sdd-cli 0.1.0

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 (186) hide show
  1. package/README.md +566 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +308 -0
  4. package/dist/commands/ai-exec.d.ts +1 -0
  5. package/dist/commands/ai-exec.js +18 -0
  6. package/dist/commands/ai-status.d.ts +1 -0
  7. package/dist/commands/ai-status.js +12 -0
  8. package/dist/commands/doctor.d.ts +1 -0
  9. package/dist/commands/doctor.js +101 -0
  10. package/dist/commands/gen-architecture.d.ts +1 -0
  11. package/dist/commands/gen-architecture.js +61 -0
  12. package/dist/commands/gen-best-practices.d.ts +1 -0
  13. package/dist/commands/gen-best-practices.js +64 -0
  14. package/dist/commands/gen-functional-spec.d.ts +1 -0
  15. package/dist/commands/gen-functional-spec.js +67 -0
  16. package/dist/commands/gen-project-readme.d.ts +1 -0
  17. package/dist/commands/gen-project-readme.js +72 -0
  18. package/dist/commands/gen-requirements.d.ts +1 -0
  19. package/dist/commands/gen-requirements.js +7 -0
  20. package/dist/commands/gen-technical-spec.d.ts +1 -0
  21. package/dist/commands/gen-technical-spec.js +67 -0
  22. package/dist/commands/gen-utils.d.ts +4 -0
  23. package/dist/commands/gen-utils.js +44 -0
  24. package/dist/commands/hello.d.ts +1 -0
  25. package/dist/commands/hello.js +63 -0
  26. package/dist/commands/init.d.ts +1 -0
  27. package/dist/commands/init.js +9 -0
  28. package/dist/commands/learn-deliver.d.ts +1 -0
  29. package/dist/commands/learn-deliver.js +55 -0
  30. package/dist/commands/learn-refine.d.ts +1 -0
  31. package/dist/commands/learn-refine.js +71 -0
  32. package/dist/commands/learn-start.d.ts +1 -0
  33. package/dist/commands/learn-start.js +63 -0
  34. package/dist/commands/learn-utils.d.ts +22 -0
  35. package/dist/commands/learn-utils.js +78 -0
  36. package/dist/commands/list.d.ts +1 -0
  37. package/dist/commands/list.js +69 -0
  38. package/dist/commands/pr-audit.d.ts +1 -0
  39. package/dist/commands/pr-audit.js +59 -0
  40. package/dist/commands/pr-finish.d.ts +1 -0
  41. package/dist/commands/pr-finish.js +51 -0
  42. package/dist/commands/pr-report.d.ts +1 -0
  43. package/dist/commands/pr-report.js +59 -0
  44. package/dist/commands/pr-respond.d.ts +1 -0
  45. package/dist/commands/pr-respond.js +65 -0
  46. package/dist/commands/pr-start.d.ts +1 -0
  47. package/dist/commands/pr-start.js +79 -0
  48. package/dist/commands/pr-utils.d.ts +8 -0
  49. package/dist/commands/pr-utils.js +54 -0
  50. package/dist/commands/req-archive.d.ts +1 -0
  51. package/dist/commands/req-archive.js +33 -0
  52. package/dist/commands/req-create.d.ts +10 -0
  53. package/dist/commands/req-create.js +94 -0
  54. package/dist/commands/req-export.d.ts +1 -0
  55. package/dist/commands/req-export.js +37 -0
  56. package/dist/commands/req-finish.d.ts +1 -0
  57. package/dist/commands/req-finish.js +120 -0
  58. package/dist/commands/req-lint.d.ts +1 -0
  59. package/dist/commands/req-lint.js +58 -0
  60. package/dist/commands/req-list.d.ts +1 -0
  61. package/dist/commands/req-list.js +36 -0
  62. package/dist/commands/req-plan.d.ts +1 -0
  63. package/dist/commands/req-plan.js +200 -0
  64. package/dist/commands/req-refine.d.ts +1 -0
  65. package/dist/commands/req-refine.js +108 -0
  66. package/dist/commands/req-report.d.ts +1 -0
  67. package/dist/commands/req-report.js +44 -0
  68. package/dist/commands/req-start.d.ts +1 -0
  69. package/dist/commands/req-start.js +131 -0
  70. package/dist/commands/req-status.d.ts +1 -0
  71. package/dist/commands/req-status.js +29 -0
  72. package/dist/commands/route.d.ts +1 -0
  73. package/dist/commands/route.js +30 -0
  74. package/dist/commands/test-plan.d.ts +1 -0
  75. package/dist/commands/test-plan.js +81 -0
  76. package/dist/context/flags.d.ts +7 -0
  77. package/dist/context/flags.js +17 -0
  78. package/dist/paths.d.ts +1 -0
  79. package/dist/paths.js +10 -0
  80. package/dist/providers/codex.d.ts +7 -0
  81. package/dist/providers/codex.js +19 -0
  82. package/dist/router/flow.d.ts +1 -0
  83. package/dist/router/flow.js +17 -0
  84. package/dist/router/intent.d.ts +3 -0
  85. package/dist/router/intent.js +69 -0
  86. package/dist/router/prompt-map.d.ts +1 -0
  87. package/dist/router/prompt-map.js +20 -0
  88. package/dist/router/prompt-packs.d.ts +8 -0
  89. package/dist/router/prompt-packs.js +20 -0
  90. package/dist/router/validate-prompt-packs.d.ts +4 -0
  91. package/dist/router/validate-prompt-packs.js +16 -0
  92. package/dist/templates/render.d.ts +2 -0
  93. package/dist/templates/render.js +25 -0
  94. package/dist/templates/validate.d.ts +4 -0
  95. package/dist/templates/validate.js +58 -0
  96. package/dist/types.d.ts +7 -0
  97. package/dist/types.js +2 -0
  98. package/dist/ui/prompt.d.ts +2 -0
  99. package/dist/ui/prompt.js +49 -0
  100. package/dist/utils/list.d.ts +2 -0
  101. package/dist/utils/list.js +20 -0
  102. package/dist/validation/validate.d.ts +4 -0
  103. package/dist/validation/validate.js +20 -0
  104. package/dist/workspace/index.d.ts +21 -0
  105. package/dist/workspace/index.js +103 -0
  106. package/flows/ADMISSIONS_ADMIN.md +33 -0
  107. package/flows/ART.md +33 -0
  108. package/flows/BUG_FIX.md +32 -0
  109. package/flows/COURT_SYSTEM.md +33 -0
  110. package/flows/DATA_SCIENTIST.md +33 -0
  111. package/flows/ECOMMERCE.md +33 -0
  112. package/flows/ECONOMICS.md +33 -0
  113. package/flows/GRAPHIC_DESIGN.md +33 -0
  114. package/flows/HISTORY.md +33 -0
  115. package/flows/LAWYER.md +34 -0
  116. package/flows/PROGRAMMER.md +33 -0
  117. package/flows/PR_REVIEW.md +33 -0
  118. package/flows/README.md +29 -0
  119. package/flows/RETAIL_STORE.md +33 -0
  120. package/flows/SOCIOLOGY.md +33 -0
  121. package/flows/STATE_ADMIN.md +33 -0
  122. package/flows/STUDENT_UNIVERSITY.md +33 -0
  123. package/flows/TAXES_ADMIN.md +33 -0
  124. package/flows/TEACHER.md +33 -0
  125. package/package.json +32 -0
  126. package/router/BUG_FIX.flow.md +63 -0
  127. package/router/BUSINESS.flow.md +57 -0
  128. package/router/DATA_SCIENCE.flow.md +58 -0
  129. package/router/DESIGN.flow.md +58 -0
  130. package/router/FLOW_TEMPLATE.md +26 -0
  131. package/router/GENERIC.flow.md +37 -0
  132. package/router/HUMANITIES.flow.md +58 -0
  133. package/router/LEARN.flow.md +52 -0
  134. package/router/LEGAL.flow.md +58 -0
  135. package/router/PR_REVIEW.flow.md +55 -0
  136. package/router/README.md +23 -0
  137. package/router/SOFTWARE_FEATURE.flow.md +59 -0
  138. package/schemas/architecture.schema.json +13 -0
  139. package/schemas/decision-log.schema.json +16 -0
  140. package/schemas/diagram.schema.json +11 -0
  141. package/schemas/domain.schema.json +20 -0
  142. package/schemas/functional-spec.schema.json +15 -0
  143. package/schemas/gate.schema.json +10 -0
  144. package/schemas/learn-session.schema.json +15 -0
  145. package/schemas/pr-review.schema.json +20 -0
  146. package/schemas/progress-log.schema.json +21 -0
  147. package/schemas/project-readme.schema.json +23 -0
  148. package/schemas/project.schema.json +16 -0
  149. package/schemas/prompt-pack.schema.json +12 -0
  150. package/schemas/quality.schema.json +23 -0
  151. package/schemas/requirement.schema.json +34 -0
  152. package/schemas/role.schema.json +17 -0
  153. package/schemas/router-flow.schema.json +15 -0
  154. package/schemas/router-intent.schema.json +13 -0
  155. package/schemas/technical-spec.schema.json +15 -0
  156. package/schemas/template.schema.json +10 -0
  157. package/schemas/test-plan.schema.json +13 -0
  158. package/schemas/workspace.schema.json +12 -0
  159. package/templates/architecture.md +16 -0
  160. package/templates/changelog.md +3 -0
  161. package/templates/ci-checklist.md +14 -0
  162. package/templates/decision-log.md +16 -0
  163. package/templates/diagrams/component.mmd +3 -0
  164. package/templates/diagrams/container.mmd +3 -0
  165. package/templates/diagrams/context.mmd +3 -0
  166. package/templates/functional-spec.md +22 -0
  167. package/templates/gate-index.json +20 -0
  168. package/templates/implementation-plan.md +13 -0
  169. package/templates/pr-comment-audit.md +19 -0
  170. package/templates/pr-comment-lifecycle.md +11 -0
  171. package/templates/pr-comment-severity.md +13 -0
  172. package/templates/pr-dispute-resolution.md +16 -0
  173. package/templates/pr-metrics.md +10 -0
  174. package/templates/pr-response-generator.md +11 -0
  175. package/templates/pr-response-style.md +13 -0
  176. package/templates/pr-review-report.md +22 -0
  177. package/templates/pr-review-summary.md +16 -0
  178. package/templates/progress-log.md +6 -0
  179. package/templates/project-readme.md +19 -0
  180. package/templates/prompt-pack-index.json +127 -0
  181. package/templates/quality.yml +17 -0
  182. package/templates/requirement.md +33 -0
  183. package/templates/summary.md +10 -0
  184. package/templates/technical-spec.md +22 -0
  185. package/templates/template-index.json +212 -0
  186. package/templates/test-plan.md +16 -0
