@ias-ai/zhima-spec 1.3.1

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 (307) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +206 -0
  3. package/bin/zhima.js +3 -0
  4. package/dist/cli/index.d.ts +2 -0
  5. package/dist/cli/index.js +462 -0
  6. package/dist/commands/change.d.ts +35 -0
  7. package/dist/commands/change.js +277 -0
  8. package/dist/commands/completion.d.ts +72 -0
  9. package/dist/commands/completion.js +264 -0
  10. package/dist/commands/config.d.ts +36 -0
  11. package/dist/commands/config.js +611 -0
  12. package/dist/commands/feedback.d.ts +9 -0
  13. package/dist/commands/feedback.js +183 -0
  14. package/dist/commands/schema.d.ts +6 -0
  15. package/dist/commands/schema.js +869 -0
  16. package/dist/commands/show.d.ts +14 -0
  17. package/dist/commands/show.js +132 -0
  18. package/dist/commands/spec.d.ts +15 -0
  19. package/dist/commands/spec.js +225 -0
  20. package/dist/commands/validate.d.ts +24 -0
  21. package/dist/commands/validate.js +294 -0
  22. package/dist/commands/workflow/index.d.ts +17 -0
  23. package/dist/commands/workflow/index.js +12 -0
  24. package/dist/commands/workflow/instructions.d.ts +29 -0
  25. package/dist/commands/workflow/instructions.js +336 -0
  26. package/dist/commands/workflow/new-change.d.ts +13 -0
  27. package/dist/commands/workflow/new-change.js +92 -0
  28. package/dist/commands/workflow/schemas.d.ts +10 -0
  29. package/dist/commands/workflow/schemas.js +34 -0
  30. package/dist/commands/workflow/shared.d.ts +57 -0
  31. package/dist/commands/workflow/shared.js +116 -0
  32. package/dist/commands/workflow/status.d.ts +14 -0
  33. package/dist/commands/workflow/status.js +87 -0
  34. package/dist/commands/workflow/templates.d.ts +16 -0
  35. package/dist/commands/workflow/templates.js +69 -0
  36. package/dist/commands/workspace/open.d.ts +29 -0
  37. package/dist/commands/workspace/open.js +84 -0
  38. package/dist/commands/workspace/operations.d.ts +23 -0
  39. package/dist/commands/workspace/operations.js +475 -0
  40. package/dist/commands/workspace/selection.d.ts +6 -0
  41. package/dist/commands/workspace/selection.js +113 -0
  42. package/dist/commands/workspace/types.d.ts +88 -0
  43. package/dist/commands/workspace/types.js +36 -0
  44. package/dist/commands/workspace.d.ts +6 -0
  45. package/dist/commands/workspace.js +868 -0
  46. package/dist/core/archive.d.ts +11 -0
  47. package/dist/core/archive.js +318 -0
  48. package/dist/core/artifact-graph/graph.d.ts +56 -0
  49. package/dist/core/artifact-graph/graph.js +141 -0
  50. package/dist/core/artifact-graph/index.d.ts +8 -0
  51. package/dist/core/artifact-graph/index.js +14 -0
  52. package/dist/core/artifact-graph/instruction-loader.d.ts +196 -0
  53. package/dist/core/artifact-graph/instruction-loader.js +317 -0
  54. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  55. package/dist/core/artifact-graph/outputs.js +39 -0
  56. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  57. package/dist/core/artifact-graph/resolver.js +257 -0
  58. package/dist/core/artifact-graph/schema.d.ts +13 -0
  59. package/dist/core/artifact-graph/schema.js +108 -0
  60. package/dist/core/artifact-graph/state.d.ts +12 -0
  61. package/dist/core/artifact-graph/state.js +31 -0
  62. package/dist/core/artifact-graph/types.d.ts +47 -0
  63. package/dist/core/artifact-graph/types.js +48 -0
  64. package/dist/core/available-tools.d.ts +17 -0
  65. package/dist/core/available-tools.js +43 -0
  66. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  67. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  68. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  69. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  70. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  71. package/dist/core/command-generation/adapters/auggie.js +27 -0
  72. package/dist/core/command-generation/adapters/bob.d.ts +14 -0
  73. package/dist/core/command-generation/adapters/bob.js +45 -0
  74. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  75. package/dist/core/command-generation/adapters/claude.js +50 -0
  76. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  77. package/dist/core/command-generation/adapters/cline.js +27 -0
  78. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  80. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  81. package/dist/core/command-generation/adapters/codex.js +39 -0
  82. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/continue.js +28 -0
  84. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  85. package/dist/core/command-generation/adapters/costrict.js +27 -0
  86. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/crush.js +30 -0
  88. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  89. package/dist/core/command-generation/adapters/cursor.js +44 -0
  90. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/factory.js +27 -0
  92. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/gemini.js +26 -0
  94. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  95. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  96. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  97. package/dist/core/command-generation/adapters/iflow.js +29 -0
  98. package/dist/core/command-generation/adapters/index.d.ts +33 -0
  99. package/dist/core/command-generation/adapters/index.js +33 -0
  100. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  101. package/dist/core/command-generation/adapters/junie.js +26 -0
  102. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  103. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  104. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  105. package/dist/core/command-generation/adapters/kiro.js +26 -0
  106. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/lingma.js +30 -0
  108. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  109. package/dist/core/command-generation/adapters/opencode.js +29 -0
  110. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  111. package/dist/core/command-generation/adapters/pi.js +55 -0
  112. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/qoder.js +30 -0
  114. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  115. package/dist/core/command-generation/adapters/qwen.js +26 -0
  116. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/roocode.js +27 -0
  118. package/dist/core/command-generation/adapters/vjsp.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/vjsp.js +27 -0
  120. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  122. package/dist/core/command-generation/generator.d.ts +21 -0
  123. package/dist/core/command-generation/generator.js +27 -0
  124. package/dist/core/command-generation/index.d.ts +22 -0
  125. package/dist/core/command-generation/index.js +24 -0
  126. package/dist/core/command-generation/registry.d.ts +36 -0
  127. package/dist/core/command-generation/registry.js +98 -0
  128. package/dist/core/command-generation/types.d.ts +56 -0
  129. package/dist/core/command-generation/types.js +8 -0
  130. package/dist/core/completions/command-registry.d.ts +7 -0
  131. package/dist/core/completions/command-registry.js +626 -0
  132. package/dist/core/completions/completion-provider.d.ts +71 -0
  133. package/dist/core/completions/completion-provider.js +129 -0
  134. package/dist/core/completions/factory.d.ts +64 -0
  135. package/dist/core/completions/factory.js +75 -0
  136. package/dist/core/completions/generators/bash-generator.d.ts +35 -0
  137. package/dist/core/completions/generators/bash-generator.js +230 -0
  138. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  139. package/dist/core/completions/generators/fish-generator.js +160 -0
  140. package/dist/core/completions/generators/powershell-generator.d.ts +36 -0
  141. package/dist/core/completions/generators/powershell-generator.js +266 -0
  142. package/dist/core/completions/generators/zsh-generator.d.ts +47 -0
  143. package/dist/core/completions/generators/zsh-generator.js +274 -0
  144. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  145. package/dist/core/completions/installers/bash-installer.js +318 -0
  146. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  147. package/dist/core/completions/installers/fish-installer.js +143 -0
  148. package/dist/core/completions/installers/powershell-installer.d.ts +102 -0
  149. package/dist/core/completions/installers/powershell-installer.js +387 -0
  150. package/dist/core/completions/installers/zsh-installer.d.ts +117 -0
  151. package/dist/core/completions/installers/zsh-installer.js +421 -0
  152. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  153. package/dist/core/completions/templates/bash-templates.js +30 -0
  154. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  155. package/dist/core/completions/templates/fish-templates.js +45 -0
  156. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  157. package/dist/core/completions/templates/powershell-templates.js +34 -0
  158. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  159. package/dist/core/completions/templates/zsh-templates.js +45 -0
  160. package/dist/core/completions/types.d.ts +101 -0
  161. package/dist/core/completions/types.js +2 -0
  162. package/dist/core/config-prompts.d.ts +9 -0
  163. package/dist/core/config-prompts.js +34 -0
  164. package/dist/core/config-schema.d.ts +86 -0
  165. package/dist/core/config-schema.js +213 -0
  166. package/dist/core/config.d.ts +18 -0
  167. package/dist/core/config.js +39 -0
  168. package/dist/core/converters/json-converter.d.ts +6 -0
  169. package/dist/core/converters/json-converter.js +51 -0
  170. package/dist/core/global-config.d.ts +49 -0
  171. package/dist/core/global-config.js +124 -0
  172. package/dist/core/index.d.ts +4 -0
  173. package/dist/core/index.js +5 -0
  174. package/dist/core/init.d.ts +37 -0
  175. package/dist/core/init.js +593 -0
  176. package/dist/core/legacy-cleanup.d.ts +162 -0
  177. package/dist/core/legacy-cleanup.js +514 -0
  178. package/dist/core/list.d.ts +9 -0
  179. package/dist/core/list.js +171 -0
  180. package/dist/core/migration.d.ts +23 -0
  181. package/dist/core/migration.js +108 -0
  182. package/dist/core/parsers/change-parser.d.ts +13 -0
  183. package/dist/core/parsers/change-parser.js +197 -0
  184. package/dist/core/parsers/markdown-parser.d.ts +26 -0
  185. package/dist/core/parsers/markdown-parser.js +227 -0
  186. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  187. package/dist/core/parsers/requirement-blocks.js +201 -0
  188. package/dist/core/parsers/spec-structure.d.ts +9 -0
  189. package/dist/core/parsers/spec-structure.js +88 -0
  190. package/dist/core/planning-home.d.ts +21 -0
  191. package/dist/core/planning-home.js +124 -0
  192. package/dist/core/profile-sync-drift.d.ts +38 -0
  193. package/dist/core/profile-sync-drift.js +200 -0
  194. package/dist/core/profiles.d.ts +26 -0
  195. package/dist/core/profiles.js +40 -0
  196. package/dist/core/project-config.d.ts +64 -0
  197. package/dist/core/project-config.js +223 -0
  198. package/dist/core/schemas/base.schema.d.ts +13 -0
  199. package/dist/core/schemas/base.schema.js +13 -0
  200. package/dist/core/schemas/change.schema.d.ts +73 -0
  201. package/dist/core/schemas/change.schema.js +31 -0
  202. package/dist/core/schemas/index.d.ts +4 -0
  203. package/dist/core/schemas/index.js +4 -0
  204. package/dist/core/schemas/spec.schema.d.ts +18 -0
  205. package/dist/core/schemas/spec.schema.js +15 -0
  206. package/dist/core/shared/index.d.ts +8 -0
  207. package/dist/core/shared/index.js +8 -0
  208. package/dist/core/shared/skill-generation.d.ts +49 -0
  209. package/dist/core/shared/skill-generation.js +96 -0
  210. package/dist/core/shared/tool-detection.d.ts +71 -0
  211. package/dist/core/shared/tool-detection.js +158 -0
  212. package/dist/core/specs-apply.d.ts +73 -0
  213. package/dist/core/specs-apply.js +392 -0
  214. package/dist/core/styles/palette.d.ts +7 -0
  215. package/dist/core/styles/palette.js +8 -0
  216. package/dist/core/templates/index.d.ts +8 -0
  217. package/dist/core/templates/index.js +9 -0
  218. package/dist/core/templates/skill-templates.d.ts +19 -0
  219. package/dist/core/templates/skill-templates.js +18 -0
  220. package/dist/core/templates/types.d.ts +19 -0
  221. package/dist/core/templates/types.js +5 -0
  222. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  223. package/dist/core/templates/workflows/apply-change.js +314 -0
  224. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  225. package/dist/core/templates/workflows/archive-change.js +277 -0
  226. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  227. package/dist/core/templates/workflows/bulk-archive-change.js +492 -0
  228. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  229. package/dist/core/templates/workflows/continue-change.js +234 -0
  230. package/dist/core/templates/workflows/explore.d.ts +10 -0
  231. package/dist/core/templates/workflows/explore.js +459 -0
  232. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  233. package/dist/core/templates/workflows/feedback.js +108 -0
  234. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  235. package/dist/core/templates/workflows/ff-change.js +200 -0
  236. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  237. package/dist/core/templates/workflows/new-change.js +143 -0
  238. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  239. package/dist/core/templates/workflows/onboard.js +563 -0
  240. package/dist/core/templates/workflows/propose.d.ts +10 -0
  241. package/dist/core/templates/workflows/propose.js +218 -0
  242. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  243. package/dist/core/templates/workflows/sync-specs.js +290 -0
  244. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  245. package/dist/core/templates/workflows/verify-change.js +338 -0
  246. package/dist/core/update.d.ts +82 -0
  247. package/dist/core/update.js +557 -0
  248. package/dist/core/validation/constants.d.ts +34 -0
  249. package/dist/core/validation/constants.js +40 -0
  250. package/dist/core/validation/types.d.ts +18 -0
  251. package/dist/core/validation/types.js +2 -0
  252. package/dist/core/validation/validator.d.ts +33 -0
  253. package/dist/core/validation/validator.js +418 -0
  254. package/dist/core/view.d.ts +8 -0
  255. package/dist/core/view.js +168 -0
  256. package/dist/core/workspace/foundation.d.ts +87 -0
  257. package/dist/core/workspace/foundation.js +379 -0
  258. package/dist/core/workspace/index.d.ts +6 -0
  259. package/dist/core/workspace/index.js +6 -0
  260. package/dist/core/workspace/link-input.d.ts +9 -0
  261. package/dist/core/workspace/link-input.js +32 -0
  262. package/dist/core/workspace/open-surface.d.ts +24 -0
  263. package/dist/core/workspace/open-surface.js +137 -0
  264. package/dist/core/workspace/openers.d.ts +21 -0
  265. package/dist/core/workspace/openers.js +119 -0
  266. package/dist/core/workspace/skills.d.ts +55 -0
  267. package/dist/core/workspace/skills.js +334 -0
  268. package/dist/index.d.ts +3 -0
  269. package/dist/index.js +3 -0
  270. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  271. package/dist/prompts/searchable-multi-select.js +159 -0
  272. package/dist/ui/ascii-patterns.d.ts +16 -0
  273. package/dist/ui/ascii-patterns.js +133 -0
  274. package/dist/ui/welcome-screen.d.ts +10 -0
  275. package/dist/ui/welcome-screen.js +146 -0
  276. package/dist/utils/change-metadata.d.ts +51 -0
  277. package/dist/utils/change-metadata.js +147 -0
  278. package/dist/utils/change-utils.d.ts +71 -0
  279. package/dist/utils/change-utils.js +123 -0
  280. package/dist/utils/command-references.d.ts +18 -0
  281. package/dist/utils/command-references.js +20 -0
  282. package/dist/utils/file-system.d.ts +41 -0
  283. package/dist/utils/file-system.js +301 -0
  284. package/dist/utils/index.d.ts +6 -0
  285. package/dist/utils/index.js +9 -0
  286. package/dist/utils/interactive.d.ts +18 -0
  287. package/dist/utils/interactive.js +21 -0
  288. package/dist/utils/item-discovery.d.ts +4 -0
  289. package/dist/utils/item-discovery.js +72 -0
  290. package/dist/utils/match.d.ts +3 -0
  291. package/dist/utils/match.js +22 -0
  292. package/dist/utils/shell-detection.d.ts +20 -0
  293. package/dist/utils/shell-detection.js +41 -0
  294. package/dist/utils/task-progress.d.ts +8 -0
  295. package/dist/utils/task-progress.js +36 -0
  296. package/package.json +82 -0
  297. package/schemas/spec-driven/schema.yaml +153 -0
  298. package/schemas/spec-driven/templates/design.md +19 -0
  299. package/schemas/spec-driven/templates/proposal.md +23 -0
  300. package/schemas/spec-driven/templates/spec.md +8 -0
  301. package/schemas/spec-driven/templates/tasks.md +9 -0
  302. package/schemas/workspace-planning/schema.yaml +72 -0
  303. package/schemas/workspace-planning/templates/design.md +33 -0
  304. package/schemas/workspace-planning/templates/proposal.md +28 -0
  305. package/schemas/workspace-planning/templates/spec.md +9 -0
  306. package/schemas/workspace-planning/templates/tasks.md +15 -0
  307. package/scripts/postinstall.js +83 -0
