ai-spector 0.8.48 → 0.8.49

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 (302) hide show
  1. package/README.md +95 -90
  2. package/README.vi.md +34 -11
  3. package/dist/cli.js +65 -9
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/comments/storage.d.ts +3 -0
  6. package/dist/core/comments/storage.d.ts.map +1 -1
  7. package/dist/core/comments/storage.js +12 -3
  8. package/dist/core/comments/storage.js.map +1 -1
  9. package/dist/core/comments/types.d.ts +6 -0
  10. package/dist/core/comments/types.d.ts.map +1 -1
  11. package/dist/core/config/docflow-paths.d.ts +23 -0
  12. package/dist/core/config/docflow-paths.d.ts.map +1 -0
  13. package/dist/core/config/docflow-paths.js +64 -0
  14. package/dist/core/config/docflow-paths.js.map +1 -0
  15. package/dist/core/config/load.d.ts +3 -1
  16. package/dist/core/config/load.d.ts.map +1 -1
  17. package/dist/core/config/load.js +4 -2
  18. package/dist/core/config/load.js.map +1 -1
  19. package/dist/core/config/types.d.ts +3 -3
  20. package/dist/core/config/types.d.ts.map +1 -1
  21. package/dist/core/course/catalog.d.ts +20 -0
  22. package/dist/core/course/catalog.d.ts.map +1 -0
  23. package/dist/core/course/catalog.js +117 -0
  24. package/dist/core/course/catalog.js.map +1 -0
  25. package/dist/core/course/html-shell.d.ts +11 -0
  26. package/dist/core/course/html-shell.d.ts.map +1 -0
  27. package/dist/core/course/html-shell.js +175 -0
  28. package/dist/core/course/html-shell.js.map +1 -0
  29. package/dist/core/course/render.d.ts +4 -0
  30. package/dist/core/course/render.d.ts.map +1 -0
  31. package/dist/core/course/render.js +58 -0
  32. package/dist/core/course/render.js.map +1 -0
  33. package/dist/core/course/sections.d.ts +5 -0
  34. package/dist/core/course/sections.d.ts.map +1 -0
  35. package/dist/core/course/sections.js +25 -0
  36. package/dist/core/course/sections.js.map +1 -0
  37. package/dist/core/course/serve.d.ts +16 -0
  38. package/dist/core/course/serve.d.ts.map +1 -0
  39. package/dist/core/course/serve.js +81 -0
  40. package/dist/core/course/serve.js.map +1 -0
  41. package/dist/core/index/docs-config.d.ts.map +1 -1
  42. package/dist/core/index/docs-config.js +2 -1
  43. package/dist/core/index/docs-config.js.map +1 -1
  44. package/dist/core/operations/check.d.ts.map +1 -1
  45. package/dist/core/operations/check.js +2 -1
  46. package/dist/core/operations/check.js.map +1 -1
  47. package/dist/core/operations/comments.d.ts +12 -4
  48. package/dist/core/operations/comments.d.ts.map +1 -1
  49. package/dist/core/operations/comments.js +13 -2
  50. package/dist/core/operations/comments.js.map +1 -1
  51. package/dist/core/operations/context.d.ts +8 -0
  52. package/dist/core/operations/context.d.ts.map +1 -1
  53. package/dist/core/operations/context.js +19 -3
  54. package/dist/core/operations/context.js.map +1 -1
  55. package/dist/core/operations/course.d.ts +2 -0
  56. package/dist/core/operations/course.d.ts.map +1 -0
  57. package/dist/core/operations/course.js +2 -0
  58. package/dist/core/operations/course.js.map +1 -0
  59. package/dist/core/operations/extracted.d.ts +10 -0
  60. package/dist/core/operations/extracted.d.ts.map +1 -1
  61. package/dist/core/operations/extracted.js +31 -7
  62. package/dist/core/operations/extracted.js.map +1 -1
  63. package/dist/core/operations/prototype.js +4 -4
  64. package/dist/core/operations/review.d.ts +30 -0
  65. package/dist/core/operations/review.d.ts.map +1 -1
  66. package/dist/core/operations/review.js +70 -8
  67. package/dist/core/operations/review.js.map +1 -1
  68. package/dist/core/operations/setup.d.ts.map +1 -1
  69. package/dist/core/operations/setup.js +2 -1
  70. package/dist/core/operations/setup.js.map +1 -1
  71. package/dist/core/operations/task.d.ts +6 -1
  72. package/dist/core/operations/task.d.ts.map +1 -1
  73. package/dist/core/operations/task.js +20 -4
  74. package/dist/core/operations/task.js.map +1 -1
  75. package/dist/core/operations/template.d.ts.map +1 -1
  76. package/dist/core/operations/template.js +18 -17
  77. package/dist/core/operations/template.js.map +1 -1
  78. package/dist/core/operations/workflow-route.d.ts.map +1 -1
  79. package/dist/core/operations/workflow-route.js +6 -1
  80. package/dist/core/operations/workflow-route.js.map +1 -1
  81. package/dist/core/operations/workflow-status.d.ts +6 -0
  82. package/dist/core/operations/workflow-status.d.ts.map +1 -0
  83. package/dist/core/operations/workflow-status.js +12 -0
  84. package/dist/core/operations/workflow-status.js.map +1 -0
  85. package/dist/core/prototype/config.d.ts.map +1 -1
  86. package/dist/core/prototype/config.js +6 -5
  87. package/dist/core/prototype/config.js.map +1 -1
  88. package/dist/core/readiness/config.d.ts +1 -1
  89. package/dist/core/readiness/config.d.ts.map +1 -1
  90. package/dist/core/readiness/config.js +13 -12
  91. package/dist/core/readiness/config.js.map +1 -1
  92. package/dist/core/readiness/criteria-path.d.ts.map +1 -1
  93. package/dist/core/readiness/criteria-path.js +4 -4
  94. package/dist/core/readiness/criteria-path.js.map +1 -1
  95. package/dist/core/readiness/custom-checklists.d.ts +35 -0
  96. package/dist/core/readiness/custom-checklists.d.ts.map +1 -0
  97. package/dist/core/readiness/custom-checklists.js +176 -0
  98. package/dist/core/readiness/custom-checklists.js.map +1 -0
  99. package/dist/core/readiness/output-checklist.d.ts +9 -0
  100. package/dist/core/readiness/output-checklist.d.ts.map +1 -1
  101. package/dist/core/readiness/output-checklist.js +16 -14
  102. package/dist/core/readiness/output-checklist.js.map +1 -1
  103. package/dist/core/readiness/profiles.d.ts +4 -1
  104. package/dist/core/readiness/profiles.d.ts.map +1 -1
  105. package/dist/core/readiness/profiles.js +33 -25
  106. package/dist/core/readiness/profiles.js.map +1 -1
  107. package/dist/core/readiness/resolve.js +2 -2
  108. package/dist/core/readiness/resolve.js.map +1 -1
  109. package/dist/core/readiness/scan-docs.d.ts.map +1 -1
  110. package/dist/core/readiness/scan-docs.js +3 -3
  111. package/dist/core/readiness/scan-docs.js.map +1 -1
  112. package/dist/core/readiness/standards-align.js +1 -1
  113. package/dist/core/readiness/standards-align.js.map +1 -1
  114. package/dist/core/readiness/types.d.ts +2 -0
  115. package/dist/core/readiness/types.d.ts.map +1 -1
  116. package/dist/core/reviews/doc-type.d.ts +3 -0
  117. package/dist/core/reviews/doc-type.d.ts.map +1 -0
  118. package/dist/core/reviews/doc-type.js +17 -0
  119. package/dist/core/reviews/doc-type.js.map +1 -0
  120. package/dist/core/reviews/session.d.ts.map +1 -1
  121. package/dist/core/reviews/session.js +3 -1
  122. package/dist/core/reviews/session.js.map +1 -1
  123. package/dist/core/reviews/types.d.ts +7 -0
  124. package/dist/core/reviews/types.d.ts.map +1 -1
  125. package/dist/core/reviews/types.js.map +1 -1
  126. package/dist/core/reviews/workflow-guidance.d.ts +1 -0
  127. package/dist/core/reviews/workflow-guidance.d.ts.map +1 -1
  128. package/dist/core/reviews/workflow-guidance.js +26 -13
  129. package/dist/core/reviews/workflow-guidance.js.map +1 -1
  130. package/dist/core/template/pack-readiness.js +2 -2
  131. package/dist/core/template/pack-readiness.js.map +1 -1
  132. package/dist/core/util/audit-actor.d.ts +29 -0
  133. package/dist/core/util/audit-actor.d.ts.map +1 -0
  134. package/dist/core/util/audit-actor.js +80 -0
  135. package/dist/core/util/audit-actor.js.map +1 -0
  136. package/dist/core/util/git-user.d.ts +3 -0
  137. package/dist/core/util/git-user.d.ts.map +1 -0
  138. package/dist/core/util/git-user.js +3 -0
  139. package/dist/core/util/git-user.js.map +1 -0
  140. package/dist/core/workflow/active-worker.d.ts +48 -0
  141. package/dist/core/workflow/active-worker.d.ts.map +1 -0
  142. package/dist/core/workflow/active-worker.js +173 -0
  143. package/dist/core/workflow/active-worker.js.map +1 -0
  144. package/dist/core/workflow/guidance.d.ts +19 -0
  145. package/dist/core/workflow/guidance.d.ts.map +1 -1
  146. package/dist/core/workflow/guidance.js +158 -0
  147. package/dist/core/workflow/guidance.js.map +1 -1
  148. package/dist/core/workflow/route-intent.d.ts +22 -6
  149. package/dist/core/workflow/route-intent.d.ts.map +1 -1
  150. package/dist/core/workflow/route-intent.js +93 -8
  151. package/dist/core/workflow/route-intent.js.map +1 -1
  152. package/dist/interfaces/cli/format/comments.d.ts.map +1 -1
  153. package/dist/interfaces/cli/format/comments.js +4 -2
  154. package/dist/interfaces/cli/format/comments.js.map +1 -1
  155. package/dist/interfaces/cli/format/context.d.ts.map +1 -1
  156. package/dist/interfaces/cli/format/context.js +4 -1
  157. package/dist/interfaces/cli/format/context.js.map +1 -1
  158. package/dist/interfaces/cli/format/extracted.d.ts.map +1 -1
  159. package/dist/interfaces/cli/format/extracted.js +4 -1
  160. package/dist/interfaces/cli/format/extracted.js.map +1 -1
  161. package/dist/interfaces/cli/format/reviews.d.ts.map +1 -1
  162. package/dist/interfaces/cli/format/reviews.js +4 -2
  163. package/dist/interfaces/cli/format/reviews.js.map +1 -1
  164. package/dist/interfaces/mcp/schemas.d.ts +99 -37
  165. package/dist/interfaces/mcp/schemas.d.ts.map +1 -1
  166. package/dist/interfaces/mcp/schemas.js +38 -6
  167. package/dist/interfaces/mcp/schemas.js.map +1 -1
  168. package/dist/interfaces/mcp/server.js +16 -2
  169. package/dist/interfaces/mcp/server.js.map +1 -1
  170. package/dist/interfaces/mcp/tool-descriptions.d.ts.map +1 -1
  171. package/dist/interfaces/mcp/tool-descriptions.js +1 -0
  172. package/dist/interfaces/mcp/tool-descriptions.js.map +1 -1
  173. package/dist/interfaces/mcp/tools/comments.d.ts.map +1 -1
  174. package/dist/interfaces/mcp/tools/comments.js +3 -1
  175. package/dist/interfaces/mcp/tools/comments.js.map +1 -1
  176. package/dist/interfaces/mcp/tools/context.d.ts.map +1 -1
  177. package/dist/interfaces/mcp/tools/context.js +6 -2
  178. package/dist/interfaces/mcp/tools/context.js.map +1 -1
  179. package/dist/interfaces/mcp/tools/extracted.d.ts.map +1 -1
  180. package/dist/interfaces/mcp/tools/extracted.js +4 -0
  181. package/dist/interfaces/mcp/tools/extracted.js.map +1 -1
  182. package/dist/interfaces/mcp/tools/readiness.d.ts.map +1 -1
  183. package/dist/interfaces/mcp/tools/readiness.js +1 -0
  184. package/dist/interfaces/mcp/tools/readiness.js.map +1 -1
  185. package/dist/interfaces/mcp/tools/resolve-task.d.ts +8 -2
  186. package/dist/interfaces/mcp/tools/resolve-task.d.ts.map +1 -1
  187. package/dist/interfaces/mcp/tools/resolve-task.js +5 -1
  188. package/dist/interfaces/mcp/tools/resolve-task.js.map +1 -1
  189. package/dist/interfaces/mcp/tools/reviews.d.ts.map +1 -1
  190. package/dist/interfaces/mcp/tools/reviews.js +15 -2
  191. package/dist/interfaces/mcp/tools/reviews.js.map +1 -1
  192. package/dist/interfaces/mcp/tools/task.d.ts.map +1 -1
  193. package/dist/interfaces/mcp/tools/task.js +3 -0
  194. package/dist/interfaces/mcp/tools/task.js.map +1 -1
  195. package/dist/interfaces/mcp/tools/workflow-status.d.ts +4 -0
  196. package/dist/interfaces/mcp/tools/workflow-status.d.ts.map +1 -0
  197. package/dist/interfaces/mcp/tools/workflow-status.js +5 -0
  198. package/dist/interfaces/mcp/tools/workflow-status.js.map +1 -0
  199. package/dist/interfaces/sdk/index.d.ts +7 -3
  200. package/dist/interfaces/sdk/index.d.ts.map +1 -1
  201. package/dist/interfaces/sdk/index.js +3 -1
  202. package/dist/interfaces/sdk/index.js.map +1 -1
  203. package/docs/course/00-overview.md +38 -0
  204. package/docs/course/01-get-started/01-prerequisites-and-init.md +82 -0
  205. package/docs/course/01-get-started/02-setup-and-skills.md +50 -0
  206. package/docs/course/01-get-started/README.md +10 -0
  207. package/docs/course/02-chat-basics/01-how-chat-works.md +48 -0
  208. package/docs/course/02-chat-basics/02-workspace-and-tasks.md +55 -0
  209. package/docs/course/02-chat-basics/README.md +10 -0
  210. package/docs/course/03-graph/01-sources-and-analyze.md +44 -0
  211. package/docs/course/03-graph/02-validate-index-explore.md +57 -0
  212. package/docs/course/03-graph/README.md +10 -0
  213. package/docs/course/04-generate/01-generate-srs.md +63 -0
  214. package/docs/course/04-generate/02-basic-design.md +44 -0
  215. package/docs/course/04-generate/README.md +12 -0
  216. package/docs/course/05-prototype/01-translations.md +26 -0
  217. package/docs/course/05-prototype/02-build-prototype.md +54 -0
  218. package/docs/course/05-prototype/README.md +10 -0
  219. package/docs/course/06-review/01-review-comments-changes.md +55 -0
  220. package/docs/course/06-review/README.md +9 -0
  221. package/docs/course/07-advanced/01-custom-templates.md +30 -0
  222. package/docs/course/07-advanced/02-search-and-editors.md +36 -0
  223. package/docs/course/07-advanced/README.md +10 -0
  224. package/docs/course/README.md +45 -0
  225. package/package.json +4 -1
  226. package/scaffold/.ai-spector/.docflow/config/{dag.srs.graph-seeds.json → doc-types/srs/dag.graph-seeds.json} +1 -1
  227. package/scaffold/.ai-spector/.docflow/config/readiness/profiles/general.json +7 -0
  228. package/scaffold/.ai-spector/.docflow/config/review-checklists/README.md +59 -0
  229. package/scaffold/.ai-spector/.docflow/config/review-checklists/srs/_all/security-gates.json.example +19 -0
  230. package/scaffold/.ai-spector/.docflow/config/{index.docs.json → workspace/index.docs.json} +1 -1
  231. package/scaffold/claude/.claude/skills/ai-spector-generate-srs/skill.md +2 -2
  232. package/scaffold/cocoindex/flow.py +1 -1
  233. package/scaffold/cursor/ACTIVE-WORKER.md +46 -0
  234. package/scaffold/cursor/WORKFLOW.md +24 -5
  235. package/scaffold/cursor/commands/generate-srs.md +32 -0
  236. package/scaffold/cursor/commands/resolve-comments.md +31 -0
  237. package/scaffold/cursor/commands/review.md +5 -6
  238. package/scaffold/cursor/rules/ai-spector-routing.mdc +59 -42
  239. package/scaffold/cursor/skills/README.md +17 -14
  240. package/scaffold/cursor/skills/_skill-router.md +4 -2
  241. package/scaffold/cursor/skills/ai-spector/SKILL.md +4 -1
  242. package/scaffold/cursor/skills/ai-spector/references/clarify.md +1 -1
  243. package/scaffold/cursor/skills/ai-spector/references/context-readiness.md +15 -14
  244. package/scaffold/cursor/skills/ai-spector/references/generate-workflow.md +3 -3
  245. package/scaffold/cursor/skills/ai-spector/references/language-picker.md +3 -3
  246. package/scaffold/cursor/skills/ai-spector/references/plan-and-briefing.md +1 -1
  247. package/scaffold/cursor/skills/ai-spector/references/prerequisites.md +1 -1
  248. package/scaffold/cursor/skills/ai-spector/references/project-conventions.md +9 -3
  249. package/scaffold/cursor/skills/ai-spector/references/workspace-check.md +1 -1
  250. package/scaffold/cursor/skills/ai-spector-check/SKILL.md +6 -0
  251. package/scaffold/cursor/skills/ai-spector-generate/SKILL.md +4 -0
  252. package/scaffold/cursor/skills/ai-spector-generate-basic-design/SKILL.md +6 -0
  253. package/scaffold/cursor/skills/ai-spector-generate-basic-design/references/runbook.md +1 -1
  254. package/scaffold/cursor/skills/ai-spector-generate-prototype/SKILL.md +6 -0
  255. package/scaffold/cursor/skills/ai-spector-generate-prototype/references/auth-picker.md +6 -6
  256. package/scaffold/cursor/skills/ai-spector-generate-prototype/references/runbook.md +9 -9
  257. package/scaffold/cursor/skills/ai-spector-generate-prototype/references/stack-picker.md +4 -4
  258. package/scaffold/cursor/skills/ai-spector-generate-srs/SKILL.md +6 -0
  259. package/scaffold/cursor/skills/ai-spector-generate-srs/references/runbook.md +3 -3
  260. package/scaffold/cursor/skills/ai-spector-graph/SKILL.md +6 -0
  261. package/scaffold/cursor/skills/ai-spector-resolve-comments/SKILL.md +6 -0
  262. package/scaffold/cursor/skills/ai-spector-resolve-task/SKILL.md +6 -0
  263. package/scaffold/cursor/skills/ai-spector-review/SKILL.md +14 -4
  264. package/scaffold/cursor/skills/ai-spector-review/references/custom-checklists.md +139 -0
  265. package/scaffold/cursor/skills/ai-spector-review/references/readiness-compliance.md +82 -0
  266. package/scaffold/cursor/skills/ai-spector-review/references/runbook.md +33 -0
  267. package/scaffold/cursor/skills/ai-spector-search/SKILL.md +6 -0
  268. package/scaffold/cursor/skills/ai-spector-setup/SKILL.md +6 -0
  269. package/scaffold/cursor/skills/ai-spector-setup/references/cli-setup.md +9 -3
  270. package/scaffold/cursor/skills/ai-spector-setup/references/runbook.md +3 -1
  271. package/scaffold/cursor/skills/ai-spector-task/SKILL.md +6 -0
  272. package/scaffold/cursor/skills/ai-spector-template-import/references/pack-gap-matrix.md +3 -3
  273. package/scaffold/cursor/skills/ai-spector-template-import/references/readiness-setup.md +2 -2
  274. package/scaffold/cursor/skills/ai-spector-template-import/references/skill-outline.md +9 -9
  275. package/scaffold/cursor/subagents/README.md +53 -0
  276. package/scaffold/cursor/subagents/doc-review.md +45 -0
  277. package/scaffold/cursor/subagents/generate-basic-design.md +28 -0
  278. package/scaffold/cursor/subagents/generate-prototype.md +31 -0
  279. package/scaffold/cursor/subagents/generate-srs.md +44 -0
  280. package/scaffold/cursor/subagents/graph-ops.md +34 -0
  281. package/scaffold/cursor/subagents/resolve-comments.md +38 -0
  282. package/scaffold/cursor/subagents/resolve-task.md +40 -0
  283. package/scaffold/cursor/subagents/search.md +25 -0
  284. package/scaffold/cursor/subagents/setup-check.md +25 -0
  285. package/scaffold/cursor/subagents/spec-queue.md +34 -0
  286. package/scaffold/cursor/subagents/task-router.md +39 -0
  287. package/scaffold/prototype/README.md +2 -2
  288. /package/scaffold/.ai-spector/.docflow/config/{completeness-rules.basic-design.json → doc-types/basic-design/completeness-rules.json} +0 -0
  289. /package/scaffold/.ai-spector/.docflow/config/{dag.basic-design.graph-seeds.json → doc-types/basic-design/dag.graph-seeds.json} +0 -0
  290. /package/scaffold/.ai-spector/.docflow/config/{dag.basic-design.json → doc-types/basic-design/dag.json} +0 -0
  291. /package/scaffold/.ai-spector/.docflow/config/{completeness-rules.detail-design.json → doc-types/detail-design/completeness-rules.json} +0 -0
  292. /package/scaffold/.ai-spector/.docflow/config/{dag.detail-design.json → doc-types/detail-design/dag.json} +0 -0
  293. /package/scaffold/.ai-spector/.docflow/config/{completeness-rules.srs.json → doc-types/srs/completeness-rules.json} +0 -0
  294. /package/scaffold/.ai-spector/.docflow/config/{dag.srs.json → doc-types/srs/dag.json} +0 -0
  295. /package/scaffold/.ai-spector/.docflow/config/{readiness-criteria.srs.json → doc-types/srs/readiness-criteria.json} +0 -0
  296. /package/scaffold/.ai-spector/.docflow/config/{prototype.config.json → prototype/config.json} +0 -0
  297. /package/scaffold/.ai-spector/.docflow/config/{readiness-profiles → readiness/profiles}/arc42.json +0 -0
  298. /package/scaffold/.ai-spector/.docflow/config/{readiness-profiles → readiness/profiles}/regulated.json +0 -0
  299. /package/scaffold/.ai-spector/.docflow/config/{data-source.json → workspace/data-source.json} +0 -0
  300. /package/scaffold/.ai-spector/.docflow/config/{language.json → workspace/language.json} +0 -0
  301. /package/scaffold/.ai-spector/.docflow/config/{workspace.rules.json → workspace/rules.json} +0 -0
  302. /package/scaffold/.ai-spector/.docflow/config/{workflow.dependencies.json → workspace/workflow.dependencies.json} +0 -0
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # AI Spector
2
2
 
