spec-cat 0.1.29 → 0.1.30

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.
Files changed (28) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{DWfl6VER.js → B-mPy4v0.js} +1 -1
  3. package/.output/public/_nuxt/BBwCne8P.js +4 -0
  4. package/.output/public/_nuxt/{BYSSU_C5.js → BgvgELpz.js} +1 -1
  5. package/.output/public/_nuxt/{WBf5CG5l.js → BjiM5vTO.js} +1 -1
  6. package/.output/public/_nuxt/{DHRTMwte.js → CEJ6U1Qq.js} +1 -1
  7. package/.output/public/_nuxt/{DL_gJOgv.js → CS51gfpH.js} +1 -1
  8. package/.output/public/_nuxt/{BuAdOXGq.js → CkMVxEkR.js} +1 -1
  9. package/.output/public/_nuxt/{Dpc_a9DZ.js → Cs3CDuzi.js} +1 -1
  10. package/.output/public/_nuxt/{C3xB8Cgs.js → CtGpX7eD.js} +1 -1
  11. package/.output/public/_nuxt/{C7HUOCmf.js → CyiHvGEK.js} +1 -1
  12. package/.output/public/_nuxt/DD--WXKu.js +1 -0
  13. package/.output/public/_nuxt/{CjahVUNV.js → DhEjAk03.js} +1 -1
  14. package/.output/public/_nuxt/{BvFtAA65.js → UKPh86SU.js} +34 -34
  15. package/.output/public/_nuxt/builds/latest.json +1 -1
  16. package/.output/public/_nuxt/builds/meta/ddb67c8c-22f4-45e8-a41d-13e5496d70bb.json +1 -0
  17. package/.output/server/chunks/_/error-500.mjs.map +1 -1
  18. package/.output/server/chunks/build/client.precomputed.mjs +1 -1
  19. package/.output/server/chunks/build/client.precomputed.mjs.map +1 -1
  20. package/.output/server/chunks/nitro/nitro.mjs +644 -644
  21. package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
  22. package/.output/server/chunks/routes/renderer.mjs.map +1 -1
  23. package/.output/server/package.json +1 -1
  24. package/README.md +113 -101
  25. package/package.json +1 -1
  26. package/.output/public/_nuxt/DJrEvjo-.js +0 -4
  27. package/.output/public/_nuxt/builds/meta/65ae0c7c-58de-4f20-a97f-c1be9bfe34bb.json +0 -1
  28. package/.output/public/_nuxt/ggQsoUsu.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nitro.mjs","sources":["../../../../node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.node.mjs","../../../../node_modules/.pnpm/crossws@0.3.5/node_modules/crossws/dist/shared/crossws.DfCzGthR.mjs","../../../../node_modules/.pnpm/crossws@0.3.5/node_modules/crossws/dist/shared/crossws.D9ehKjSh.mjs","../../../../node_modules/.pnpm/crossws@0.3.5/node_modules/crossws/dist/shared/crossws.By9qWDAI.mjs","../../../../node_modules/.pnpm/crossws@0.3.5/node_modules/crossws/dist/shared/crossws.CipVM6lf.mjs","../../../../node_modules/.pnpm/crossws@0.3.5/node_modules/crossws/dist/adapters/node.mjs","../../../../node_modules/.pnpm/destr@2.0.5/node_modules/destr/dist/index.mjs","../../../../node_modules/.pnpm/ufo@1.6.3/node_modules/ufo/dist/index.mjs","../../../../node_modules/.pnpm/cookie-es@1.2.2/node_modules/cookie-es/dist/index.mjs","../../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../../../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs","../../../../node_modules/.pnpm/node-mock-http@1.0.4/node_modules/node-mock-http/dist/index.mjs","../../../../node_modules/.pnpm/h3@1.15.5/node_modules/h3/dist/index.mjs","../../../../node_modules/.pnpm/hookable@5.5.3/node_modules/hookable/dist/index.mjs","../../../../node_modules/.pnpm/node-fetch-native@1.6.7/node_modules/node-fetch-native/dist/native.mjs","../../../../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs","../../../../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/node.mjs","../../../../node_modules/.pnpm/unstorage@1.17.4_db0@0.3.4_better-sqlite3@12.6.2__ioredis@5.9.2/node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../node_modules/.pnpm/unstorage@1.17.4_db0@0.3.4_better-sqlite3@12.6.2__ioredis@5.9.2/node_modules/unstorage/dist/index.mjs","../../../../node_modules/.pnpm/unstorage@1.17.4_db0@0.3.4_better-sqlite3@12.6.2__ioredis@5.9.2/node_modules/unstorage/drivers/utils/index.mjs","../../../../node_modules/.pnpm/unstorage@1.17.4_db0@0.3.4_better-sqlite3@12.6.2__ioredis@5.9.2/node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../node_modules/.pnpm/unstorage@1.17.4_db0@0.3.4_better-sqlite3@12.6.2__ioredis@5.9.2/node_modules/unstorage/drivers/fs-lite.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/crypto/node/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/dist/index.mjs","../../../../node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/.pnpm/unctx@2.5.0/node_modules/unctx/dist/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/context.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../server/utils/projectDir.ts","../../../../server/plugins/projectDir.ts","../../../../server/utils/specCatStore.ts","../../../../server/utils/logger.ts","../../../../server/utils/specSearch/database.ts","../../../../server/utils/specSearch/embeddings.ts","../../../../server/utils/specSearch/chunker.ts","../../../../server/utils/specSearch/indexer.ts","../../../../server/utils/specSearch/scheduler.ts","../../../../server/plugins/specSearchScheduler.ts","../../../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../server/middleware/theme.ts","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../../node_modules/.pnpm/nitropack@2.13.1_better-sqlite3@12.6.2/node_modules/nitropack/dist/presets/node/runtime/node-server.mjs"],"names":["isPlainObject","getQuery","serialize","createRouter","f","h","i","l","createError","mergeHeaders","s","nodeFetch","Headers","Headers$1","AbortController$1","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","_inlineAppConfig","createRadixRouter","readFile","writeFile","require","log","readdir","nitroApp","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown","HttpsServer","HttpServer","wsAdapter"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,49,50,52,53,54,55,56]}
