From dc97ab49365e9812550303018fc0ec7eb39c8424 Mon Sep 17 00:00:00 2001 From: iamtoruk Date: Sun, 26 Jul 2026 10:19:33 -0700 Subject: [PATCH] chore(workspace): move CLI to packages/cli, add @codeburn/core skeleton (phase 1) --- .github/workflows/build-windows-store.yml | 4 +- .github/workflows/ci.yml | 2 +- .gitignore | 2 +- CONTRIBUTING.md | 27 +++--- RELEASING.md | 16 ++-- app/electron/cli.test.ts | 2 +- app/electron/cli.ts | 6 +- app/scripts/stage-cli.mjs | 7 +- dash/vite.config.ts | 2 +- docs/architecture.md | 10 +-- docs/core/phase0-recipe.md | 7 ++ package-lock.json | 82 +++++++++++++------ package.json | 67 +++------------ packages/cli/package.json | 75 +++++++++++++++++ {src => packages/cli/src}/act/apply.ts | 0 {src => packages/cli/src}/act/backup.ts | 0 {src => packages/cli/src}/act/cli.ts | 0 {src => packages/cli/src}/act/journal.ts | 0 .../cli/src}/act/model-defaults.ts | 0 .../cli/src}/act/optimize-apply.ts | 0 {src => packages/cli/src}/act/plans.ts | 0 {src => packages/cli/src}/act/report.ts | 0 {src => packages/cli/src}/act/types.ts | 0 {src => packages/cli/src}/act/undo.ts | 0 .../cli/src}/antigravity-statusline.ts | 0 {src => packages/cli/src}/audit-report.ts | 0 {src => packages/cli/src}/bash-utils.ts | 0 {src => packages/cli/src}/budget.ts | 0 .../cli/src}/cache-refresh-lock.ts | 0 {src => packages/cli/src}/classifier.ts | 0 {src => packages/cli/src}/cli-date.ts | 0 {src => packages/cli/src}/cli.ts | 0 {src => packages/cli/src}/codex-cache.ts | 0 {src => packages/cli/src}/codex-credits.ts | 0 {src => packages/cli/src}/compare-stats.ts | 0 {src => packages/cli/src}/compare.tsx | 0 {src => packages/cli/src}/config.ts | 0 {src => packages/cli/src}/content-utils.ts | 0 {src => packages/cli/src}/context-budget.ts | 0 .../cli/src}/context-tree-codex.ts | 0 {src => packages/cli/src}/context-tree.ts | 0 {src => packages/cli/src}/context-tui.tsx | 0 {src => packages/cli/src}/currency.ts | 0 {src => packages/cli/src}/cursor-cache.ts | 0 {src => packages/cli/src}/daily-cache.ts | 0 {src => packages/cli/src}/dashboard.tsx | 0 .../cli/src}/data/litellm-snapshot.json | 0 .../cli/src}/data/pricing-fallback.json | 0 {src => packages/cli/src}/day-aggregator.ts | 0 {src => packages/cli/src}/doctor.ts | 0 {src => packages/cli/src}/export.ts | 0 {src => packages/cli/src}/fetch-utils.ts | 0 {src => packages/cli/src}/format.ts | 0 {src => packages/cli/src}/fs-utils.ts | 0 {src => packages/cli/src}/granular-history.ts | 0 {src => packages/cli/src}/guard/cli.ts | 0 {src => packages/cli/src}/guard/flags.ts | 0 {src => packages/cli/src}/guard/hooks.ts | 0 {src => packages/cli/src}/guard/settings.ts | 0 {src => packages/cli/src}/guard/store.ts | 0 {src => packages/cli/src}/guard/usage.ts | 0 {src => packages/cli/src}/ink-win.ts | 0 {src => packages/cli/src}/main.ts | 0 {src => packages/cli/src}/mcp/redact.ts | 0 {src => packages/cli/src}/mcp/server.ts | 0 {src => packages/cli/src}/mcp/tables.ts | 0 .../cli/src}/menubar-installer.ts | 0 {src => packages/cli/src}/menubar-json.ts | 0 {src => packages/cli/src}/model-breakdown.ts | 0 {src => packages/cli/src}/model-efficiency.ts | 0 {src => packages/cli/src}/models-report.ts | 0 {src => packages/cli/src}/models.ts | 0 {src => packages/cli/src}/optimize.ts | 0 {src => packages/cli/src}/overview.ts | 0 {src => packages/cli/src}/parser.ts | 0 .../cli/src}/persistent-codeburn.ts | 0 {src => packages/cli/src}/plan-usage.ts | 0 {src => packages/cli/src}/plans.ts | 0 {src => packages/cli/src}/pricing-pass.ts | 0 .../cli/src}/providers/antigravity.ts | 0 {src => packages/cli/src}/providers/claude.ts | 0 {src => packages/cli/src}/providers/cline.ts | 0 .../cli/src}/providers/codebuff.ts | 0 .../cli/src}/providers/codewhale.ts | 0 {src => packages/cli/src}/providers/codex.ts | 0 .../cli/src}/providers/copilot.ts | 0 {src => packages/cli/src}/providers/crush.ts | 0 .../cli/src}/providers/cursor-agent.ts | 0 {src => packages/cli/src}/providers/cursor.ts | 0 {src => packages/cli/src}/providers/devin.ts | 0 {src => packages/cli/src}/providers/droid.ts | 0 {src => packages/cli/src}/providers/forge.ts | 0 {src => packages/cli/src}/providers/gemini.ts | 0 {src => packages/cli/src}/providers/goose.ts | 0 {src => packages/cli/src}/providers/grok.ts | 0 {src => packages/cli/src}/providers/hermes.ts | 0 .../cli/src}/providers/ibm-bob.ts | 0 {src => packages/cli/src}/providers/index.ts | 0 .../cli/src}/providers/kilo-code.ts | 0 {src => packages/cli/src}/providers/kimi.ts | 0 .../cli/src}/providers/kimicode.ts | 0 {src => packages/cli/src}/providers/kiro.ts | 0 .../cli/src}/providers/lingtai-tui.ts | 0 .../cli/src}/providers/mistral-vibe.ts | 0 {src => packages/cli/src}/providers/mux.ts | 0 .../cli/src}/providers/open-design.ts | 0 .../cli/src}/providers/openclaw.ts | 0 .../src}/providers/opencode-file-parser.ts | 0 .../cli/src}/providers/opencode.ts | 0 {src => packages/cli/src}/providers/pi.ts | 0 .../cli/src}/providers/quickdesk.ts | 0 {src => packages/cli/src}/providers/qwen.ts | 0 .../cli/src}/providers/roo-code.ts | 0 .../cli/src}/providers/session-message.ts | 0 .../src}/providers/sqlite-session-parser.ts | 0 {src => packages/cli/src}/providers/types.ts | 0 .../cli/src}/providers/vercel-gateway.ts | 0 .../cli/src}/providers/vscode-cline-parser.ts | 0 {src => packages/cli/src}/providers/warp.ts | 0 {src => packages/cli/src}/providers/zcode.ts | 0 {src => packages/cli/src}/providers/zed.ts | 0 .../cli/src}/providers/zerostack.ts | 0 {src => packages/cli/src}/quota.ts | 0 {src => packages/cli/src}/session-cache.ts | 0 {src => packages/cli/src}/sessions-report.ts | 0 {src => packages/cli/src}/sessions-tui.tsx | 0 {src => packages/cli/src}/sharing/client.ts | 0 .../cli/src}/sharing/discovery.ts | 0 {src => packages/cli/src}/sharing/host.ts | 0 {src => packages/cli/src}/sharing/identity.ts | 0 {src => packages/cli/src}/sharing/pairing.ts | 0 {src => packages/cli/src}/sharing/prompt.ts | 0 {src => packages/cli/src}/sharing/sanitize.ts | 0 .../cli/src}/sharing/share-controller.ts | 0 .../cli/src}/sharing/share-run.ts | 0 .../cli/src}/sharing/share-server.ts | 0 {src => packages/cli/src}/sharing/store.ts | 0 {src => packages/cli/src}/spend-flow.ts | 0 {src => packages/cli/src}/sqlite.ts | 0 {src => packages/cli/src}/sync/auth.ts | 0 {src => packages/cli/src}/sync/cli.ts | 0 {src => packages/cli/src}/sync/config.ts | 0 {src => packages/cli/src}/sync/credentials.ts | 0 {src => packages/cli/src}/sync/discovery.ts | 0 {src => packages/cli/src}/sync/index.ts | 0 {src => packages/cli/src}/sync/ledger.ts | 0 {src => packages/cli/src}/sync/otlp.ts | 0 {src => packages/cli/src}/sync/push.ts | 0 {src => packages/cli/src}/text-table.ts | 0 {src => packages/cli/src}/token-estimate.ts | 0 {src => packages/cli/src}/types.ts | 0 {src => packages/cli/src}/usage-aggregator.ts | 0 {src => packages/cli/src}/web-dashboard.ts | 0 .../cli/src}/workflow-insights.ts | 0 {src => packages/cli/src}/yield.ts | 0 .../cli/tests}/act-journal.test.ts | 0 .../cli/tests}/act-model-defaults.test.ts | 0 .../cli/tests}/act-report.test.ts | 0 .../cli/tests}/act-undo.test.ts | 0 .../cli/tests}/antigravity-statusline.test.ts | 0 .../cli/tests}/audit-report.test.ts | 0 .../cli/tests}/bash-commands.test.ts | 0 .../cli/tests}/blob-to-text.test.ts | 0 {tests => packages/cli/tests}/budget.test.ts | 0 .../cache-persistence-coldstart.test.ts | 0 .../tests}/cache-refresh-lock-process.test.ts | 0 .../cli/tests}/cache-refresh-lock.test.ts | 0 .../cli/tests}/classifier.test.ts | 0 .../cli/tests}/cli-budget.test.ts | 0 .../cli/tests}/cli-date.test.ts | 0 .../tests}/cli-deepseek-v4-pricing.test.ts | 0 .../tests}/cli-devin-model-variants.test.ts | 0 .../cli/tests}/cli-durable-totals.test.ts | 0 .../cli/tests}/cli-emitters.test.ts | 0 .../cli/tests}/cli-export-date-range.test.ts | 0 .../cli/tests}/cli-json-daily.test.ts | 0 .../cli/tests}/cli-model-savings.test.ts | 0 .../cli/tests}/cli-plan.test.ts | 0 .../cli/tests}/cli-price-override.test.ts | 0 .../tests}/cli-provider-validation.test.ts | 0 .../cli/tests}/cli-proxy-path.test.ts | 0 .../cli/tests}/cli-settings-json.test.ts | 0 .../cli/tests}/cli-status-menubar.test.ts | 0 .../tests}/codex-cache-invalidation.test.ts | 0 .../cli/tests}/codex-credits.test.ts | 0 .../cli/tests}/codex-rich-capture.test.ts | 0 .../cli/tests}/compare-stats.test.ts | 0 .../cli/tests}/content-utils.test.ts | 0 .../cross-provider-pr-correlation.test.ts | 0 .../cli/tests}/currency-rounding.test.ts | 0 .../tests}/daily-cache-carry-forward.test.ts | 0 .../cli/tests}/daily-cache.test.ts | 0 .../cli/tests}/dashboard.test.ts | 0 .../cli/tests}/date-range-filter.test.ts | 0 .../cli/tests}/day-aggregator-savings.test.ts | 0 .../cli/tests}/day-aggregator.test.ts | 0 .../cli/tests}/defer-plans.test.ts | 0 .../cli/tests}/devices-json.test.ts | 0 {tests => packages/cli/tests}/doctor.test.ts | 0 {tests => packages/cli/tests}/export.test.ts | 0 .../cli/tests}/fetch-utils.test.ts | 0 .../.system_generated/logs/transcript.jsonl | 0 .../antigravity-cli-current/gen-metadata.json | 0 .../tests}/fixtures/cache-refresh-worker.ts | 0 ...1031d227-0c67-4e17-8954-0b6e2b3322f0.jsonl | 0 .../fixtures/mock-discovery-register.mjs | 0 .../cli/tests}/fixtures/mock-idp.ts | 0 .../data/runs/run-mixed/events.jsonl | 0 .../data/runs/run-no-usage/events.jsonl | 0 .../data/runs/run-start-seeded/events.jsonl | 0 .../tests}/fixtures/security/proto-bash.jsonl | 0 .../fixtures/security/proto-model.jsonl | 0 .../tests}/fixtures/security/proto-tool.jsonl | 0 .../cli/tests}/format-mark-estimated.test.ts | 0 .../cli/tests}/fs-utils.test.ts | 0 .../cli/tests}/granular-history.test.ts | 0 .../cli/tests}/guard-hooks.test.ts | 0 .../cli/tests}/guard-install.test.ts | 0 .../hydration-interrupt-convergence.test.ts | 0 .../tests}/kiro-cache-invalidation.test.ts | 0 .../cli/tests}/local-model-savings.test.ts | 0 .../cli/tests}/mcp-coverage.test.ts | 0 .../cli/tests}/mcp-deferral.test.ts | 0 .../cli/tests}/mcp-redact.test.ts | 0 .../cli/tests}/mcp-server.test.ts | 0 .../cli/tests}/mcp-tables.test.ts | 0 .../tests}/menubar-carried-headline.test.ts | 0 .../cli/tests}/menubar-installer.test.ts | 0 .../cli/tests}/menubar-json.test.ts | 0 .../cli/tests}/menubar-report-parity.test.ts | 0 .../cli/tests}/menubar-savings.test.ts | 0 {tests => packages/cli/tests}/minimax.test.ts | 0 .../cli/tests}/model-breakdown.test.ts | 0 .../cli/tests}/model-efficiency.test.ts | 0 .../cli/tests}/models-hoist.test.ts | 0 .../cli/tests}/models-report.test.ts | 0 {tests => packages/cli/tests}/models.test.ts | 0 .../cli/tests}/optimize-apply.test.ts | 0 .../cli/tests}/optimize-fs.test.ts | 0 .../tests}/optimize-zero-edit-savings.test.ts | 0 .../cli/tests}/optimize.test.ts | 0 .../cli/tests}/otel-cache-aggregation.test.ts | 0 .../cli/tests}/overview.test.ts | 0 .../cli/tests}/parser-advisor-usage.test.ts | 0 .../parser-antigravity-timestamp.test.ts | 0 .../parser-cache-refresh-timeout.test.ts | 0 .../cli/tests}/parser-claude-cwd.test.ts | 0 .../cli/tests}/parser-compact-entry.test.ts | 0 .../cli/tests}/parser-estimated-cost.test.ts | 0 .../cli/tests}/parser-filter.test.ts | 0 .../cli/tests}/parser-gemini-cache.test.ts | 0 .../cli/tests}/parser-hydration-lock.test.ts | 0 .../tests}/parser-incremental-append.test.ts | 0 .../parser-large-json-scanner-parity.test.ts | 0 .../tests}/parser-large-json-scanner.test.ts | 0 .../cli/tests}/parser-large-session.test.ts | 0 .../cli/tests}/parser-local-savings.test.ts | 0 .../cli/tests}/parser-mcp-inventory.test.ts | 0 .../cli/tests}/parser-number-helpers.test.ts | 0 .../tests}/parser-proxy-codex-only.test.ts | 0 .../cli/tests}/parser-proxy-merge.test.ts | 0 .../cli/tests}/parser-proxy-pricing.test.ts | 0 .../cli/tests}/parser-rich-capture.test.ts | 0 .../tests}/parser-single-pass-scanner.test.ts | 0 .../cli/tests}/parser-skip-line.test.ts | 0 .../tests}/parser-subagent-collection.test.ts | 0 .../cli/tests}/parser-subagent-range.test.ts | 0 {tests => packages/cli/tests}/parser.test.ts | 0 .../cli/tests}/plan-usage.test.ts | 0 {tests => packages/cli/tests}/plans.test.ts | 0 .../cli/tests}/pricing-fallback-data.test.ts | 0 .../cli/tests}/pricing-pass.test.ts | 0 .../cli/tests}/provider-registry.test.ts | 0 .../cli/tests}/provider-turn-grouping.test.ts | 0 .../cli/tests}/providers/antigravity.test.ts | 0 .../providers/claude-config-dirs.test.ts | 0 .../cli/tests}/providers/cline.test.ts | 0 .../cli/tests}/providers/codebuff.test.ts | 0 .../cli/tests}/providers/codewhale.test.ts | 0 .../cli/tests}/providers/codex.test.ts | 0 .../tests}/providers/copilot-skills.test.ts | 0 .../cli/tests}/providers/copilot.test.ts | 0 .../cli/tests}/providers/crush.test.ts | 0 .../cli/tests}/providers/cursor-agent.test.ts | 0 .../providers/cursor-bubble-dedup.test.ts | 0 .../providers/cursor-large-db-cap.test.ts | 0 .../providers/cursor-real-tokens.test.ts | 0 .../cursor-workspace-breakdown.test.ts | 0 .../cli/tests}/providers/cursor.test.ts | 0 .../cli/tests}/providers/devin.test.ts | 0 .../cli/tests}/providers/droid.test.ts | 0 .../cli/tests}/providers/forge.test.ts | 0 .../cli/tests}/providers/gemini.test.ts | 0 .../cli/tests}/providers/grok.test.ts | 0 .../cli/tests}/providers/hermes.test.ts | 0 .../cli/tests}/providers/ibm-bob.test.ts | 0 .../cli/tests}/providers/kilo-code.test.ts | 0 .../cli/tests}/providers/kimi.test.ts | 0 .../cli/tests}/providers/kimicode.test.ts | 0 .../cli/tests}/providers/kiro.test.ts | 0 .../cli/tests}/providers/lingtai-tui.test.ts | 0 .../cli/tests}/providers/mistral-vibe.test.ts | 0 .../cli/tests}/providers/mux.test.ts | 0 .../cli/tests}/providers/omp.test.ts | 0 .../cli/tests}/providers/open-design.test.ts | 0 .../cli/tests}/providers/openclaw.test.ts | 0 .../tests}/providers/opencode-file.test.ts | 0 .../cli/tests}/providers/opencode.test.ts | 0 .../cli/tests}/providers/pi.test.ts | 0 .../cli/tests}/providers/quickdesk.test.ts | 0 .../cli/tests}/providers/roo-code.test.ts | 0 .../tests}/providers/vercel-gateway.test.ts | 0 .../providers/vscode-cline-parser.test.ts | 0 .../cli/tests}/providers/warp.test.ts | 0 .../cli/tests}/providers/zcode.test.ts | 0 .../cli/tests}/providers/zed.test.ts | 0 .../cli/tests}/providers/zerostack.test.ts | 0 {tests => packages/cli/tests}/quota.test.ts | 0 .../cli/tests}/scan-progress.test.ts | 0 .../security/prototype-pollution.test.ts | 0 .../tests}/session-cache-rich-capture.test.ts | 0 .../tests}/session-cache-v5-adoption.test.ts | 0 .../cli/tests}/session-cache.test.ts | 0 .../cli/tests}/sessions-by-branch.test.ts | 0 .../cli/tests}/sessions-by-pr.test.ts | 0 .../cli/tests}/sessions-report.test.ts | 0 .../cli/tests}/sessions-subagent-fold.test.ts | 0 .../cli/tests}/setup/env-isolation.ts | 0 .../cli/tests}/sharing/approve.test.ts | 0 .../tests}/sharing/connect-timeout.test.ts | 0 .../cli/tests}/sharing/host.test.ts | 0 .../cli/tests}/sharing/pairing.test.ts | 0 .../cli/tests}/sharing/sanitize.test.ts | 0 .../cli/tests}/sharing/transport.test.ts | 0 .../cli/tests}/spend-flow.test.ts | 0 .../cli/tests}/sync-e2e.test.ts | 0 .../cli/tests}/sync-headless-e2e.test.ts | 0 .../cli/tests}/sync-infra-e2e.test.ts | 0 .../cli/tests}/sync-ledger-otlp.test.ts | 0 .../cli/tests}/sync-push.test.ts | 0 {tests => packages/cli/tests}/sync.test.ts | 0 .../cli/tests}/token-estimate.test.ts | 0 .../cli/tests}/usage-aggregator.test.ts | 0 .../cli/tests}/web-dashboard.test.ts | 0 .../cli/tests}/workflow-insights.test.ts | 0 .../tests}/yield-overlap-attribution.test.ts | 0 .../cli/tests}/yield-repo-grouping.test.ts | 0 {tests => packages/cli/tests}/yield.test.ts | 0 tsconfig.json => packages/cli/tsconfig.json | 0 tsup.config.ts => packages/cli/tsup.config.ts | 0 .../cli/vitest.config.ts | 0 packages/core/README.md | 9 ++ packages/core/package.json | 32 ++++++++ packages/core/src/index.ts | 1 + packages/core/tsconfig.json | 17 ++++ packages/core/tsup.config.ts | 12 +++ scripts/bundle-litellm.mjs | 2 +- 357 files changed, 265 insertions(+), 117 deletions(-) create mode 100644 packages/cli/package.json rename {src => packages/cli/src}/act/apply.ts (100%) rename {src => packages/cli/src}/act/backup.ts (100%) rename {src => packages/cli/src}/act/cli.ts (100%) rename {src => packages/cli/src}/act/journal.ts (100%) rename {src => packages/cli/src}/act/model-defaults.ts (100%) rename {src => packages/cli/src}/act/optimize-apply.ts (100%) rename {src => packages/cli/src}/act/plans.ts (100%) rename {src => packages/cli/src}/act/report.ts (100%) rename {src => packages/cli/src}/act/types.ts (100%) rename {src => packages/cli/src}/act/undo.ts (100%) rename {src => packages/cli/src}/antigravity-statusline.ts (100%) rename {src => packages/cli/src}/audit-report.ts (100%) rename {src => packages/cli/src}/bash-utils.ts (100%) rename {src => packages/cli/src}/budget.ts (100%) rename {src => packages/cli/src}/cache-refresh-lock.ts (100%) rename {src => packages/cli/src}/classifier.ts (100%) rename {src => packages/cli/src}/cli-date.ts (100%) rename {src => packages/cli/src}/cli.ts (100%) rename {src => packages/cli/src}/codex-cache.ts (100%) rename {src => packages/cli/src}/codex-credits.ts (100%) rename {src => packages/cli/src}/compare-stats.ts (100%) rename {src => packages/cli/src}/compare.tsx (100%) rename {src => packages/cli/src}/config.ts (100%) rename {src => packages/cli/src}/content-utils.ts (100%) rename {src => packages/cli/src}/context-budget.ts (100%) rename {src => packages/cli/src}/context-tree-codex.ts (100%) rename {src => packages/cli/src}/context-tree.ts (100%) rename {src => packages/cli/src}/context-tui.tsx (100%) rename {src => packages/cli/src}/currency.ts (100%) rename {src => packages/cli/src}/cursor-cache.ts (100%) rename {src => packages/cli/src}/daily-cache.ts (100%) rename {src => packages/cli/src}/dashboard.tsx (100%) rename {src => packages/cli/src}/data/litellm-snapshot.json (100%) rename {src => packages/cli/src}/data/pricing-fallback.json (100%) rename {src => packages/cli/src}/day-aggregator.ts (100%) rename {src => packages/cli/src}/doctor.ts (100%) rename {src => packages/cli/src}/export.ts (100%) rename {src => packages/cli/src}/fetch-utils.ts (100%) rename {src => packages/cli/src}/format.ts (100%) rename {src => packages/cli/src}/fs-utils.ts (100%) rename {src => packages/cli/src}/granular-history.ts (100%) rename {src => packages/cli/src}/guard/cli.ts (100%) rename {src => packages/cli/src}/guard/flags.ts (100%) rename {src => packages/cli/src}/guard/hooks.ts (100%) rename {src => packages/cli/src}/guard/settings.ts (100%) rename {src => packages/cli/src}/guard/store.ts (100%) rename {src => packages/cli/src}/guard/usage.ts (100%) rename {src => packages/cli/src}/ink-win.ts (100%) rename {src => packages/cli/src}/main.ts (100%) rename {src => packages/cli/src}/mcp/redact.ts (100%) rename {src => packages/cli/src}/mcp/server.ts (100%) rename {src => packages/cli/src}/mcp/tables.ts (100%) rename {src => packages/cli/src}/menubar-installer.ts (100%) rename {src => packages/cli/src}/menubar-json.ts (100%) rename {src => packages/cli/src}/model-breakdown.ts (100%) rename {src => packages/cli/src}/model-efficiency.ts (100%) rename {src => packages/cli/src}/models-report.ts (100%) rename {src => packages/cli/src}/models.ts (100%) rename {src => packages/cli/src}/optimize.ts (100%) rename {src => packages/cli/src}/overview.ts (100%) rename {src => packages/cli/src}/parser.ts (100%) rename {src => packages/cli/src}/persistent-codeburn.ts (100%) rename {src => packages/cli/src}/plan-usage.ts (100%) rename {src => packages/cli/src}/plans.ts (100%) rename {src => packages/cli/src}/pricing-pass.ts (100%) rename {src => packages/cli/src}/providers/antigravity.ts (100%) rename {src => packages/cli/src}/providers/claude.ts (100%) rename {src => packages/cli/src}/providers/cline.ts (100%) rename {src => packages/cli/src}/providers/codebuff.ts (100%) rename {src => packages/cli/src}/providers/codewhale.ts (100%) rename {src => packages/cli/src}/providers/codex.ts (100%) rename {src => packages/cli/src}/providers/copilot.ts (100%) rename {src => packages/cli/src}/providers/crush.ts (100%) rename {src => packages/cli/src}/providers/cursor-agent.ts (100%) rename {src => packages/cli/src}/providers/cursor.ts (100%) rename {src => packages/cli/src}/providers/devin.ts (100%) rename {src => packages/cli/src}/providers/droid.ts (100%) rename {src => packages/cli/src}/providers/forge.ts (100%) rename {src => packages/cli/src}/providers/gemini.ts (100%) rename {src => packages/cli/src}/providers/goose.ts (100%) rename {src => packages/cli/src}/providers/grok.ts (100%) rename {src => packages/cli/src}/providers/hermes.ts (100%) rename {src => packages/cli/src}/providers/ibm-bob.ts (100%) rename {src => packages/cli/src}/providers/index.ts (100%) rename {src => packages/cli/src}/providers/kilo-code.ts (100%) rename {src => packages/cli/src}/providers/kimi.ts (100%) rename {src => packages/cli/src}/providers/kimicode.ts (100%) rename {src => packages/cli/src}/providers/kiro.ts (100%) rename {src => packages/cli/src}/providers/lingtai-tui.ts (100%) rename {src => packages/cli/src}/providers/mistral-vibe.ts (100%) rename {src => packages/cli/src}/providers/mux.ts (100%) rename {src => packages/cli/src}/providers/open-design.ts (100%) rename {src => packages/cli/src}/providers/openclaw.ts (100%) rename {src => packages/cli/src}/providers/opencode-file-parser.ts (100%) rename {src => packages/cli/src}/providers/opencode.ts (100%) rename {src => packages/cli/src}/providers/pi.ts (100%) rename {src => packages/cli/src}/providers/quickdesk.ts (100%) rename {src => packages/cli/src}/providers/qwen.ts (100%) rename {src => packages/cli/src}/providers/roo-code.ts (100%) rename {src => packages/cli/src}/providers/session-message.ts (100%) rename {src => packages/cli/src}/providers/sqlite-session-parser.ts (100%) rename {src => packages/cli/src}/providers/types.ts (100%) rename {src => packages/cli/src}/providers/vercel-gateway.ts (100%) rename {src => packages/cli/src}/providers/vscode-cline-parser.ts (100%) rename {src => packages/cli/src}/providers/warp.ts (100%) rename {src => packages/cli/src}/providers/zcode.ts (100%) rename {src => packages/cli/src}/providers/zed.ts (100%) rename {src => packages/cli/src}/providers/zerostack.ts (100%) rename {src => packages/cli/src}/quota.ts (100%) rename {src => packages/cli/src}/session-cache.ts (100%) rename {src => packages/cli/src}/sessions-report.ts (100%) rename {src => packages/cli/src}/sessions-tui.tsx (100%) rename {src => packages/cli/src}/sharing/client.ts (100%) rename {src => packages/cli/src}/sharing/discovery.ts (100%) rename {src => packages/cli/src}/sharing/host.ts (100%) rename {src => packages/cli/src}/sharing/identity.ts (100%) rename {src => packages/cli/src}/sharing/pairing.ts (100%) rename {src => packages/cli/src}/sharing/prompt.ts (100%) rename {src => packages/cli/src}/sharing/sanitize.ts (100%) rename {src => packages/cli/src}/sharing/share-controller.ts (100%) rename {src => packages/cli/src}/sharing/share-run.ts (100%) rename {src => packages/cli/src}/sharing/share-server.ts (100%) rename {src => packages/cli/src}/sharing/store.ts (100%) rename {src => packages/cli/src}/spend-flow.ts (100%) rename {src => packages/cli/src}/sqlite.ts (100%) rename {src => packages/cli/src}/sync/auth.ts (100%) rename {src => packages/cli/src}/sync/cli.ts (100%) rename {src => packages/cli/src}/sync/config.ts (100%) rename {src => packages/cli/src}/sync/credentials.ts (100%) rename {src => packages/cli/src}/sync/discovery.ts (100%) rename {src => packages/cli/src}/sync/index.ts (100%) rename {src => packages/cli/src}/sync/ledger.ts (100%) rename {src => packages/cli/src}/sync/otlp.ts (100%) rename {src => packages/cli/src}/sync/push.ts (100%) rename {src => packages/cli/src}/text-table.ts (100%) rename {src => packages/cli/src}/token-estimate.ts (100%) rename {src => packages/cli/src}/types.ts (100%) rename {src => packages/cli/src}/usage-aggregator.ts (100%) rename {src => packages/cli/src}/web-dashboard.ts (100%) rename {src => packages/cli/src}/workflow-insights.ts (100%) rename {src => packages/cli/src}/yield.ts (100%) rename {tests => packages/cli/tests}/act-journal.test.ts (100%) rename {tests => packages/cli/tests}/act-model-defaults.test.ts (100%) rename {tests => packages/cli/tests}/act-report.test.ts (100%) rename {tests => packages/cli/tests}/act-undo.test.ts (100%) rename {tests => packages/cli/tests}/antigravity-statusline.test.ts (100%) rename {tests => packages/cli/tests}/audit-report.test.ts (100%) rename {tests => packages/cli/tests}/bash-commands.test.ts (100%) rename {tests => packages/cli/tests}/blob-to-text.test.ts (100%) rename {tests => packages/cli/tests}/budget.test.ts (100%) rename {tests => packages/cli/tests}/cache-persistence-coldstart.test.ts (100%) rename {tests => packages/cli/tests}/cache-refresh-lock-process.test.ts (100%) rename {tests => packages/cli/tests}/cache-refresh-lock.test.ts (100%) rename {tests => packages/cli/tests}/classifier.test.ts (100%) rename {tests => packages/cli/tests}/cli-budget.test.ts (100%) rename {tests => packages/cli/tests}/cli-date.test.ts (100%) rename {tests => packages/cli/tests}/cli-deepseek-v4-pricing.test.ts (100%) rename {tests => packages/cli/tests}/cli-devin-model-variants.test.ts (100%) rename {tests => packages/cli/tests}/cli-durable-totals.test.ts (100%) rename {tests => packages/cli/tests}/cli-emitters.test.ts (100%) rename {tests => packages/cli/tests}/cli-export-date-range.test.ts (100%) rename {tests => packages/cli/tests}/cli-json-daily.test.ts (100%) rename {tests => packages/cli/tests}/cli-model-savings.test.ts (100%) rename {tests => packages/cli/tests}/cli-plan.test.ts (100%) rename {tests => packages/cli/tests}/cli-price-override.test.ts (100%) rename {tests => packages/cli/tests}/cli-provider-validation.test.ts (100%) rename {tests => packages/cli/tests}/cli-proxy-path.test.ts (100%) rename {tests => packages/cli/tests}/cli-settings-json.test.ts (100%) rename {tests => packages/cli/tests}/cli-status-menubar.test.ts (100%) rename {tests => packages/cli/tests}/codex-cache-invalidation.test.ts (100%) rename {tests => packages/cli/tests}/codex-credits.test.ts (100%) rename {tests => packages/cli/tests}/codex-rich-capture.test.ts (100%) rename {tests => packages/cli/tests}/compare-stats.test.ts (100%) rename {tests => packages/cli/tests}/content-utils.test.ts (100%) rename {tests => packages/cli/tests}/cross-provider-pr-correlation.test.ts (100%) rename {tests => packages/cli/tests}/currency-rounding.test.ts (100%) rename {tests => packages/cli/tests}/daily-cache-carry-forward.test.ts (100%) rename {tests => packages/cli/tests}/daily-cache.test.ts (100%) rename {tests => packages/cli/tests}/dashboard.test.ts (100%) rename {tests => packages/cli/tests}/date-range-filter.test.ts (100%) rename {tests => packages/cli/tests}/day-aggregator-savings.test.ts (100%) rename {tests => packages/cli/tests}/day-aggregator.test.ts (100%) rename {tests => packages/cli/tests}/defer-plans.test.ts (100%) rename {tests => packages/cli/tests}/devices-json.test.ts (100%) rename {tests => packages/cli/tests}/doctor.test.ts (100%) rename {tests => packages/cli/tests}/export.test.ts (100%) rename {tests => packages/cli/tests}/fetch-utils.test.ts (100%) rename {tests => packages/cli/tests}/fixtures/antigravity-cli-current/brain/fixture-current-cli/.system_generated/logs/transcript.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/antigravity-cli-current/gen-metadata.json (100%) rename {tests => packages/cli/tests}/fixtures/cache-refresh-worker.ts (100%) rename {tests => packages/cli/tests}/fixtures/cursor-agent/workspace-less/projects/agent-transcripts/1031d227-0c67-4e17-8954-0b6e2b3322f0/1031d227-0c67-4e17-8954-0b6e2b3322f0.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/mock-discovery-register.mjs (100%) rename {tests => packages/cli/tests}/fixtures/mock-idp.ts (100%) rename {tests => packages/cli/tests}/fixtures/open-design/namespaces/release-stable/data/runs/run-mixed/events.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/open-design/namespaces/release-stable/data/runs/run-no-usage/events.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/open-design/namespaces/release-stable/data/runs/run-start-seeded/events.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/security/proto-bash.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/security/proto-model.jsonl (100%) rename {tests => packages/cli/tests}/fixtures/security/proto-tool.jsonl (100%) rename {tests => packages/cli/tests}/format-mark-estimated.test.ts (100%) rename {tests => packages/cli/tests}/fs-utils.test.ts (100%) rename {tests => packages/cli/tests}/granular-history.test.ts (100%) rename {tests => packages/cli/tests}/guard-hooks.test.ts (100%) rename {tests => packages/cli/tests}/guard-install.test.ts (100%) rename {tests => packages/cli/tests}/hydration-interrupt-convergence.test.ts (100%) rename {tests => packages/cli/tests}/kiro-cache-invalidation.test.ts (100%) rename {tests => packages/cli/tests}/local-model-savings.test.ts (100%) rename {tests => packages/cli/tests}/mcp-coverage.test.ts (100%) rename {tests => packages/cli/tests}/mcp-deferral.test.ts (100%) rename {tests => packages/cli/tests}/mcp-redact.test.ts (100%) rename {tests => packages/cli/tests}/mcp-server.test.ts (100%) rename {tests => packages/cli/tests}/mcp-tables.test.ts (100%) rename {tests => packages/cli/tests}/menubar-carried-headline.test.ts (100%) rename {tests => packages/cli/tests}/menubar-installer.test.ts (100%) rename {tests => packages/cli/tests}/menubar-json.test.ts (100%) rename {tests => packages/cli/tests}/menubar-report-parity.test.ts (100%) rename {tests => packages/cli/tests}/menubar-savings.test.ts (100%) rename {tests => packages/cli/tests}/minimax.test.ts (100%) rename {tests => packages/cli/tests}/model-breakdown.test.ts (100%) rename {tests => packages/cli/tests}/model-efficiency.test.ts (100%) rename {tests => packages/cli/tests}/models-hoist.test.ts (100%) rename {tests => packages/cli/tests}/models-report.test.ts (100%) rename {tests => packages/cli/tests}/models.test.ts (100%) rename {tests => packages/cli/tests}/optimize-apply.test.ts (100%) rename {tests => packages/cli/tests}/optimize-fs.test.ts (100%) rename {tests => packages/cli/tests}/optimize-zero-edit-savings.test.ts (100%) rename {tests => packages/cli/tests}/optimize.test.ts (100%) rename {tests => packages/cli/tests}/otel-cache-aggregation.test.ts (100%) rename {tests => packages/cli/tests}/overview.test.ts (100%) rename {tests => packages/cli/tests}/parser-advisor-usage.test.ts (100%) rename {tests => packages/cli/tests}/parser-antigravity-timestamp.test.ts (100%) rename {tests => packages/cli/tests}/parser-cache-refresh-timeout.test.ts (100%) rename {tests => packages/cli/tests}/parser-claude-cwd.test.ts (100%) rename {tests => packages/cli/tests}/parser-compact-entry.test.ts (100%) rename {tests => packages/cli/tests}/parser-estimated-cost.test.ts (100%) rename {tests => packages/cli/tests}/parser-filter.test.ts (100%) rename {tests => packages/cli/tests}/parser-gemini-cache.test.ts (100%) rename {tests => packages/cli/tests}/parser-hydration-lock.test.ts (100%) rename {tests => packages/cli/tests}/parser-incremental-append.test.ts (100%) rename {tests => packages/cli/tests}/parser-large-json-scanner-parity.test.ts (100%) rename {tests => packages/cli/tests}/parser-large-json-scanner.test.ts (100%) rename {tests => packages/cli/tests}/parser-large-session.test.ts (100%) rename {tests => packages/cli/tests}/parser-local-savings.test.ts (100%) rename {tests => packages/cli/tests}/parser-mcp-inventory.test.ts (100%) rename {tests => packages/cli/tests}/parser-number-helpers.test.ts (100%) rename {tests => packages/cli/tests}/parser-proxy-codex-only.test.ts (100%) rename {tests => packages/cli/tests}/parser-proxy-merge.test.ts (100%) rename {tests => packages/cli/tests}/parser-proxy-pricing.test.ts (100%) rename {tests => packages/cli/tests}/parser-rich-capture.test.ts (100%) rename {tests => packages/cli/tests}/parser-single-pass-scanner.test.ts (100%) rename {tests => packages/cli/tests}/parser-skip-line.test.ts (100%) rename {tests => packages/cli/tests}/parser-subagent-collection.test.ts (100%) rename {tests => packages/cli/tests}/parser-subagent-range.test.ts (100%) rename {tests => packages/cli/tests}/parser.test.ts (100%) rename {tests => packages/cli/tests}/plan-usage.test.ts (100%) rename {tests => packages/cli/tests}/plans.test.ts (100%) rename {tests => packages/cli/tests}/pricing-fallback-data.test.ts (100%) rename {tests => packages/cli/tests}/pricing-pass.test.ts (100%) rename {tests => packages/cli/tests}/provider-registry.test.ts (100%) rename {tests => packages/cli/tests}/provider-turn-grouping.test.ts (100%) rename {tests => packages/cli/tests}/providers/antigravity.test.ts (100%) rename {tests => packages/cli/tests}/providers/claude-config-dirs.test.ts (100%) rename {tests => packages/cli/tests}/providers/cline.test.ts (100%) rename {tests => packages/cli/tests}/providers/codebuff.test.ts (100%) rename {tests => packages/cli/tests}/providers/codewhale.test.ts (100%) rename {tests => packages/cli/tests}/providers/codex.test.ts (100%) rename {tests => packages/cli/tests}/providers/copilot-skills.test.ts (100%) rename {tests => packages/cli/tests}/providers/copilot.test.ts (100%) rename {tests => packages/cli/tests}/providers/crush.test.ts (100%) rename {tests => packages/cli/tests}/providers/cursor-agent.test.ts (100%) rename {tests => packages/cli/tests}/providers/cursor-bubble-dedup.test.ts (100%) rename {tests => packages/cli/tests}/providers/cursor-large-db-cap.test.ts (100%) rename {tests => packages/cli/tests}/providers/cursor-real-tokens.test.ts (100%) rename {tests => packages/cli/tests}/providers/cursor-workspace-breakdown.test.ts (100%) rename {tests => packages/cli/tests}/providers/cursor.test.ts (100%) rename {tests => packages/cli/tests}/providers/devin.test.ts (100%) rename {tests => packages/cli/tests}/providers/droid.test.ts (100%) rename {tests => packages/cli/tests}/providers/forge.test.ts (100%) rename {tests => packages/cli/tests}/providers/gemini.test.ts (100%) rename {tests => packages/cli/tests}/providers/grok.test.ts (100%) rename {tests => packages/cli/tests}/providers/hermes.test.ts (100%) rename {tests => packages/cli/tests}/providers/ibm-bob.test.ts (100%) rename {tests => packages/cli/tests}/providers/kilo-code.test.ts (100%) rename {tests => packages/cli/tests}/providers/kimi.test.ts (100%) rename {tests => packages/cli/tests}/providers/kimicode.test.ts (100%) rename {tests => packages/cli/tests}/providers/kiro.test.ts (100%) rename {tests => packages/cli/tests}/providers/lingtai-tui.test.ts (100%) rename {tests => packages/cli/tests}/providers/mistral-vibe.test.ts (100%) rename {tests => packages/cli/tests}/providers/mux.test.ts (100%) rename {tests => packages/cli/tests}/providers/omp.test.ts (100%) rename {tests => packages/cli/tests}/providers/open-design.test.ts (100%) rename {tests => packages/cli/tests}/providers/openclaw.test.ts (100%) rename {tests => packages/cli/tests}/providers/opencode-file.test.ts (100%) rename {tests => packages/cli/tests}/providers/opencode.test.ts (100%) rename {tests => packages/cli/tests}/providers/pi.test.ts (100%) rename {tests => packages/cli/tests}/providers/quickdesk.test.ts (100%) rename {tests => packages/cli/tests}/providers/roo-code.test.ts (100%) rename {tests => packages/cli/tests}/providers/vercel-gateway.test.ts (100%) rename {tests => packages/cli/tests}/providers/vscode-cline-parser.test.ts (100%) rename {tests => packages/cli/tests}/providers/warp.test.ts (100%) rename {tests => packages/cli/tests}/providers/zcode.test.ts (100%) rename {tests => packages/cli/tests}/providers/zed.test.ts (100%) rename {tests => packages/cli/tests}/providers/zerostack.test.ts (100%) rename {tests => packages/cli/tests}/quota.test.ts (100%) rename {tests => packages/cli/tests}/scan-progress.test.ts (100%) rename {tests => packages/cli/tests}/security/prototype-pollution.test.ts (100%) rename {tests => packages/cli/tests}/session-cache-rich-capture.test.ts (100%) rename {tests => packages/cli/tests}/session-cache-v5-adoption.test.ts (100%) rename {tests => packages/cli/tests}/session-cache.test.ts (100%) rename {tests => packages/cli/tests}/sessions-by-branch.test.ts (100%) rename {tests => packages/cli/tests}/sessions-by-pr.test.ts (100%) rename {tests => packages/cli/tests}/sessions-report.test.ts (100%) rename {tests => packages/cli/tests}/sessions-subagent-fold.test.ts (100%) rename {tests => packages/cli/tests}/setup/env-isolation.ts (100%) rename {tests => packages/cli/tests}/sharing/approve.test.ts (100%) rename {tests => packages/cli/tests}/sharing/connect-timeout.test.ts (100%) rename {tests => packages/cli/tests}/sharing/host.test.ts (100%) rename {tests => packages/cli/tests}/sharing/pairing.test.ts (100%) rename {tests => packages/cli/tests}/sharing/sanitize.test.ts (100%) rename {tests => packages/cli/tests}/sharing/transport.test.ts (100%) rename {tests => packages/cli/tests}/spend-flow.test.ts (100%) rename {tests => packages/cli/tests}/sync-e2e.test.ts (100%) rename {tests => packages/cli/tests}/sync-headless-e2e.test.ts (100%) rename {tests => packages/cli/tests}/sync-infra-e2e.test.ts (100%) rename {tests => packages/cli/tests}/sync-ledger-otlp.test.ts (100%) rename {tests => packages/cli/tests}/sync-push.test.ts (100%) rename {tests => packages/cli/tests}/sync.test.ts (100%) rename {tests => packages/cli/tests}/token-estimate.test.ts (100%) rename {tests => packages/cli/tests}/usage-aggregator.test.ts (100%) rename {tests => packages/cli/tests}/web-dashboard.test.ts (100%) rename {tests => packages/cli/tests}/workflow-insights.test.ts (100%) rename {tests => packages/cli/tests}/yield-overlap-attribution.test.ts (100%) rename {tests => packages/cli/tests}/yield-repo-grouping.test.ts (100%) rename {tests => packages/cli/tests}/yield.test.ts (100%) rename tsconfig.json => packages/cli/tsconfig.json (100%) rename tsup.config.ts => packages/cli/tsup.config.ts (100%) rename vitest.config.ts => packages/cli/vitest.config.ts (100%) create mode 100644 packages/core/README.md create mode 100644 packages/core/package.json create mode 100644 packages/core/src/index.ts create mode 100644 packages/core/tsconfig.json create mode 100644 packages/core/tsup.config.ts diff --git a/.github/workflows/build-windows-store.yml b/.github/workflows/build-windows-store.yml index a7e6f034..6804764e 100644 --- a/.github/workflows/build-windows-store.yml +++ b/.github/workflows/build-windows-store.yml @@ -6,7 +6,9 @@ on: paths: - .github/workflows/build-windows-store.yml - app/** - - src/** + - packages/cli/** + - dash/** + - scripts/** - package.json - package-lock.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1230adca..d369dba4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: set -e semgrep --config .semgrep/rules/no-bracket-assign-hot-paths.yml \ --strict --json \ - src/providers/ src/parser.ts > semgrep-out.json + packages/cli/src/providers/ packages/cli/src/parser.ts > semgrep-out.json FINDINGS=$(jq '.results | length' semgrep-out.json) if [ "$FINDINGS" -gt 0 ]; then jq -r '.results[] | "::error file=\(.path),line=\(.start.line)::\(.extra.message)"' semgrep-out.json diff --git a/.gitignore b/.gitignore index b71c1592..3e5622e6 100644 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,4 @@ desktop/ appstore/ # WIP / not ready -src/summit.ts +packages/cli/src/summit.ts diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aebe0f23..3fa31e53 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,7 +18,9 @@ cd codeburn npm install ``` -There is no separate build step required to run the dev CLI. `npm run dev` runs `tsx` against `src/cli.ts` directly. +This is an npm-workspaces monorepo: the published CLI lives in `packages/cli`, and `@codeburn/core` (a skeleton today) in `packages/core`. Run the root scripts (`npm test`, `npm run build`, `npm run dev`) from the repo root — they forward to the `codeburn` workspace. + +There is no separate build step required to run the dev CLI. `npm run dev` runs `tsx` against `packages/cli/src/cli.ts` directly. ## Common Commands @@ -26,8 +28,8 @@ There is no separate build step required to run the dev CLI. `npm run dev` runs |---|---| | `npm test` | Runs the vitest suite (42 test files, 568 tests). | | `npm run dev -- status` | Runs the CLI in dev mode against your real data. | -| `npm run build` | Bundles the litellm pricing snapshot, then runs `tsup` to produce `dist/cli.js`. | -| `npm run bundle-litellm` | Refreshes `src/data/litellm-snapshot.json` from the upstream litellm repo. | +| `npm run build` | Bundles the litellm pricing snapshot, then runs `tsup` to produce `packages/cli/dist/cli.js`. | +| `npm run bundle-litellm` | Refreshes `packages/cli/src/data/litellm-snapshot.json` from the upstream litellm repo. | To test a specific suite, pass a path: @@ -45,13 +47,16 @@ npm test -- tests/providers/codex.test.ts ## Project Layout ``` -src/ CLI, parsers, optimize detectors, cache layers -src/providers/ One file per AI tool integration -src/data/ Bundled litellm pricing snapshot -tests/ vitest specs -mac/ Swift menubar app -gnome/ GNOME shell extension -scripts/ Build helpers (litellm bundle) +packages/cli/ The published `codeburn` CLI (npm workspace) +packages/cli/src/ CLI, parsers, optimize detectors, cache layers +packages/cli/src/providers/ One file per AI tool integration +packages/cli/src/data/ Bundled litellm pricing snapshot +packages/cli/tests/ vitest specs +packages/core/ @codeburn/core — shared provider-agnostic core (skeleton) +dash/ React web dashboard (built into packages/cli/dist/dash) +mac/ Swift menubar app +gnome/ GNOME shell extension +scripts/ Build helpers (litellm bundle) ``` See `docs/architecture.md` for a fuller map. @@ -59,7 +64,7 @@ See `docs/architecture.md` for a fuller map. ## Coding Conventions - TypeScript strict mode is on. Do not introduce `any` without a comment explaining why. -- Avoid bracket-assign (`obj[key] = value`) on parsed user input in hot paths inside `src/providers/` and `src/parser.ts`. There is a Semgrep rule (`.semgrep/rules/no-bracket-assign-hot-paths.yml`) enforced in CI that will fail your PR if you do. Use a `Map` or an explicit allowlist instead. +- Avoid bracket-assign (`obj[key] = value`) on parsed user input in hot paths inside `packages/cli/src/providers/` and `packages/cli/src/parser.ts`. There is a Semgrep rule (`.semgrep/rules/no-bracket-assign-hot-paths.yml`) enforced in CI that will fail your PR if you do. Use a `Map` or an explicit allowlist instead. - Provider parsers must be deterministic given the same input. If you read the system clock or the filesystem outside the documented session paths, add a fixture-based test. - New providers go through `src/providers/index.ts`. Lazy-load anything that pulls a heavy native dependency (sqlite, protobuf) so users without that provider are not slowed down. diff --git a/RELEASING.md b/RELEASING.md index 8f1f0113..6f20b17a 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -26,15 +26,15 @@ npm run build ### 1. Update the Version -Edit `package.json` to bump the version number. Update both the `version` field at the top and the `package-lock.json` lockfile to match (npm handles this automatically): +The published CLI is the `codeburn` workspace at `packages/cli`. Edit `packages/cli/package.json` to bump the `version`; the root `package-lock.json` tracks it (npm handles this automatically): ```bash -npm version +npm version -w codeburn ``` -For example, `npm version 0.9.8` updates both files and creates a commit. +For example, `npm version 0.9.8 -w codeburn` updates the workspace package and the lockfile. -Alternatively, edit `package.json` by hand and run `npm install` to regenerate the lockfile with the new version. +Alternatively, edit `packages/cli/package.json` by hand and run `npm install` to regenerate the lockfile with the new version. ### 2. Update the Changelog @@ -57,19 +57,19 @@ Edit `CHANGELOG.md`. Move all changes from the "Unreleased" section into a new s Commit these changes: ```bash -git add CHANGELOG.md package.json package-lock.json +git add CHANGELOG.md packages/cli/package.json package-lock.json git commit -m "chore: bump to 0.9.8" ``` ### 3. Publish to npm -There is no GitHub Actions workflow for the CLI; the maintainer runs `npm publish` from a clean working tree: +There is no GitHub Actions workflow for the CLI; the maintainer publishes the `codeburn` workspace from a clean working tree: ```bash -npm publish +npm publish -w codeburn ``` -The `prepublishOnly` script in `package.json` runs `npm run build` first, which bundles the litellm pricing snapshot and then runs `tsup` to emit `dist/cli.js`. +The `prepublishOnly` script in `packages/cli/package.json` runs `npm run build` first, which bundles the litellm pricing snapshot and then runs `tsup` to emit `packages/cli/dist/cli.js`. If publishing for the first time on a new machine, run `npm login` first. diff --git a/app/electron/cli.test.ts b/app/electron/cli.test.ts index e95bc93d..97428afc 100644 --- a/app/electron/cli.test.ts +++ b/app/electron/cli.test.ts @@ -26,7 +26,7 @@ function fakeBin(name: string, body: string): string { /** Writes the repo CLI under this test's isolated dev-root override. */ function fakeDevRepoCli(): string { const repoRoot = join(dir, 'dev-repo') - const p = join(repoRoot, 'dist', 'cli.js') + const p = join(repoRoot, 'packages', 'cli', 'dist', 'cli.js') mkdirSync(dirname(p), { recursive: true }) writeFileSync(p, '#!/usr/bin/env node\n', { mode: 0o755 }) chmodSync(p, 0o755) diff --git a/app/electron/cli.ts b/app/electron/cli.ts index 30efddce..b10aacf1 100644 --- a/app/electron/cli.ts +++ b/app/electron/cli.ts @@ -258,14 +258,14 @@ export function resolveTarget(): CliTarget | null { const devRepoRoot = process.env.CODEBURN_DEV_REPO_ROOT if (devRepoRoot) { // Test/advanced override, matching CODEBURN_PATH_DIRS: keep dev lookup in an isolated repo root. - const devBin = join(devRepoRoot, 'dist', 'cli.js') + const devBin = join(devRepoRoot, 'packages', 'cli', 'dist', 'cli.js') if (isExecutableFile(devBin)) return { kind: 'external', bin: devBin } } else { - const devBin = join(__dirname, '..', '..', '..', 'dist', 'cli.js') + const devBin = join(__dirname, '..', '..', '..', 'packages', 'cli', 'dist', 'cli.js') if (isExecutableFile(devBin)) return { kind: 'external', bin: devBin } // Vitest loads this source module from app/electron rather than the emitted // app/dist/electron directory; keep the same repo CLI discoverable there. - const sourceDevBin = join(__dirname, '..', '..', 'dist', 'cli.js') + const sourceDevBin = join(__dirname, '..', '..', 'packages', 'cli', 'dist', 'cli.js') if (isExecutableFile(sourceDevBin)) return { kind: 'external', bin: sourceDevBin } } } diff --git a/app/scripts/stage-cli.mjs b/app/scripts/stage-cli.mjs index 69085678..ca48cb40 100644 --- a/app/scripts/stage-cli.mjs +++ b/app/scripts/stage-cli.mjs @@ -25,7 +25,10 @@ import { fileURLToPath } from 'node:url' const here = dirname(fileURLToPath(import.meta.url)) // app/scripts const appDir = join(here, '..') // app const root = join(appDir, '..') // repo root -const dist = join(root, 'dist') +const cliPkg = join(root, 'packages', 'cli') // the codeburn CLI workspace +const dist = join(cliPkg, 'dist') +// Workspace installs hoist production deps to the repo-root node_modules, so the +// dependency closure is copied from there. const rootModules = join(root, 'node_modules') const stage = join(appDir, 'build', 'cli') @@ -38,7 +41,7 @@ for (const f of ['cli.js', 'main.js']) { rmSync(stage, { recursive: true, force: true }) mkdirSync(join(stage, 'dist'), { recursive: true }) -copyFileSync(join(root, 'package.json'), join(stage, 'package.json')) +copyFileSync(join(cliPkg, 'package.json'), join(stage, 'package.json')) copyFileSync(join(dist, 'cli.js'), join(stage, 'dist', 'cli.js')) copyFileSync(join(dist, 'main.js'), join(stage, 'dist', 'main.js')) diff --git a/dash/vite.config.ts b/dash/vite.config.ts index ca07a91d..a9142de2 100644 --- a/dash/vite.config.ts +++ b/dash/vite.config.ts @@ -13,7 +13,7 @@ export default defineConfig({ alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) }, }, build: { - outDir: '../dist/dash', + outDir: '../packages/cli/dist/dash', emptyOutDir: true, }, server: { diff --git a/docs/architecture.md b/docs/architecture.md index 8131aa4e..f081348a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -26,9 +26,9 @@ CodeBurn is one Node.js CLI plus two GUI clients that shell out to it. The macOS menubar (`mac/`) and the GNOME extension (`gnome/`) both invoke `codeburn status --format menubar-json --period

` and parse the JSON. They do not share code with the CLI; they only depend on its output contract. -## CLI (`src/`) +## CLI (`packages/cli/src/`) -`src/cli.ts` is the Commander.js entry point. The bin field in `package.json` points at `dist/cli.js`. Twelve commands are registered: +`packages/cli/src/cli.ts` is the Commander.js entry point. The bin field in `packages/cli/package.json` points at `dist/cli.js`. Twelve commands are registered: | Command | Line | Purpose | |---|---|---| @@ -170,10 +170,10 @@ Plain JavaScript, no bundler. Targets GNOME Shell 45-50 (`metadata.json`). `npm run build` is two steps: -1. `node scripts/bundle-litellm.mjs` fetches the latest litellm pricing JSON and writes `src/data/litellm-snapshot.json`. The bundle script keeps a manual override for MiniMax variants. Direct (un-prefixed) entries win over prefixed ones. The result is checked in so the build is reproducible. -2. `tsup` reads `tsup.config.ts` and emits a single ESM bundle at `dist/cli.js` with a Node shebang banner. No source maps in publish builds; sourcemaps on for development. +1. `node ../../scripts/bundle-litellm.mjs` fetches the latest litellm pricing JSON and writes `packages/cli/src/data/litellm-snapshot.json`. The bundle script keeps a manual override for MiniMax variants. Direct (un-prefixed) entries win over prefixed ones. The result is checked in so the build is reproducible. +2. `tsup` reads `packages/cli/tsup.config.ts` and emits a single ESM bundle at `packages/cli/dist/cli.js` with a Node shebang banner. No source maps in publish builds; sourcemaps on for development. -The `prepublishOnly` hook in `package.json` runs `npm run build` so `npm publish` always ships fresh code. +The `prepublishOnly` hook in `packages/cli/package.json` runs `npm run build` so `npm publish -w codeburn` always ships fresh code. ## Tests diff --git a/docs/core/phase0-recipe.md b/docs/core/phase0-recipe.md index 100f655a..2c4a60b2 100644 --- a/docs/core/phase0-recipe.md +++ b/docs/core/phase0-recipe.md @@ -1,5 +1,12 @@ # Phase 0 fan-out recipe: lift `calculateCost` out of decoders +> **Path note (Phase 1):** The CLI source has moved into the `packages/cli` +> workspace. Every `src/...` and `tests/...` path in this document now lives +> under `packages/cli/` (e.g. `src/pricing-pass.ts` → `packages/cli/src/pricing-pass.ts`, +> `tests/providers/.test.ts` → `packages/cli/tests/providers/.test.ts`). +> Relative import paths inside `packages/cli/src` (such as `../../src/pricing-pass.js`) +> are unaffected because the source tree moved as a whole. + Phase 0 of the `@codeburn/core` extraction (issue #809) moves cost computation out of the provider decoders and into a single host-side pricing pass (`src/pricing-pass.ts`). Decoders emit **token counts + a `costBasis` marker**; diff --git a/package-lock.json b/package-lock.json index 463913b9..35c894b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,38 +1,16 @@ { - "name": "codeburn", + "name": "codeburn-monorepo", "version": "0.9.19", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "codeburn", + "name": "codeburn-monorepo", "version": "0.9.19", "license": "MIT", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.29.0", - "bonjour-service": "^1.4.1", - "chalk": "^5.4.1", - "commander": "^13.1.0", - "ink": "^7.0.0", - "react": "^19.2.5", - "selfsigned": "^5.5.0", - "strip-ansi": "^7.2.0", - "undici": "^7.27.2", - "zod": "^3.25.76" - }, - "bin": { - "codeburn": "dist/cli.js" - }, - "devDependencies": { - "@types/node": "^22.19.17", - "@types/react": "^19.2.14", - "@types/selfsigned": "^2.0.4", - "playwright": "^1.61.1", - "tsup": "^8.4.0", - "tsx": "^4.19.0", - "typescript": "^5.8.0", - "vitest": "^3.1.0" - }, + "workspaces": [ + "packages/*" + ], "engines": { "node": ">=22.13.0" } @@ -50,6 +28,10 @@ "node": ">=18" } }, + "node_modules/@codeburn/core": { + "resolved": "packages/core", + "link": true + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.7", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", @@ -1633,6 +1615,10 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, + "node_modules/codeburn": { + "resolved": "packages/cli", + "link": true + }, "node_modules/commander": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", @@ -4127,6 +4113,48 @@ "peerDependencies": { "zod": "^3.25.28 || ^4" } + }, + "packages/cli": { + "name": "codeburn", + "version": "0.9.19", + "license": "MIT", + "dependencies": { + "@codeburn/core": "*", + "@modelcontextprotocol/sdk": "^1.29.0", + "bonjour-service": "^1.4.1", + "chalk": "^5.4.1", + "commander": "^13.1.0", + "ink": "^7.0.0", + "react": "^19.2.5", + "selfsigned": "^5.5.0", + "strip-ansi": "^7.2.0", + "undici": "^7.27.2", + "zod": "^3.25.76" + }, + "bin": { + "codeburn": "dist/cli.js" + }, + "devDependencies": { + "@types/node": "^22.19.17", + "@types/react": "^19.2.14", + "@types/selfsigned": "^2.0.4", + "playwright": "^1.61.1", + "tsup": "^8.4.0", + "tsx": "^4.19.0", + "typescript": "^5.8.0", + "vitest": "^3.1.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "packages/core": { + "name": "@codeburn/core", + "version": "0.9.19", + "license": "MIT", + "engines": { + "node": ">=22.13.0" + } } } } diff --git a/package.json b/package.json index 3b823691..156eaa75 100644 --- a/package.json +++ b/package.json @@ -1,41 +1,20 @@ { - "name": "codeburn", + "name": "codeburn-monorepo", "version": "0.9.19", - "description": "See where your AI spend goes - by task, tool, model, and project", + "description": "CodeBurn monorepo — CLI (packages/cli) + @codeburn/core (packages/core)", + "private": true, "type": "module", - "main": "./dist/cli.js", - "bin": { - "codeburn": "dist/cli.js" - }, - "files": [ - "dist" + "workspaces": [ + "packages/*" ], "scripts": { - "bundle-litellm": "node scripts/bundle-litellm.mjs", - "build": "node scripts/bundle-litellm.mjs && tsup && node -e \"const fs=require('fs'); fs.copyFileSync('src/cli.ts','dist/cli.js'); fs.chmodSync('dist/cli.js',0o755)\" && npm run build:dash", - "build:cli": "tsup && node -e \"const fs=require('fs'); fs.copyFileSync('src/cli.ts','dist/cli.js'); fs.chmodSync('dist/cli.js',0o755)\"", - "build:dash": "cd dash && npm install --no-audit --no-fund --silent && npm run build", - "dev": "NODE_OPTIONS=--no-deprecation tsx src/cli.ts", - "test": "vitest", - "prepublishOnly": "npm run build" + "bundle-litellm": "npm run bundle-litellm -w codeburn", + "build": "npm run build -w codeburn", + "build:cli": "npm run build:cli -w codeburn", + "build:dash": "npm run build:dash -w codeburn", + "dev": "npm run dev -w codeburn", + "test": "npm run test -w codeburn" }, - "keywords": [ - "claude-code", - "cursor", - "codex", - "kimi", - "devin", - "ibm-bob", - "opencode", - "pi", - "codebuff", - "codewhale", - "ai-coding", - "token-usage", - "cost-tracking", - "observability", - "developer-tools" - ], "engines": { "node": ">=22.13.0" }, @@ -48,27 +27,5 @@ "bugs": { "url": "https://github.com/getagentseal/codeburn/issues" }, - "homepage": "https://github.com/getagentseal/codeburn#readme", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.29.0", - "bonjour-service": "^1.4.1", - "chalk": "^5.4.1", - "commander": "^13.1.0", - "ink": "^7.0.0", - "react": "^19.2.5", - "selfsigned": "^5.5.0", - "strip-ansi": "^7.2.0", - "undici": "^7.27.2", - "zod": "^3.25.76" - }, - "devDependencies": { - "@types/node": "^22.19.17", - "@types/react": "^19.2.14", - "@types/selfsigned": "^2.0.4", - "playwright": "^1.61.1", - "tsup": "^8.4.0", - "tsx": "^4.19.0", - "typescript": "^5.8.0", - "vitest": "^3.1.0" - } + "homepage": "https://github.com/getagentseal/codeburn#readme" } diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 00000000..ac76c3cc --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,75 @@ +{ + "name": "codeburn", + "version": "0.9.19", + "description": "See where your AI spend goes - by task, tool, model, and project", + "type": "module", + "main": "./dist/cli.js", + "bin": { + "codeburn": "dist/cli.js" + }, + "files": [ + "dist" + ], + "scripts": { + "bundle-litellm": "node ../../scripts/bundle-litellm.mjs", + "build": "node ../../scripts/bundle-litellm.mjs && tsup && node -e \"const fs=require('fs'); fs.copyFileSync('src/cli.ts','dist/cli.js'); fs.chmodSync('dist/cli.js',0o755)\" && npm run build:dash", + "build:cli": "tsup && node -e \"const fs=require('fs'); fs.copyFileSync('src/cli.ts','dist/cli.js'); fs.chmodSync('dist/cli.js',0o755)\"", + "build:dash": "cd ../../dash && npm install --no-audit --no-fund --silent && npm run build", + "dev": "NODE_OPTIONS=--no-deprecation tsx src/cli.ts", + "test": "vitest", + "prepublishOnly": "npm run build" + }, + "keywords": [ + "claude-code", + "cursor", + "codex", + "kimi", + "devin", + "ibm-bob", + "opencode", + "pi", + "codebuff", + "codewhale", + "ai-coding", + "token-usage", + "cost-tracking", + "observability", + "developer-tools" + ], + "engines": { + "node": ">=22.13.0" + }, + "author": "AgentSeal ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/getagentseal/codeburn.git" + }, + "bugs": { + "url": "https://github.com/getagentseal/codeburn/issues" + }, + "homepage": "https://github.com/getagentseal/codeburn#readme", + "dependencies": { + "@codeburn/core": "*", + "@modelcontextprotocol/sdk": "^1.29.0", + "bonjour-service": "^1.4.1", + "chalk": "^5.4.1", + "commander": "^13.1.0", + "ink": "^7.0.0", + "react": "^19.2.5", + "selfsigned": "^5.5.0", + "strip-ansi": "^7.2.0", + "undici": "^7.27.2", + "zod": "^3.25.76" + }, + "devDependencies": { + "@types/node": "^22.19.17", + "@types/react": "^19.2.14", + "@types/selfsigned": "^2.0.4", + "playwright": "^1.61.1", + "tsup": "^8.4.0", + "tsx": "^4.19.0", + "typescript": "^5.8.0", + "vitest": "^3.1.0" + } +} diff --git a/src/act/apply.ts b/packages/cli/src/act/apply.ts similarity index 100% rename from src/act/apply.ts rename to packages/cli/src/act/apply.ts diff --git a/src/act/backup.ts b/packages/cli/src/act/backup.ts similarity index 100% rename from src/act/backup.ts rename to packages/cli/src/act/backup.ts diff --git a/src/act/cli.ts b/packages/cli/src/act/cli.ts similarity index 100% rename from src/act/cli.ts rename to packages/cli/src/act/cli.ts diff --git a/src/act/journal.ts b/packages/cli/src/act/journal.ts similarity index 100% rename from src/act/journal.ts rename to packages/cli/src/act/journal.ts diff --git a/src/act/model-defaults.ts b/packages/cli/src/act/model-defaults.ts similarity index 100% rename from src/act/model-defaults.ts rename to packages/cli/src/act/model-defaults.ts diff --git a/src/act/optimize-apply.ts b/packages/cli/src/act/optimize-apply.ts similarity index 100% rename from src/act/optimize-apply.ts rename to packages/cli/src/act/optimize-apply.ts diff --git a/src/act/plans.ts b/packages/cli/src/act/plans.ts similarity index 100% rename from src/act/plans.ts rename to packages/cli/src/act/plans.ts diff --git a/src/act/report.ts b/packages/cli/src/act/report.ts similarity index 100% rename from src/act/report.ts rename to packages/cli/src/act/report.ts diff --git a/src/act/types.ts b/packages/cli/src/act/types.ts similarity index 100% rename from src/act/types.ts rename to packages/cli/src/act/types.ts diff --git a/src/act/undo.ts b/packages/cli/src/act/undo.ts similarity index 100% rename from src/act/undo.ts rename to packages/cli/src/act/undo.ts diff --git a/src/antigravity-statusline.ts b/packages/cli/src/antigravity-statusline.ts similarity index 100% rename from src/antigravity-statusline.ts rename to packages/cli/src/antigravity-statusline.ts diff --git a/src/audit-report.ts b/packages/cli/src/audit-report.ts similarity index 100% rename from src/audit-report.ts rename to packages/cli/src/audit-report.ts diff --git a/src/bash-utils.ts b/packages/cli/src/bash-utils.ts similarity index 100% rename from src/bash-utils.ts rename to packages/cli/src/bash-utils.ts diff --git a/src/budget.ts b/packages/cli/src/budget.ts similarity index 100% rename from src/budget.ts rename to packages/cli/src/budget.ts diff --git a/src/cache-refresh-lock.ts b/packages/cli/src/cache-refresh-lock.ts similarity index 100% rename from src/cache-refresh-lock.ts rename to packages/cli/src/cache-refresh-lock.ts diff --git a/src/classifier.ts b/packages/cli/src/classifier.ts similarity index 100% rename from src/classifier.ts rename to packages/cli/src/classifier.ts diff --git a/src/cli-date.ts b/packages/cli/src/cli-date.ts similarity index 100% rename from src/cli-date.ts rename to packages/cli/src/cli-date.ts diff --git a/src/cli.ts b/packages/cli/src/cli.ts similarity index 100% rename from src/cli.ts rename to packages/cli/src/cli.ts diff --git a/src/codex-cache.ts b/packages/cli/src/codex-cache.ts similarity index 100% rename from src/codex-cache.ts rename to packages/cli/src/codex-cache.ts diff --git a/src/codex-credits.ts b/packages/cli/src/codex-credits.ts similarity index 100% rename from src/codex-credits.ts rename to packages/cli/src/codex-credits.ts diff --git a/src/compare-stats.ts b/packages/cli/src/compare-stats.ts similarity index 100% rename from src/compare-stats.ts rename to packages/cli/src/compare-stats.ts diff --git a/src/compare.tsx b/packages/cli/src/compare.tsx similarity index 100% rename from src/compare.tsx rename to packages/cli/src/compare.tsx diff --git a/src/config.ts b/packages/cli/src/config.ts similarity index 100% rename from src/config.ts rename to packages/cli/src/config.ts diff --git a/src/content-utils.ts b/packages/cli/src/content-utils.ts similarity index 100% rename from src/content-utils.ts rename to packages/cli/src/content-utils.ts diff --git a/src/context-budget.ts b/packages/cli/src/context-budget.ts similarity index 100% rename from src/context-budget.ts rename to packages/cli/src/context-budget.ts diff --git a/src/context-tree-codex.ts b/packages/cli/src/context-tree-codex.ts similarity index 100% rename from src/context-tree-codex.ts rename to packages/cli/src/context-tree-codex.ts diff --git a/src/context-tree.ts b/packages/cli/src/context-tree.ts similarity index 100% rename from src/context-tree.ts rename to packages/cli/src/context-tree.ts diff --git a/src/context-tui.tsx b/packages/cli/src/context-tui.tsx similarity index 100% rename from src/context-tui.tsx rename to packages/cli/src/context-tui.tsx diff --git a/src/currency.ts b/packages/cli/src/currency.ts similarity index 100% rename from src/currency.ts rename to packages/cli/src/currency.ts diff --git a/src/cursor-cache.ts b/packages/cli/src/cursor-cache.ts similarity index 100% rename from src/cursor-cache.ts rename to packages/cli/src/cursor-cache.ts diff --git a/src/daily-cache.ts b/packages/cli/src/daily-cache.ts similarity index 100% rename from src/daily-cache.ts rename to packages/cli/src/daily-cache.ts diff --git a/src/dashboard.tsx b/packages/cli/src/dashboard.tsx similarity index 100% rename from src/dashboard.tsx rename to packages/cli/src/dashboard.tsx diff --git a/src/data/litellm-snapshot.json b/packages/cli/src/data/litellm-snapshot.json similarity index 100% rename from src/data/litellm-snapshot.json rename to packages/cli/src/data/litellm-snapshot.json diff --git a/src/data/pricing-fallback.json b/packages/cli/src/data/pricing-fallback.json similarity index 100% rename from src/data/pricing-fallback.json rename to packages/cli/src/data/pricing-fallback.json diff --git a/src/day-aggregator.ts b/packages/cli/src/day-aggregator.ts similarity index 100% rename from src/day-aggregator.ts rename to packages/cli/src/day-aggregator.ts diff --git a/src/doctor.ts b/packages/cli/src/doctor.ts similarity index 100% rename from src/doctor.ts rename to packages/cli/src/doctor.ts diff --git a/src/export.ts b/packages/cli/src/export.ts similarity index 100% rename from src/export.ts rename to packages/cli/src/export.ts diff --git a/src/fetch-utils.ts b/packages/cli/src/fetch-utils.ts similarity index 100% rename from src/fetch-utils.ts rename to packages/cli/src/fetch-utils.ts diff --git a/src/format.ts b/packages/cli/src/format.ts similarity index 100% rename from src/format.ts rename to packages/cli/src/format.ts diff --git a/src/fs-utils.ts b/packages/cli/src/fs-utils.ts similarity index 100% rename from src/fs-utils.ts rename to packages/cli/src/fs-utils.ts diff --git a/src/granular-history.ts b/packages/cli/src/granular-history.ts similarity index 100% rename from src/granular-history.ts rename to packages/cli/src/granular-history.ts diff --git a/src/guard/cli.ts b/packages/cli/src/guard/cli.ts similarity index 100% rename from src/guard/cli.ts rename to packages/cli/src/guard/cli.ts diff --git a/src/guard/flags.ts b/packages/cli/src/guard/flags.ts similarity index 100% rename from src/guard/flags.ts rename to packages/cli/src/guard/flags.ts diff --git a/src/guard/hooks.ts b/packages/cli/src/guard/hooks.ts similarity index 100% rename from src/guard/hooks.ts rename to packages/cli/src/guard/hooks.ts diff --git a/src/guard/settings.ts b/packages/cli/src/guard/settings.ts similarity index 100% rename from src/guard/settings.ts rename to packages/cli/src/guard/settings.ts diff --git a/src/guard/store.ts b/packages/cli/src/guard/store.ts similarity index 100% rename from src/guard/store.ts rename to packages/cli/src/guard/store.ts diff --git a/src/guard/usage.ts b/packages/cli/src/guard/usage.ts similarity index 100% rename from src/guard/usage.ts rename to packages/cli/src/guard/usage.ts diff --git a/src/ink-win.ts b/packages/cli/src/ink-win.ts similarity index 100% rename from src/ink-win.ts rename to packages/cli/src/ink-win.ts diff --git a/src/main.ts b/packages/cli/src/main.ts similarity index 100% rename from src/main.ts rename to packages/cli/src/main.ts diff --git a/src/mcp/redact.ts b/packages/cli/src/mcp/redact.ts similarity index 100% rename from src/mcp/redact.ts rename to packages/cli/src/mcp/redact.ts diff --git a/src/mcp/server.ts b/packages/cli/src/mcp/server.ts similarity index 100% rename from src/mcp/server.ts rename to packages/cli/src/mcp/server.ts diff --git a/src/mcp/tables.ts b/packages/cli/src/mcp/tables.ts similarity index 100% rename from src/mcp/tables.ts rename to packages/cli/src/mcp/tables.ts diff --git a/src/menubar-installer.ts b/packages/cli/src/menubar-installer.ts similarity index 100% rename from src/menubar-installer.ts rename to packages/cli/src/menubar-installer.ts diff --git a/src/menubar-json.ts b/packages/cli/src/menubar-json.ts similarity index 100% rename from src/menubar-json.ts rename to packages/cli/src/menubar-json.ts diff --git a/src/model-breakdown.ts b/packages/cli/src/model-breakdown.ts similarity index 100% rename from src/model-breakdown.ts rename to packages/cli/src/model-breakdown.ts diff --git a/src/model-efficiency.ts b/packages/cli/src/model-efficiency.ts similarity index 100% rename from src/model-efficiency.ts rename to packages/cli/src/model-efficiency.ts diff --git a/src/models-report.ts b/packages/cli/src/models-report.ts similarity index 100% rename from src/models-report.ts rename to packages/cli/src/models-report.ts diff --git a/src/models.ts b/packages/cli/src/models.ts similarity index 100% rename from src/models.ts rename to packages/cli/src/models.ts diff --git a/src/optimize.ts b/packages/cli/src/optimize.ts similarity index 100% rename from src/optimize.ts rename to packages/cli/src/optimize.ts diff --git a/src/overview.ts b/packages/cli/src/overview.ts similarity index 100% rename from src/overview.ts rename to packages/cli/src/overview.ts diff --git a/src/parser.ts b/packages/cli/src/parser.ts similarity index 100% rename from src/parser.ts rename to packages/cli/src/parser.ts diff --git a/src/persistent-codeburn.ts b/packages/cli/src/persistent-codeburn.ts similarity index 100% rename from src/persistent-codeburn.ts rename to packages/cli/src/persistent-codeburn.ts diff --git a/src/plan-usage.ts b/packages/cli/src/plan-usage.ts similarity index 100% rename from src/plan-usage.ts rename to packages/cli/src/plan-usage.ts diff --git a/src/plans.ts b/packages/cli/src/plans.ts similarity index 100% rename from src/plans.ts rename to packages/cli/src/plans.ts diff --git a/src/pricing-pass.ts b/packages/cli/src/pricing-pass.ts similarity index 100% rename from src/pricing-pass.ts rename to packages/cli/src/pricing-pass.ts diff --git a/src/providers/antigravity.ts b/packages/cli/src/providers/antigravity.ts similarity index 100% rename from src/providers/antigravity.ts rename to packages/cli/src/providers/antigravity.ts diff --git a/src/providers/claude.ts b/packages/cli/src/providers/claude.ts similarity index 100% rename from src/providers/claude.ts rename to packages/cli/src/providers/claude.ts diff --git a/src/providers/cline.ts b/packages/cli/src/providers/cline.ts similarity index 100% rename from src/providers/cline.ts rename to packages/cli/src/providers/cline.ts diff --git a/src/providers/codebuff.ts b/packages/cli/src/providers/codebuff.ts similarity index 100% rename from src/providers/codebuff.ts rename to packages/cli/src/providers/codebuff.ts diff --git a/src/providers/codewhale.ts b/packages/cli/src/providers/codewhale.ts similarity index 100% rename from src/providers/codewhale.ts rename to packages/cli/src/providers/codewhale.ts diff --git a/src/providers/codex.ts b/packages/cli/src/providers/codex.ts similarity index 100% rename from src/providers/codex.ts rename to packages/cli/src/providers/codex.ts diff --git a/src/providers/copilot.ts b/packages/cli/src/providers/copilot.ts similarity index 100% rename from src/providers/copilot.ts rename to packages/cli/src/providers/copilot.ts diff --git a/src/providers/crush.ts b/packages/cli/src/providers/crush.ts similarity index 100% rename from src/providers/crush.ts rename to packages/cli/src/providers/crush.ts diff --git a/src/providers/cursor-agent.ts b/packages/cli/src/providers/cursor-agent.ts similarity index 100% rename from src/providers/cursor-agent.ts rename to packages/cli/src/providers/cursor-agent.ts diff --git a/src/providers/cursor.ts b/packages/cli/src/providers/cursor.ts similarity index 100% rename from src/providers/cursor.ts rename to packages/cli/src/providers/cursor.ts diff --git a/src/providers/devin.ts b/packages/cli/src/providers/devin.ts similarity index 100% rename from src/providers/devin.ts rename to packages/cli/src/providers/devin.ts diff --git a/src/providers/droid.ts b/packages/cli/src/providers/droid.ts similarity index 100% rename from src/providers/droid.ts rename to packages/cli/src/providers/droid.ts diff --git a/src/providers/forge.ts b/packages/cli/src/providers/forge.ts similarity index 100% rename from src/providers/forge.ts rename to packages/cli/src/providers/forge.ts diff --git a/src/providers/gemini.ts b/packages/cli/src/providers/gemini.ts similarity index 100% rename from src/providers/gemini.ts rename to packages/cli/src/providers/gemini.ts diff --git a/src/providers/goose.ts b/packages/cli/src/providers/goose.ts similarity index 100% rename from src/providers/goose.ts rename to packages/cli/src/providers/goose.ts diff --git a/src/providers/grok.ts b/packages/cli/src/providers/grok.ts similarity index 100% rename from src/providers/grok.ts rename to packages/cli/src/providers/grok.ts diff --git a/src/providers/hermes.ts b/packages/cli/src/providers/hermes.ts similarity index 100% rename from src/providers/hermes.ts rename to packages/cli/src/providers/hermes.ts diff --git a/src/providers/ibm-bob.ts b/packages/cli/src/providers/ibm-bob.ts similarity index 100% rename from src/providers/ibm-bob.ts rename to packages/cli/src/providers/ibm-bob.ts diff --git a/src/providers/index.ts b/packages/cli/src/providers/index.ts similarity index 100% rename from src/providers/index.ts rename to packages/cli/src/providers/index.ts diff --git a/src/providers/kilo-code.ts b/packages/cli/src/providers/kilo-code.ts similarity index 100% rename from src/providers/kilo-code.ts rename to packages/cli/src/providers/kilo-code.ts diff --git a/src/providers/kimi.ts b/packages/cli/src/providers/kimi.ts similarity index 100% rename from src/providers/kimi.ts rename to packages/cli/src/providers/kimi.ts diff --git a/src/providers/kimicode.ts b/packages/cli/src/providers/kimicode.ts similarity index 100% rename from src/providers/kimicode.ts rename to packages/cli/src/providers/kimicode.ts diff --git a/src/providers/kiro.ts b/packages/cli/src/providers/kiro.ts similarity index 100% rename from src/providers/kiro.ts rename to packages/cli/src/providers/kiro.ts diff --git a/src/providers/lingtai-tui.ts b/packages/cli/src/providers/lingtai-tui.ts similarity index 100% rename from src/providers/lingtai-tui.ts rename to packages/cli/src/providers/lingtai-tui.ts diff --git a/src/providers/mistral-vibe.ts b/packages/cli/src/providers/mistral-vibe.ts similarity index 100% rename from src/providers/mistral-vibe.ts rename to packages/cli/src/providers/mistral-vibe.ts diff --git a/src/providers/mux.ts b/packages/cli/src/providers/mux.ts similarity index 100% rename from src/providers/mux.ts rename to packages/cli/src/providers/mux.ts diff --git a/src/providers/open-design.ts b/packages/cli/src/providers/open-design.ts similarity index 100% rename from src/providers/open-design.ts rename to packages/cli/src/providers/open-design.ts diff --git a/src/providers/openclaw.ts b/packages/cli/src/providers/openclaw.ts similarity index 100% rename from src/providers/openclaw.ts rename to packages/cli/src/providers/openclaw.ts diff --git a/src/providers/opencode-file-parser.ts b/packages/cli/src/providers/opencode-file-parser.ts similarity index 100% rename from src/providers/opencode-file-parser.ts rename to packages/cli/src/providers/opencode-file-parser.ts diff --git a/src/providers/opencode.ts b/packages/cli/src/providers/opencode.ts similarity index 100% rename from src/providers/opencode.ts rename to packages/cli/src/providers/opencode.ts diff --git a/src/providers/pi.ts b/packages/cli/src/providers/pi.ts similarity index 100% rename from src/providers/pi.ts rename to packages/cli/src/providers/pi.ts diff --git a/src/providers/quickdesk.ts b/packages/cli/src/providers/quickdesk.ts similarity index 100% rename from src/providers/quickdesk.ts rename to packages/cli/src/providers/quickdesk.ts diff --git a/src/providers/qwen.ts b/packages/cli/src/providers/qwen.ts similarity index 100% rename from src/providers/qwen.ts rename to packages/cli/src/providers/qwen.ts diff --git a/src/providers/roo-code.ts b/packages/cli/src/providers/roo-code.ts similarity index 100% rename from src/providers/roo-code.ts rename to packages/cli/src/providers/roo-code.ts diff --git a/src/providers/session-message.ts b/packages/cli/src/providers/session-message.ts similarity index 100% rename from src/providers/session-message.ts rename to packages/cli/src/providers/session-message.ts diff --git a/src/providers/sqlite-session-parser.ts b/packages/cli/src/providers/sqlite-session-parser.ts similarity index 100% rename from src/providers/sqlite-session-parser.ts rename to packages/cli/src/providers/sqlite-session-parser.ts diff --git a/src/providers/types.ts b/packages/cli/src/providers/types.ts similarity index 100% rename from src/providers/types.ts rename to packages/cli/src/providers/types.ts diff --git a/src/providers/vercel-gateway.ts b/packages/cli/src/providers/vercel-gateway.ts similarity index 100% rename from src/providers/vercel-gateway.ts rename to packages/cli/src/providers/vercel-gateway.ts diff --git a/src/providers/vscode-cline-parser.ts b/packages/cli/src/providers/vscode-cline-parser.ts similarity index 100% rename from src/providers/vscode-cline-parser.ts rename to packages/cli/src/providers/vscode-cline-parser.ts diff --git a/src/providers/warp.ts b/packages/cli/src/providers/warp.ts similarity index 100% rename from src/providers/warp.ts rename to packages/cli/src/providers/warp.ts diff --git a/src/providers/zcode.ts b/packages/cli/src/providers/zcode.ts similarity index 100% rename from src/providers/zcode.ts rename to packages/cli/src/providers/zcode.ts diff --git a/src/providers/zed.ts b/packages/cli/src/providers/zed.ts similarity index 100% rename from src/providers/zed.ts rename to packages/cli/src/providers/zed.ts diff --git a/src/providers/zerostack.ts b/packages/cli/src/providers/zerostack.ts similarity index 100% rename from src/providers/zerostack.ts rename to packages/cli/src/providers/zerostack.ts diff --git a/src/quota.ts b/packages/cli/src/quota.ts similarity index 100% rename from src/quota.ts rename to packages/cli/src/quota.ts diff --git a/src/session-cache.ts b/packages/cli/src/session-cache.ts similarity index 100% rename from src/session-cache.ts rename to packages/cli/src/session-cache.ts diff --git a/src/sessions-report.ts b/packages/cli/src/sessions-report.ts similarity index 100% rename from src/sessions-report.ts rename to packages/cli/src/sessions-report.ts diff --git a/src/sessions-tui.tsx b/packages/cli/src/sessions-tui.tsx similarity index 100% rename from src/sessions-tui.tsx rename to packages/cli/src/sessions-tui.tsx diff --git a/src/sharing/client.ts b/packages/cli/src/sharing/client.ts similarity index 100% rename from src/sharing/client.ts rename to packages/cli/src/sharing/client.ts diff --git a/src/sharing/discovery.ts b/packages/cli/src/sharing/discovery.ts similarity index 100% rename from src/sharing/discovery.ts rename to packages/cli/src/sharing/discovery.ts diff --git a/src/sharing/host.ts b/packages/cli/src/sharing/host.ts similarity index 100% rename from src/sharing/host.ts rename to packages/cli/src/sharing/host.ts diff --git a/src/sharing/identity.ts b/packages/cli/src/sharing/identity.ts similarity index 100% rename from src/sharing/identity.ts rename to packages/cli/src/sharing/identity.ts diff --git a/src/sharing/pairing.ts b/packages/cli/src/sharing/pairing.ts similarity index 100% rename from src/sharing/pairing.ts rename to packages/cli/src/sharing/pairing.ts diff --git a/src/sharing/prompt.ts b/packages/cli/src/sharing/prompt.ts similarity index 100% rename from src/sharing/prompt.ts rename to packages/cli/src/sharing/prompt.ts diff --git a/src/sharing/sanitize.ts b/packages/cli/src/sharing/sanitize.ts similarity index 100% rename from src/sharing/sanitize.ts rename to packages/cli/src/sharing/sanitize.ts diff --git a/src/sharing/share-controller.ts b/packages/cli/src/sharing/share-controller.ts similarity index 100% rename from src/sharing/share-controller.ts rename to packages/cli/src/sharing/share-controller.ts diff --git a/src/sharing/share-run.ts b/packages/cli/src/sharing/share-run.ts similarity index 100% rename from src/sharing/share-run.ts rename to packages/cli/src/sharing/share-run.ts diff --git a/src/sharing/share-server.ts b/packages/cli/src/sharing/share-server.ts similarity index 100% rename from src/sharing/share-server.ts rename to packages/cli/src/sharing/share-server.ts diff --git a/src/sharing/store.ts b/packages/cli/src/sharing/store.ts similarity index 100% rename from src/sharing/store.ts rename to packages/cli/src/sharing/store.ts diff --git a/src/spend-flow.ts b/packages/cli/src/spend-flow.ts similarity index 100% rename from src/spend-flow.ts rename to packages/cli/src/spend-flow.ts diff --git a/src/sqlite.ts b/packages/cli/src/sqlite.ts similarity index 100% rename from src/sqlite.ts rename to packages/cli/src/sqlite.ts diff --git a/src/sync/auth.ts b/packages/cli/src/sync/auth.ts similarity index 100% rename from src/sync/auth.ts rename to packages/cli/src/sync/auth.ts diff --git a/src/sync/cli.ts b/packages/cli/src/sync/cli.ts similarity index 100% rename from src/sync/cli.ts rename to packages/cli/src/sync/cli.ts diff --git a/src/sync/config.ts b/packages/cli/src/sync/config.ts similarity index 100% rename from src/sync/config.ts rename to packages/cli/src/sync/config.ts diff --git a/src/sync/credentials.ts b/packages/cli/src/sync/credentials.ts similarity index 100% rename from src/sync/credentials.ts rename to packages/cli/src/sync/credentials.ts diff --git a/src/sync/discovery.ts b/packages/cli/src/sync/discovery.ts similarity index 100% rename from src/sync/discovery.ts rename to packages/cli/src/sync/discovery.ts diff --git a/src/sync/index.ts b/packages/cli/src/sync/index.ts similarity index 100% rename from src/sync/index.ts rename to packages/cli/src/sync/index.ts diff --git a/src/sync/ledger.ts b/packages/cli/src/sync/ledger.ts similarity index 100% rename from src/sync/ledger.ts rename to packages/cli/src/sync/ledger.ts diff --git a/src/sync/otlp.ts b/packages/cli/src/sync/otlp.ts similarity index 100% rename from src/sync/otlp.ts rename to packages/cli/src/sync/otlp.ts diff --git a/src/sync/push.ts b/packages/cli/src/sync/push.ts similarity index 100% rename from src/sync/push.ts rename to packages/cli/src/sync/push.ts diff --git a/src/text-table.ts b/packages/cli/src/text-table.ts similarity index 100% rename from src/text-table.ts rename to packages/cli/src/text-table.ts diff --git a/src/token-estimate.ts b/packages/cli/src/token-estimate.ts similarity index 100% rename from src/token-estimate.ts rename to packages/cli/src/token-estimate.ts diff --git a/src/types.ts b/packages/cli/src/types.ts similarity index 100% rename from src/types.ts rename to packages/cli/src/types.ts diff --git a/src/usage-aggregator.ts b/packages/cli/src/usage-aggregator.ts similarity index 100% rename from src/usage-aggregator.ts rename to packages/cli/src/usage-aggregator.ts diff --git a/src/web-dashboard.ts b/packages/cli/src/web-dashboard.ts similarity index 100% rename from src/web-dashboard.ts rename to packages/cli/src/web-dashboard.ts diff --git a/src/workflow-insights.ts b/packages/cli/src/workflow-insights.ts similarity index 100% rename from src/workflow-insights.ts rename to packages/cli/src/workflow-insights.ts diff --git a/src/yield.ts b/packages/cli/src/yield.ts similarity index 100% rename from src/yield.ts rename to packages/cli/src/yield.ts diff --git a/tests/act-journal.test.ts b/packages/cli/tests/act-journal.test.ts similarity index 100% rename from tests/act-journal.test.ts rename to packages/cli/tests/act-journal.test.ts diff --git a/tests/act-model-defaults.test.ts b/packages/cli/tests/act-model-defaults.test.ts similarity index 100% rename from tests/act-model-defaults.test.ts rename to packages/cli/tests/act-model-defaults.test.ts diff --git a/tests/act-report.test.ts b/packages/cli/tests/act-report.test.ts similarity index 100% rename from tests/act-report.test.ts rename to packages/cli/tests/act-report.test.ts diff --git a/tests/act-undo.test.ts b/packages/cli/tests/act-undo.test.ts similarity index 100% rename from tests/act-undo.test.ts rename to packages/cli/tests/act-undo.test.ts diff --git a/tests/antigravity-statusline.test.ts b/packages/cli/tests/antigravity-statusline.test.ts similarity index 100% rename from tests/antigravity-statusline.test.ts rename to packages/cli/tests/antigravity-statusline.test.ts diff --git a/tests/audit-report.test.ts b/packages/cli/tests/audit-report.test.ts similarity index 100% rename from tests/audit-report.test.ts rename to packages/cli/tests/audit-report.test.ts diff --git a/tests/bash-commands.test.ts b/packages/cli/tests/bash-commands.test.ts similarity index 100% rename from tests/bash-commands.test.ts rename to packages/cli/tests/bash-commands.test.ts diff --git a/tests/blob-to-text.test.ts b/packages/cli/tests/blob-to-text.test.ts similarity index 100% rename from tests/blob-to-text.test.ts rename to packages/cli/tests/blob-to-text.test.ts diff --git a/tests/budget.test.ts b/packages/cli/tests/budget.test.ts similarity index 100% rename from tests/budget.test.ts rename to packages/cli/tests/budget.test.ts diff --git a/tests/cache-persistence-coldstart.test.ts b/packages/cli/tests/cache-persistence-coldstart.test.ts similarity index 100% rename from tests/cache-persistence-coldstart.test.ts rename to packages/cli/tests/cache-persistence-coldstart.test.ts diff --git a/tests/cache-refresh-lock-process.test.ts b/packages/cli/tests/cache-refresh-lock-process.test.ts similarity index 100% rename from tests/cache-refresh-lock-process.test.ts rename to packages/cli/tests/cache-refresh-lock-process.test.ts diff --git a/tests/cache-refresh-lock.test.ts b/packages/cli/tests/cache-refresh-lock.test.ts similarity index 100% rename from tests/cache-refresh-lock.test.ts rename to packages/cli/tests/cache-refresh-lock.test.ts diff --git a/tests/classifier.test.ts b/packages/cli/tests/classifier.test.ts similarity index 100% rename from tests/classifier.test.ts rename to packages/cli/tests/classifier.test.ts diff --git a/tests/cli-budget.test.ts b/packages/cli/tests/cli-budget.test.ts similarity index 100% rename from tests/cli-budget.test.ts rename to packages/cli/tests/cli-budget.test.ts diff --git a/tests/cli-date.test.ts b/packages/cli/tests/cli-date.test.ts similarity index 100% rename from tests/cli-date.test.ts rename to packages/cli/tests/cli-date.test.ts diff --git a/tests/cli-deepseek-v4-pricing.test.ts b/packages/cli/tests/cli-deepseek-v4-pricing.test.ts similarity index 100% rename from tests/cli-deepseek-v4-pricing.test.ts rename to packages/cli/tests/cli-deepseek-v4-pricing.test.ts diff --git a/tests/cli-devin-model-variants.test.ts b/packages/cli/tests/cli-devin-model-variants.test.ts similarity index 100% rename from tests/cli-devin-model-variants.test.ts rename to packages/cli/tests/cli-devin-model-variants.test.ts diff --git a/tests/cli-durable-totals.test.ts b/packages/cli/tests/cli-durable-totals.test.ts similarity index 100% rename from tests/cli-durable-totals.test.ts rename to packages/cli/tests/cli-durable-totals.test.ts diff --git a/tests/cli-emitters.test.ts b/packages/cli/tests/cli-emitters.test.ts similarity index 100% rename from tests/cli-emitters.test.ts rename to packages/cli/tests/cli-emitters.test.ts diff --git a/tests/cli-export-date-range.test.ts b/packages/cli/tests/cli-export-date-range.test.ts similarity index 100% rename from tests/cli-export-date-range.test.ts rename to packages/cli/tests/cli-export-date-range.test.ts diff --git a/tests/cli-json-daily.test.ts b/packages/cli/tests/cli-json-daily.test.ts similarity index 100% rename from tests/cli-json-daily.test.ts rename to packages/cli/tests/cli-json-daily.test.ts diff --git a/tests/cli-model-savings.test.ts b/packages/cli/tests/cli-model-savings.test.ts similarity index 100% rename from tests/cli-model-savings.test.ts rename to packages/cli/tests/cli-model-savings.test.ts diff --git a/tests/cli-plan.test.ts b/packages/cli/tests/cli-plan.test.ts similarity index 100% rename from tests/cli-plan.test.ts rename to packages/cli/tests/cli-plan.test.ts diff --git a/tests/cli-price-override.test.ts b/packages/cli/tests/cli-price-override.test.ts similarity index 100% rename from tests/cli-price-override.test.ts rename to packages/cli/tests/cli-price-override.test.ts diff --git a/tests/cli-provider-validation.test.ts b/packages/cli/tests/cli-provider-validation.test.ts similarity index 100% rename from tests/cli-provider-validation.test.ts rename to packages/cli/tests/cli-provider-validation.test.ts diff --git a/tests/cli-proxy-path.test.ts b/packages/cli/tests/cli-proxy-path.test.ts similarity index 100% rename from tests/cli-proxy-path.test.ts rename to packages/cli/tests/cli-proxy-path.test.ts diff --git a/tests/cli-settings-json.test.ts b/packages/cli/tests/cli-settings-json.test.ts similarity index 100% rename from tests/cli-settings-json.test.ts rename to packages/cli/tests/cli-settings-json.test.ts diff --git a/tests/cli-status-menubar.test.ts b/packages/cli/tests/cli-status-menubar.test.ts similarity index 100% rename from tests/cli-status-menubar.test.ts rename to packages/cli/tests/cli-status-menubar.test.ts diff --git a/tests/codex-cache-invalidation.test.ts b/packages/cli/tests/codex-cache-invalidation.test.ts similarity index 100% rename from tests/codex-cache-invalidation.test.ts rename to packages/cli/tests/codex-cache-invalidation.test.ts diff --git a/tests/codex-credits.test.ts b/packages/cli/tests/codex-credits.test.ts similarity index 100% rename from tests/codex-credits.test.ts rename to packages/cli/tests/codex-credits.test.ts diff --git a/tests/codex-rich-capture.test.ts b/packages/cli/tests/codex-rich-capture.test.ts similarity index 100% rename from tests/codex-rich-capture.test.ts rename to packages/cli/tests/codex-rich-capture.test.ts diff --git a/tests/compare-stats.test.ts b/packages/cli/tests/compare-stats.test.ts similarity index 100% rename from tests/compare-stats.test.ts rename to packages/cli/tests/compare-stats.test.ts diff --git a/tests/content-utils.test.ts b/packages/cli/tests/content-utils.test.ts similarity index 100% rename from tests/content-utils.test.ts rename to packages/cli/tests/content-utils.test.ts diff --git a/tests/cross-provider-pr-correlation.test.ts b/packages/cli/tests/cross-provider-pr-correlation.test.ts similarity index 100% rename from tests/cross-provider-pr-correlation.test.ts rename to packages/cli/tests/cross-provider-pr-correlation.test.ts diff --git a/tests/currency-rounding.test.ts b/packages/cli/tests/currency-rounding.test.ts similarity index 100% rename from tests/currency-rounding.test.ts rename to packages/cli/tests/currency-rounding.test.ts diff --git a/tests/daily-cache-carry-forward.test.ts b/packages/cli/tests/daily-cache-carry-forward.test.ts similarity index 100% rename from tests/daily-cache-carry-forward.test.ts rename to packages/cli/tests/daily-cache-carry-forward.test.ts diff --git a/tests/daily-cache.test.ts b/packages/cli/tests/daily-cache.test.ts similarity index 100% rename from tests/daily-cache.test.ts rename to packages/cli/tests/daily-cache.test.ts diff --git a/tests/dashboard.test.ts b/packages/cli/tests/dashboard.test.ts similarity index 100% rename from tests/dashboard.test.ts rename to packages/cli/tests/dashboard.test.ts diff --git a/tests/date-range-filter.test.ts b/packages/cli/tests/date-range-filter.test.ts similarity index 100% rename from tests/date-range-filter.test.ts rename to packages/cli/tests/date-range-filter.test.ts diff --git a/tests/day-aggregator-savings.test.ts b/packages/cli/tests/day-aggregator-savings.test.ts similarity index 100% rename from tests/day-aggregator-savings.test.ts rename to packages/cli/tests/day-aggregator-savings.test.ts diff --git a/tests/day-aggregator.test.ts b/packages/cli/tests/day-aggregator.test.ts similarity index 100% rename from tests/day-aggregator.test.ts rename to packages/cli/tests/day-aggregator.test.ts diff --git a/tests/defer-plans.test.ts b/packages/cli/tests/defer-plans.test.ts similarity index 100% rename from tests/defer-plans.test.ts rename to packages/cli/tests/defer-plans.test.ts diff --git a/tests/devices-json.test.ts b/packages/cli/tests/devices-json.test.ts similarity index 100% rename from tests/devices-json.test.ts rename to packages/cli/tests/devices-json.test.ts diff --git a/tests/doctor.test.ts b/packages/cli/tests/doctor.test.ts similarity index 100% rename from tests/doctor.test.ts rename to packages/cli/tests/doctor.test.ts diff --git a/tests/export.test.ts b/packages/cli/tests/export.test.ts similarity index 100% rename from tests/export.test.ts rename to packages/cli/tests/export.test.ts diff --git a/tests/fetch-utils.test.ts b/packages/cli/tests/fetch-utils.test.ts similarity index 100% rename from tests/fetch-utils.test.ts rename to packages/cli/tests/fetch-utils.test.ts diff --git a/tests/fixtures/antigravity-cli-current/brain/fixture-current-cli/.system_generated/logs/transcript.jsonl b/packages/cli/tests/fixtures/antigravity-cli-current/brain/fixture-current-cli/.system_generated/logs/transcript.jsonl similarity index 100% rename from tests/fixtures/antigravity-cli-current/brain/fixture-current-cli/.system_generated/logs/transcript.jsonl rename to packages/cli/tests/fixtures/antigravity-cli-current/brain/fixture-current-cli/.system_generated/logs/transcript.jsonl diff --git a/tests/fixtures/antigravity-cli-current/gen-metadata.json b/packages/cli/tests/fixtures/antigravity-cli-current/gen-metadata.json similarity index 100% rename from tests/fixtures/antigravity-cli-current/gen-metadata.json rename to packages/cli/tests/fixtures/antigravity-cli-current/gen-metadata.json diff --git a/tests/fixtures/cache-refresh-worker.ts b/packages/cli/tests/fixtures/cache-refresh-worker.ts similarity index 100% rename from tests/fixtures/cache-refresh-worker.ts rename to packages/cli/tests/fixtures/cache-refresh-worker.ts diff --git a/tests/fixtures/cursor-agent/workspace-less/projects/agent-transcripts/1031d227-0c67-4e17-8954-0b6e2b3322f0/1031d227-0c67-4e17-8954-0b6e2b3322f0.jsonl b/packages/cli/tests/fixtures/cursor-agent/workspace-less/projects/agent-transcripts/1031d227-0c67-4e17-8954-0b6e2b3322f0/1031d227-0c67-4e17-8954-0b6e2b3322f0.jsonl similarity index 100% rename from tests/fixtures/cursor-agent/workspace-less/projects/agent-transcripts/1031d227-0c67-4e17-8954-0b6e2b3322f0/1031d227-0c67-4e17-8954-0b6e2b3322f0.jsonl rename to packages/cli/tests/fixtures/cursor-agent/workspace-less/projects/agent-transcripts/1031d227-0c67-4e17-8954-0b6e2b3322f0/1031d227-0c67-4e17-8954-0b6e2b3322f0.jsonl diff --git a/tests/fixtures/mock-discovery-register.mjs b/packages/cli/tests/fixtures/mock-discovery-register.mjs similarity index 100% rename from tests/fixtures/mock-discovery-register.mjs rename to packages/cli/tests/fixtures/mock-discovery-register.mjs diff --git a/tests/fixtures/mock-idp.ts b/packages/cli/tests/fixtures/mock-idp.ts similarity index 100% rename from tests/fixtures/mock-idp.ts rename to packages/cli/tests/fixtures/mock-idp.ts diff --git a/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-mixed/events.jsonl b/packages/cli/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-mixed/events.jsonl similarity index 100% rename from tests/fixtures/open-design/namespaces/release-stable/data/runs/run-mixed/events.jsonl rename to packages/cli/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-mixed/events.jsonl diff --git a/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-no-usage/events.jsonl b/packages/cli/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-no-usage/events.jsonl similarity index 100% rename from tests/fixtures/open-design/namespaces/release-stable/data/runs/run-no-usage/events.jsonl rename to packages/cli/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-no-usage/events.jsonl diff --git a/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-start-seeded/events.jsonl b/packages/cli/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-start-seeded/events.jsonl similarity index 100% rename from tests/fixtures/open-design/namespaces/release-stable/data/runs/run-start-seeded/events.jsonl rename to packages/cli/tests/fixtures/open-design/namespaces/release-stable/data/runs/run-start-seeded/events.jsonl diff --git a/tests/fixtures/security/proto-bash.jsonl b/packages/cli/tests/fixtures/security/proto-bash.jsonl similarity index 100% rename from tests/fixtures/security/proto-bash.jsonl rename to packages/cli/tests/fixtures/security/proto-bash.jsonl diff --git a/tests/fixtures/security/proto-model.jsonl b/packages/cli/tests/fixtures/security/proto-model.jsonl similarity index 100% rename from tests/fixtures/security/proto-model.jsonl rename to packages/cli/tests/fixtures/security/proto-model.jsonl diff --git a/tests/fixtures/security/proto-tool.jsonl b/packages/cli/tests/fixtures/security/proto-tool.jsonl similarity index 100% rename from tests/fixtures/security/proto-tool.jsonl rename to packages/cli/tests/fixtures/security/proto-tool.jsonl diff --git a/tests/format-mark-estimated.test.ts b/packages/cli/tests/format-mark-estimated.test.ts similarity index 100% rename from tests/format-mark-estimated.test.ts rename to packages/cli/tests/format-mark-estimated.test.ts diff --git a/tests/fs-utils.test.ts b/packages/cli/tests/fs-utils.test.ts similarity index 100% rename from tests/fs-utils.test.ts rename to packages/cli/tests/fs-utils.test.ts diff --git a/tests/granular-history.test.ts b/packages/cli/tests/granular-history.test.ts similarity index 100% rename from tests/granular-history.test.ts rename to packages/cli/tests/granular-history.test.ts diff --git a/tests/guard-hooks.test.ts b/packages/cli/tests/guard-hooks.test.ts similarity index 100% rename from tests/guard-hooks.test.ts rename to packages/cli/tests/guard-hooks.test.ts diff --git a/tests/guard-install.test.ts b/packages/cli/tests/guard-install.test.ts similarity index 100% rename from tests/guard-install.test.ts rename to packages/cli/tests/guard-install.test.ts diff --git a/tests/hydration-interrupt-convergence.test.ts b/packages/cli/tests/hydration-interrupt-convergence.test.ts similarity index 100% rename from tests/hydration-interrupt-convergence.test.ts rename to packages/cli/tests/hydration-interrupt-convergence.test.ts diff --git a/tests/kiro-cache-invalidation.test.ts b/packages/cli/tests/kiro-cache-invalidation.test.ts similarity index 100% rename from tests/kiro-cache-invalidation.test.ts rename to packages/cli/tests/kiro-cache-invalidation.test.ts diff --git a/tests/local-model-savings.test.ts b/packages/cli/tests/local-model-savings.test.ts similarity index 100% rename from tests/local-model-savings.test.ts rename to packages/cli/tests/local-model-savings.test.ts diff --git a/tests/mcp-coverage.test.ts b/packages/cli/tests/mcp-coverage.test.ts similarity index 100% rename from tests/mcp-coverage.test.ts rename to packages/cli/tests/mcp-coverage.test.ts diff --git a/tests/mcp-deferral.test.ts b/packages/cli/tests/mcp-deferral.test.ts similarity index 100% rename from tests/mcp-deferral.test.ts rename to packages/cli/tests/mcp-deferral.test.ts diff --git a/tests/mcp-redact.test.ts b/packages/cli/tests/mcp-redact.test.ts similarity index 100% rename from tests/mcp-redact.test.ts rename to packages/cli/tests/mcp-redact.test.ts diff --git a/tests/mcp-server.test.ts b/packages/cli/tests/mcp-server.test.ts similarity index 100% rename from tests/mcp-server.test.ts rename to packages/cli/tests/mcp-server.test.ts diff --git a/tests/mcp-tables.test.ts b/packages/cli/tests/mcp-tables.test.ts similarity index 100% rename from tests/mcp-tables.test.ts rename to packages/cli/tests/mcp-tables.test.ts diff --git a/tests/menubar-carried-headline.test.ts b/packages/cli/tests/menubar-carried-headline.test.ts similarity index 100% rename from tests/menubar-carried-headline.test.ts rename to packages/cli/tests/menubar-carried-headline.test.ts diff --git a/tests/menubar-installer.test.ts b/packages/cli/tests/menubar-installer.test.ts similarity index 100% rename from tests/menubar-installer.test.ts rename to packages/cli/tests/menubar-installer.test.ts diff --git a/tests/menubar-json.test.ts b/packages/cli/tests/menubar-json.test.ts similarity index 100% rename from tests/menubar-json.test.ts rename to packages/cli/tests/menubar-json.test.ts diff --git a/tests/menubar-report-parity.test.ts b/packages/cli/tests/menubar-report-parity.test.ts similarity index 100% rename from tests/menubar-report-parity.test.ts rename to packages/cli/tests/menubar-report-parity.test.ts diff --git a/tests/menubar-savings.test.ts b/packages/cli/tests/menubar-savings.test.ts similarity index 100% rename from tests/menubar-savings.test.ts rename to packages/cli/tests/menubar-savings.test.ts diff --git a/tests/minimax.test.ts b/packages/cli/tests/minimax.test.ts similarity index 100% rename from tests/minimax.test.ts rename to packages/cli/tests/minimax.test.ts diff --git a/tests/model-breakdown.test.ts b/packages/cli/tests/model-breakdown.test.ts similarity index 100% rename from tests/model-breakdown.test.ts rename to packages/cli/tests/model-breakdown.test.ts diff --git a/tests/model-efficiency.test.ts b/packages/cli/tests/model-efficiency.test.ts similarity index 100% rename from tests/model-efficiency.test.ts rename to packages/cli/tests/model-efficiency.test.ts diff --git a/tests/models-hoist.test.ts b/packages/cli/tests/models-hoist.test.ts similarity index 100% rename from tests/models-hoist.test.ts rename to packages/cli/tests/models-hoist.test.ts diff --git a/tests/models-report.test.ts b/packages/cli/tests/models-report.test.ts similarity index 100% rename from tests/models-report.test.ts rename to packages/cli/tests/models-report.test.ts diff --git a/tests/models.test.ts b/packages/cli/tests/models.test.ts similarity index 100% rename from tests/models.test.ts rename to packages/cli/tests/models.test.ts diff --git a/tests/optimize-apply.test.ts b/packages/cli/tests/optimize-apply.test.ts similarity index 100% rename from tests/optimize-apply.test.ts rename to packages/cli/tests/optimize-apply.test.ts diff --git a/tests/optimize-fs.test.ts b/packages/cli/tests/optimize-fs.test.ts similarity index 100% rename from tests/optimize-fs.test.ts rename to packages/cli/tests/optimize-fs.test.ts diff --git a/tests/optimize-zero-edit-savings.test.ts b/packages/cli/tests/optimize-zero-edit-savings.test.ts similarity index 100% rename from tests/optimize-zero-edit-savings.test.ts rename to packages/cli/tests/optimize-zero-edit-savings.test.ts diff --git a/tests/optimize.test.ts b/packages/cli/tests/optimize.test.ts similarity index 100% rename from tests/optimize.test.ts rename to packages/cli/tests/optimize.test.ts diff --git a/tests/otel-cache-aggregation.test.ts b/packages/cli/tests/otel-cache-aggregation.test.ts similarity index 100% rename from tests/otel-cache-aggregation.test.ts rename to packages/cli/tests/otel-cache-aggregation.test.ts diff --git a/tests/overview.test.ts b/packages/cli/tests/overview.test.ts similarity index 100% rename from tests/overview.test.ts rename to packages/cli/tests/overview.test.ts diff --git a/tests/parser-advisor-usage.test.ts b/packages/cli/tests/parser-advisor-usage.test.ts similarity index 100% rename from tests/parser-advisor-usage.test.ts rename to packages/cli/tests/parser-advisor-usage.test.ts diff --git a/tests/parser-antigravity-timestamp.test.ts b/packages/cli/tests/parser-antigravity-timestamp.test.ts similarity index 100% rename from tests/parser-antigravity-timestamp.test.ts rename to packages/cli/tests/parser-antigravity-timestamp.test.ts diff --git a/tests/parser-cache-refresh-timeout.test.ts b/packages/cli/tests/parser-cache-refresh-timeout.test.ts similarity index 100% rename from tests/parser-cache-refresh-timeout.test.ts rename to packages/cli/tests/parser-cache-refresh-timeout.test.ts diff --git a/tests/parser-claude-cwd.test.ts b/packages/cli/tests/parser-claude-cwd.test.ts similarity index 100% rename from tests/parser-claude-cwd.test.ts rename to packages/cli/tests/parser-claude-cwd.test.ts diff --git a/tests/parser-compact-entry.test.ts b/packages/cli/tests/parser-compact-entry.test.ts similarity index 100% rename from tests/parser-compact-entry.test.ts rename to packages/cli/tests/parser-compact-entry.test.ts diff --git a/tests/parser-estimated-cost.test.ts b/packages/cli/tests/parser-estimated-cost.test.ts similarity index 100% rename from tests/parser-estimated-cost.test.ts rename to packages/cli/tests/parser-estimated-cost.test.ts diff --git a/tests/parser-filter.test.ts b/packages/cli/tests/parser-filter.test.ts similarity index 100% rename from tests/parser-filter.test.ts rename to packages/cli/tests/parser-filter.test.ts diff --git a/tests/parser-gemini-cache.test.ts b/packages/cli/tests/parser-gemini-cache.test.ts similarity index 100% rename from tests/parser-gemini-cache.test.ts rename to packages/cli/tests/parser-gemini-cache.test.ts diff --git a/tests/parser-hydration-lock.test.ts b/packages/cli/tests/parser-hydration-lock.test.ts similarity index 100% rename from tests/parser-hydration-lock.test.ts rename to packages/cli/tests/parser-hydration-lock.test.ts diff --git a/tests/parser-incremental-append.test.ts b/packages/cli/tests/parser-incremental-append.test.ts similarity index 100% rename from tests/parser-incremental-append.test.ts rename to packages/cli/tests/parser-incremental-append.test.ts diff --git a/tests/parser-large-json-scanner-parity.test.ts b/packages/cli/tests/parser-large-json-scanner-parity.test.ts similarity index 100% rename from tests/parser-large-json-scanner-parity.test.ts rename to packages/cli/tests/parser-large-json-scanner-parity.test.ts diff --git a/tests/parser-large-json-scanner.test.ts b/packages/cli/tests/parser-large-json-scanner.test.ts similarity index 100% rename from tests/parser-large-json-scanner.test.ts rename to packages/cli/tests/parser-large-json-scanner.test.ts diff --git a/tests/parser-large-session.test.ts b/packages/cli/tests/parser-large-session.test.ts similarity index 100% rename from tests/parser-large-session.test.ts rename to packages/cli/tests/parser-large-session.test.ts diff --git a/tests/parser-local-savings.test.ts b/packages/cli/tests/parser-local-savings.test.ts similarity index 100% rename from tests/parser-local-savings.test.ts rename to packages/cli/tests/parser-local-savings.test.ts diff --git a/tests/parser-mcp-inventory.test.ts b/packages/cli/tests/parser-mcp-inventory.test.ts similarity index 100% rename from tests/parser-mcp-inventory.test.ts rename to packages/cli/tests/parser-mcp-inventory.test.ts diff --git a/tests/parser-number-helpers.test.ts b/packages/cli/tests/parser-number-helpers.test.ts similarity index 100% rename from tests/parser-number-helpers.test.ts rename to packages/cli/tests/parser-number-helpers.test.ts diff --git a/tests/parser-proxy-codex-only.test.ts b/packages/cli/tests/parser-proxy-codex-only.test.ts similarity index 100% rename from tests/parser-proxy-codex-only.test.ts rename to packages/cli/tests/parser-proxy-codex-only.test.ts diff --git a/tests/parser-proxy-merge.test.ts b/packages/cli/tests/parser-proxy-merge.test.ts similarity index 100% rename from tests/parser-proxy-merge.test.ts rename to packages/cli/tests/parser-proxy-merge.test.ts diff --git a/tests/parser-proxy-pricing.test.ts b/packages/cli/tests/parser-proxy-pricing.test.ts similarity index 100% rename from tests/parser-proxy-pricing.test.ts rename to packages/cli/tests/parser-proxy-pricing.test.ts diff --git a/tests/parser-rich-capture.test.ts b/packages/cli/tests/parser-rich-capture.test.ts similarity index 100% rename from tests/parser-rich-capture.test.ts rename to packages/cli/tests/parser-rich-capture.test.ts diff --git a/tests/parser-single-pass-scanner.test.ts b/packages/cli/tests/parser-single-pass-scanner.test.ts similarity index 100% rename from tests/parser-single-pass-scanner.test.ts rename to packages/cli/tests/parser-single-pass-scanner.test.ts diff --git a/tests/parser-skip-line.test.ts b/packages/cli/tests/parser-skip-line.test.ts similarity index 100% rename from tests/parser-skip-line.test.ts rename to packages/cli/tests/parser-skip-line.test.ts diff --git a/tests/parser-subagent-collection.test.ts b/packages/cli/tests/parser-subagent-collection.test.ts similarity index 100% rename from tests/parser-subagent-collection.test.ts rename to packages/cli/tests/parser-subagent-collection.test.ts diff --git a/tests/parser-subagent-range.test.ts b/packages/cli/tests/parser-subagent-range.test.ts similarity index 100% rename from tests/parser-subagent-range.test.ts rename to packages/cli/tests/parser-subagent-range.test.ts diff --git a/tests/parser.test.ts b/packages/cli/tests/parser.test.ts similarity index 100% rename from tests/parser.test.ts rename to packages/cli/tests/parser.test.ts diff --git a/tests/plan-usage.test.ts b/packages/cli/tests/plan-usage.test.ts similarity index 100% rename from tests/plan-usage.test.ts rename to packages/cli/tests/plan-usage.test.ts diff --git a/tests/plans.test.ts b/packages/cli/tests/plans.test.ts similarity index 100% rename from tests/plans.test.ts rename to packages/cli/tests/plans.test.ts diff --git a/tests/pricing-fallback-data.test.ts b/packages/cli/tests/pricing-fallback-data.test.ts similarity index 100% rename from tests/pricing-fallback-data.test.ts rename to packages/cli/tests/pricing-fallback-data.test.ts diff --git a/tests/pricing-pass.test.ts b/packages/cli/tests/pricing-pass.test.ts similarity index 100% rename from tests/pricing-pass.test.ts rename to packages/cli/tests/pricing-pass.test.ts diff --git a/tests/provider-registry.test.ts b/packages/cli/tests/provider-registry.test.ts similarity index 100% rename from tests/provider-registry.test.ts rename to packages/cli/tests/provider-registry.test.ts diff --git a/tests/provider-turn-grouping.test.ts b/packages/cli/tests/provider-turn-grouping.test.ts similarity index 100% rename from tests/provider-turn-grouping.test.ts rename to packages/cli/tests/provider-turn-grouping.test.ts diff --git a/tests/providers/antigravity.test.ts b/packages/cli/tests/providers/antigravity.test.ts similarity index 100% rename from tests/providers/antigravity.test.ts rename to packages/cli/tests/providers/antigravity.test.ts diff --git a/tests/providers/claude-config-dirs.test.ts b/packages/cli/tests/providers/claude-config-dirs.test.ts similarity index 100% rename from tests/providers/claude-config-dirs.test.ts rename to packages/cli/tests/providers/claude-config-dirs.test.ts diff --git a/tests/providers/cline.test.ts b/packages/cli/tests/providers/cline.test.ts similarity index 100% rename from tests/providers/cline.test.ts rename to packages/cli/tests/providers/cline.test.ts diff --git a/tests/providers/codebuff.test.ts b/packages/cli/tests/providers/codebuff.test.ts similarity index 100% rename from tests/providers/codebuff.test.ts rename to packages/cli/tests/providers/codebuff.test.ts diff --git a/tests/providers/codewhale.test.ts b/packages/cli/tests/providers/codewhale.test.ts similarity index 100% rename from tests/providers/codewhale.test.ts rename to packages/cli/tests/providers/codewhale.test.ts diff --git a/tests/providers/codex.test.ts b/packages/cli/tests/providers/codex.test.ts similarity index 100% rename from tests/providers/codex.test.ts rename to packages/cli/tests/providers/codex.test.ts diff --git a/tests/providers/copilot-skills.test.ts b/packages/cli/tests/providers/copilot-skills.test.ts similarity index 100% rename from tests/providers/copilot-skills.test.ts rename to packages/cli/tests/providers/copilot-skills.test.ts diff --git a/tests/providers/copilot.test.ts b/packages/cli/tests/providers/copilot.test.ts similarity index 100% rename from tests/providers/copilot.test.ts rename to packages/cli/tests/providers/copilot.test.ts diff --git a/tests/providers/crush.test.ts b/packages/cli/tests/providers/crush.test.ts similarity index 100% rename from tests/providers/crush.test.ts rename to packages/cli/tests/providers/crush.test.ts diff --git a/tests/providers/cursor-agent.test.ts b/packages/cli/tests/providers/cursor-agent.test.ts similarity index 100% rename from tests/providers/cursor-agent.test.ts rename to packages/cli/tests/providers/cursor-agent.test.ts diff --git a/tests/providers/cursor-bubble-dedup.test.ts b/packages/cli/tests/providers/cursor-bubble-dedup.test.ts similarity index 100% rename from tests/providers/cursor-bubble-dedup.test.ts rename to packages/cli/tests/providers/cursor-bubble-dedup.test.ts diff --git a/tests/providers/cursor-large-db-cap.test.ts b/packages/cli/tests/providers/cursor-large-db-cap.test.ts similarity index 100% rename from tests/providers/cursor-large-db-cap.test.ts rename to packages/cli/tests/providers/cursor-large-db-cap.test.ts diff --git a/tests/providers/cursor-real-tokens.test.ts b/packages/cli/tests/providers/cursor-real-tokens.test.ts similarity index 100% rename from tests/providers/cursor-real-tokens.test.ts rename to packages/cli/tests/providers/cursor-real-tokens.test.ts diff --git a/tests/providers/cursor-workspace-breakdown.test.ts b/packages/cli/tests/providers/cursor-workspace-breakdown.test.ts similarity index 100% rename from tests/providers/cursor-workspace-breakdown.test.ts rename to packages/cli/tests/providers/cursor-workspace-breakdown.test.ts diff --git a/tests/providers/cursor.test.ts b/packages/cli/tests/providers/cursor.test.ts similarity index 100% rename from tests/providers/cursor.test.ts rename to packages/cli/tests/providers/cursor.test.ts diff --git a/tests/providers/devin.test.ts b/packages/cli/tests/providers/devin.test.ts similarity index 100% rename from tests/providers/devin.test.ts rename to packages/cli/tests/providers/devin.test.ts diff --git a/tests/providers/droid.test.ts b/packages/cli/tests/providers/droid.test.ts similarity index 100% rename from tests/providers/droid.test.ts rename to packages/cli/tests/providers/droid.test.ts diff --git a/tests/providers/forge.test.ts b/packages/cli/tests/providers/forge.test.ts similarity index 100% rename from tests/providers/forge.test.ts rename to packages/cli/tests/providers/forge.test.ts diff --git a/tests/providers/gemini.test.ts b/packages/cli/tests/providers/gemini.test.ts similarity index 100% rename from tests/providers/gemini.test.ts rename to packages/cli/tests/providers/gemini.test.ts diff --git a/tests/providers/grok.test.ts b/packages/cli/tests/providers/grok.test.ts similarity index 100% rename from tests/providers/grok.test.ts rename to packages/cli/tests/providers/grok.test.ts diff --git a/tests/providers/hermes.test.ts b/packages/cli/tests/providers/hermes.test.ts similarity index 100% rename from tests/providers/hermes.test.ts rename to packages/cli/tests/providers/hermes.test.ts diff --git a/tests/providers/ibm-bob.test.ts b/packages/cli/tests/providers/ibm-bob.test.ts similarity index 100% rename from tests/providers/ibm-bob.test.ts rename to packages/cli/tests/providers/ibm-bob.test.ts diff --git a/tests/providers/kilo-code.test.ts b/packages/cli/tests/providers/kilo-code.test.ts similarity index 100% rename from tests/providers/kilo-code.test.ts rename to packages/cli/tests/providers/kilo-code.test.ts diff --git a/tests/providers/kimi.test.ts b/packages/cli/tests/providers/kimi.test.ts similarity index 100% rename from tests/providers/kimi.test.ts rename to packages/cli/tests/providers/kimi.test.ts diff --git a/tests/providers/kimicode.test.ts b/packages/cli/tests/providers/kimicode.test.ts similarity index 100% rename from tests/providers/kimicode.test.ts rename to packages/cli/tests/providers/kimicode.test.ts diff --git a/tests/providers/kiro.test.ts b/packages/cli/tests/providers/kiro.test.ts similarity index 100% rename from tests/providers/kiro.test.ts rename to packages/cli/tests/providers/kiro.test.ts diff --git a/tests/providers/lingtai-tui.test.ts b/packages/cli/tests/providers/lingtai-tui.test.ts similarity index 100% rename from tests/providers/lingtai-tui.test.ts rename to packages/cli/tests/providers/lingtai-tui.test.ts diff --git a/tests/providers/mistral-vibe.test.ts b/packages/cli/tests/providers/mistral-vibe.test.ts similarity index 100% rename from tests/providers/mistral-vibe.test.ts rename to packages/cli/tests/providers/mistral-vibe.test.ts diff --git a/tests/providers/mux.test.ts b/packages/cli/tests/providers/mux.test.ts similarity index 100% rename from tests/providers/mux.test.ts rename to packages/cli/tests/providers/mux.test.ts diff --git a/tests/providers/omp.test.ts b/packages/cli/tests/providers/omp.test.ts similarity index 100% rename from tests/providers/omp.test.ts rename to packages/cli/tests/providers/omp.test.ts diff --git a/tests/providers/open-design.test.ts b/packages/cli/tests/providers/open-design.test.ts similarity index 100% rename from tests/providers/open-design.test.ts rename to packages/cli/tests/providers/open-design.test.ts diff --git a/tests/providers/openclaw.test.ts b/packages/cli/tests/providers/openclaw.test.ts similarity index 100% rename from tests/providers/openclaw.test.ts rename to packages/cli/tests/providers/openclaw.test.ts diff --git a/tests/providers/opencode-file.test.ts b/packages/cli/tests/providers/opencode-file.test.ts similarity index 100% rename from tests/providers/opencode-file.test.ts rename to packages/cli/tests/providers/opencode-file.test.ts diff --git a/tests/providers/opencode.test.ts b/packages/cli/tests/providers/opencode.test.ts similarity index 100% rename from tests/providers/opencode.test.ts rename to packages/cli/tests/providers/opencode.test.ts diff --git a/tests/providers/pi.test.ts b/packages/cli/tests/providers/pi.test.ts similarity index 100% rename from tests/providers/pi.test.ts rename to packages/cli/tests/providers/pi.test.ts diff --git a/tests/providers/quickdesk.test.ts b/packages/cli/tests/providers/quickdesk.test.ts similarity index 100% rename from tests/providers/quickdesk.test.ts rename to packages/cli/tests/providers/quickdesk.test.ts diff --git a/tests/providers/roo-code.test.ts b/packages/cli/tests/providers/roo-code.test.ts similarity index 100% rename from tests/providers/roo-code.test.ts rename to packages/cli/tests/providers/roo-code.test.ts diff --git a/tests/providers/vercel-gateway.test.ts b/packages/cli/tests/providers/vercel-gateway.test.ts similarity index 100% rename from tests/providers/vercel-gateway.test.ts rename to packages/cli/tests/providers/vercel-gateway.test.ts diff --git a/tests/providers/vscode-cline-parser.test.ts b/packages/cli/tests/providers/vscode-cline-parser.test.ts similarity index 100% rename from tests/providers/vscode-cline-parser.test.ts rename to packages/cli/tests/providers/vscode-cline-parser.test.ts diff --git a/tests/providers/warp.test.ts b/packages/cli/tests/providers/warp.test.ts similarity index 100% rename from tests/providers/warp.test.ts rename to packages/cli/tests/providers/warp.test.ts diff --git a/tests/providers/zcode.test.ts b/packages/cli/tests/providers/zcode.test.ts similarity index 100% rename from tests/providers/zcode.test.ts rename to packages/cli/tests/providers/zcode.test.ts diff --git a/tests/providers/zed.test.ts b/packages/cli/tests/providers/zed.test.ts similarity index 100% rename from tests/providers/zed.test.ts rename to packages/cli/tests/providers/zed.test.ts diff --git a/tests/providers/zerostack.test.ts b/packages/cli/tests/providers/zerostack.test.ts similarity index 100% rename from tests/providers/zerostack.test.ts rename to packages/cli/tests/providers/zerostack.test.ts diff --git a/tests/quota.test.ts b/packages/cli/tests/quota.test.ts similarity index 100% rename from tests/quota.test.ts rename to packages/cli/tests/quota.test.ts diff --git a/tests/scan-progress.test.ts b/packages/cli/tests/scan-progress.test.ts similarity index 100% rename from tests/scan-progress.test.ts rename to packages/cli/tests/scan-progress.test.ts diff --git a/tests/security/prototype-pollution.test.ts b/packages/cli/tests/security/prototype-pollution.test.ts similarity index 100% rename from tests/security/prototype-pollution.test.ts rename to packages/cli/tests/security/prototype-pollution.test.ts diff --git a/tests/session-cache-rich-capture.test.ts b/packages/cli/tests/session-cache-rich-capture.test.ts similarity index 100% rename from tests/session-cache-rich-capture.test.ts rename to packages/cli/tests/session-cache-rich-capture.test.ts diff --git a/tests/session-cache-v5-adoption.test.ts b/packages/cli/tests/session-cache-v5-adoption.test.ts similarity index 100% rename from tests/session-cache-v5-adoption.test.ts rename to packages/cli/tests/session-cache-v5-adoption.test.ts diff --git a/tests/session-cache.test.ts b/packages/cli/tests/session-cache.test.ts similarity index 100% rename from tests/session-cache.test.ts rename to packages/cli/tests/session-cache.test.ts diff --git a/tests/sessions-by-branch.test.ts b/packages/cli/tests/sessions-by-branch.test.ts similarity index 100% rename from tests/sessions-by-branch.test.ts rename to packages/cli/tests/sessions-by-branch.test.ts diff --git a/tests/sessions-by-pr.test.ts b/packages/cli/tests/sessions-by-pr.test.ts similarity index 100% rename from tests/sessions-by-pr.test.ts rename to packages/cli/tests/sessions-by-pr.test.ts diff --git a/tests/sessions-report.test.ts b/packages/cli/tests/sessions-report.test.ts similarity index 100% rename from tests/sessions-report.test.ts rename to packages/cli/tests/sessions-report.test.ts diff --git a/tests/sessions-subagent-fold.test.ts b/packages/cli/tests/sessions-subagent-fold.test.ts similarity index 100% rename from tests/sessions-subagent-fold.test.ts rename to packages/cli/tests/sessions-subagent-fold.test.ts diff --git a/tests/setup/env-isolation.ts b/packages/cli/tests/setup/env-isolation.ts similarity index 100% rename from tests/setup/env-isolation.ts rename to packages/cli/tests/setup/env-isolation.ts diff --git a/tests/sharing/approve.test.ts b/packages/cli/tests/sharing/approve.test.ts similarity index 100% rename from tests/sharing/approve.test.ts rename to packages/cli/tests/sharing/approve.test.ts diff --git a/tests/sharing/connect-timeout.test.ts b/packages/cli/tests/sharing/connect-timeout.test.ts similarity index 100% rename from tests/sharing/connect-timeout.test.ts rename to packages/cli/tests/sharing/connect-timeout.test.ts diff --git a/tests/sharing/host.test.ts b/packages/cli/tests/sharing/host.test.ts similarity index 100% rename from tests/sharing/host.test.ts rename to packages/cli/tests/sharing/host.test.ts diff --git a/tests/sharing/pairing.test.ts b/packages/cli/tests/sharing/pairing.test.ts similarity index 100% rename from tests/sharing/pairing.test.ts rename to packages/cli/tests/sharing/pairing.test.ts diff --git a/tests/sharing/sanitize.test.ts b/packages/cli/tests/sharing/sanitize.test.ts similarity index 100% rename from tests/sharing/sanitize.test.ts rename to packages/cli/tests/sharing/sanitize.test.ts diff --git a/tests/sharing/transport.test.ts b/packages/cli/tests/sharing/transport.test.ts similarity index 100% rename from tests/sharing/transport.test.ts rename to packages/cli/tests/sharing/transport.test.ts diff --git a/tests/spend-flow.test.ts b/packages/cli/tests/spend-flow.test.ts similarity index 100% rename from tests/spend-flow.test.ts rename to packages/cli/tests/spend-flow.test.ts diff --git a/tests/sync-e2e.test.ts b/packages/cli/tests/sync-e2e.test.ts similarity index 100% rename from tests/sync-e2e.test.ts rename to packages/cli/tests/sync-e2e.test.ts diff --git a/tests/sync-headless-e2e.test.ts b/packages/cli/tests/sync-headless-e2e.test.ts similarity index 100% rename from tests/sync-headless-e2e.test.ts rename to packages/cli/tests/sync-headless-e2e.test.ts diff --git a/tests/sync-infra-e2e.test.ts b/packages/cli/tests/sync-infra-e2e.test.ts similarity index 100% rename from tests/sync-infra-e2e.test.ts rename to packages/cli/tests/sync-infra-e2e.test.ts diff --git a/tests/sync-ledger-otlp.test.ts b/packages/cli/tests/sync-ledger-otlp.test.ts similarity index 100% rename from tests/sync-ledger-otlp.test.ts rename to packages/cli/tests/sync-ledger-otlp.test.ts diff --git a/tests/sync-push.test.ts b/packages/cli/tests/sync-push.test.ts similarity index 100% rename from tests/sync-push.test.ts rename to packages/cli/tests/sync-push.test.ts diff --git a/tests/sync.test.ts b/packages/cli/tests/sync.test.ts similarity index 100% rename from tests/sync.test.ts rename to packages/cli/tests/sync.test.ts diff --git a/tests/token-estimate.test.ts b/packages/cli/tests/token-estimate.test.ts similarity index 100% rename from tests/token-estimate.test.ts rename to packages/cli/tests/token-estimate.test.ts diff --git a/tests/usage-aggregator.test.ts b/packages/cli/tests/usage-aggregator.test.ts similarity index 100% rename from tests/usage-aggregator.test.ts rename to packages/cli/tests/usage-aggregator.test.ts diff --git a/tests/web-dashboard.test.ts b/packages/cli/tests/web-dashboard.test.ts similarity index 100% rename from tests/web-dashboard.test.ts rename to packages/cli/tests/web-dashboard.test.ts diff --git a/tests/workflow-insights.test.ts b/packages/cli/tests/workflow-insights.test.ts similarity index 100% rename from tests/workflow-insights.test.ts rename to packages/cli/tests/workflow-insights.test.ts diff --git a/tests/yield-overlap-attribution.test.ts b/packages/cli/tests/yield-overlap-attribution.test.ts similarity index 100% rename from tests/yield-overlap-attribution.test.ts rename to packages/cli/tests/yield-overlap-attribution.test.ts diff --git a/tests/yield-repo-grouping.test.ts b/packages/cli/tests/yield-repo-grouping.test.ts similarity index 100% rename from tests/yield-repo-grouping.test.ts rename to packages/cli/tests/yield-repo-grouping.test.ts diff --git a/tests/yield.test.ts b/packages/cli/tests/yield.test.ts similarity index 100% rename from tests/yield.test.ts rename to packages/cli/tests/yield.test.ts diff --git a/tsconfig.json b/packages/cli/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/cli/tsconfig.json diff --git a/tsup.config.ts b/packages/cli/tsup.config.ts similarity index 100% rename from tsup.config.ts rename to packages/cli/tsup.config.ts diff --git a/vitest.config.ts b/packages/cli/vitest.config.ts similarity index 100% rename from vitest.config.ts rename to packages/cli/vitest.config.ts diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 00000000..7ebbda4d --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,9 @@ +# @codeburn/core + +Shared, provider-agnostic core for [CodeBurn](https://github.com/getagentseal/codeburn): +session parsing, model/pricing resolution, and the cost math that the CLI and the +desktop apps all depend on. + +**Status: skeleton.** This package currently exports nothing. It is introduced in +Phase 1 of the core extraction (packaging only) and is populated incrementally in +later phases as logic is lifted out of `packages/cli`. diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 00000000..8ea45167 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,32 @@ +{ + "name": "@codeburn/core", + "version": "0.9.19", + "description": "Shared, provider-agnostic core for CodeBurn (parsing, pricing, models). Skeleton — populated in later phases of the core extraction.", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "typecheck": "tsc --noEmit" + }, + "engines": { + "node": ">=22.13.0" + }, + "author": "AgentSeal ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/getagentseal/codeburn.git", + "directory": "packages/core" + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 00000000..336ce12b --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1 @@ +export {} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 00000000..32c62d2b --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist", + "rootDir": "src", + "declaration": true, + "sourceMap": true, + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts new file mode 100644 index 00000000..cc42ace2 --- /dev/null +++ b/packages/core/tsup.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm'], + target: 'node20', + outDir: 'dist', + clean: true, + splitting: false, + sourcemap: true, + dts: true, +}) diff --git a/scripts/bundle-litellm.mjs b/scripts/bundle-litellm.mjs index 6d5f4955..fc8fe575 100644 --- a/scripts/bundle-litellm.mjs +++ b/scripts/bundle-litellm.mjs @@ -22,7 +22,7 @@ const MODELS_DEV_URL = 'https://models.dev/api.json' const OPENROUTER_URL = 'https://openrouter.ai/api/v1/models' const __dirname = dirname(fileURLToPath(import.meta.url)) -const dataDir = join(__dirname, '..', 'src', 'data') +const dataDir = join(__dirname, '..', 'packages', 'cli', 'src', 'data') const snapshotPath = join(dataDir, 'litellm-snapshot.json') const fallbackPath = join(dataDir, 'pricing-fallback.json')