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.
- package/README.md +566 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +308 -0
- package/dist/commands/ai-exec.d.ts +1 -0
- package/dist/commands/ai-exec.js +18 -0
- package/dist/commands/ai-status.d.ts +1 -0
- package/dist/commands/ai-status.js +12 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +101 -0
- package/dist/commands/gen-architecture.d.ts +1 -0
- package/dist/commands/gen-architecture.js +61 -0
- package/dist/commands/gen-best-practices.d.ts +1 -0
- package/dist/commands/gen-best-practices.js +64 -0
- package/dist/commands/gen-functional-spec.d.ts +1 -0
- package/dist/commands/gen-functional-spec.js +67 -0
- package/dist/commands/gen-project-readme.d.ts +1 -0
- package/dist/commands/gen-project-readme.js +72 -0
- package/dist/commands/gen-requirements.d.ts +1 -0
- package/dist/commands/gen-requirements.js +7 -0
- package/dist/commands/gen-technical-spec.d.ts +1 -0
- package/dist/commands/gen-technical-spec.js +67 -0
- package/dist/commands/gen-utils.d.ts +4 -0
- package/dist/commands/gen-utils.js +44 -0
- package/dist/commands/hello.d.ts +1 -0
- package/dist/commands/hello.js +63 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/learn-deliver.d.ts +1 -0
- package/dist/commands/learn-deliver.js +55 -0
- package/dist/commands/learn-refine.d.ts +1 -0
- package/dist/commands/learn-refine.js +71 -0
- package/dist/commands/learn-start.d.ts +1 -0
- package/dist/commands/learn-start.js +63 -0
- package/dist/commands/learn-utils.d.ts +22 -0
- package/dist/commands/learn-utils.js +78 -0
- package/dist/commands/list.d.ts +1 -0
- package/dist/commands/list.js +69 -0
- package/dist/commands/pr-audit.d.ts +1 -0
- package/dist/commands/pr-audit.js +59 -0
- package/dist/commands/pr-finish.d.ts +1 -0
- package/dist/commands/pr-finish.js +51 -0
- package/dist/commands/pr-report.d.ts +1 -0
- package/dist/commands/pr-report.js +59 -0
- package/dist/commands/pr-respond.d.ts +1 -0
- package/dist/commands/pr-respond.js +65 -0
- package/dist/commands/pr-start.d.ts +1 -0
- package/dist/commands/pr-start.js +79 -0
- package/dist/commands/pr-utils.d.ts +8 -0
- package/dist/commands/pr-utils.js +54 -0
- package/dist/commands/req-archive.d.ts +1 -0
- package/dist/commands/req-archive.js +33 -0
- package/dist/commands/req-create.d.ts +10 -0
- package/dist/commands/req-create.js +94 -0
- package/dist/commands/req-export.d.ts +1 -0
- package/dist/commands/req-export.js +37 -0
- package/dist/commands/req-finish.d.ts +1 -0
- package/dist/commands/req-finish.js +120 -0
- package/dist/commands/req-lint.d.ts +1 -0
- package/dist/commands/req-lint.js +58 -0
- package/dist/commands/req-list.d.ts +1 -0
- package/dist/commands/req-list.js +36 -0
- package/dist/commands/req-plan.d.ts +1 -0
- package/dist/commands/req-plan.js +200 -0
- package/dist/commands/req-refine.d.ts +1 -0
- package/dist/commands/req-refine.js +108 -0
- package/dist/commands/req-report.d.ts +1 -0
- package/dist/commands/req-report.js +44 -0
- package/dist/commands/req-start.d.ts +1 -0
- package/dist/commands/req-start.js +131 -0
- package/dist/commands/req-status.d.ts +1 -0
- package/dist/commands/req-status.js +29 -0
- package/dist/commands/route.d.ts +1 -0
- package/dist/commands/route.js +30 -0
- package/dist/commands/test-plan.d.ts +1 -0
- package/dist/commands/test-plan.js +81 -0
- package/dist/context/flags.d.ts +7 -0
- package/dist/context/flags.js +17 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.js +10 -0
- package/dist/providers/codex.d.ts +7 -0
- package/dist/providers/codex.js +19 -0
- package/dist/router/flow.d.ts +1 -0
- package/dist/router/flow.js +17 -0
- package/dist/router/intent.d.ts +3 -0
- package/dist/router/intent.js +69 -0
- package/dist/router/prompt-map.d.ts +1 -0
- package/dist/router/prompt-map.js +20 -0
- package/dist/router/prompt-packs.d.ts +8 -0
- package/dist/router/prompt-packs.js +20 -0
- package/dist/router/validate-prompt-packs.d.ts +4 -0
- package/dist/router/validate-prompt-packs.js +16 -0
- package/dist/templates/render.d.ts +2 -0
- package/dist/templates/render.js +25 -0
- package/dist/templates/validate.d.ts +4 -0
- package/dist/templates/validate.js +58 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/ui/prompt.d.ts +2 -0
- package/dist/ui/prompt.js +49 -0
- package/dist/utils/list.d.ts +2 -0
- package/dist/utils/list.js +20 -0
- package/dist/validation/validate.d.ts +4 -0
- package/dist/validation/validate.js +20 -0
- package/dist/workspace/index.d.ts +21 -0
- package/dist/workspace/index.js +103 -0
- package/flows/ADMISSIONS_ADMIN.md +33 -0
- package/flows/ART.md +33 -0
- package/flows/BUG_FIX.md +32 -0
- package/flows/COURT_SYSTEM.md +33 -0
- package/flows/DATA_SCIENTIST.md +33 -0
- package/flows/ECOMMERCE.md +33 -0
- package/flows/ECONOMICS.md +33 -0
- package/flows/GRAPHIC_DESIGN.md +33 -0
- package/flows/HISTORY.md +33 -0
- package/flows/LAWYER.md +34 -0
- package/flows/PROGRAMMER.md +33 -0
- package/flows/PR_REVIEW.md +33 -0
- package/flows/README.md +29 -0
- package/flows/RETAIL_STORE.md +33 -0
- package/flows/SOCIOLOGY.md +33 -0
- package/flows/STATE_ADMIN.md +33 -0
- package/flows/STUDENT_UNIVERSITY.md +33 -0
- package/flows/TAXES_ADMIN.md +33 -0
- package/flows/TEACHER.md +33 -0
- package/package.json +32 -0
- package/router/BUG_FIX.flow.md +63 -0
- package/router/BUSINESS.flow.md +57 -0
- package/router/DATA_SCIENCE.flow.md +58 -0
- package/router/DESIGN.flow.md +58 -0
- package/router/FLOW_TEMPLATE.md +26 -0
- package/router/GENERIC.flow.md +37 -0
- package/router/HUMANITIES.flow.md +58 -0
- package/router/LEARN.flow.md +52 -0
- package/router/LEGAL.flow.md +58 -0
- package/router/PR_REVIEW.flow.md +55 -0
- package/router/README.md +23 -0
- package/router/SOFTWARE_FEATURE.flow.md +59 -0
- package/schemas/architecture.schema.json +13 -0
- package/schemas/decision-log.schema.json +16 -0
- package/schemas/diagram.schema.json +11 -0
- package/schemas/domain.schema.json +20 -0
- package/schemas/functional-spec.schema.json +15 -0
- package/schemas/gate.schema.json +10 -0
- package/schemas/learn-session.schema.json +15 -0
- package/schemas/pr-review.schema.json +20 -0
- package/schemas/progress-log.schema.json +21 -0
- package/schemas/project-readme.schema.json +23 -0
- package/schemas/project.schema.json +16 -0
- package/schemas/prompt-pack.schema.json +12 -0
- package/schemas/quality.schema.json +23 -0
- package/schemas/requirement.schema.json +34 -0
- package/schemas/role.schema.json +17 -0
- package/schemas/router-flow.schema.json +15 -0
- package/schemas/router-intent.schema.json +13 -0
- package/schemas/technical-spec.schema.json +15 -0
- package/schemas/template.schema.json +10 -0
- package/schemas/test-plan.schema.json +13 -0
- package/schemas/workspace.schema.json +12 -0
- package/templates/architecture.md +16 -0
- package/templates/changelog.md +3 -0
- package/templates/ci-checklist.md +14 -0
- package/templates/decision-log.md +16 -0
- package/templates/diagrams/component.mmd +3 -0
- package/templates/diagrams/container.mmd +3 -0
- package/templates/diagrams/context.mmd +3 -0
- package/templates/functional-spec.md +22 -0
- package/templates/gate-index.json +20 -0
- package/templates/implementation-plan.md +13 -0
- package/templates/pr-comment-audit.md +19 -0
- package/templates/pr-comment-lifecycle.md +11 -0
- package/templates/pr-comment-severity.md +13 -0
- package/templates/pr-dispute-resolution.md +16 -0
- package/templates/pr-metrics.md +10 -0
- package/templates/pr-response-generator.md +11 -0
- package/templates/pr-response-style.md +13 -0
- package/templates/pr-review-report.md +22 -0
- package/templates/pr-review-summary.md +16 -0
- package/templates/progress-log.md +6 -0
- package/templates/project-readme.md +19 -0
- package/templates/prompt-pack-index.json +127 -0
- package/templates/quality.yml +17 -0
- package/templates/requirement.md +33 -0
- package/templates/summary.md +10 -0
- package/templates/technical-spec.md +22 -0
- package/templates/template-index.json +212 -0
- 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>;
|