1
+ {"version":3,"file":"nitro.mjs","sources":["../../../../node_modules/uncrypto/dist/crypto.node.mjs","../../../../node_modules/crossws/dist/shared/crossws.DfCzGthR.mjs","../../../../node_modules/crossws/dist/shared/crossws.D9ehKjSh.mjs","../../../../node_modules/crossws/dist/shared/crossws.By9qWDAI.mjs","../../../../node_modules/crossws/dist/shared/crossws.CipVM6lf.mjs","../../../../node_modules/crossws/dist/adapters/node.mjs","../../../../node_modules/destr/dist/index.mjs","../../../../node_modules/ufo/dist/index.mjs","../../../../node_modules/h3/node_modules/cookie-es/dist/index.mjs","../../../../node_modules/radix3/dist/index.mjs","../../../../node_modules/defu/dist/defu.mjs","../../../../node_modules/node-mock-http/dist/index.mjs","../../../../node_modules/h3/dist/index.mjs","../../../../node_modules/hookable/dist/index.mjs","../../../../node_modules/node-fetch-native/dist/native.mjs","../../../../node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs","../../../../node_modules/ofetch/dist/node.mjs","../../../../node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../node_modules/unstorage/dist/index.mjs","../../../../node_modules/unstorage/drivers/utils/index.mjs","../../../../node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../node_modules/unstorage/drivers/fs-lite.mjs","../../../../node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../node_modules/ohash/dist/crypto/node/index.mjs","../../../../node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../node_modules/klona/dist/index.mjs","../../../../node_modules/scule/dist/index.mjs","../../../../node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/unctx/dist/index.mjs","../../../../node_modules/nitropack/dist/runtime/internal/context.mjs","../../../../node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../server/utils/projectDir.ts","../../../../server/plugins/projectDir.ts","../../../../server/utils/specCatStore.ts","../../../../server/utils/logger.ts","../../../../server/utils/specSearch/database.ts","../../../../server/utils/specSearch/embeddings.ts","../../../../server/utils/specSearch/chunker.ts","../../../../server/utils/specSearch/indexer.ts","../../../../server/utils/specSearch/scheduler.ts","../../../../server/plugins/specSearchScheduler.ts","../../../../node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../server/middleware/theme.ts","../../../../node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/nitropack/dist/runtime/internal/shutdown.mjs","../../../../node_modules/nitropack/dist/presets/node/runtime/node-server.mjs"],"names":["isPlainObject","getQuery","serialize","createRouter","f","h","i","l","createError","mergeHeaders","s","nodeFetch","Headers","Headers$1","AbortController$1","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","_inlineAppConfig","createRadixRouter","readFile","writeFile","require","log","readdir","nitroApp","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown","HttpsServer","HttpServer","wsAdapter"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,49,50,52,53,54,55,56]}
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.mjs","sources":["../../../../node_modules/.pnpm/@unhead+vue@2.1.2_vue@3.5.27_typescript@5.9.3_/node_modules/@unhead/vue/dist/shared/vue.N9zWjxoK.mjs","../../../../node_modules/.pnpm/@unhead+vue@2.1.2_vue@3.5.27_typescript@5.9.3_/node_modules/@unhead/vue/dist/shared/vue.Bm-NbY4b.mjs","../../../../node_modules/.pnpm/@unhead+vue@2.1.2_vue@3.5.27_typescript@5.9.3_/node_modules/@unhead/vue/dist/server.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/utils/paths.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/build-files.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/payload.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/app.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@3.21.0_better-sqlite3@12.6.2_db0@0.3.4_better-sqlite3@12.6.2__ioredi_16a94e24c4b6aecf7aea27120059bd54/node_modules/@nuxt/nitro-server/dist/runtime/handlers/renderer.mjs"],"names":[],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7]}
1
+ {"version":3,"file":"renderer.mjs","sources":["../../../../node_modules/@unhead/vue/dist/shared/vue.N9zWjxoK.mjs","../../../../node_modules/@unhead/vue/dist/shared/vue.Bm-NbY4b.mjs","../../../../node_modules/@unhead/vue/dist/server.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/paths.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/build-files.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/payload.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/utils/renderer/app.mjs","../../../../node_modules/@nuxt/nitro-server/dist/runtime/handlers/renderer.mjs"],"names":[],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-cat-prod",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/README.md CHANGED
@@ -1,105 +1,112 @@
1
1
  # Spec Cat
2
- Spec Cat is a local development workbench designed to make spec-driven development safer, faster, and a bit more delightful.
3
2
 
4
- It brings spec writing/editing, Git graph inspection, interactive AI coding, worktree isolation, and cascade automation into a single screen.
5
-
6
- <img width="3127" height="1503" alt="image" src="https://github.com/user-attachments/assets/81f6a813-d769-4765-804a-ac3159d7eadb" />
7
-
8
- ## Project Overview
9
- In large codebases, a "one-line prompt" might be fast, but it does not guarantee maintainable results.
10
-
11
- Spec Cat is built to make this workflow a daily default:
12
-
13
- `spec -> plan -> tasks -> implement -> review`
14
-
15
- This workflow follows GitHub Spec-Kit conventions and tracks planning/implementation around documents in `specs/`.
16
- Spec Cat is not only convention-compatible: it is a wrapper/orchestration project around Spec-Kit workflows (`/speckit.*`), adding UI, conversation state, worktree safety, and review/finalize controls on top.
17
-
18
- The core idea is simple.
19
- - Specs are the source of truth.
20
- - Changes are isolated by worktree.
21
- - AI helps quickly, but outcomes remain reviewable by humans.
3
+ ```
4
+ ____ ____ _
5
+ / ___| _ __ ___ ___ / ___|__ _| |_
6
+ \___ \| '_ \ / _ \/ __|| | / _` | __|
7
+ ___) | |_) | __/ (__ | |__| (_| | |_
8
+ |____/| .__/ \___|\___| \____\__,_|\__|
9
+ |_|
10
+ ```
22
11
 
23
- ## Motivation
24
- - Direct code changes from prompts alone can quickly make projects chaotic.
25
- - The more repetitive spec pipeline work is automated, the smaller team quality variance becomes.
26
- - Even when AI makes mistakes, teams should be able to recover safely through a worktree/preview/finalize flow.
12
+ A local development workbench for spec-driven development.
13
+ Write specs, visualize git history, chat with AI, isolate work in worktrees — all in one screen.
27
14
 
28
- ## Features
29
- Below are the major features in the current repository (implemented + some in progress).
15
+ ## What It Does
30
16
 
31
- ### 1) Four-column development workbench UI
32
- - Use Git / Features / Conversations / Chat panels on a single screen
33
- - Prioritizes context continuity over route switching
17
+ Spec Cat orchestrates the spec-driven workflow:
34
18
 
35
- ### 2) Git graph + Git tooling
36
- - Git operation APIs and UI for branches, commits, tags, stashes, and more
37
- - Commit graph visualization with detailed diff inspection
19
+ ```
20
+ spec -> (clarify) -> plan -> tasks -> implement -> review
21
+ ```
38
22
 
39
- ### 3) Features panel + spec viewer
40
- - Automatic discovery of the `specs/` directory
41
- - Status checks for `spec.md`, `plan.md`, and `tasks.md` from feature cards
42
- - Markdown viewing/editing for spec files in a modal
23
+ Every change starts from a spec, gets planned, broken into tasks, implemented in an isolated worktree, and reviewed before merging. AI assists at each step, but humans stay in control.
43
24
 
44
- ### 4) AI chat (provider abstraction)
45
- - Streaming responses, session resume, and permission modes (`plan`, `ask`, `auto`, `bypass`)
46
- - Provider Registry supports Claude and Codex selection
47
- - Incompatible provider/model combinations are safely normalized on the server
25
+ ## Screen Layout
48
26
 
49
- ### 5) Worktree-isolated workflow
50
- - Worktree isolation per conversation
51
- - `Preview` (apply to main workspace) -> `Finalize` (clean up after review) flow
52
- - Stop/recovery paths when conflicts occur
27
+ Four-column workbench on a single page:
53
28
 
54
- ### 6) Cascade / auto mode
55
- - Chained pipeline command execution by feature unit
56
- - Sequential/parallel processing of multiple spec units in auto mode
57
- - Results are reviewed in the same conversation/worktree flow
29
+ | Git Graph | Features | Conversations | Chat |
30
+ |-----------|----------|---------------|------|
31
+ | Branch/commit visualization, diffs, 50+ git operations | Spec status cards, markdown viewer, traceability | Session list, archive, search | AI streaming, permission modes, worktree controls |
58
32
 
59
- ### 7) Spec search
60
- - Keeps `specs/*` as the source of truth
61
- - Keyword search + embedding-based semantic search (SQLite cache)
33
+ ## Features
62
34
 
63
- ### 8) Conversation archive
64
- - Archive-first management instead of hard deletion
65
- - Preserve historical context for re-open/restart workflows
35
+ ### Git Graph & Operations
36
+ - Interactive commit graph with branch/tag/stash visualization
37
+ - Context menus for merge, rebase, cherry-pick, reset, revert, stash, tag, push/pull
38
+ - Inline diff viewer for any commit or uncommitted changes
39
+ - Find widget for searching commits by subject or hash
40
+ - Remote management (add, edit, fetch, push, pull)
41
+
42
+ ### Spec Management
43
+ - Auto-discovers `specs/` directory with per-feature status (`spec.md`, `plan.md`, `tasks.md`)
44
+ - Markdown viewer/editor modal with syntax highlighting (CodeMirror)
45
+ - FR traceability analysis — verifies every requirement maps through plan to tasks
46
+ - Keyword + embedding-based semantic search across all specs (SQLite + sqlite-vec)
47
+
48
+ ### AI Chat
49
+ - Streaming responses with thinking blocks, tool use, and result summaries
50
+ - **Permission modes**: `ask` (confirm each action), `plan` (upfront approval), `auto` (no prompts), `bypass` (admin)
51
+ - **Providers**: Claude, Gemini, Codex — with capability-based selection and safe fallbacks
52
+ - Session resume on page reload, per-conversation stream isolation
53
+ - Commit message generation from diffs
54
+
55
+ ### Worktree Isolation
56
+ - Each conversation gets its own git worktree
57
+ - **Preview**: apply worktree changes to main workspace for review
58
+ - **Finalize**: clean up worktree after merge
59
+ - **Sync**: keep worktree alive for continued iteration
60
+ - Rebase conflict resolution with AI-assisted suggestions
61
+
62
+ ### Conversations
63
+ - Archive-first management (soft delete, not hard delete)
64
+ - Linked to features and worktree branches
65
+ - Persistent across sessions via filesystem-backed storage
66
+
67
+ ### Cascade / Auto Mode
68
+ - Chain spec pipeline commands per feature (`specify -> plan -> tasks -> implement`)
69
+ - Sequential or parallel processing of multiple features
70
+ - Results reviewed in the same conversation/worktree flow
71
+
72
+ ### Skills & Tools
73
+ - Registered tool schemas sent per AI request (request-scoped, not global)
74
+ - Skill prompt system for spec-kit operations
75
+ - Provider adapters map tools to each provider's format
76
+
77
+ ### Theme
78
+ - Dark / light mode with retro-style color palette
79
+ - Persisted via cookie
66
80
 
67
81
  ## Tech Stack
68
- - Nuxt 3, Vue 3, TypeScript
69
- - Pinia, Tailwind CSS
70
- - Nitro server routes + Node.js child process/fs utilities
71
- - SQLite (`better-sqlite3`, `sqlite-vec`) for spec search caching
72
-
73
- ## Provider Capability Policy
74
- - Codex can appear in provider metadata even when runtime support is unavailable.
75
- - If Codex is missing required capabilities (`streaming`, `permissions`, `resume`), selection is disabled in Settings with a clear reason.
76
- - Backend AI endpoints return actionable guard errors that include `providerId` and `missingCapability`.
77
- - If persisted provider/model settings are invalid, Claude is used as a safe default fallback.
78
-
79
- ## Model API Tool Registration Policy
80
- - Tool schemas are request-scoped: each model API call includes the tool schema payload.
81
- - App startup loads only the internal tool registry (definitions + executors).
82
- - Provider adapters map that registry per provider format at request time.
82
+
83
+ | Layer | Tech |
84
+ |-------|------|
85
+ | Framework | Nuxt 3, Vue 3, TypeScript |
86
+ | State | Pinia |
87
+ | Styling | Tailwind CSS |
88
+ | Server | Nitro with WebSocket support |
89
+ | Editor | CodeMirror 6 |
90
+ | Search | SQLite (better-sqlite3) + sqlite-vec for embeddings |
91
+ | Markdown | marked + shiki + DOMPurify |
92
+ | AI | Claude CLI, Gemini API, Codex CLI |
83
93
 
84
94
  ## Getting Started
85
- ### 1) Requirements
86
- - Node.js (LTS recommended)
95
+
96
+ ### Requirements
97
+ - Node.js >= 20
87
98
  - `pnpm`
88
- - (Optional) AI CLI
89
- - For Claude: authenticated `claude` CLI
90
- - For Codex: `codex` CLI or `CODEX_CLI_PATH` configuration
99
+ - For AI features: authenticated `claude` CLI, `codex` CLI, or Gemini API credentials
91
100
 
92
- ### 2) Install
93
- ```bash
94
- pnpm install
95
- ```
101
+ ### Install & Run
96
102
 
97
- ### 3) Run in development
98
103
  ```bash
104
+ pnpm install
99
105
  pnpm dev
100
106
  ```
101
107
 
102
- ### 4) Run via npx (after npm publish)
108
+ ### Run via npx
109
+
103
110
  ```bash
104
111
  npx spec-cat
105
112
  npx spec-cat --port 4310 --host 0.0.0.0
@@ -107,32 +114,37 @@ npx spec-cat --project /path/to/your/project
107
114
  SPEC_CAT_PROJECT_DIR=/path/to/your/project npx spec-cat
108
115
  ```
109
116
 
110
- ### 5) Key scripts
117
+ ### Scripts
118
+
111
119
  ```bash
112
- pnpm typecheck
113
- pnpm test
114
- pnpm test:coverage
115
- pnpm build
116
- pnpm preview
120
+ pnpm dev # Development server
121
+ pnpm build # Production build
122
+ pnpm preview # Preview production build
123
+ pnpm typecheck # Type checking
124
+ pnpm test # Run tests
125
+ pnpm test:coverage # Tests with coverage
117
126
  ```
118
127
 
119
- ## Settings Storage Path
120
- Per-project settings are stored at:
128
+ ## Directory Structure
129
+
130
+ ```
131
+ components/ 70+ Vue components (chat, git, features, worktree, settings)
132
+ composables/ Reusable composition functions (stream, graph, dialogs, theme)
133
+ stores/ Pinia stores (chat, gitGraph, layout, settings, worktree)
134
+ server/api/ 90+ Nitro API endpoints
135
+ server/utils/ AI providers, git ops, spec search, job queue, event bus
136
+ pages/ Main workbench, settings, worktrees, design guide
137
+ types/ TypeScript type definitions
138
+ utils/ Client-side utilities
139
+ specs/ Feature spec documents (source of truth)
140
+ lib/speckit/ Spec-kit templates and prompts
141
+ ```
121
142
 
122
- `~/.spec-cat/projects/{project-hash}/settings.json`
143
+ ## Settings
123
144
 
124
- Even when opening the same repository multiple times, settings remain isolated per project hash.
145
+ Per-project settings stored at `~/.spec-cat/projects/{project-hash}/settings.json`.
146
+ Same repo opened from different paths gets separate settings.
125
147
 
126
- ## Directory Sketch
127
- ```text
128
- components/ UI components
129
- stores/ Pinia state management
130
- server/api/ Nitro API endpoints
131
- server/utils/ provider/worktree/spec/git utilities
132
- specs/ Feature spec docs (source of truth)
133
- tests/ Vitest tests
134
- ```
148
+ ## License
135
149
 
136
- ## Direction
137
- Spec Cat aims to be more than an "AI codes for you" app.
138
- It is a workbench where structure does not collapse, even when AI and humans build together.
150
+ MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "spec-cat",
3
- "version": "0.1.29",
3
+ "version": "0.1.30",
4
4
  "description": "Spec-driven development workbench",
5
5
  "license": "MIT",
6
6
  "keywords": [