3
- Documentation workflow in **Cursor** or **Claude Code**: traceability graph, SRS, basic design, and UI prototypes (static HTML or SPA static build). **Describe what you need in chat** — skills route the agent, which runs `ai-spector` CLI or MCP tools. You usually do not run CLI yourself.
3
+ Documentation workflow in **Cursor** or **Claude Code**: traceability graph, SRS, basic design, and UI prototypes (static HTML or SPA). **Describe what you need in chat** — an orchestrator routes to specialized workers that run `ai-spector` MCP tools. You rarely touch the terminal.
4
4
 
5
5
  **Needs:** Node 20+, Git, [Cursor](https://cursor.com) and/or [Claude Code](https://docs.anthropic.com/en/docs/claude-code), Python 3.11+ *(optional — CocoIndex semantic search)*.
6
6
 
7
- **Course (step-by-step):** [docs/course/README.md](docs/course/README.md)
7
+ **Learn:** `npx ai-spector course serve --open` · [Course](docs/course/README.md) *(13 lessons, ~10 min each)*
8
8
 
9
9
  **Tiếng Việt:** [README.vi.md](README.vi.md)
10
10
 
@@ -19,21 +19,29 @@ Documentation workflow in **Cursor** or **Claude Code**: traceability graph, SRS
19
19
  | Node.js ≥ 20 | `node --version` |
20
20
  | Git repository | `git status` |
21
21
  | Cursor and/or Claude Code | IDE open in project root |
22
- | Python ≥ 3.11 *(optional)* | only for CocoIndex semantic search |
22
+ | Python ≥ 3.11 *(optional)* | CocoIndex semantic search |
23
23
 
24
- ---
24
+ ### Step 1 — Install & scaffold *(CLI)*
25
25
 
26
- ### Step 1 Scaffold *(only CLI step)*
26
+ Run once at your project root. **Install the package first**, then run the init wizard.
27
27
 
28
- Run once at your project root. On the **first** run, pass `--registry` so `npx` can download the package from the internal Verdaccio registry (`http://10.101.0.239:4873`). No `npm login` required.
28
+ **Internal registry** (Verdaccio no `npm login` required):
29
29
 
30
30
  ```bash
31
- npx ai-spector@latest init --registry http://10.101.0.239:4873
31
+ npm install ai-spector --registry http://10.101.0.239:4873
32
+ npx ai-spector init
32
33
  ```
33
34
 
34
- The wizard prompts for editor (Cursor, Claude Code, or both), languages, git hook, and optional CocoIndex.
35
+ **Public npm:**
35
36
 
36
- This creates:
37
+ ```bash
38
+ npm install ai-spector
39
+ npx ai-spector init
40
+ ```
41
+
42
+ The init wizard prompts for editor (Cursor, Claude Code, or both), languages, git hook, and optional CocoIndex.
43
+
44
+ Creates:
37
45
 
38
46
  - `.ai-spector/` — config, graph, templates
39
47
  - `docs/data-source/`, `docs/srs/`, `docs/basic-design/`
@@ -41,129 +49,124 @@ This creates:
41
49
  - **Claude Code:** `CLAUDE.md` + `.claude/skills/` + `.mcp.json`
42
50
  - Pre-commit hook (when git is available)
43
51
 
44
- ---
45
-
46
52
  ### Step 2 — Finish setup in chat
47
53
 
48
- Open the project in **Cursor** or **Claude Code** and say:
49
-
50
54
  ```text
51
55
  setup ai-spector project
52
56
  ```
53
57
 
54
- The agent installs the npm dependency (if needed), verifies the checklist, offers CocoIndex, and reminds you what is left to do manually.
55
-
56
- ---
58
+ The agent installs the npm dependency (if needed), verifies the checklist, and reminds you of any manual steps.
57
59
 
58
60
  ### Step 3 — Enable the agent *(manual, one-time)*
59
61
 
60
- **Cursor**
61
-
62
- 1. **Settings → Rules → Agent Skills** — enable **all** folders under `.cursor/skills/` (see `.cursor/skills/README.md`)
63
- 2. **Reload MCP** — `.cursor/mcp.json` registers the `ai-spector` MCP server
64
-
65
- **Claude Code**
62
+ **Cursor:** Settings → Rules → **Agent Skills** — enable **all** folders under `.cursor/skills/`. Reload MCP (`.cursor/mcp.json`).
66
63
 
67
- 1. Skills load automatically from `.claude/skills/` (see `CLAUDE.md`)
68
- 2. **Reload MCP** — `.mcp.json` registers the `ai-spector` MCP server
69
-
70
- ---
64
+ **Claude Code:** Skills load from `.claude/skills/`. Reload MCP (`.mcp.json`).
71
65
 
72
66
  ### Step 4 — Add source material
73
67
 
74
- Drop requirements docs, meeting notes, user stories, or any input into `docs/data-source/`. Supported formats: `.md`, `.txt`, `.pdf`.
75
-
76
- ---
68
+ Drop requirements into `docs/data-source/` (`.md`, `.txt`, `.pdf`).
77
69
 
78
70
  ### Step 5 — Start the pipeline
79
71
 
80
- In chat:
81
-
82
72
  ```text
83
73
  analyze my data source
84
74
  ```
85
75
 
86
- Then continue in chat as needed — see [Workflow](#workflow) below.
76
+ Continue in chat — see [Workflow](#workflow) below.
87
77
 
88
78
  ---
89
79
 
90
- ### Optional — CocoIndex semantic search
91
-
92
- Enables `docs_search` and `graph_query_fuzzy` MCP tools. Requires Python ≥ 3.11.
93
-
94
- In chat:
80
+ ## Workflow
95
81
 
96
- ```text
97
- enable CocoIndex for this project
98
- ```
82
+ After `init`, see `.cursor/WORKFLOW.md` (Cursor) or `CLAUDE.md` (Claude Code) for the full skill map.
99
83
 
100
- See [docs/setup-guide.md](docs/setup-guide.md) for Postgres / OpenAI embedding options.
84
+ ### How chat routing works
101
85
 
102
- ---
86
+ | Layer | Role |
87
+ |-------|------|
88
+ | **Orchestrator** | Classifies your message, asks clarifying questions, spawns a worker |
89
+ | **Worker** | One job (analyze, generate SRS, review docs, …) with a saved task state |
103
90
 
104
- ### Add another editor later
91
+ Say what you want in natural language — same in Cursor and Claude Code. If intent is unclear (especially **“approve”**), the agent asks once before acting.
105
92
 
106
- In chat:
93
+ ### First run
107
94
 
108
95
  ```text
109
- add Claude Code support to ai-spector
110
- sync ai-spector cursor skills
96
+ analyze the data source
97
+ validate the graph
98
+ generate the SRS
111
99
  ```
112
100
 
113
- After upgrading ai-spector, say **"sync ai-spector cursor skills"** in chat.
114
-
115
- ---
116
-
117
- ## Workflow
118
-
119
- See `.cursor/WORKFLOW.md` (Cursor) or `CLAUDE.md` (Claude Code) after `init`.
101
+ Generation is **gated**: workspace check → clarifying questions → plan table → your **yes, go ahead** waves of writing → optional **SPEC-NNN** approval → index.
120
102
 
121
- ### First run
122
-
123
- Say in chat:
103
+ Then as needed:
124
104
 
125
105
  ```text
126
- “analyze the data source”
127
- “validate the graph”
128
- “generate the SRS”
129
- “refresh the index”
106
+ generate basic design
107
+ generate prototype
108
+ refresh the index
109
+ review documents
130
110
  ```
131
111
 
132
- Then: **“generate basic design”** as needed.
133
-
134
- **Prototype** — static HTML (default) or SPA (React/Vue/etc. built to static files in `prototype/dist/`). Say **“generate prototype”** or **“generate HTML prototype”** for plain HTML; **“generate prototype with Vue”** (or React) for SPA. If no theme is saved, the agent recommends 3 themes, opens previews, and waits for you to pick. Or name one upfront: **“prototype with stripe theme”**.
135
-
136
- Then: **“generate prototype for all screens”**. For SPA, run the framework build and `npx ai-spector prototype sync`.
112
+ **Prototype** — static HTML (default) or SPA (React/Vue → `prototype/dist/`). Say **“generate prototype”** or **“generate prototype with Vue”**. For themes: **“help me pick a theme”** or **“prototype with stripe theme”**. SPA: run framework build, then `npx ai-spector prototype sync`.
137
113
 
138
114
  ### Day to day
139
115
 
140
116
  | When | Say (examples) |
141
117
  |------|----------------|
142
- | New or changed data source | “analyze data source” |
143
- | Check graph | “validate the graph” |
144
- | Regenerate docs | “generate SRS”, “generate basic design”, |
145
- | Prototype (HTML or SPA) | “generate prototype”, “generate prototype with Vue”, “prototype with stripe theme” |
146
- | Choose a theme | “help me pick a prototype theme”, “show me theme options” |
147
- | After doc edits | “re-index the graph” |
148
- | Multi-language sync | “add language vi”, “resolve translations”, “translation status— [Work 10](docs/course/10-multi-language.md) |
149
- | Custom templates | “set up template pack”, “template list”, `generate <pack-name>` — [Work 17](docs/course/17-custom-template-packs.md) |
150
- | What to redo | “what’s the impact of my changes” |
151
- | Review comments | “resolve comments” |
152
- | Explore graph | “visualize the graph” |
118
+ | New or changed sources | “analyze data source” |
119
+ | Check graph | “validate the graph”, “graph report” |
120
+ | Regenerate docs | “generate SRS”, “generate basic design |
121
+ | Pause / resume work | “active tasks”, “resume my SRS”, “pause task” |
122
+ | One feature or section | “I want to add login with Google”, “update the auth section” |
123
+ | After doc edits | “refresh the index”, “re-index the graph” |
124
+ | Document sign-off | “review documents”, “approve srs/01-overview”, “what needs review” |
125
+ | Comment threads | “resolve comments”, “show open comments” |
126
+ | Impact / what to redo | “what’s the impact of my changes” |
127
+ | Prototype | “generate prototype”, “prototype with stripe theme” |
128
+ | Multi-language | “add language vi”, “resolve translations— [course](docs/course/05-prototype/01-translations.md) |
129
+ | Custom templates | “set up template pack”, `generate <pack-name>` — [course](docs/course/07-advanced/01-custom-templates.md) |
130
+ | Semantic search *(CocoIndex)* | “find all mentions of rate limiting” |
131
+ | Explore graph | “show the graph”, `npx ai-spector graph visualize --open` |
132
+ | Check workspace | “check my workspace”, “why did pre-commit block me” |
153
133
 
154
134
  ### Typical path
155
135
 
156
136
  ```text
157
- docs/data-source/ → analyze → validate graph → generate SRS → index
158
- → generate basic design
159
- prototype setupgenerate screens (HTML or SPA build)
137
+ docs/data-source/ → analyze → validate
138
+ → generate SRS (clarify → plan → waves → specs) → index
139
+ basic designprototype → review documents
140
+ ```
141
+
142
+ ---
143
+
144
+ ## Optional — CocoIndex
145
+
146
+ Enables semantic search MCP tools (`docs_search`, `graph_query_fuzzy`). Requires Python ≥ 3.11.
147
+
148
+ ```text
149
+ enable CocoIndex for this project
160
150
  ```
161
151
 
152
+ See [docs/setup-guide.md](docs/setup-guide.md) for Postgres / embedding options.
153
+
162
154
  ---
163
155
 
164
- ## CLI (optional)
156
+ ## CLI *(scripts & debugging)*
157
+
158
+ Most users stay in chat. Useful commands:
159
+
160
+ ```bash
161
+ npx ai-spector course serve --open # interactive course in browser
162
+ npx ai-spector setup --check
163
+ npx ai-spector graph validate
164
+ npx ai-spector graph visualize --open
165
+ npx ai-spector graph impact --git
166
+ npx ai-spector prototype validate --strict
167
+ ```
165
168
 
166
- For scripts or debugging only: `npx ai-spector index`, `graph validate`, `graph visualize --open`, `graph impact --git`, `prototype auth|themes|preview|setup|manifest|validate`. See `npx ai-spector --help`.
169
+ Full list: `npx ai-spector --help`.
167
170
 
168
171
  ---
169
172
 
@@ -172,19 +175,21 @@ For scripts or debugging only: `npx ai-spector index`, `graph validate`, `graph
172
175
  | Issue | Fix |
173
176
  |-------|-----|
174
177
  | MCP tools unavailable | Reload MCP; confirm `.cursor/mcp.json` or `.mcp.json` has `ai-spector` server |
175
- | Setup incomplete | In chat: **“check ai-spector setup”** |
176
- | Skills not routing (Cursor) | Re-enable all folders under `.cursor/skills/` in Settings → Rules |
177
- | Validate errors after edits | In chat: **“re-index the graph”** |
178
- | Pre-commit hook missing | In chat: **“install ai-spector git hook”** |
178
+ | Setup incomplete | **“check ai-spector setup”** |
179
+ | Skills not routing (Cursor) | Re-enable all folders under `.cursor/skills/` |
180
+ | Validate errors after edits | **“re-index the graph”** |
181
+ | Pre-commit hook missing | **“install ai-spector git hook”** |
179
182
  | Agent stuck on CLI error | `.cursor/skills/ai-spector/references/cli-failures.md` |
180
183
 
184
+ After upgrading: reload MCP; in chat **“sync ai-spector cursor skills”** if scaffold skills changed.
185
+
181
186
  ---
182
187
 
183
188
  ## Node SDK
184
189
 
185
- For **scripts, CI, or custom backends** that call the same operations as the CLI and MCP server:
190
+ For scripts, CI, or custom backends:
186
191
 
187
- - **[SDK guide](docs/sdk.md)** — install, entry points, examples, API reference
192
+ - **[SDK guide](docs/plan/sdk.md)** — install, entry points, API reference
188
193
 
189
194
  ```bash
190
195
  npm install ai-spector
@@ -198,10 +203,10 @@ import { runIndex, runGraphImpact, validateGraph } from "ai-spector";
198
203
 
199
204
  ## Web / graph SDK
200
205
 
201
- For **browser or custom dashboards** (not the Cursor/Claude CLI), use the read-only npm package **`ai-spector-graph`**. Your backend serves repo JSON; the frontend loads it into `ProjectSession`.
206
+ For browser dashboards (read-only graph UI): npm package **`ai-spector-graph`**.
202
207
 
203
- - **[Integration guide](docs/ai-spector-graph-integration-guide.md)** — architecture, API examples, React, recipes
204
- - **[API reference](docs/ai-spector-graph.md)** — types and exports
208
+ - **[Integration guide](docs/ai-spector-graph-integration-guide.md)**
209
+ - **[API reference](docs/ai-spector-graph.md)**
205
210
 
206
211
  ```bash
207
212
  npm install ai-spector-graph
package/README.vi.md CHANGED
@@ -4,7 +4,7 @@ Công cụ làm tài liệu phần mềm trên **Cursor** hoặc **Claude Code**
4
4
 
5
5
  **Cần có:** Node 20+, Git, [Cursor](https://cursor.com) và/hoặc [Claude Code](https://docs.anthropic.com/en/docs/claude-code), Python 3.11+ *(không bắt buộc — dùng cho tìm kiếm thông minh với CocoIndex)*.
6
6
 
7
- Hướng dẫn chi tiết: [docs/setup-guide.md](docs/setup-guide.md)
7
+ Hướng dẫn từng bước: `npx ai-spector course serve --open` · [Khóa học](docs/course/README.md)
8
8
 
9
9
  **English:** [README.md](README.md)
10
10
 
@@ -23,15 +23,25 @@ Hướng dẫn chi tiết: [docs/setup-guide.md](docs/setup-guide.md)
23
23
 
24
24
  ---
25
25
 
26
- ### Bước 1 — Khởi tạo project *(bước duy nhất cần gõ lệnh)*
26
+ ### Bước 1 — Cài gói & khởi tạo *(CLI)*
27
27
 
28
- Chạy một lần ở thư mục gốc project. **Lần đầu** cần thêm `--registry` để `npx` tải gói từ registry nội bộ (`http://10.101.0.239:4873`). **Không cần** `npm login`.
28
+ Chạy một lần ở thư mục gốc project. **Cài gói trước**, rồi chạy wizard init.
29
+
30
+ **Registry nội bộ** (Verdaccio — **không cần** `npm login`):
31
+
32
+ ```bash
33
+ npm install ai-spector --registry http://10.101.0.239:4873
34
+ npx ai-spector init
35
+ ```
36
+
37
+ **npm công khai:**
29
38
 
30
39
  ```bash
31
- npx ai-spector@latest init --registry http://10.101.0.239:4873
40
+ npm install ai-spector
41
+ npx ai-spector init
32
42
  ```
33
43
 
34
- Lệnh sẽ hỏi: dùng Cursor, Claude Code hay cả hai; ngôn ngữ tài liệu; git hook; bật CocoIndex không.
44
+ Wizard init sẽ hỏi: Cursor, Claude Code hay cả hai; ngôn ngữ; git hook; CocoIndex (tùy chọn).
35
45
 
36
46
  Sau khi chạy xong sẽ có:
37
47
 
@@ -145,11 +155,15 @@ Sau đó: **“generate prototype for all screens”**. Với SPA, chạy build
145
155
  | Prototype (HTML hoặc SPA) | “generate prototype”, “generate prototype with Vue”, “prototype with stripe theme” |
146
156
  | Chọn theme | “help me pick a prototype theme”, “show me theme options” |
147
157
  | Vừa sửa tài liệu xong | “re-index the graph” |
148
- | Đồng bộ đa ngôn ngữ | “add language vi”, “resolve translations”, “translation status” — [Work 10](docs/course/10-multi-language.md) |
149
- | Template tùy chỉnh | “set up template pack”, “template list”, `generate <pack-name>` — [Work 17](docs/course/17-custom-template-packs.md) |
158
+ | Đồng bộ đa ngôn ngữ | “add language vi”, “resolve translations” — [Translations](docs/course/05-prototype/01-translations.md) |
159
+ | Template tùy chỉnh | “set up template pack”, `generate <pack-name>` — [Custom templates](docs/course/07-advanced/01-custom-templates.md) |
150
160
  | Xem phần nào bị ảnh hưởng | “what’s the impact of my changes” |
151
- | Xử lý comment | “resolve comments” |
152
- | Xem đồ trực quan | “visualize the graph” |
161
+ | Xử lý comment | “resolve comments”, “show open comments” |
162
+ | Duyệt / phê duyệt tài liệu | “review documents”, “approve srs/01-overview” |
163
+ | Tạm dừng / tiếp tục task | “active tasks”, “resume my SRS” |
164
+ | Thêm / sửa một phần nhỏ | “I want to add login with Google” |
165
+ | Xem sơ đồ trực quan | “show the graph”, `npx ai-spector graph visualize --open` |
166
+ | Kiểm tra workspace | “check my workspace” |
153
167
 
154
168
  ### Quy trình thường gặp
155
169
 
@@ -163,7 +177,16 @@ docs/data-source/ → analyze → validate graph → generate SRS → in
163
177
 
164
178
  ## CLI (nếu cần)
165
179
 
166
- Chỉ dùng khi viết script hoặc debug: `npx ai-spector index`, `graph validate`, `graph visualize --open`, `graph impact --git`, `prototype auth|themes|preview|setup|manifest|validate`. Gõ `npx ai-spector --help` để xem đầy đủ.
180
+ Chủ yếu dùng chat. Một số lệnh hữu ích:
181
+
182
+ ```bash
183
+ npx ai-spector course serve --open
184
+ npx ai-spector setup --check
185
+ npx ai-spector graph validate
186
+ npx ai-spector graph visualize --open
187
+ ```
188
+
189
+ Đầy đủ: `npx ai-spector --help`
167
190
 
168
191
  ---
169
192
 
@@ -184,7 +207,7 @@ Chỉ dùng khi viết script hoặc debug: `npx ai-spector index`, `graph valid
184
207
 
185
208
  Dùng khi bạn viết **script, CI, hoặc backend tùy chỉnh** — cùng các thao tác typed như CLI và MCP:
186
209
 
187
- - **[Hướng dẫn SDK](docs/sdk.md)** — cài đặt, entry points, ví dụ, tham chiếu API
210
+ - **[Hướng dẫn SDK](docs/plan/sdk.md)** — cài đặt, entry points, ví dụ, tham chiếu API
188
211
 
189
212
  ```bash
190
213
  npm install ai-spector
package/dist/cli.js CHANGED
@@ -45,6 +45,7 @@ import { registerReadinessCommand } from "./core/operations/readiness.js";
45
45
  import { runCocoindexSetup, runCocoindexSearch, runGraphQueryFuzzy } from "./core/operations/cocoindex.js";
46
46
  import { formatCocoindexSetup, formatCocoindexSearch, formatCocoindexStats, formatGraphQueryFuzzy, } from "./interfaces/cli/format/cocoindex.js";
47
47
  import { runPrototypeInstallPreviews, runPrototypeManifest, runPrototypePreview, runPrototypeSetup, runPrototypeStack, runPrototypeSync, runPrototypeThemes, runPrototypeValidate, runPrototypeAuth, } from "./core/operations/prototype.js";
48
+ import { runCourseServe, formatCourseServeStarted } from "./core/operations/course.js";
48
49
  const program = new Command();
49
50
  const require = createRequire(import.meta.url);
50
51
  const packageJson = require("../package.json");
@@ -171,7 +172,9 @@ context
171
172
  .option("--scope <scope>", "DAG node / section this informs (e.g. srs.use-cases)")
172
173
  .option("--source <source>", "user | inferred | data-source", "user")
173
174
  .option("--refs <paths>", "Comma-separated source files that make this stale on change")
174
- .option("--by <name>", "Who answered")
175
+ .option("--by <email>", "Answerer email override (default: git user.email)")
176
+ .option("--username <name>", "Answerer name override (default: git user.name)")
177
+ .option("--role <role>", "Actor role: user | client (default: user)")
175
178
  .option("--json", "JSON output")
176
179
  .action(async (docType, question, opts) => {
177
180
  const result = await runContextRecord({
@@ -185,6 +188,8 @@ context
185
188
  ? opts.refs.split(",").map((s) => s.trim()).filter(Boolean)
186
189
  : undefined,
187
190
  answeredBy: opts.by,
191
+ answeredByUsername: opts.username,
192
+ role: opts.role,
188
193
  });
189
194
  if (opts.json)
190
195
  console.log(JSON.stringify(result, null, 2));
@@ -195,7 +200,9 @@ context
195
200
  .command("resolve <docType> <id> <answer>")
196
201
  .description("Answer an open/stale entry by id (e.g. Q-001)")
197
202
  .option("-C, --cwd <path>", "Project root", process.cwd())
198
- .option("--by <name>", "Who answered")
203
+ .option("--by <email>", "Answerer email override (default: git user.email)")
204
+ .option("--username <name>", "Answerer name override (default: git user.name)")
205
+ .option("--role <role>", "Actor role: user | client (default: user)")
199
206
  .option("--json", "JSON output")
200
207
  .action(async (docType, id, answer, opts) => {
201
208
  const result = await runContextResolve({
@@ -204,6 +211,8 @@ context
204
211
  id,
205
212
  answer,
206
213
  answeredBy: opts.by,
214
+ answeredByUsername: opts.username,
215
+ role: opts.role,
207
216
  });
208
217
  if (opts.json)
209
218
  console.log(JSON.stringify(result, null, 2));
@@ -235,7 +244,9 @@ spec
235
244
  .command("approve <docType> <id>")
236
245
  .description("Approve a pending spec; merges its graph patch (if any) into the graph")
237
246
  .option("-C, --cwd <path>", "Project root", process.cwd())
238
- .option("--by <name>", "Reviewer name")
247
+ .option("--by <email>", "Reviewer email override (default: git user.email)")
248
+ .option("--username <name>", "Reviewer name override (default: git user.name)")
249
+ .option("--role <role>", "Actor role: user | client (default: user)")
239
250
  .option("--note <note>", "Review note")
240
251
  .option("--skip-merge", "Approve without merging the graph patch")
241
252
  .option("--json", "JSON output")
@@ -245,6 +256,8 @@ spec
245
256
  docType,
246
257
  id,
247
258
  by: opts.by,
259
+ username: opts.username,
260
+ role: opts.role,
248
261
  note: opts.note,
249
262
  skipMerge: opts.skipMerge,
250
263
  });
@@ -257,7 +270,9 @@ spec
257
270
  .command("reject <docType> <id>")
258
271
  .description("Reject a pending spec (kept for audit, never merged)")
259
272
  .option("-C, --cwd <path>", "Project root", process.cwd())
260
- .option("--by <name>", "Reviewer name")
273
+ .option("--by <email>", "Reviewer email override (default: git user.email)")
274
+ .option("--username <name>", "Reviewer name override (default: git user.name)")
275
+ .option("--role <role>", "Actor role: user | client (default: user)")
261
276
  .option("--note <note>", "Why the spec was rejected")
262
277
  .option("--json", "JSON output")
263
278
  .action(async (docType, id, opts) => {
@@ -266,6 +281,8 @@ spec
266
281
  docType,
267
282
  id,
268
283
  by: opts.by,
284
+ username: opts.username,
285
+ role: opts.role,
269
286
  note: opts.note,
270
287
  });
271
288
  if (opts.json)
@@ -395,6 +412,9 @@ task
395
412
  .command("approve <taskId>")
396
413
  .description("Approve the task plan and advance to the next step")
397
414
  .option("-C, --cwd <path>", "Project root", process.cwd())
415
+ .option("--by <email>", "Approver email override (default: git user.email)")
416
+ .option("--username <name>", "Approver name override (default: git user.name)")
417
+ .option("--role <role>", "Actor role: user | client (default: user)")
398
418
  .option("--plan <json>", "Plan JSON (StoredPlan) if not already set on task")
399
419
  .option("--json", "JSON output")
400
420
  .action(async (taskId, opts) => {
@@ -402,6 +422,9 @@ task
402
422
  root: resolve(opts.cwd ?? process.cwd()),
403
423
  taskId,
404
424
  plan: opts.plan ? JSON.parse(opts.plan) : undefined,
425
+ by: opts.by,
426
+ username: opts.username,
427
+ role: opts.role,
405
428
  });
406
429
  if (opts.json)
407
430
  console.log(JSON.stringify(result, null, 2));
@@ -898,7 +921,9 @@ comments
898
921
  .command("resolve <threadId>")
899
922
  .description("Mark thread resolved in meta_data.json and append events.jsonl")
900
923
  .requiredOption("--file <path>", "Logical file path (e.g. srs/04-features/auth)")
901
- .option("--by <author>", "resolvedBy value recorded in meta_data.json", "local")
924
+ .option("--by <email>", "Resolver email override (default: git user.email)")
925
+ .option("--username <name>", "Resolver name override (default: git user.name)")
926
+ .option("--role <role>", "Actor role: user | client (default: user)")
902
927
  .option("--commit-sha <sha>", "resolvedInCommitSha (defaults to git HEAD)")
903
928
  .option("--expected-version <n>", "Optimistic lock on meta_data.json version")
904
929
  .option("--dry-run", "Preview resolve without writing files")
@@ -909,6 +934,8 @@ comments
909
934
  threadId,
910
935
  filePath: opts.file,
911
936
  resolvedBy: opts.by,
937
+ resolvedByUsername: opts.username,
938
+ role: opts.role,
912
939
  commitSha: opts.commitSha,
913
940
  expectedVersion: opts.expectedVersion != null ? Number(opts.expectedVersion) : undefined,
914
941
  dryRun: opts.dryRun,
@@ -925,10 +952,18 @@ const review = program
925
952
  review
926
953
  .command("approve <logicalPath>")
927
954
  .description("Mark document as internally approved and move to client review queue")
928
- .option("--by <reviewer>", "Reviewer name or id (default: local)")
955
+ .option("--by <email>", "Reviewer email override (default: git user.email)")
956
+ .option("--username <name>", "Reviewer name override (default: git user.name)")
957
+ .option("--role <role>", "Actor role: user | client (default: user)")
929
958
  .option("--json", "JSON output for agents")
930
959
  .action(async (logicalPath, opts, cmd) => {
931
- const result = await runApprove({ root: projectRootOpt(cmd), logicalPath, by: opts.by });
960
+ const result = await runApprove({
961
+ root: projectRootOpt(cmd),
962
+ logicalPath,
963
+ by: opts.by,
964
+ username: opts.username,
965
+ role: opts.role,
966
+ });
932
967
  if (opts.json)
933
968
  console.log(JSON.stringify(result, null, 2));
934
969
  else
@@ -1091,10 +1126,10 @@ prototype
1091
1126
  });
1092
1127
  prototype
1093
1128
  .command("auth")
1094
- .description("Configure HTTP basic auth (credentials in prototype.config.json, .htpasswd under prototype/)")
1129
+ .description("Configure HTTP basic auth (credentials in prototype/config.json, .htpasswd under prototype/)")
1095
1130
  .option("--username <name>", "Basic auth username")
1096
1131
  .option("--password <secret>", "Basic auth password")
1097
- .option("--from-config", "Regenerate .htpasswd from stored prototype.config.json basicAuth")
1132
+ .option("--from-config", "Regenerate .htpasswd from stored prototype/config.json basicAuth")
1098
1133
  .action(async (opts, cmd) => {
1099
1134
  await runPrototypeAuth({
1100
1135
  root: projectRootOpt(cmd),
@@ -1190,6 +1225,27 @@ graph
1190
1225
  });
1191
1226
  registerTemplateCommand(program);
1192
1227
  registerReadinessCommand(program);
1228
+ const course = program
1229
+ .command("course")
1230
+ .description("Browse the step-by-step AI Spector course in your browser");
1231
+ course
1232
+ .command("serve")
1233
+ .description("Start a local web server for the interactive course")
1234
+ .option("--port <number>", "Port (default: 4177)", (v) => Number(v), 4177)
1235
+ .option("--host <host>", "Host (default: 127.0.0.1)", "127.0.0.1")
1236
+ .option("--open", "Open the course in your default browser")
1237
+ .action(async (opts, cmd) => {
1238
+ const result = await runCourseServe({
1239
+ projectRoot: projectRootOpt(cmd),
1240
+ host: opts.host,
1241
+ port: opts.port,
1242
+ open: opts.open,
1243
+ });
1244
+ console.log(formatCourseServeStarted(result));
1245
+ await new Promise(() => {
1246
+ /* keep process alive until Ctrl+C */
1247
+ });
1248
+ });
1193
1249
  // ── CocoIndex ──────────────────────────────────────────────────────────────────
1194
1250
  const cocoindex = program
1195
1251
  .command("cocoindex")