@@ -0,0 +1,72 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ export async function getActiveChangeIds(root = process.cwd()) {
4
+ const changesPath = path.join(root, 'zhima', 'changes');
5
+ try {
6
+ const entries = await fs.readdir(changesPath, { withFileTypes: true });
7
+ const result = [];
8
+ for (const entry of entries) {
9
+ if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === 'archive')
10
+ continue;
11
+ const proposalPath = path.join(changesPath, entry.name, 'proposal.md');
12
+ try {
13
+ await fs.access(proposalPath);
14
+ result.push(entry.name);
15
+ }
16
+ catch {
17
+ // skip directories without proposal.md
18
+ }
19
+ }
20
+ return result.sort();
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ export async function getSpecIds(root = process.cwd()) {
27
+ const specsPath = path.join(root, 'zhima', 'specs');
28
+ const result = [];
29
+ try {
30
+ const entries = await fs.readdir(specsPath, { withFileTypes: true });
31
+ for (const entry of entries) {
32
+ if (!entry.isDirectory() || entry.name.startsWith('.'))
33
+ continue;
34
+ const specFile = path.join(specsPath, entry.name, 'spec.md');
35
+ try {
36
+ await fs.access(specFile);
37
+ result.push(entry.name);
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ }
43
+ }
44
+ catch {
45
+ // ignore
46
+ }
47
+ return result.sort();
48
+ }
49
+ export async function getArchivedChangeIds(root = process.cwd()) {
50
+ const archivePath = path.join(root, 'zhima', 'changes', 'archive');
51
+ try {
52
+ const entries = await fs.readdir(archivePath, { withFileTypes: true });
53
+ const result = [];
54
+ for (const entry of entries) {
55
+ if (!entry.isDirectory() || entry.name.startsWith('.'))
56
+ continue;
57
+ const proposalPath = path.join(archivePath, entry.name, 'proposal.md');
58
+ try {
59
+ await fs.access(proposalPath);
60
+ result.push(entry.name);
61
+ }
62
+ catch {
63
+ // skip directories without proposal.md
64
+ }
65
+ }
66
+ return result.sort();
67
+ }
68
+ catch {
69
+ return [];
70
+ }
71
+ }
72
+ //# sourceMappingURL=item-discovery.js.map
@@ -0,0 +1,3 @@
1
+ export declare function nearestMatches(input: string, candidates: string[], max?: number): string[];
2
+ export declare function levenshtein(a: string, b: string): number;
3
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1,22 @@
1
+ export function nearestMatches(input, candidates, max = 5) {
2
+ const scored = candidates.map(candidate => ({ candidate, distance: levenshtein(input, candidate) }));
3
+ scored.sort((a, b) => a.distance - b.distance);
4
+ return scored.slice(0, max).map(s => s.candidate);
5
+ }
6
+ export function levenshtein(a, b) {
7
+ const m = a.length;
8
+ const n = b.length;
9
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
10
+ for (let i = 0; i <= m; i++)
11
+ dp[i][0] = i;
12
+ for (let j = 0; j <= n; j++)
13
+ dp[0][j] = j;
14
+ for (let i = 1; i <= m; i++) {
15
+ for (let j = 1; j <= n; j++) {
16
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
17
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + cost);
18
+ }
19
+ }
20
+ return dp[m][n];
21
+ }
22
+ //# sourceMappingURL=match.js.map
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Supported shell types for completion generation
3
+ */
4
+ export type SupportedShell = 'zsh' | 'bash' | 'fish' | 'powershell';
5
+ /**
6
+ * Result of shell detection
7
+ */
8
+ export interface ShellDetectionResult {
9
+ /** The detected shell if supported, otherwise undefined */
10
+ shell: SupportedShell | undefined;
11
+ /** The raw shell name detected (even if unsupported), or undefined if nothing detected */
12
+ detected: string | undefined;
13
+ }
14
+ /**
15
+ * Detects the current user's shell based on environment variables
16
+ *
17
+ * @returns Detection result with supported shell and raw detected name
18
+ */
19
+ export declare function detectShell(): ShellDetectionResult;
20
+ //# sourceMappingURL=shell-detection.d.ts.map
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Detects the current user's shell based on environment variables
3
+ *
4
+ * @returns Detection result with supported shell and raw detected name
5
+ */
6
+ export function detectShell() {
7
+ // Try SHELL environment variable first (Unix-like systems)
8
+ const shellPath = process.env.SHELL;
9
+ if (shellPath) {
10
+ const shellName = shellPath.toLowerCase();
11
+ if (shellName.includes('zsh')) {
12
+ return { shell: 'zsh', detected: 'zsh' };
13
+ }
14
+ if (shellName.includes('bash')) {
15
+ return { shell: 'bash', detected: 'bash' };
16
+ }
17
+ if (shellName.includes('fish')) {
18
+ return { shell: 'fish', detected: 'fish' };
19
+ }
20
+ // Shell detected but not supported
21
+ // Extract shell name from path (e.g., /bin/tcsh -> tcsh)
22
+ const match = shellPath.match(/\/([^/]+)$/);
23
+ const detectedName = match ? match[1] : shellPath;
24
+ return { shell: undefined, detected: detectedName };
25
+ }
26
+ // Check for PowerShell on Windows
27
+ // PSModulePath is a reliable PowerShell-specific environment variable
28
+ if (process.env.PSModulePath || process.platform === 'win32') {
29
+ const comspec = process.env.COMSPEC?.toLowerCase();
30
+ // If PSModulePath exists, we're definitely in PowerShell
31
+ if (process.env.PSModulePath) {
32
+ return { shell: 'powershell', detected: 'powershell' };
33
+ }
34
+ // On Windows without PSModulePath, we might be in cmd.exe
35
+ if (comspec?.includes('cmd.exe')) {
36
+ return { shell: undefined, detected: 'cmd.exe' };
37
+ }
38
+ }
39
+ return { shell: undefined, detected: undefined };
40
+ }
41
+ //# sourceMappingURL=shell-detection.js.map
@@ -0,0 +1,8 @@
1
+ export interface TaskProgress {
2
+ total: number;
3
+ completed: number;
4
+ }
5
+ export declare function countTasksFromContent(content: string): TaskProgress;
6
+ export declare function getTaskProgressForChange(changesDir: string, changeName: string): Promise<TaskProgress>;
7
+ export declare function formatTaskStatus(progress: TaskProgress): string;
8
+ //# sourceMappingURL=task-progress.d.ts.map
@@ -0,0 +1,36 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ const TASK_PATTERN = /^[-*]\s+\[[\sx]\]/i;
4
+ const COMPLETED_TASK_PATTERN = /^[-*]\s+\[x\]/i;
5
+ export function countTasksFromContent(content) {
6
+ const lines = content.split('\n');
7
+ let total = 0;
8
+ let completed = 0;
9
+ for (const line of lines) {
10
+ if (line.match(TASK_PATTERN)) {
11
+ total++;
12
+ if (line.match(COMPLETED_TASK_PATTERN)) {
13
+ completed++;
14
+ }
15
+ }
16
+ }
17
+ return { total, completed };
18
+ }
19
+ export async function getTaskProgressForChange(changesDir, changeName) {
20
+ const tasksPath = path.join(changesDir, changeName, 'tasks.md');
21
+ try {
22
+ const content = await fs.readFile(tasksPath, 'utf-8');
23
+ return countTasksFromContent(content);
24
+ }
25
+ catch {
26
+ return { total: 0, completed: 0 };
27
+ }
28
+ }
29
+ export function formatTaskStatus(progress) {
30
+ if (progress.total === 0)
31
+ return 'No tasks';
32
+ if (progress.completed === progress.total)
33
+ return '✓ Complete';
34
+ return `${progress.completed}/${progress.total} tasks`;
35
+ }
36
+ //# sourceMappingURL=task-progress.js.map
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@ias-ai/zhima-spec",
3
+ "version": "1.3.1",
4
+ "description": "AI-native system development flow",
5
+ "keywords": [
6
+ "zhima",
7
+ "specs",
8
+ "cli",
9
+ "ai",
10
+ "development"
11
+ ],
12
+ "homepage": "https://gitlab.oneberry.cc:2083/zhima-agent/ias-workflow",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://gitlab.oneberry.cc:2083/zhima-agent/ias-workflow"
16
+ },
17
+ "license": "MIT",
18
+ "type": "module",
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "default": "./dist/index.js"
26
+ }
27
+ },
28
+ "bin": {
29
+ "zhima": "./bin/zhima.js"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "bin",
34
+ "schemas",
35
+ "scripts/postinstall.js",
36
+ "!dist/**/*.test.js",
37
+ "!dist/**/__tests__",
38
+ "!dist/**/*.map"
39
+ ],
40
+ "scripts": {
41
+ "lint": "eslint src/",
42
+ "build": "node build.js",
43
+ "dev": "tsc --watch",
44
+ "dev:cli": "pnpm build && node bin/zhima.js",
45
+ "test": "vitest run",
46
+ "test:watch": "vitest",
47
+ "test:ui": "vitest --ui",
48
+ "test:coverage": "vitest --coverage",
49
+ "test:postinstall": "node scripts/postinstall.js",
50
+ "prepare": "pnpm run build",
51
+ "prepublishOnly": "pnpm run build",
52
+ "postinstall": "node scripts/postinstall.js",
53
+ "check:pack-version": "node scripts/pack-version-check.mjs",
54
+ "release": "pnpm run release:ci",
55
+ "release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
56
+ "changeset": "changeset"
57
+ },
58
+ "engines": {
59
+ "node": ">=20.19.0"
60
+ },
61
+ "devDependencies": {
62
+ "@changesets/changelog-github": "^0.5.2",
63
+ "@changesets/cli": "^2.27.7",
64
+ "@types/node": "^24.2.0",
65
+ "@vitest/ui": "^3.2.4",
66
+ "eslint": "^9.39.2",
67
+ "typescript": "^5.9.3",
68
+ "typescript-eslint": "^8.50.1",
69
+ "vitest": "^3.2.4"
70
+ },
71
+ "dependencies": {
72
+ "@inquirer/core": "^10.2.2",
73
+ "@inquirer/prompts": "^7.8.0",
74
+ "chalk": "^5.5.0",
75
+ "commander": "^14.0.0",
76
+ "cross-spawn": "7.0.6",
77
+ "fast-glob": "^3.3.3",
78
+ "ora": "^8.2.0",
79
+ "yaml": "^2.8.2",
80
+ "zod": "^4.0.17"
81
+ }
82
+ }
@@ -0,0 +1,153 @@
1
+ name: spec-driven
2
+ version: 1
3
+ description: Default ZhiMa workflow - proposal → specs → design → tasks
4
+ artifacts:
5
+ - id: proposal
6
+ generates: proposal.md
7
+ description: Initial proposal document outlining the change
8
+ template: proposal.md
9
+ instruction: |
10
+ Create the proposal document that establishes WHY this change is needed.
11
+
12
+ Sections:
13
+ - **Why**: 1-2 sentences on the problem or opportunity. What problem does this solve? Why now?
14
+ - **What Changes**: Bullet list of changes. Be specific about new capabilities, modifications, or removals. Mark breaking changes with **BREAKING**.
15
+ - **Capabilities**: Identify which specs will be created or modified:
16
+ - **New Capabilities**: List capabilities being introduced. Each becomes a new `specs/<name>/spec.md`. Use kebab-case names (e.g., `user-auth`, `data-export`).
17
+ - **Modified Capabilities**: List existing capabilities whose REQUIREMENTS are changing. Only include if spec-level behavior changes (not just implementation details). Each needs a delta spec file. Check `zhima/specs/` for existing spec names. Leave empty if no requirement changes.
18
+ - **Impact**: Affected code, APIs, dependencies, or systems.
19
+
20
+ IMPORTANT: The Capabilities section is critical. It creates the contract between
21
+ proposal and specs phases. Research existing specs before filling this in.
22
+ Each capability listed here will need a corresponding spec file.
23
+
24
+ Keep it concise (1-2 pages). Focus on the "why" not the "how" -
25
+ implementation details belong in design.md.
26
+
27
+ This is the foundation - specs, design, and tasks all build on this.
28
+ requires: []
29
+
30
+ - id: specs
31
+ generates: "specs/**/*.md"
32
+ description: Detailed specifications for the change
33
+ template: spec.md
34
+ instruction: |
35
+ Create specification files that define WHAT the system should do.
36
+
37
+ Create one spec file per capability listed in the proposal's Capabilities section.
38
+ - New capabilities: use the exact kebab-case name from the proposal (specs/<capability>/spec.md).
39
+ - Modified capabilities: use the existing spec folder name from zhima/specs/<capability>/ when creating the delta spec at specs/<capability>/spec.md.
40
+
41
+ Delta operations (use ## headers):
42
+ - **ADDED Requirements**: New capabilities
43
+ - **MODIFIED Requirements**: Changed behavior - MUST include full updated content
44
+ - **REMOVED Requirements**: Deprecated features - MUST include **Reason** and **Migration**
45
+ - **RENAMED Requirements**: Name changes only - use FROM:/TO: format
46
+
47
+ Format requirements:
48
+ - Each requirement: `### Requirement: <name>` followed by description
49
+ - Use SHALL/MUST for normative requirements (avoid should/may)
50
+ - Each scenario: `#### Scenario: <name>` with WHEN/THEN format
51
+ - **CRITICAL**: Scenarios MUST use exactly 4 hashtags (`####`). Using 3 hashtags or bullets will fail silently.
52
+ - Every requirement MUST have at least one scenario.
53
+
54
+ MODIFIED requirements workflow:
55
+ 1. Locate the existing requirement in zhima/specs/<capability>/spec.md
56
+ 2. Copy the ENTIRE requirement block (from `### Requirement:` through all scenarios)
57
+ 3. Paste under `## MODIFIED Requirements` and edit to reflect new behavior
58
+ 4. Ensure header text matches exactly (whitespace-insensitive)
59
+
60
+ Common pitfall: Using MODIFIED with partial content loses detail at archive time.
61
+ If adding new concerns without changing existing behavior, use ADDED instead.
62
+
63
+ Example:
64
+ ```
65
+ ## ADDED Requirements
66
+
67
+ ### Requirement: User can export data
68
+ The system SHALL allow users to export their data in CSV format.
69
+
70
+ #### Scenario: Successful export
71
+ - **WHEN** user clicks "Export" button
72
+ - **THEN** system downloads a CSV file with all user data
73
+
74
+ ## REMOVED Requirements
75
+
76
+ ### Requirement: Legacy export
77
+ **Reason**: Replaced by new export system
78
+ **Migration**: Use new export endpoint at /api/v2/export
79
+ ```
80
+
81
+ Specs should be testable - each scenario is a potential test case.
82
+ requires:
83
+ - proposal
84
+
85
+ - id: design
86
+ generates: design.md
87
+ description: Technical design document with implementation details
88
+ template: design.md
89
+ instruction: |
90
+ Create the design document that explains HOW to implement the change.
91
+
92
+ When to include design.md (create only if any apply):
93
+ - Cross-cutting change (multiple services/modules) or new architectural pattern
94
+ - New external dependency or significant data model changes
95
+ - Security, performance, or migration complexity
96
+ - Ambiguity that benefits from technical decisions before coding
97
+
98
+ Sections:
99
+ - **Context**: Background, current state, constraints, stakeholders
100
+ - **Goals / Non-Goals**: What this design achieves and explicitly excludes
101
+ - **Decisions**: Key technical choices with rationale (why X over Y?). Include alternatives considered for each decision.
102
+ - **Risks / Trade-offs**: Known limitations, things that could go wrong. Format: [Risk] → Mitigation
103
+ - **Migration Plan**: Steps to deploy, rollback strategy (if applicable)
104
+ - **Open Questions**: Outstanding decisions or unknowns to resolve
105
+
106
+ Focus on architecture and approach, not line-by-line implementation.
107
+ Reference the proposal for motivation and specs for requirements.
108
+
109
+ Good design docs explain the "why" behind technical decisions.
110
+ requires:
111
+ - proposal
112
+
113
+ - id: tasks
114
+ generates: tasks.md
115
+ description: Implementation checklist with trackable tasks
116
+ template: tasks.md
117
+ instruction: |
118
+ Create the task list that breaks down the implementation work.
119
+
120
+ **IMPORTANT: Follow the template below exactly.** The apply phase parses
121
+ checkbox format to track progress. Tasks not using `- [ ]` won't be tracked.
122
+
123
+ Guidelines:
124
+ - Group related tasks under ## numbered headings
125
+ - Each task MUST be a checkbox: `- [ ] X.Y Task description`
126
+ - Tasks should be small enough to complete in one session
127
+ - Order tasks by dependency (what must be done first?)
128
+
129
+ Example:
130
+ ```
131
+ ## 1. Setup
132
+
133
+ - [ ] 1.1 Create new module structure
134
+ - [ ] 1.2 Add dependencies to package.json
135
+
136
+ ## 2. Core Implementation
137
+
138
+ - [ ] 2.1 Implement data export function
139
+ - [ ] 2.2 Add CSV formatting utilities
140
+ ```
141
+
142
+ Reference specs for what needs to be built, design for how to build it.
143
+ Each task should be verifiable - you know when it's done.
144
+ requires:
145
+ - specs
146
+ - design
147
+
148
+ apply:
149
+ requires: [tasks]
150
+ tracks: tasks.md
151
+ instruction: |
152
+ Read context files, work through pending tasks, mark complete as you go.
153
+ Pause if you hit blockers or need clarification.
@@ -0,0 +1,19 @@
1
+ ## Context
2
+
3
+ <!-- Background and current state -->
4
+
5
+ ## Goals / Non-Goals
6
+
7
+ **Goals:**
8
+ <!-- What this design aims to achieve -->
9
+
10
+ **Non-Goals:**
11
+ <!-- What is explicitly out of scope -->
12
+
13
+ ## Decisions
14
+
15
+ <!-- Key design decisions and rationale -->
16
+
17
+ ## Risks / Trade-offs
18
+
19
+ <!-- Known risks and trade-offs -->
@@ -0,0 +1,23 @@
1
+ ## Why
2
+
3
+ <!-- Explain the motivation for this change. What problem does this solve? Why now? -->
4
+
5
+ ## What Changes
6
+
7
+ <!-- Describe what will change. Be specific about new capabilities, modifications, or removals. -->
8
+
9
+ ## Capabilities
10
+
11
+ ### New Capabilities
12
+ <!-- Capabilities being introduced. Replace <name> with kebab-case identifier (e.g., user-auth, data-export, api-rate-limiting). Each creates specs/<name>/spec.md -->
13
+ - `<name>`: <brief description of what this capability covers>
14
+
15
+ ### Modified Capabilities
16
+ <!-- Existing capabilities whose REQUIREMENTS are changing (not just implementation).
17
+ Only list here if spec-level behavior changes. Each needs a delta spec file.
18
+ Use existing spec names from zhima/specs/. Leave empty if no requirement changes. -->
19
+ - `<existing-name>`: <what requirement is changing>
20
+
21
+ ## Impact
22
+
23
+ <!-- Affected code, APIs, dependencies, systems -->
@@ -0,0 +1,8 @@
1
+ ## ADDED Requirements
2
+
3
+ ### Requirement: <!-- requirement name -->
4
+ <!-- requirement text -->
5
+
6
+ #### Scenario: <!-- scenario name -->
7
+ - **WHEN** <!-- condition -->
8
+ - **THEN** <!-- expected outcome -->
@@ -0,0 +1,9 @@
1
+ ## 1. <!-- Task Group Name -->
2
+
3
+ - [ ] 1.1 <!-- Task description -->
4
+ - [ ] 1.2 <!-- Task description -->
5
+
6
+ ## 2. <!-- Task Group Name -->
7
+
8
+ - [ ] 2.1 <!-- Task description -->
9
+ - [ ] 2.2 <!-- Task description -->
@@ -0,0 +1,72 @@
1
+ name: workspace-planning
2
+ version: 1
3
+ description: Workspace planning workflow for cross-area changes
4
+ artifacts:
5
+ - id: proposal
6
+ generates: proposal.md
7
+ description: Shared workspace proposal with the product goal, scope, affected areas, and impact
8
+ template: proposal.md
9
+ instruction: |
10
+ Create the workspace-level proposal that captures the shared product goal once.
11
+
12
+ Sections:
13
+ - **Why**: Explain the product goal or problem in 1-2 concise paragraphs.
14
+ - **What Changes**: List the cross-area behavior, workflow, or capability changes.
15
+ - **Affected Areas**: Name known affected areas using registered workspace link names where applicable. If scope is still being explored, say what remains unresolved.
16
+ - **Capabilities**: Identify workspace-scoped capabilities that need specs. Area-specific requirements should later live under `specs/<area-or-repo>/<capability>/spec.md`.
17
+ - **Impact**: Summarize user-facing impact, planning impact, and likely implementation homes without creating repo-local artifacts.
18
+
19
+ Keep linked repos and folders as exploration context until an explicit implementation workflow selects an affected area.
20
+ requires: []
21
+
22
+ - id: specs
23
+ generates: "specs/**/*.md"
24
+ description: Workspace-scoped specs organized by affected area and capability
25
+ template: spec.md
26
+ instruction: |
27
+ Create workspace-scoped specification files that define WHAT should change.
28
+
29
+ Use `specs/<area-or-repo>/<capability>/spec.md` for area-specific requirements. The first path segment should be a registered workspace link name when a registered area owns the requirement. If the area is unresolved, use an exploratory area name and make the unresolved question explicit in the requirement or scenario.
30
+
31
+ These specs are planning artifacts under the workspace change root. Do not create repo-local spec files in linked repos during workspace planning.
32
+
33
+ Delta operations (use ## headers):
34
+ - **ADDED Requirements**: New workspace-scoped behavior.
35
+ - **MODIFIED Requirements**: Changed behavior; include the full updated requirement.
36
+ - **REMOVED Requirements**: Deprecated behavior with Reason and Migration.
37
+ - **RENAMED Requirements**: Name changes only; use FROM:/TO: format.
38
+
39
+ Each requirement must use SHALL/MUST language and include at least one `#### Scenario:` block.
40
+ requires:
41
+ - proposal
42
+
43
+ - id: design
44
+ generates: design.md
45
+ description: Cross-area technical design and coordination decisions
46
+ template: design.md
47
+ instruction: |
48
+ Create the cross-area design document for workspace planning.
49
+
50
+ Focus on decisions that affect multiple areas, handoffs between areas, shared constraints, sequencing risks, and how the workspace plan should stay the source of truth. Avoid line-by-line implementation details and do not instruct agents to edit linked repos until an explicit implementation workflow provides an allowed edit root.
51
+ requires:
52
+ - proposal
53
+
54
+ - id: tasks
55
+ generates: tasks.md
56
+ description: Coordination checklist for workspace planning and later affected-area implementation
57
+ template: tasks.md
58
+ instruction: |
59
+ Create the workspace coordination task list.
60
+
61
+ Group tasks by phase or affected area as useful. Each actionable item must be a checkbox using `- [ ]`. When implementation tasks are area-specific, name the affected area and keep the task at planning granularity until a later implementation workflow selects an allowed edit root.
62
+ requires:
63
+ - specs
64
+ - design
65
+
66
+ apply:
67
+ requires: [tasks]
68
+ tracks: tasks.md
69
+ instruction: |
70
+ Read the workspace planning context from status and instructions output before applying.
71
+ Select an affected area and confirm an allowed edit root before making implementation edits.
72
+ Until an explicit implementation context is available, treat linked repos and folders as read-only exploration context.
@@ -0,0 +1,33 @@
1
+ ## Context
2
+
3
+ Summarize the workspace planning context, relevant linked areas, and constraints.
4
+
5
+ ## Goals / Non-Goals
6
+
7
+ **Goals:**
8
+ -
9
+
10
+ **Non-Goals:**
11
+ - Creating repo-local implementation artifacts before an affected area is selected.
12
+
13
+ ## Decisions
14
+
15
+ ### Decision: <title>
16
+
17
+ <decision and rationale>
18
+
19
+ Alternative considered: <alternative and why it was not chosen>
20
+
21
+ ## Risks / Trade-offs
22
+
23
+ - <risk> -> <mitigation>
24
+
25
+ ## Coordination Notes
26
+
27
+ - Affected areas:
28
+ - Open handoffs:
29
+ - Implementation entry criteria:
30
+
31
+ ## Open Questions
32
+
33
+ -
@@ -0,0 +1,28 @@
1
+ ## Why
2
+
3
+ Describe the shared product goal, problem, or opportunity that makes this workspace-level change worth planning.
4
+
5
+ ## What Changes
6
+
7
+ -
8
+
9
+ ## Affected Areas
10
+
11
+ - Known:
12
+ - Unresolved:
13
+
14
+ ## Capabilities
15
+
16
+ ### New Capabilities
17
+
18
+ -
19
+
20
+ ### Modified Capabilities
21
+
22
+ -
23
+
24
+ ## Impact
25
+
26
+ - Workspace planning:
27
+ - Linked repos or folders:
28
+ - User-facing behavior:
@@ -0,0 +1,9 @@
1
+ ## ADDED Requirements
2
+
3
+ ### Requirement: <workspace requirement name>
4
+ The workspace plan SHALL describe the required behavior and affected area without creating repo-local artifacts during planning.
5
+
6
+ #### Scenario: <scenario name>
7
+ - **GIVEN** <context>
8
+ - **WHEN** <action>
9
+ - **THEN** <observable result>
@@ -0,0 +1,15 @@
1
+ ## 1. Workspace Planning
2
+
3
+ - [ ] 1.1 Confirm the shared product goal and unresolved scope questions.
4
+ - [ ] 1.2 Identify affected areas using registered workspace link names where applicable.
5
+ - [ ] 1.3 Review workspace-scoped specs and design before selecting implementation areas.
6
+
7
+ ## 2. Affected Area Implementation
8
+
9
+ - [ ] 2.1 Select an affected area and confirm its allowed edit root before implementation.
10
+ - [ ] 2.2 Create or update repo-local implementation artifacts only after the area is selected.
11
+
12
+ ## 3. Verification
13
+
14
+ - [ ] 3.1 Verify workspace planning artifacts remain the source of truth.
15
+ - [ ] 3.2 Record manual acceptance evidence and follow-up fixes.