@leanspec/ui 0.2.7-dev.20251126090633 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/node_modules/.pnpm/@img+sharp-darwin-arm64@0.34.5/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-linux-x64@0.34.5/node_modules/@img/sharp-linux-x64 → @img+sharp-darwin-arm64@0.34.5/node_modules/@img/sharp-darwin-arm64}/package.json +7 -13
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/README.md +2 -2
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/lib/glib-2.0/include/glibconfig.h +8 -9
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib} +0 -0
- package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/package.json +5 -11
- package/.next/standalone/node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
- package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
- package/.next/standalone/packages/ui/.next/build-manifest.json +2 -2
- package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -3
- package/.next/standalone/packages/ui/.next/required-server-files.json +4 -4
- package/.next/standalone/packages/ui/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/discover/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/list-directory/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/local-projects/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/[spec]/status/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/specs/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/[id]/stats/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/revalidate/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/dependency-graph/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/status/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/specs/[id]/subspecs/[file]/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/api/stats/route.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
- package/.next/standalone/packages/ui/.next/server/app/projects.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects.segment.rsc +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/specs/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/app/stats/page.js.nft.json +1 -1
- package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
- package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/packages/ui/dist/standalone/packages/web/README.md +196 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/components.json +20 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0000_reflective_thena.sql +59 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/0001_fresh_carmella_unuscione.sql +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0000_snapshot.json +427 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/0001_snapshot.json +436 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle/meta/_journal.json +20 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/drizzle.config.ts +10 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/eslint.config.mjs +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/next.config.ts +7 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/package.json +83 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/postcss.config.mjs +8 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/f864aa7e7061c0600e35cf3d879b27cf.txt +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/favicon.ico +0 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/file.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/github-mark-white.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/github-mark.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/globe.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/icon.svg +7 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/logo-dark-bg.svg +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/logo-with-bg.svg +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/logo.svg +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/next.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/vercel.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/public/window.svg +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/server.js +44 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/[id]/specs/route.ts +23 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/projects/route.ts +19 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/revalidate/route.ts +63 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.test.ts +51 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/dependency-graph/route.ts +171 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/route.ts +36 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/specs/[id]/subspecs/[file]/route.ts +46 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/api/stats/route.ts +19 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/board-client.tsx +162 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/loading.tsx +43 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/board/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/dashboard-client.tsx +364 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/error.tsx +43 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/globals.css +531 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/home-client.tsx +277 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/layout.tsx +70 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/loading.tsx +87 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/not-found.tsx +27 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/loading.tsx +5 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/[id]/page.tsx +43 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/specs/specs-client.tsx +425 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/page.tsx +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/app/stats/stats-client.tsx +283 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/back-to-top.tsx +46 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/empty-state.tsx +52 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/main-sidebar.tsx +175 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.test.ts +96 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/markdown-link.tsx +95 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/navigation.tsx +210 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/priority-badge.tsx +53 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/quick-search.tsx +180 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/skeletons.tsx +119 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-dependency-graph.tsx +369 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-client.tsx +372 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-loading-shell.tsx +42 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-detail-wrapper.tsx +70 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-metadata.tsx +136 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-sidebar.tsx +127 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/spec-timeline.tsx +186 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/specs-nav-sidebar.tsx +561 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/status-badge.tsx +53 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/sub-spec-tabs.tsx +143 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/table-of-contents.tsx +130 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-provider.tsx +11 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/theme-toggle.tsx +37 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/avatar.tsx +50 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/badge.tsx +36 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/breadcrumb.tsx +110 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/button.tsx +57 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/card.tsx +76 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/command.tsx +153 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/dialog.tsx +122 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/input.tsx +24 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/select.tsx +159 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/separator.tsx +31 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/skeleton.tsx +15 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tabs.tsx +55 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/toast.tsx +30 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/components/ui/tooltip.tsx +32 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/date-utils.ts +76 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/index.ts +42 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/migrate.ts +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/queries.ts +114 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/schema.ts +123 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/seed.ts +156 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/db/service-queries.ts +216 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/dependency-graph.ts +105 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/service.ts +120 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/database-source.ts +94 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/sources/filesystem-source.ts +249 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/specs/types.ts +55 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/stores/specs-sidebar-store.ts +152 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/sub-specs.ts +171 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/lib/utils.ts +17 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/src/types/specs.ts +18 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tailwind.config.ts +58 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.json +34 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/tsconfig.tsbuildinfo +1 -0
- package/.next/standalone/packages/ui/dist/standalone/packages/web/vitest.config.ts +14 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/014-complete-custom-frontmatter/README.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/016-github-action/README.md +317 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/017-vscode-extension/README.md +261 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CLI-DESIGN.md +380 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CONFIGURATION-EXAMPLES.md +230 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/CONFIGURATION.md +285 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/IMPLEMENTATION.md +358 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/README.md +303 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/TESTING.md +368 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/018-spec-validation/VALIDATION-RULES.md +327 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/024-pattern-aware-list-grouping/README.md +117 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/025-template-config-updates/README.md +73 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/026-init-pattern-selection/README.md +109 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/034-copilot-slash-commands/README.md +107 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/ARCHITECTURE.md +244 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/IMPLEMENTATION.md +429 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/035-live-specs-showcase/README.md +306 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/036-pm-integrations/README.md +158 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-AI-ASSISTED.md +359 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-FULL-LIFECYCLE.md +86 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-REAL-FEATURE.md +437 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DEMO-SCRIPT.md +365 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-FINAL.md +203 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-SESSION-2025-11-06.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/DOGFOODING-SUMMARY.md +156 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/IMPLEMENTATION.md +183 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/MARKETING.md +229 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/NEXT-STEPS-DEMO.md +243 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/README.md +217 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/SESSION-2025-11-06.md +166 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/043-official-launch-02/TESTING.md +126 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/ACTUAL-IMPLEMENTATION.md +108 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/DESIGN.md +382 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/IMPLEMENTATION.md +144 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/RATIONALE.md +146 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/README.md +208 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/045-unified-dashboard/TESTING.md +182 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/047-git-backfill-timestamps/README.md +314 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/FINDINGS.md +113 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/GUIDELINES.md +237 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/048-spec-complexity-analysis/README.md +149 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/ANALYSIS-COMPARISONS.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/ANALYSIS-CONSTRAINTS.md +254 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/FIRST-PRINCIPLES.md +376 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/OPERATIONALIZATION-ROADMAP.md +240 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/OPERATIONALIZATION-TOOLS.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/049-leanspec-first-principles/README.md +374 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/051-docs-system-prompt-principles/README.md +339 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/052-branding-assets/README.md +128 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/053-spec-assets-philosophy/README.md +97 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/DESIGN-DECISIONS.md +93 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/OUTPUT-FORMAT-SPEC.md +146 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/054-validate-output-lint-style/README.md +175 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS-PART1.md +397 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS-PART2.md +342 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/ANALYSIS.md +44 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/CHANGES.md +150 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/CONCERNS-ANALYSIS.md +351 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/DOCS-ALIGNMENT-ANALYSIS.md +238 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/README.md +280 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/REDESIGN-DRAFT.md +372 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/055-readme-redesign-ai-first/REDESIGN-REFINED.md +466 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/056-docs-site-accuracy-audit/AUDIT-RESULTS.md +178 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/056-docs-site-accuracy-audit/README.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/057-docs-validation-comprehensive/README.md +295 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/057-docs-validation-comprehensive/VALIDATION-RESULTS.md +487 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/ANALYSIS.md +241 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/DESIGN.md +279 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/IMPLEMENTATION.md +642 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/NOTES.md +125 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/058-docs-overview-polish/README.md +286 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/ARCHITECTURE.md +392 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/COMMANDS.md +1002 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/CONTEXT-ENGINEERING.md +411 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/IMPLEMENTATION.md +812 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/README.md +504 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/059-programmatic-spec-management/TESTING.md +724 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/060-core-concepts-coherence/README.md +125 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/061-ai-assisted-spec-writing/README.md +299 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/IMPLEMENTATION-PLAN.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/PAGE-SPECIFICATIONS.md +265 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/PROBLEM-ANALYSIS.md +36 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/README.md +243 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/062-docs-info-architecture-v2/SOLUTION-DESIGN.md +82 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/DESIGN.md +338 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/EXAMPLES.md +354 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/IMPLEMENTATION.md +189 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/063-migration-from-existing-tools/README.md +119 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/064-docs-site-zh-translation/README.md +170 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/065-v03-planning/README.md +158 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/066-context-economy-thresholds-refinement/README.md +842 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/067-monorepo-core-extraction/README.md +358 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/068-live-specs-ux-enhancements/DESIGN.md +444 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/068-live-specs-ux-enhancements/README.md +357 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/069-token-counting-utils/README.md +551 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/070-mcp-token-counting-tool/README.md +372 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/071-simplified-token-validation/README.md +489 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/072-ai-agent-first-use-workflow/README.md +287 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/073-template-engine-agents-md/README.md +323 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/074-content-at-creation/README.md +136 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/075-intelligent-search-engine/README.md +399 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/076-programmatic-spec-relationships/README.md +301 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/077-archiving-strategy/README.md +235 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/078-sub-spec-template-system/README.md +303 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/079-cli-alphabetical-organization/README.md +196 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/080-mcp-server-modular-architecture/README.md +388 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/081-web-app-ux-redesign/README.md +825 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/DATABASE.md +111 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/DEPLOYMENT.md +69 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/FILESYSTEM.md +77 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/IMPLEMENTATION.md +184 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/082-web-realtime-sync-architecture/README.md +501 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/083-web-navigation-performance/README.md +490 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/084-sub-spec-visibility-in-tools/README.md +389 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/085-cli-relationship-commands/README.md +920 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/086-template-component-deduplication/README.md +146 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/087-cli-ui-command/README.md +421 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/088-core-concepts-terminology-only/README.md +106 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/089-sdd-practical-tutorials/README.md +126 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/090-leanspec-sdd-case-studies/README.md +131 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/091-chinese-localization-strategy/README.md +254 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/092-docs-site-submodule-migration/README.md +152 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/093-spec-detail-ui-improvements/README.md +65 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/094-ai-chatbot-web-integration/README.md +332 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/095-pr-migration-verification/README.md +339 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/096-docs-beginner-first-reorg/README.md +399 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/097-dag-visualization-library/README.md +525 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/098-github-multi-project-integration/README.md +387 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/099-enhanced-dependency-commands-cli-mcp/README.md +613 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/100-release-process-typecheck-failure/README.md +266 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/101-sidebar-scroll-position-drift/README.md +100 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/102-mcp-wrapper-package/README.md +172 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/001-typescript-cli-migration/README.md +37 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/002-template-system-redesign/README.md +60 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/003-init-system-redesign/README.md +113 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/004-existing-project-integration/README.md +69 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/004-existing-project-integration/SUMMARY.md +112 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/005-structured-frontmatter/README.md +229 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/006-pm-visualization-tools/README.md +406 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/007-system-prompt-updates/README.md +168 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/008-commander-migration/README.md +174 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/009-cli-ux-enhancement/README.md +212 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/010-commands-refactor/README.md +249 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/011-test-results/README.md +60 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/011-test-results/TEST_SUMMARY.md +139 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/012-sub-spec-files/README.md +722 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/013-custom-spec-templates/README.md +413 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/015-npm-publishing/README.md +255 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/019-readme-improvement/README.md +252 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/020-documentation-website/README.md +253 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/021-docusaurus-vercel-migration/README.md +612 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/022-flexible-folder-structure/README.md +794 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/023-folder-structure-improvements/DESIGN.md +834 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/023-folder-structure-improvements/README.md +255 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/027-cli-ui-ux-optimization/README.md +454 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/028-cli-ui-modernization/README.md +172 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/029-visualization-improvements/IMPLEMENTATION.md +152 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/029-visualization-improvements/README.md +95 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/030-created-date-format-bug/README.md +87 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/031-gantt-ux-improvements/README.md +230 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/032-console-log-chalk-security/README.md +89 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/033-mcp-server/README.md +89 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/037-docs-overhaul/README.md +166 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/038-flat-structure-migration/README.md +276 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/038-mcp-frontmatter-bug-fix/README.md +122 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/039-simplify-viewer-commands/README.md +198 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/039-template-variable-sync/README.md +192 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/040-spec-viewer-commands/README.md +171 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/042-mcp-error-handling/README.md +200 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/044-spec-relationships-clarity/README.md +317 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/DESIGN.md +276 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/IMPLEMENTATION.md +241 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/README.md +139 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/046-stats-dashboard-refactor/TESTING.md +328 -0
- package/.next/standalone/packages/ui/dist/standalone/specs/archived/050-tool-redesign-first-principles/README.md +400 -0
- package/.next/standalone/packages/ui/package.json +1 -1
- package/.next/standalone/packages/ui/server.js +1 -1
- package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/README.md +0 -46
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/glib-2.0/include/glibconfig.h +0 -221
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +0 -1
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +0 -42
- package/.next/standalone/node_modules/.pnpm/@img+sharp-libvips-linuxmusl-x64@1.2.4/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +0 -30
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linux-x64@0.34.5/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
- package/.next/standalone/node_modules/.pnpm/@img+sharp-linuxmusl-x64@0.34.5/node_modules/@img/sharp-linuxmusl-x64/package.json +0 -46
- /package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/lib/index.js +0 -0
- /package/.next/standalone/node_modules/.pnpm/{@img+sharp-libvips-linux-x64@1.2.4/node_modules/@img/sharp-libvips-linux-x64 → @img+sharp-libvips-darwin-arm64@1.2.4/node_modules/@img/sharp-libvips-darwin-arm64}/versions.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_buildManifest.js +0 -0
- /package/.next/standalone/packages/ui/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_clientMiddlewareManifest.json +0 -0
- /package/.next/standalone/packages/ui/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_ssgManifest.js +0 -0
- /package/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_buildManifest.js +0 -0
- /package/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{gmEkSwWc7AIWzMK9b0WXr → 6nq7WNafPv5Bf_7mWgRQ-}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
---
|
|
2
|
+
status: complete
|
|
3
|
+
created: '2025-11-13'
|
|
4
|
+
tags:
|
|
5
|
+
- core
|
|
6
|
+
- tooling
|
|
7
|
+
- context-economy
|
|
8
|
+
- llm
|
|
9
|
+
- validation
|
|
10
|
+
priority: high
|
|
11
|
+
assignee: marvin
|
|
12
|
+
created_at: '2025-11-13T02:17:52.074Z'
|
|
13
|
+
depends_on:
|
|
14
|
+
- 066-context-economy-thresholds-refinement
|
|
15
|
+
related:
|
|
16
|
+
- 059-programmatic-spec-management
|
|
17
|
+
- 048-spec-complexity-analysis
|
|
18
|
+
- 070-mcp-token-counting-tool
|
|
19
|
+
updated_at: '2025-11-13T02:49:45.179Z'
|
|
20
|
+
transitions:
|
|
21
|
+
- status: in-progress
|
|
22
|
+
at: '2025-11-13T02:35:30.196Z'
|
|
23
|
+
- status: complete
|
|
24
|
+
at: '2025-11-13T02:49:45.179Z'
|
|
25
|
+
completed_at: '2025-11-13T02:49:45.179Z'
|
|
26
|
+
completed: '2025-11-13'
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Token Counting Utilities for LLM Context Management
|
|
30
|
+
|
|
31
|
+
> **Status**: ✅ Complete · **Priority**: High · **Created**: 2025-11-13 · **Tags**: core, tooling, context-economy, llm, validation
|
|
32
|
+
> **Assignee**: marvin · **Reviewer**: TBD
|
|
33
|
+
|
|
34
|
+
**The Problem**: Token count is the most accurate predictor of LLM context performance, but we lack convenient tools (MCP, CLI, core utilities) to measure it for specs and sub-specs.
|
|
35
|
+
|
|
36
|
+
**The Solution**: Create a comprehensive token counting utility layer as core infrastructure for LLM context management, enabling both humans and AI agents to measure and optimize spec token usage.
|
|
37
|
+
|
|
38
|
+
## Overview
|
|
39
|
+
|
|
40
|
+
### Why Token Counting Matters
|
|
41
|
+
|
|
42
|
+
From spec 066 research findings:
|
|
43
|
+
|
|
44
|
+
1. **Token count predicts AI performance better than line count**
|
|
45
|
+
- 39% average performance drop in multi-turn contexts (arXiv:2505.06120)
|
|
46
|
+
- Quality degradation starts well before 50K token limits
|
|
47
|
+
- 6x cost difference: 2,000-line vs 300-line specs
|
|
48
|
+
|
|
49
|
+
2. **Content density varies significantly**
|
|
50
|
+
- Code: ~3 chars/token (denser)
|
|
51
|
+
- Prose: ~4 chars/token (lighter)
|
|
52
|
+
- Spec 016: Only 315 lines but ~2,400 tokens (26 code blocks)
|
|
53
|
+
- Spec 049: 374 lines but only ~1,700 tokens (pure prose)
|
|
54
|
+
|
|
55
|
+
3. **Current validation uses tokenx**
|
|
56
|
+
- Integrated in `ComplexityValidator` (spec 066 implementation)
|
|
57
|
+
- Will migrate to tiktoken for exact token counts
|
|
58
|
+
- No user-facing tools to inspect token counts
|
|
59
|
+
- No way for AI agents to query token counts programmatically
|
|
60
|
+
|
|
61
|
+
### What's Missing
|
|
62
|
+
|
|
63
|
+
**Current State**:
|
|
64
|
+
- ✅ `ComplexityValidator` uses `tokenx` internally (will migrate to tiktoken)
|
|
65
|
+
- ✅ Token thresholds defined (2K/3.5K/5K - hypotheses)
|
|
66
|
+
- ❌ No CLI command to check token counts
|
|
67
|
+
- ❌ No MCP tool for AI agents to query tokens
|
|
68
|
+
- ❌ No utility to count sub-spec tokens
|
|
69
|
+
- ❌ No breakdown by content type (code vs prose vs tables)
|
|
70
|
+
|
|
71
|
+
**User Pain Points**:
|
|
72
|
+
- Can't answer "How many tokens is this spec?"
|
|
73
|
+
- Can't compare token counts across specs
|
|
74
|
+
- Can't see token breakdown before/after edits
|
|
75
|
+
- AI agents can't make token-aware decisions
|
|
76
|
+
- No way to validate MCP tool context fits in budget
|
|
77
|
+
|
|
78
|
+
### What We're Building
|
|
79
|
+
|
|
80
|
+
**Three Layers of Token Counting**:
|
|
81
|
+
|
|
82
|
+
1. **Core Library** (`@leanspec/core`)
|
|
83
|
+
- Token counting utilities using `tiktoken`
|
|
84
|
+
- Sub-spec aggregation
|
|
85
|
+
- Content type breakdown
|
|
86
|
+
- Export for reuse across packages
|
|
87
|
+
|
|
88
|
+
2. **CLI Commands** (`@leanspec/cli`)
|
|
89
|
+
- `lean-spec tokens <spec>` - Show token count for spec
|
|
90
|
+
- `lean-spec tokens <spec> --detailed` - Breakdown by file/type
|
|
91
|
+
- `lean-spec tokens --all` - Compare all specs
|
|
92
|
+
- Integration with `lean-spec analyze`
|
|
93
|
+
|
|
94
|
+
3. **MCP Tools** (Future)
|
|
95
|
+
- `mcp_lean-spec_tokens` - Query token counts
|
|
96
|
+
- Enable AI agents to make token-aware decisions
|
|
97
|
+
- Support context budget planning
|
|
98
|
+
|
|
99
|
+
## Design
|
|
100
|
+
|
|
101
|
+
### Architecture
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
┌─────────────────────────────────────────────────────────┐
|
|
105
|
+
│ User Interfaces │
|
|
106
|
+
├──────────────┬──────────────────┬───────────────────────┤
|
|
107
|
+
│ CLI │ MCP Server │ Internal (Validator)│
|
|
108
|
+
│ │ │ │
|
|
109
|
+
│ lean-spec │ mcp_lean-spec │ ComplexityValidator │
|
|
110
|
+
│ tokens │ _tokens │ │
|
|
111
|
+
└──────┬───────┴────────┬─────────┴──────────┬───────────┘
|
|
112
|
+
│ │ │
|
|
113
|
+
└────────────────┴────────────────────┘
|
|
114
|
+
│
|
|
115
|
+
┌─────────▼──────────┐
|
|
116
|
+
│ Core Library │
|
|
117
|
+
│ @leanspec/core │
|
|
118
|
+
├────────────────────┤
|
|
119
|
+
│ TokenCounter │
|
|
120
|
+
│ - count() │
|
|
121
|
+
│ - analyze() │
|
|
122
|
+
│ - breakdown() │
|
|
123
|
+
│ │
|
|
124
|
+
│ Uses: tiktoken │
|
|
125
|
+
└────────────────────┘
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Token Counting Options
|
|
129
|
+
|
|
130
|
+
Based on spec 066 analysis of token counting packages:
|
|
131
|
+
|
|
132
|
+
### Using tiktoken for Token Counting
|
|
133
|
+
|
|
134
|
+
**Official OpenAI tokenizer** for precise token counting and complexity measurement.
|
|
135
|
+
|
|
136
|
+
**Note**: We use `tiktoken` (official OpenAI package) NOT `gpt-tokenizer` mentioned in spec 066. The `tiktoken` npm package is the official JavaScript port.
|
|
137
|
+
|
|
138
|
+
**Why tiktoken?**:
|
|
139
|
+
- ✅ Exact BPE encoding used by GPT-4 and similar models
|
|
140
|
+
- ✅ Official OpenAI tokenizer (ported to JS)
|
|
141
|
+
- ✅ Battle-tested and maintained (1.1M+ weekly downloads)
|
|
142
|
+
- ✅ Token count is the primary metric for complexity (not line count)
|
|
143
|
+
- ✅ Easy to install and setup (no complex configuration)
|
|
144
|
+
- ✅ Fast enough for our use case (<50ms per spec)
|
|
145
|
+
|
|
146
|
+
**Trade-offs**:
|
|
147
|
+
- Bundle size: ~500KB (acceptable for core functionality)
|
|
148
|
+
- Slightly slower than estimation (but negligible: <50ms per spec)
|
|
149
|
+
- Model-specific encoding (we standardize on GPT-4/Claude encoding)
|
|
150
|
+
|
|
151
|
+
**Package**: https://www.npmjs.com/package/tiktoken
|
|
152
|
+
|
|
153
|
+
**Usage**:
|
|
154
|
+
```typescript
|
|
155
|
+
import { encoding_for_model } from 'tiktoken';
|
|
156
|
+
|
|
157
|
+
const enc = encoding_for_model('gpt-4');
|
|
158
|
+
const tokens = enc.encode(specContent);
|
|
159
|
+
const count = tokens.length;
|
|
160
|
+
enc.free(); // Important: free memory
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Decision**: Use tiktoken as the single solution—no fallback needed. Easy to setup, fast enough, and gives us exact token counts.
|
|
164
|
+
|
|
165
|
+
### Core Utilities
|
|
166
|
+
|
|
167
|
+
New utilities in `@leanspec/core/src/utils/token-counter.ts`:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
export interface TokenCount {
|
|
171
|
+
total: number;
|
|
172
|
+
files: {
|
|
173
|
+
path: string;
|
|
174
|
+
tokens: number;
|
|
175
|
+
}[];
|
|
176
|
+
breakdown?: {
|
|
177
|
+
code: number; // Tokens in code blocks
|
|
178
|
+
prose: number; // Tokens in prose
|
|
179
|
+
tables: number; // Tokens in tables
|
|
180
|
+
frontmatter: number; // Tokens in frontmatter
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface TokenCounterOptions {
|
|
185
|
+
detailed?: boolean; // Include breakdown by file and type
|
|
186
|
+
includeSubSpecs?: boolean; // Count sub-spec files
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export class TokenCounter {
|
|
190
|
+
/**
|
|
191
|
+
* Count tokens in a single file
|
|
192
|
+
*/
|
|
193
|
+
async countFile(filePath: string, options?: TokenCounterOptions): Promise<TokenCount>;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Count tokens in a spec (including sub-specs if requested)
|
|
197
|
+
*/
|
|
198
|
+
async countSpec(specPath: string, options?: TokenCounterOptions): Promise<TokenCount>;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Analyze token breakdown by content type
|
|
202
|
+
*/
|
|
203
|
+
async analyzeBreakdown(content: string): Promise<TokenCount['breakdown']>;
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Check if content fits within token limit
|
|
207
|
+
*/
|
|
208
|
+
isWithinLimit(count: TokenCount, limit: number): boolean;
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Format token count for display
|
|
212
|
+
*/
|
|
213
|
+
formatCount(count: TokenCount, verbose?: boolean): string;
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### CLI Commands
|
|
218
|
+
|
|
219
|
+
#### Basic Command
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
$ lean-spec tokens 059
|
|
223
|
+
Spec: 059-programmatic-spec-management
|
|
224
|
+
Total: 2,100 tokens
|
|
225
|
+
Files:
|
|
226
|
+
README.md: 394 lines, 2,100 tokens
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### With Sub-Specs
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
$ lean-spec tokens 059 --include-sub-specs
|
|
233
|
+
Spec: 059-programmatic-spec-management
|
|
234
|
+
Total: 8,450 tokens
|
|
235
|
+
Files:
|
|
236
|
+
README.md: 2,100 tokens (394 lines)
|
|
237
|
+
ARCHITECTURE.md: 1,850 tokens (411 lines)
|
|
238
|
+
CONTEXT-ENGINEERING.md: 3,200 tokens (799 lines)
|
|
239
|
+
COMMANDS.md: 560 tokens (156 lines)
|
|
240
|
+
ALGORITHMS.md: 240 tokens (62 lines)
|
|
241
|
+
IMPLEMENTATION.md: 310 tokens (88 lines)
|
|
242
|
+
TESTING.md: 190 tokens (54 lines)
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
#### Detailed Breakdown
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
$ lean-spec tokens 066 --detailed
|
|
249
|
+
Spec: 066-context-economy-thresholds-refinement
|
|
250
|
+
Total: 7,307 tokens
|
|
251
|
+
|
|
252
|
+
Content Breakdown:
|
|
253
|
+
Prose: 4,200 tokens (57%)
|
|
254
|
+
Code: 2,100 tokens (29%)
|
|
255
|
+
Tables: 800 tokens (11%)
|
|
256
|
+
Frontmatter: 207 tokens (3%)
|
|
257
|
+
|
|
258
|
+
Performance Indicators:
|
|
259
|
+
Cost multiplier: 6.1x vs baseline (1,200 tokens)
|
|
260
|
+
AI effectiveness: ~65% (hypothesis - >5K tokens)
|
|
261
|
+
Context Economy: ⚠️ Review - elevated token count
|
|
262
|
+
|
|
263
|
+
Recommendation: Consider splitting or using sub-specs
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### Compare All Specs
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
$ lean-spec tokens --all --sort-by tokens
|
|
270
|
+
╭────────────────────────────────────────────────────────╮
|
|
271
|
+
│ Token Counts (Top 10) │
|
|
272
|
+
├─────────┬──────────────────────────────┬───────────────┤
|
|
273
|
+
│ Spec │ Name │ Tokens │
|
|
274
|
+
├─────────┼──────────────────────────────┼───────────────┤
|
|
275
|
+
│ 066 │ context-economy-thresholds │ 7,307 (⚠️) │
|
|
276
|
+
│ 045 │ unified-dashboard │ 4,800 (⚠️) │
|
|
277
|
+
│ 016 │ github-action │ 2,400 │
|
|
278
|
+
│ 059 │ programmatic-spec-mgmt │ 2,100 │
|
|
279
|
+
│ 049 │ first-principles │ 1,700 │
|
|
280
|
+
│ 051 │ docs-system-prompt │ 1,600 │
|
|
281
|
+
╰─────────┴──────────────────────────────┴───────────────╯
|
|
282
|
+
|
|
283
|
+
Legend: ⚠️ = >3,500 tokens (review recommended)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### MCP Tool Interface
|
|
287
|
+
|
|
288
|
+
```json
|
|
289
|
+
{
|
|
290
|
+
"name": "mcp_lean-spec_tokens",
|
|
291
|
+
"description": "Count tokens in spec or sub-spec for LLM context management",
|
|
292
|
+
"parameters": {
|
|
293
|
+
"specPath": {
|
|
294
|
+
"type": "string",
|
|
295
|
+
"description": "Spec name, number, or file path (e.g., '059', 'unified-dashboard', '059/DESIGN.md')"
|
|
296
|
+
},
|
|
297
|
+
"includeSubSpecs": {
|
|
298
|
+
"type": "boolean",
|
|
299
|
+
"description": "Include all sub-spec files in count (default: false)"
|
|
300
|
+
},
|
|
301
|
+
"detailed": {
|
|
302
|
+
"type": "boolean",
|
|
303
|
+
"description": "Return breakdown by content type (default: false)"
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Example Usage by AI Agent**:
|
|
310
|
+
```
|
|
311
|
+
Agent: "I need to include spec 059 in context. Will it fit?"
|
|
312
|
+
Tool call: mcp_lean-spec_tokens("059", includeSubSpecs=true)
|
|
313
|
+
Response: { total: 8450 }
|
|
314
|
+
Agent: "That's too large. Let me just include README.md"
|
|
315
|
+
Tool call: mcp_lean-spec_tokens("059")
|
|
316
|
+
Response: { total: 2100 }
|
|
317
|
+
Agent: "Perfect, that fits in my context budget."
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## Plan
|
|
321
|
+
|
|
322
|
+
### Phase 1: Core Utilities (v0.3.0 - Week 1) ✅ COMPLETE
|
|
323
|
+
- [x] Install `tiktoken` as dependency
|
|
324
|
+
- [x] Create `TokenCounter` class in `@leanspec/core`
|
|
325
|
+
- [x] Implement `countFile()` using `tiktoken`
|
|
326
|
+
- [x] Implement `countSpec()` with sub-spec support
|
|
327
|
+
- [x] Implement `analyzeBreakdown()` for content type analysis
|
|
328
|
+
- [x] Add unit tests for edge cases (31 tests, all passing)
|
|
329
|
+
- [x] Export utilities from core package
|
|
330
|
+
|
|
331
|
+
### Phase 2: CLI Integration (v0.3.0 - Week 1-2) ✅ COMPLETE
|
|
332
|
+
- [x] Add `tokens` command to CLI (using tiktoken)
|
|
333
|
+
- [x] Implement `--include-sub-specs` flag
|
|
334
|
+
- [x] Implement `--detailed` flag for breakdown
|
|
335
|
+
- [x] Implement `--all` flag for project-wide view
|
|
336
|
+
- [x] Add `--sort-by` option (tokens, lines, name)
|
|
337
|
+
- [x] Format output with tables and colors
|
|
338
|
+
- [x] Add `--json` flag for structured output
|
|
339
|
+
|
|
340
|
+
### Phase 3: Integration & Polish (v0.3.0 - Week 2) ✅ COMPLETE
|
|
341
|
+
- [x] **Replace `tokenx` with `tiktoken` in `ComplexityValidator`**
|
|
342
|
+
- [x] **Make token count the PRIMARY complexity metric** (line count secondary)
|
|
343
|
+
- [x] Update validation thresholds based on exact token counts (2K/3.5K/5K)
|
|
344
|
+
- [x] Ensure consistency across validation and CLI
|
|
345
|
+
- [x] Validation tests passing (21 tests in complexity.test.ts)
|
|
346
|
+
- [x] Documentation complete (comprehensive spec with research rationale)
|
|
347
|
+
|
|
348
|
+
### Phase 4: MCP Tool (Moved to Spec 070)
|
|
349
|
+
- Deferred to separate spec for focused implementation
|
|
350
|
+
- See spec 070-mcp-token-counting-tool for details
|
|
351
|
+
- Infrastructure ready, just needs MCP server integration
|
|
352
|
+
|
|
353
|
+
### Phase 5: Advanced Features (Future - v0.4.0+)
|
|
354
|
+
- [ ] Add token trends over time (git history)
|
|
355
|
+
- [ ] Add context budget planning (`--budget` flag)
|
|
356
|
+
- [ ] Add "will this fit?" checker for MCP tools
|
|
357
|
+
- [ ] Support for multiple model tokenizers (Claude, Gemini, etc.)
|
|
358
|
+
- [ ] Token cost estimation ($/1M tokens)
|
|
359
|
+
|
|
360
|
+
## Test
|
|
361
|
+
|
|
362
|
+
### Unit Tests ✅ COMPLETE
|
|
363
|
+
|
|
364
|
+
**Core Utilities**:
|
|
365
|
+
- [x] `countFile()` returns correct token counts
|
|
366
|
+
- [x] `countSpec()` aggregates sub-specs correctly
|
|
367
|
+
- [x] `analyzeBreakdown()` categorizes content types
|
|
368
|
+
- [x] `isWithinLimit()` compares correctly
|
|
369
|
+
- [x] `formatCount()` produces readable output
|
|
370
|
+
|
|
371
|
+
**Edge Cases**:
|
|
372
|
+
- [x] Empty files (0 tokens)
|
|
373
|
+
- [x] Very large files (>10K tokens)
|
|
374
|
+
- [x] Files with only code blocks
|
|
375
|
+
- [x] Files with only frontmatter
|
|
376
|
+
- [x] Specs without sub-specs
|
|
377
|
+
- [x] Invalid file paths
|
|
378
|
+
|
|
379
|
+
**Test Results**: 31 tests passing in `token-counter.test.ts`
|
|
380
|
+
|
|
381
|
+
### Integration Tests ✅ COMPLETE
|
|
382
|
+
|
|
383
|
+
**CLI Commands**:
|
|
384
|
+
- [x] `lean-spec tokens <spec>` shows basic count
|
|
385
|
+
- [x] `--include-sub-specs` aggregates correctly
|
|
386
|
+
- [x] `--detailed` shows breakdown
|
|
387
|
+
- [x] `--all` lists all specs
|
|
388
|
+
- [x] Output format is readable and correct
|
|
389
|
+
- [x] Error handling for invalid specs
|
|
390
|
+
- [x] `--json` flag outputs structured data
|
|
391
|
+
|
|
392
|
+
**Validation**: Tested on spec 069 itself (4,936 tokens, warning threshold)
|
|
393
|
+
|
|
394
|
+
### Validation Tests ✅ COMPLETE
|
|
395
|
+
|
|
396
|
+
**Against Known Specs**:
|
|
397
|
+
- [x] Spec 066: 8,073 tokens (problem threshold, matches validation)
|
|
398
|
+
- [x] Spec 069: 4,936 tokens (warning threshold, matches validation)
|
|
399
|
+
- [x] Spec 059: 3,364 tokens (good range)
|
|
400
|
+
- [x] Spec 049: 3,413 tokens (good range)
|
|
401
|
+
- [x] Spec 016: 2,004 tokens (good range, code-dense)
|
|
402
|
+
|
|
403
|
+
**Project Stats**: 34 specs, 73,802 total tokens, 2,171 average
|
|
404
|
+
|
|
405
|
+
### Consistency Tests ✅ COMPLETE
|
|
406
|
+
|
|
407
|
+
**Validate tiktoken Behavior**:
|
|
408
|
+
- [x] Token counts are consistent across multiple runs
|
|
409
|
+
- [x] Proper memory cleanup (enc.free() called)
|
|
410
|
+
- [x] Works with various content types (code, prose, tables)
|
|
411
|
+
- [x] Handles edge cases (empty files, very large files)
|
|
412
|
+
- [x] Unicode and emoji support verified
|
|
413
|
+
|
|
414
|
+
## Success Metrics
|
|
415
|
+
|
|
416
|
+
### Quantitative ✅ ACHIEVED
|
|
417
|
+
|
|
418
|
+
**Performance**:
|
|
419
|
+
- [x] Token counting takes <50ms per spec (tested: ~40ms average)
|
|
420
|
+
- [x] Aggregate counting (34 specs) takes <500ms (tested: ~407ms)
|
|
421
|
+
- [x] Memory usage minimal with proper cleanup
|
|
422
|
+
|
|
423
|
+
**Reliability**:
|
|
424
|
+
- [x] Token counts are consistent and reproducible
|
|
425
|
+
- [x] Matches validation thresholds correctly
|
|
426
|
+
- [x] Uses same tokenization as GPT-4/Claude (tiktoken)
|
|
427
|
+
- [x] 31 unit tests + 21 complexity tests all passing
|
|
428
|
+
|
|
429
|
+
### Qualitative ✅ ACHIEVED
|
|
430
|
+
|
|
431
|
+
**Developer Experience**:
|
|
432
|
+
- [x] "Now I can see token counts easily" - CLI command working
|
|
433
|
+
- [x] "Helps me understand Context Economy better" - Indicators show cost/effectiveness
|
|
434
|
+
- [x] "Makes token-aware editing decisions" - Validation provides actionable feedback
|
|
435
|
+
- [x] "CLI output is clear and actionable" - Formatted with colors, emojis, recommendations
|
|
436
|
+
|
|
437
|
+
**AI Agent Experience** (Deferred to Spec 070):
|
|
438
|
+
- [ ] "Can query token counts programmatically" - MCP tool needed
|
|
439
|
+
- [ ] "Makes informed context budget decisions" - MCP tool needed
|
|
440
|
+
- [ ] "Avoids overloading context windows" - MCP tool needed
|
|
441
|
+
- [ ] "Understands which specs fit in context" - MCP tool needed
|
|
442
|
+
|
|
443
|
+
## Notes
|
|
444
|
+
|
|
445
|
+
### Why This Spec Exists
|
|
446
|
+
|
|
447
|
+
**Separated from Spec 059** because:
|
|
448
|
+
1. **Different lifecycle**: Token counting is foundational infrastructure, programmatic spec management builds on it
|
|
449
|
+
2. **Clearer dependency**: Spec 059 *depends on* having token counting utilities
|
|
450
|
+
3. **Reusable utilities**: Token counting is useful beyond just spec management (MCP tools, validation, CLI)
|
|
451
|
+
4. **Context Economy**: Spec 059 is already 394 lines with 6 sub-specs - adding token counting details would violate its own principles
|
|
452
|
+
|
|
453
|
+
**Dependency Relationship**:
|
|
454
|
+
- Spec 066: Establishes *why* token counting matters (research, thresholds)
|
|
455
|
+
- **Spec 069 (this)**: Provides *how* to count tokens (utilities, tools)
|
|
456
|
+
- Spec 059: Uses token counting for *programmatic transformations*
|
|
457
|
+
|
|
458
|
+
### Research References
|
|
459
|
+
|
|
460
|
+
From Spec 066:
|
|
461
|
+
|
|
462
|
+
1. **Token Count Critical for AI Performance**
|
|
463
|
+
- [arXiv:2505.06120](https://arxiv.org/abs/2505.06120): 39% performance drop in multi-turn contexts
|
|
464
|
+
- [Berkeley BFCL](https://gorilla.cs.berkeley.edu/leaderboard.html): All models worse with more tools/options
|
|
465
|
+
- [Databricks Research](https://www.databricks.com/blog/long-context-rag-performance-llms): Degradation even within limits
|
|
466
|
+
|
|
467
|
+
2. **Token Count vs Line Count**
|
|
468
|
+
- Code: ~3 chars/token (denser)
|
|
469
|
+
- Prose: ~4 chars/token (lighter)
|
|
470
|
+
- Better predictor than line count for AI effectiveness
|
|
471
|
+
|
|
472
|
+
3. **Validated Thresholds** (hypothesis, to be tested):
|
|
473
|
+
- <2K tokens: Baseline performance (~100%)
|
|
474
|
+
- 2-3.5K tokens: Good range (~90-95%)
|
|
475
|
+
- 3.5-5K tokens: Warning zone (~80-85%)
|
|
476
|
+
- >5K tokens: Should split (~65-80%)
|
|
477
|
+
|
|
478
|
+
### Why tiktoken?
|
|
479
|
+
|
|
480
|
+
| Feature | tiktoken |
|
|
481
|
+
|---------|----------|
|
|
482
|
+
| Tokenization | Exact BPE encoding (GPT-4) |
|
|
483
|
+
| Size | ~500KB |
|
|
484
|
+
| Speed | Fast (<50ms/spec, <2s for 100 specs) |
|
|
485
|
+
| Dependencies | Some (but well-maintained) |
|
|
486
|
+
| Downloads/week | 1.1M+ |
|
|
487
|
+
| Maintenance | Official OpenAI port |
|
|
488
|
+
| Setup | Easy (`npm install tiktoken`) |
|
|
489
|
+
|
|
490
|
+
**Decision Rationale**:
|
|
491
|
+
- Token count is the **primary complexity metric** (spec 066 research)
|
|
492
|
+
- Exact token counts are essential for reliable validation thresholds
|
|
493
|
+
- ~500KB bundle cost is justified for core functionality
|
|
494
|
+
- Performance is more than acceptable for our use case
|
|
495
|
+
- Easy to install and setup—no complex configuration needed
|
|
496
|
+
- Line count becomes secondary "backstop" metric only
|
|
497
|
+
- **No fallback needed**—tiktoken is good enough as single solution
|
|
498
|
+
|
|
499
|
+
### Implementation Notes
|
|
500
|
+
|
|
501
|
+
**Why tiktoken Over gpt-tokenizer?**
|
|
502
|
+
- Spec 066 mentioned `gpt-tokenizer` (53.1 MB unpacked)
|
|
503
|
+
- Better choice: `tiktoken` (official OpenAI port to JS)
|
|
504
|
+
- Official, well-maintained, reasonable size (~500KB)
|
|
505
|
+
- **v0.3.0 decision: Use tiktoken as single solution**
|
|
506
|
+
|
|
507
|
+
**Why tiktoken Over tokenx?**
|
|
508
|
+
- Token count is THE metric for complexity (spec 066 research)
|
|
509
|
+
- tokenx estimation has ~10% variance which is too large for validation thresholds
|
|
510
|
+
- Need exact counts to set reliable thresholds and measure effectiveness
|
|
511
|
+
- Bundle size (~500KB) is justified for core functionality
|
|
512
|
+
- Easy to install—no fallback complexity needed
|
|
513
|
+
|
|
514
|
+
**Migration from tokenx**:
|
|
515
|
+
- `ComplexityValidator` currently uses `tokenx`
|
|
516
|
+
- Phase 3: Replace with `tiktoken` for exact counts
|
|
517
|
+
- Update validation thresholds based on exact counts
|
|
518
|
+
- Remove `tokenx` dependency entirely
|
|
519
|
+
|
|
520
|
+
### Open Questions
|
|
521
|
+
|
|
522
|
+
1. **Display Format**: Show tokens always, or only on request?
|
|
523
|
+
- **Decision**: Show in `lean-spec list` with flag, dedicated `tokens` command for details
|
|
524
|
+
|
|
525
|
+
2. **Sub-Spec Aggregation**: Default to including sub-specs or not?
|
|
526
|
+
- **Decision**: Default to README only (most common), `--include-sub-specs` flag for all
|
|
527
|
+
|
|
528
|
+
3. **MCP Tool Priority**: Build now or defer to v0.4.0?
|
|
529
|
+
- **Updated**: Build in v0.3.0 (Phase 4) - token counting is foundational for AI agents
|
|
530
|
+
|
|
531
|
+
4. **Exact Counts**: Install tiktoken now or wait for user feedback?
|
|
532
|
+
- **RESOLVED**: Install tiktoken in v0.3.0 as single dependency, no fallback
|
|
533
|
+
- **Rationale**: Token count is primary metric, need exact counts, easy to setup
|
|
534
|
+
|
|
535
|
+
5. **Integration with Analyze**: Show tokens in `lean-spec analyze`?
|
|
536
|
+
- **Decision**: Yes, prominently display exact token count in complexity analysis
|
|
537
|
+
|
|
538
|
+
6. **Line Count Role**: Keep line count validation or remove it?
|
|
539
|
+
- **Decision**: Keep as backstop only (warn at >500 lines regardless of tokens)
|
|
540
|
+
- **Primary metric**: Token count thresholds (2K/3.5K/5K from spec 066)
|
|
541
|
+
|
|
542
|
+
## Related Specs
|
|
543
|
+
|
|
544
|
+
- **[066-context-economy-thresholds-refinement](../066-context-economy-thresholds-refinement/)** - Research & thresholds (dependency)
|
|
545
|
+
- **[059-programmatic-spec-management](../059-programmatic-spec-management/)** - Programmatic transformations (dependent)
|
|
546
|
+
- **[048-spec-complexity-analysis](../048-spec-complexity-analysis/)** - Initial complexity work
|
|
547
|
+
- **[018-spec-validation](../018-spec-validation/)** - Validation framework
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
**Remember**: Token counting is foundational infrastructure for Context Economy. Make it fast, accurate, and easy to use.
|