package/dist/cli.js ADDED
@@ -0,0 +1,308 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const path_1 = __importDefault(require("path"));
42
+ const commander_1 = require("commander");
43
+ const hello_1 = require("./commands/hello");
44
+ const init_1 = require("./commands/init");
45
+ const route_1 = require("./commands/route");
46
+ const doctor_1 = require("./commands/doctor");
47
+ const paths_1 = require("./paths");
48
+ const flags_1 = require("./context/flags");
49
+ const program = new commander_1.Command();
50
+ function getVersion() {
51
+ try {
52
+ const pkgPath = path_1.default.join((0, paths_1.getRepoRoot)(), "package.json");
53
+ const pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, "utf-8"));
54
+ return pkg.version ?? "0.0.0";
55
+ }
56
+ catch {
57
+ return "0.0.0";
58
+ }
59
+ }
60
+ program
61
+ .name("sdd-tool")
62
+ .description("SDD-first, AI-native CLI")
63
+ .version(getVersion())
64
+ .option("--approve", "Skip confirmations if gates pass")
65
+ .option("--improve", "Trigger self-audit and regenerate")
66
+ .option("--parallel", "Generate in parallel when supported");
67
+ program.hook("preAction", (thisCommand, actionCommand) => {
68
+ const opts = typeof actionCommand.optsWithGlobals === "function" ? actionCommand.optsWithGlobals() : thisCommand.opts();
69
+ (0, flags_1.setFlags)({
70
+ approve: Boolean(opts.approve),
71
+ improve: Boolean(opts.improve),
72
+ parallel: Boolean(opts.parallel)
73
+ });
74
+ });
75
+ program
76
+ .command("hello")
77
+ .description("Start an interactive session and route intent")
78
+ .argument("[input...]", "Optional input to classify")
79
+ .option("--questions", "Run prompt questions for detected intent")
80
+ .option("--auto", "Generate a requirement draft after questions")
81
+ .action((input, options) => (0, hello_1.runHello)(input.join(" ").trim(), options.questions || options.auto));
82
+ program
83
+ .command("init")
84
+ .description("Initialize workspace and config")
85
+ .action(() => (0, init_1.runInit)());
86
+ program
87
+ .command("list")
88
+ .description("List flows, templates, and projects")
89
+ .action(async () => {
90
+ const { runList } = await Promise.resolve().then(() => __importStar(require("./commands/list")));
91
+ runList();
92
+ });
93
+ const req = program.command("req").description("Requirement lifecycle commands");
94
+ req
95
+ .command("create")
96
+ .description("Create a new requirement")
97
+ .action(async () => {
98
+ const { runReqCreate } = await Promise.resolve().then(() => __importStar(require("./commands/req-create")));
99
+ await runReqCreate();
100
+ });
101
+ req
102
+ .command("plan")
103
+ .description("Generate specs for a requirement")
104
+ .action(async () => {
105
+ const { runReqPlan } = await Promise.resolve().then(() => __importStar(require("./commands/req-plan")));
106
+ await runReqPlan();
107
+ });
108
+ req
109
+ .command("refine")
110
+ .description("Refine an existing requirement")
111
+ .action(async () => {
112
+ const { runReqRefine } = await Promise.resolve().then(() => __importStar(require("./commands/req-refine")));
113
+ await runReqRefine();
114
+ });
115
+ req
116
+ .command("start")
117
+ .description("Generate implementation plan and quality contract")
118
+ .action(async () => {
119
+ const { runReqStart } = await Promise.resolve().then(() => __importStar(require("./commands/req-start")));
120
+ await runReqStart();
121
+ });
122
+ req
123
+ .command("finish")
124
+ .description("Finalize and archive a requirement")
125
+ .action(async () => {
126
+ const { runReqFinish } = await Promise.resolve().then(() => __importStar(require("./commands/req-finish")));
127
+ await runReqFinish();
128
+ });
129
+ req
130
+ .command("archive")
131
+ .description("Archive a completed requirement")
132
+ .action(async () => {
133
+ const { runReqArchive } = await Promise.resolve().then(() => __importStar(require("./commands/req-archive")));
134
+ await runReqArchive();
135
+ });
136
+ req
137
+ .command("list")
138
+ .description("List requirements by status")
139
+ .option("--status <status>", "Filter by status")
140
+ .action(async (options) => {
141
+ const { runReqList } = await Promise.resolve().then(() => __importStar(require("./commands/req-list")));
142
+ await runReqList(options.status);
143
+ });
144
+ req
145
+ .command("status")
146
+ .description("Show a requirement status")
147
+ .action(async () => {
148
+ const { runReqStatus } = await Promise.resolve().then(() => __importStar(require("./commands/req-status")));
149
+ await runReqStatus();
150
+ });
151
+ req
152
+ .command("lint")
153
+ .description("Validate artifacts for a requirement")
154
+ .action(async () => {
155
+ const { runReqLint } = await Promise.resolve().then(() => __importStar(require("./commands/req-lint")));
156
+ await runReqLint();
157
+ });
158
+ req
159
+ .command("report")
160
+ .description("Show completeness report for a requirement")
161
+ .action(async () => {
162
+ const { runReqReport } = await Promise.resolve().then(() => __importStar(require("./commands/req-report")));
163
+ await runReqReport();
164
+ });
165
+ req
166
+ .command("export")
167
+ .description("Export requirement artifacts to a directory")
168
+ .action(async () => {
169
+ const { runReqExport } = await Promise.resolve().then(() => __importStar(require("./commands/req-export")));
170
+ await runReqExport();
171
+ });
172
+ const pr = program.command("pr").description("PR review workflow commands");
173
+ pr
174
+ .command("start")
175
+ .description("Initialize PR review artifacts")
176
+ .action(async () => {
177
+ const { runPrStart } = await Promise.resolve().then(() => __importStar(require("./commands/pr-start")));
178
+ await runPrStart();
179
+ });
180
+ pr
181
+ .command("audit")
182
+ .description("Update PR comment audit")
183
+ .action(async () => {
184
+ const { runPrAudit } = await Promise.resolve().then(() => __importStar(require("./commands/pr-audit")));
185
+ await runPrAudit();
186
+ });
187
+ pr
188
+ .command("respond")
189
+ .description("Generate a response for a PR comment")
190
+ .action(async () => {
191
+ const { runPrRespond } = await Promise.resolve().then(() => __importStar(require("./commands/pr-respond")));
192
+ await runPrRespond();
193
+ });
194
+ pr
195
+ .command("finish")
196
+ .description("Finalize PR review summary")
197
+ .action(async () => {
198
+ const { runPrFinish } = await Promise.resolve().then(() => __importStar(require("./commands/pr-finish")));
199
+ await runPrFinish();
200
+ });
201
+ pr
202
+ .command("report")
203
+ .description("Generate PR review report")
204
+ .action(async () => {
205
+ const { runPrReport } = await Promise.resolve().then(() => __importStar(require("./commands/pr-report")));
206
+ await runPrReport();
207
+ });
208
+ const test = program.command("test").description("Test planning commands");
209
+ test
210
+ .command("plan")
211
+ .description("Generate or update a test plan")
212
+ .action(async () => {
213
+ const { runTestPlan } = await Promise.resolve().then(() => __importStar(require("./commands/test-plan")));
214
+ await runTestPlan();
215
+ });
216
+ const gen = program.command("gen").description("Artifact generation commands");
217
+ gen
218
+ .command("requirements")
219
+ .description("Generate a requirement")
220
+ .action(async () => {
221
+ const { runGenRequirements } = await Promise.resolve().then(() => __importStar(require("./commands/gen-requirements")));
222
+ await runGenRequirements();
223
+ });
224
+ gen
225
+ .command("functional-spec")
226
+ .description("Generate a functional spec")
227
+ .action(async () => {
228
+ const { runGenFunctionalSpec } = await Promise.resolve().then(() => __importStar(require("./commands/gen-functional-spec")));
229
+ await runGenFunctionalSpec();
230
+ });
231
+ gen
232
+ .command("technical-spec")
233
+ .description("Generate a technical spec")
234
+ .action(async () => {
235
+ const { runGenTechnicalSpec } = await Promise.resolve().then(() => __importStar(require("./commands/gen-technical-spec")));
236
+ await runGenTechnicalSpec();
237
+ });
238
+ gen
239
+ .command("architecture")
240
+ .description("Generate an architecture spec")
241
+ .action(async () => {
242
+ const { runGenArchitecture } = await Promise.resolve().then(() => __importStar(require("./commands/gen-architecture")));
243
+ await runGenArchitecture();
244
+ });
245
+ gen
246
+ .command("best-practices")
247
+ .description("Generate quality contract")
248
+ .action(async () => {
249
+ const { runGenBestPractices } = await Promise.resolve().then(() => __importStar(require("./commands/gen-best-practices")));
250
+ await runGenBestPractices();
251
+ });
252
+ gen
253
+ .command("project-readme")
254
+ .description("Generate project README")
255
+ .action(async () => {
256
+ const { runGenProjectReadme } = await Promise.resolve().then(() => __importStar(require("./commands/gen-project-readme")));
257
+ await runGenProjectReadme();
258
+ });
259
+ const learn = program.command("learn").description("Learning mode commands");
260
+ learn
261
+ .command("start")
262
+ .description("Start a learning session")
263
+ .action(async () => {
264
+ const { runLearnStart } = await Promise.resolve().then(() => __importStar(require("./commands/learn-start")));
265
+ await runLearnStart();
266
+ });
267
+ learn
268
+ .command("refine")
269
+ .description("Refine a learning session")
270
+ .action(async () => {
271
+ const { runLearnRefine } = await Promise.resolve().then(() => __importStar(require("./commands/learn-refine")));
272
+ await runLearnRefine();
273
+ });
274
+ learn
275
+ .command("deliver")
276
+ .description("Deliver learning outputs")
277
+ .action(async () => {
278
+ const { runLearnDeliver } = await Promise.resolve().then(() => __importStar(require("./commands/learn-deliver")));
279
+ await runLearnDeliver();
280
+ });
281
+ program
282
+ .command("route")
283
+ .description("Classify intent and select a flow")
284
+ .argument("<input...>", "Input text to classify")
285
+ .action((input) => (0, route_1.runRoute)(input.join(" ").trim()));
286
+ program
287
+ .command("doctor")
288
+ .description("Validate workspace artifacts and schemas")
289
+ .argument("[project]", "Optional project name to validate")
290
+ .argument("[requirementId]", "Optional requirement ID to validate")
291
+ .action((project, requirementId) => (0, doctor_1.runDoctor)(project, requirementId));
292
+ const ai = program.command("ai").description("Codex provider commands");
293
+ ai
294
+ .command("status")
295
+ .description("Check Codex CLI availability")
296
+ .action(async () => {
297
+ const { runAiStatus } = await Promise.resolve().then(() => __importStar(require("./commands/ai-status")));
298
+ runAiStatus();
299
+ });
300
+ ai
301
+ .command("exec")
302
+ .description("Run Codex non-interactively")
303
+ .argument("[prompt...]", "Prompt to execute")
304
+ .action(async (prompt) => {
305
+ const { runAiExec } = await Promise.resolve().then(() => __importStar(require("./commands/ai-exec")));
306
+ await runAiExec(prompt.join(" ").trim());
307
+ });
308
+ program.parse(process.argv);
@@ -0,0 +1 @@
1
+ export declare function runAiExec(promptArg?: string): Promise<void>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAiExec = runAiExec;
4
+ const codex_1 = require("../providers/codex");
5
+ const prompt_1 = require("../ui/prompt");
6
+ async function runAiExec(promptArg) {
7
+ const prompt = promptArg || (await (0, prompt_1.ask)("Prompt: "));
8
+ if (!prompt) {
9
+ console.log("Prompt is required.");
10
+ return;
11
+ }
12
+ const result = (0, codex_1.codexExec)(prompt);
13
+ if (!result.ok) {
14
+ console.log(`Codex error: ${result.error}`);
15
+ return;
16
+ }
17
+ console.log(result.output);
18
+ }
@@ -0,0 +1 @@
1
+ export declare function runAiStatus(): void;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAiStatus = runAiStatus;
4
+ const codex_1 = require("../providers/codex");
5
+ function runAiStatus() {
6
+ const result = (0, codex_1.codexVersion)();
7
+ if (!result.ok) {
8
+ console.log(`Codex not available: ${result.error}`);
9
+ return;
10
+ }
11
+ console.log(`Codex available: ${result.output}`);
12
+ }
@@ -0,0 +1 @@
1
+ export declare function runDoctor(projectName?: string, reqId?: string): void;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runDoctor = runDoctor;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const index_1 = require("../workspace/index");
10
+ const validate_1 = require("../validation/validate");
11
+ const validate_prompt_packs_1 = require("../router/validate-prompt-packs");
12
+ const validate_2 = require("../templates/validate");
13
+ function collectJsonFiles(dir) {
14
+ if (!fs_1.default.existsSync(dir)) {
15
+ return [];
16
+ }
17
+ const entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
18
+ const files = [];
19
+ for (const entry of entries) {
20
+ const full = path_1.default.join(dir, entry.name);
21
+ if (entry.isDirectory()) {
22
+ files.push(...collectJsonFiles(full));
23
+ }
24
+ else if (entry.isFile() && entry.name.endsWith(".json")) {
25
+ files.push(full);
26
+ }
27
+ }
28
+ return files;
29
+ }
30
+ function inferSchema(filePath) {
31
+ if (filePath.endsWith("requirement.json"))
32
+ return "requirement.schema.json";
33
+ if (filePath.endsWith("technical-spec.json"))
34
+ return "technical-spec.schema.json";
35
+ if (filePath.endsWith("functional-spec.json"))
36
+ return "functional-spec.schema.json";
37
+ if (filePath.endsWith("architecture.json"))
38
+ return "architecture.schema.json";
39
+ if (filePath.endsWith("test-plan.json"))
40
+ return "test-plan.schema.json";
41
+ if (filePath.endsWith("quality.json"))
42
+ return "quality.schema.json";
43
+ if (filePath.endsWith("project-readme.json"))
44
+ return "project-readme.schema.json";
45
+ return null;
46
+ }
47
+ function runDoctor(projectName, reqId) {
48
+ const workspace = (0, index_1.getWorkspaceInfo)();
49
+ let root = projectName ? path_1.default.join(workspace.root, projectName) : workspace.root;
50
+ if (projectName && reqId) {
51
+ const base = path_1.default.join(workspace.root, projectName, "requirements");
52
+ const candidates = [
53
+ path_1.default.join(base, "backlog", reqId),
54
+ path_1.default.join(base, "wip", reqId),
55
+ path_1.default.join(base, "in-progress", reqId),
56
+ path_1.default.join(base, "done", reqId),
57
+ path_1.default.join(base, "archived", reqId)
58
+ ];
59
+ root = candidates.find((candidate) => fs_1.default.existsSync(candidate)) ?? root;
60
+ }
61
+ const jsonFiles = collectJsonFiles(root);
62
+ if (jsonFiles.length === 0) {
63
+ console.log("No JSON artifacts found in workspace.");
64
+ return;
65
+ }
66
+ let failures = 0;
67
+ const promptResult = (0, validate_prompt_packs_1.validatePromptPacks)();
68
+ if (!promptResult.valid) {
69
+ failures += promptResult.errors.length;
70
+ console.log("Prompt pack validation failed:");
71
+ promptResult.errors.forEach((error) => console.log(`- ${error}`));
72
+ }
73
+ const templateResult = (0, validate_2.validateTemplates)();
74
+ if (!templateResult.valid) {
75
+ failures += templateResult.errors.length;
76
+ console.log("Template validation failed:");
77
+ templateResult.errors.forEach((error) => console.log(`- ${error}`));
78
+ }
79
+ for (const filePath of jsonFiles) {
80
+ const schema = inferSchema(filePath);
81
+ if (!schema) {
82
+ continue;
83
+ }
84
+ const data = JSON.parse(fs_1.default.readFileSync(filePath, "utf-8"));
85
+ const result = (0, validate_1.validateJson)(schema, data);
86
+ if (!result.valid) {
87
+ failures += 1;
88
+ console.log(`Invalid: ${filePath}`);
89
+ result.errors.forEach((error) => console.log(`- ${error}`));
90
+ }
91
+ else {
92
+ console.log(`Valid: ${filePath}`);
93
+ }
94
+ }
95
+ if (failures === 0) {
96
+ console.log("All JSON artifacts are valid.");
97
+ }
98
+ else {
99
+ console.log(`Validation failed for ${failures} artifact(s).`);
100
+ }
101
+ }
@@ -0,0 +1 @@
1
+ export declare function runGenArchitecture(): Promise<void>;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runGenArchitecture = runGenArchitecture;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const prompt_1 = require("../ui/prompt");
10
+ const render_1 = require("../templates/render");
11
+ const list_1 = require("../utils/list");
12
+ const validate_1 = require("../validation/validate");
13
+ const gen_utils_1 = require("./gen-utils");
14
+ const flags_1 = require("../context/flags");
15
+ async function runGenArchitecture() {
16
+ const projectName = await (0, prompt_1.ask)("Project name: ");
17
+ const reqId = await (0, prompt_1.ask)("Requirement ID (REQ-...): ");
18
+ if (!projectName || !reqId) {
19
+ console.log("Project name and requirement ID are required.");
20
+ return;
21
+ }
22
+ const requirementDir = (0, gen_utils_1.findRequirementDir)(projectName, reqId);
23
+ if (!requirementDir) {
24
+ console.log("Requirement not found.");
25
+ return;
26
+ }
27
+ const context = await (0, prompt_1.ask)("Architecture context: ");
28
+ const containers = await (0, prompt_1.ask)("Containers - comma separated: ");
29
+ const components = await (0, prompt_1.ask)("Components - comma separated: ");
30
+ const deployment = await (0, prompt_1.ask)("Deployment - comma separated: ");
31
+ const diagrams = await (0, prompt_1.ask)("Diagrams - comma separated: ");
32
+ const flags = (0, flags_1.getFlags)();
33
+ const improveNote = flags.improve ? await (0, prompt_1.ask)("Improve focus (optional): ") : "";
34
+ const architectureJson = {
35
+ context: context || "N/A",
36
+ containers: (0, list_1.parseList)(containers),
37
+ components: (0, list_1.parseList)(components),
38
+ deployment: (0, list_1.parseList)(deployment),
39
+ diagrams: (0, list_1.parseList)(diagrams)
40
+ };
41
+ const validation = (0, validate_1.validateJson)("architecture.schema.json", architectureJson);
42
+ if (!validation.valid) {
43
+ console.log("Architecture validation failed:");
44
+ validation.errors.forEach((error) => console.log(`- ${error}`));
45
+ return;
46
+ }
47
+ const template = (0, render_1.loadTemplate)("architecture");
48
+ const rendered = (0, render_1.renderTemplate)(template, {
49
+ title: projectName,
50
+ context: context || "N/A",
51
+ containers: (0, list_1.formatList)(containers),
52
+ components: (0, list_1.formatList)(components),
53
+ deployment: (0, list_1.formatList)(deployment),
54
+ diagrams: (0, list_1.formatList)(diagrams)
55
+ });
56
+ fs_1.default.writeFileSync(path_1.default.join(requirementDir, "architecture.md"), rendered, "utf-8");
57
+ fs_1.default.writeFileSync(path_1.default.join(requirementDir, "architecture.json"), JSON.stringify(architectureJson, null, 2), "utf-8");
58
+ (0, gen_utils_1.appendProgress)(requirementDir, `generated architecture for ${reqId}`);
59
+ (0, gen_utils_1.appendImprove)(requirementDir, improveNote);
60
+ console.log(`Architecture generated in ${requirementDir}`);
61
+ }
@@ -0,0 +1 @@
1
+ export declare function runGenBestPractices(): Promise<void>;
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runGenBestPractices = runGenBestPractices;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const prompt_1 = require("../ui/prompt");
10
+ const validate_1 = require("../validation/validate");
11
+ const gen_utils_1 = require("./gen-utils");
12
+ const flags_1 = require("../context/flags");
13
+ function renderQualityYaml(rules, coverage, complexity) {
14
+ const ruleLines = rules.length > 0 ? rules.map((rule) => ` - ${rule}`).join("\n") : " - N/A";
15
+ return [
16
+ "rules:",
17
+ ruleLines,
18
+ "thresholds:",
19
+ ` coverage: \"${coverage}\"`,
20
+ ` complexity: \"${complexity}\"`,
21
+ "profiles:",
22
+ " default: []"
23
+ ].join("\n");
24
+ }
25
+ async function runGenBestPractices() {
26
+ const projectName = await (0, prompt_1.ask)("Project name: ");
27
+ const reqId = await (0, prompt_1.ask)("Requirement ID (REQ-...): ");
28
+ if (!projectName || !reqId) {
29
+ console.log("Project name and requirement ID are required.");
30
+ return;
31
+ }
32
+ const requirementDir = (0, gen_utils_1.findRequirementDir)(projectName, reqId);
33
+ if (!requirementDir) {
34
+ console.log("Requirement not found.");
35
+ return;
36
+ }
37
+ const rules = await (0, prompt_1.ask)("Quality rules - comma separated: ");
38
+ const coverage = await (0, prompt_1.ask)("Coverage threshold (e.g., 80%): ");
39
+ const complexity = await (0, prompt_1.ask)("Complexity threshold (e.g., 10): ");
40
+ const flags = (0, flags_1.getFlags)();
41
+ const improveNote = flags.improve ? await (0, prompt_1.ask)("Improve focus (optional): ") : "";
42
+ const qualityJson = {
43
+ rules: rules ? rules.split(",").map((rule) => rule.trim()).filter((rule) => rule) : [],
44
+ thresholds: {
45
+ coverage: coverage || "80%",
46
+ complexity: complexity || "10"
47
+ },
48
+ profiles: {
49
+ default: []
50
+ }
51
+ };
52
+ const validation = (0, validate_1.validateJson)("quality.schema.json", qualityJson);
53
+ if (!validation.valid) {
54
+ console.log("Quality validation failed:");
55
+ validation.errors.forEach((error) => console.log(`- ${error}`));
56
+ return;
57
+ }
58
+ const qualityYaml = renderQualityYaml(qualityJson.rules, qualityJson.thresholds.coverage, qualityJson.thresholds.complexity);
59
+ fs_1.default.writeFileSync(path_1.default.join(requirementDir, "quality.yml"), qualityYaml, "utf-8");
60
+ fs_1.default.writeFileSync(path_1.default.join(requirementDir, "quality.json"), JSON.stringify(qualityJson, null, 2), "utf-8");
61
+ (0, gen_utils_1.appendProgress)(requirementDir, `generated quality contract for ${reqId}`);
62
+ (0, gen_utils_1.appendImprove)(requirementDir, improveNote);
63
+ console.log(`Quality contract generated in ${requirementDir}`);
64
+ }
@@ -0,0 +1 @@
1
+ export declare function runGenFunctionalSpec(): Promise<void>;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runGenFunctionalSpec = runGenFunctionalSpec;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const prompt_1 = require("../ui/prompt");
10
+ const render_1 = require("../templates/render");
11
+ const list_1 = require("../utils/list");
12
+ const validate_1 = require("../validation/validate");
13
+ const gen_utils_1 = require("./gen-utils");
14
+ const flags_1 = require("../context/flags");
15
+ async function runGenFunctionalSpec() {
16
+ const projectName = await (0, prompt_1.ask)("Project name: ");
17
+ const reqId = await (0, prompt_1.ask)("Requirement ID (REQ-...): ");
18
+ if (!projectName || !reqId) {
19
+ console.log("Project name and requirement ID are required.");
20
+ return;
21
+ }
22
+ const requirementDir = (0, gen_utils_1.findRequirementDir)(projectName, reqId);
23
+ if (!requirementDir) {
24
+ console.log("Requirement not found.");
25
+ return;
26
+ }
27
+ const overview = await (0, prompt_1.ask)("Functional overview: ");
28
+ const actors = await (0, prompt_1.ask)("Actors - comma separated: ");
29
+ const useCases = await (0, prompt_1.ask)("Use cases - comma separated: ");
30
+ const flows = await (0, prompt_1.ask)("Flows - comma separated: ");
31
+ const rules = await (0, prompt_1.ask)("Business rules - comma separated: ");
32
+ const errors = await (0, prompt_1.ask)("Errors - comma separated: ");
33
+ const acceptance = await (0, prompt_1.ask)("Acceptance criteria - comma separated: ");
34
+ const flags = (0, flags_1.getFlags)();
35
+ const improveNote = flags.improve ? await (0, prompt_1.ask)("Improve focus (optional): ") : "";
36
+ const functionalJson = {
37
+ overview: overview || "N/A",
38
+ actors: (0, list_1.parseList)(actors),
39
+ useCases: (0, list_1.parseList)(useCases),
40
+ flows: (0, list_1.parseList)(flows),
41
+ rules: (0, list_1.parseList)(rules),
42
+ errors: (0, list_1.parseList)(errors),
43
+ acceptanceCriteria: (0, list_1.parseList)(acceptance)
44
+ };
45
+ const validation = (0, validate_1.validateJson)("functional-spec.schema.json", functionalJson);
46
+ if (!validation.valid) {
47
+ console.log("Functional spec validation failed:");
48
+ validation.errors.forEach((error) => console.log(`- ${error}`));
49
+ return;
50
+ }
51
+ const template = (0, render_1.loadTemplate)("functional-spec");
52
+ const rendered = (0, render_1.renderTemplate)(template, {
53
+ title: projectName,
54
+ overview: overview || "N/A",
55
+ actors: (0, list_1.formatList)(actors),
56
+ use_cases: (0, list_1.formatList)(useCases),
57
+ flows: (0, list_1.formatList)(flows),
58
+ rules: (0, list_1.formatList)(rules),
59
+ errors: (0, list_1.formatList)(errors),
60
+ acceptance_criteria: (0, list_1.formatList)(acceptance)
61
+ });
62
+ fs_1.default.writeFileSync(path_1.default.join(requirementDir, "functional-spec.md"), rendered, "utf-8");
63
+ fs_1.default.writeFileSync(path_1.default.join(requirementDir, "functional-spec.json"), JSON.stringify(functionalJson, null, 2), "utf-8");
64
+ (0, gen_utils_1.appendProgress)(requirementDir, `generated functional spec for ${reqId}`);
65
+ (0, gen_utils_1.appendImprove)(requirementDir, improveNote);
66
+ console.log(`Functional spec generated in ${requirementDir}`);
67
+ }
@@ -0,0 +1 @@
1
+ export declare function runGenProjectReadme(): Promise<void>;