@aipper/aiws 0.0.40 → 0.0.42

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.
@@ -0,0 +1,606 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import readline from "node:readline";
4
+ import { resolveWorkspaceRoot } from "../workspace.js";
5
+ import { pathExists, readText, writeText, ensureDir, listFilesRecursive } from "../fs.js";
6
+ import { runCommand } from "../exec.js";
7
+ import { UserError } from "../errors.js";
8
+ import { logger } from "../lib/logger.js";
9
+ // ---------------------------------------------------------------------------
10
+ // Constants
11
+ // ---------------------------------------------------------------------------
12
+ const SKIP_DIRS = new Set(["node_modules", ".git", "dist", "build", ".aiws", ".agentdocs"]);
13
+ /** Hard cap on source files read during Phase 3 to avoid huge repos. */
14
+ const SCAN_LIMIT = 500;
15
+ /** Maximum lines read per source file. */
16
+ const MAX_FILE_LINES = 2_000;
17
+ /** Source-root directory names used during Phase 3 to filter relevant files. */
18
+ const SOURCE_ROOTS = new Set(["src", "app", "lib", "server", "client", "routes", "api", "pages", "components"]);
19
+ const ROUTE_MATCHERS = [
20
+ // Framework-style: app.get(...), router.post(...)
21
+ {
22
+ label: "framework",
23
+ regex: /(?:app|router)\.(get|post|put|delete|patch|options|head)\s*\(\s*['"]([^'"]+)['"]\s*,/g,
24
+ extract: (m) => ({ method: m[1].toUpperCase(), path: m[2] }),
25
+ },
26
+ // Decorator-style: @Get(...), @Post(...)
27
+ {
28
+ label: "decorator",
29
+ regex: /@(Get|Post|Put|Delete|Patch|Options|Head)\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
30
+ extract: (m) => ({ method: m[1].toUpperCase(), path: m[2] }),
31
+ },
32
+ // Chained route: app.route(...), router.route(...)
33
+ {
34
+ label: "chained",
35
+ regex: /(?:app|router)\.route\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
36
+ extract: (m) => ({ method: "ANY", path: m[1] }),
37
+ },
38
+ ];
39
+ // ---------------------------------------------------------------------------
40
+ // Helpers
41
+ // ---------------------------------------------------------------------------
42
+ function isSourceFile(name) {
43
+ return /\.(?:ts|tsx|js|jsx)$/.test(name);
44
+ }
45
+ function isConfigFile(name) {
46
+ return (/\.config\.[a-z]+$/.test(name) ||
47
+ /\.(json|ya?ml)$/.test(name) ||
48
+ name === ".env.example" ||
49
+ name === "Dockerfile");
50
+ }
51
+ function isUnderSourceRoot(parts) {
52
+ return parts.some((p) => SOURCE_ROOTS.has(p));
53
+ }
54
+ function isSkipped(parts) {
55
+ return parts.some((p) => SKIP_DIRS.has(p));
56
+ }
57
+ function extractFrameworkHints(deps) {
58
+ const hints = [];
59
+ const map = {
60
+ express: "Express.js",
61
+ "@nestjs/core": "NestJS",
62
+ "@angular/core": "Angular",
63
+ next: "Next.js",
64
+ vue: "Vue.js",
65
+ react: "React",
66
+ "react-dom": "React",
67
+ fastify: "Fastify",
68
+ koa: "Koa",
69
+ hapi: "Hapi.js",
70
+ "@sveltejs/kit": "SvelteKit",
71
+ nuxt: "Nuxt.js",
72
+ remix: "Remix",
73
+ "solid-js": "Solid.js",
74
+ "express-session": "Express.js",
75
+ "@fastify/static": "Fastify",
76
+ };
77
+ for (const [key, label] of Object.entries(map)) {
78
+ if (key in deps)
79
+ hints.push(label);
80
+ }
81
+ return [...new Set(hints)];
82
+ }
83
+ /** Read first `maxLines` of a file, returning them as an array (empty on error). */
84
+ async function readFirstLines(filePath, maxLines) {
85
+ try {
86
+ const content = await fs.readFile(filePath, "utf8");
87
+ const lines = content.split("\n");
88
+ return lines.slice(0, maxLines);
89
+ }
90
+ catch {
91
+ return [];
92
+ }
93
+ }
94
+ /** Extract route/endpoint declarations from a chunk of source lines. */
95
+ function extractEndpoints(lines, source) {
96
+ const found = [];
97
+ const combined = lines.join("\n");
98
+ for (const matcher of ROUTE_MATCHERS) {
99
+ const re = new RegExp(matcher.regex.source, "g");
100
+ let m;
101
+ while ((m = re.exec(combined)) !== null) {
102
+ const ep = matcher.extract(m);
103
+ if (ep) {
104
+ found.push({ method: ep.method, path: ep.path, source });
105
+ }
106
+ }
107
+ }
108
+ return found;
109
+ }
110
+ /** Extract data-model declarations (interface, type, class) from source lines. */
111
+ function extractDataModels(lines, source) {
112
+ const models = [];
113
+ const text = lines.join("\n");
114
+ // interface declarations
115
+ {
116
+ const re = /(?:export\s+)?interface\s+(\w+)/g;
117
+ let m;
118
+ while ((m = re.exec(text)) !== null) {
119
+ models.push({ name: m[1], kind: "interface", source });
120
+ }
121
+ }
122
+ // type alias declarations
123
+ {
124
+ const re = /(?:export\s+)?type\s+(\w+)\s*=/g;
125
+ let m;
126
+ while ((m = re.exec(text)) !== null) {
127
+ models.push({ name: m[1], kind: "type", source });
128
+ }
129
+ }
130
+ // class declarations with model/schema keyword: class X extends Model, class X extends Schema
131
+ {
132
+ const re = /(?:export\s+)?class\s+(\w+)\s+extends\s+\w*(?:Model|Schema)\b/g;
133
+ let m;
134
+ while ((m = re.exec(text)) !== null) {
135
+ models.push({ name: m[1], kind: "class", source });
136
+ }
137
+ }
138
+ // @Entity decorator
139
+ {
140
+ const re = /@Entity[\s\S]*?(?:export\s+)?(?:abstract\s+)?class\s+(\w+)/g;
141
+ let m;
142
+ while ((m = re.exec(text)) !== null) {
143
+ const name = m[1];
144
+ const already = models.some((d) => d.name === name && d.kind === "class");
145
+ if (!already) {
146
+ models.push({ name, kind: "class", source });
147
+ }
148
+ }
149
+ }
150
+ return models;
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // Phase 1 — Metadata
154
+ // ---------------------------------------------------------------------------
155
+ async function phase1Meta(root) {
156
+ const meta = {
157
+ projectName: "",
158
+ projectDescription: "",
159
+ dependencies: {},
160
+ frameworkHints: [],
161
+ };
162
+ const pkgPath = path.join(root, "package.json");
163
+ if (await pathExists(pkgPath)) {
164
+ try {
165
+ const raw = await readText(pkgPath);
166
+ const pkg = JSON.parse(raw);
167
+ meta.projectName = typeof pkg.name === "string" ? pkg.name : "";
168
+ meta.projectDescription = typeof pkg.description === "string" ? pkg.description : "";
169
+ const deps = pkg.dependencies;
170
+ if (deps && typeof deps === "object" && !Array.isArray(deps)) {
171
+ for (const [k, v] of Object.entries(deps)) {
172
+ meta.dependencies[k] = String(v);
173
+ }
174
+ }
175
+ const devDeps = pkg.devDependencies;
176
+ if (devDeps && typeof devDeps === "object" && !Array.isArray(devDeps)) {
177
+ for (const [k, v] of Object.entries(devDeps)) {
178
+ if (!(k in meta.dependencies)) {
179
+ meta.dependencies[k] = String(v);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ catch (err) {
185
+ logger.warn(`Failed to parse package.json: ${err.message}`);
186
+ }
187
+ }
188
+ // Workspaces / monorepo hint
189
+ try {
190
+ const raw = await readText(pkgPath);
191
+ const pkg = JSON.parse(raw);
192
+ if (pkg.workspaces) {
193
+ meta.frameworkHints.push("Monorepo (workspaces)");
194
+ }
195
+ }
196
+ catch {
197
+ // ignore — not a monorepo or package.json is unavailable
198
+ }
199
+ // Detect packages/apps directory as monorepo indicator
200
+ for (const sub of ["packages", "apps"]) {
201
+ if (await pathExists(path.join(root, sub))) {
202
+ meta.frameworkHints.push(`Has ${sub}/ directory (monorepo)`);
203
+ break;
204
+ }
205
+ }
206
+ meta.frameworkHints.push(...extractFrameworkHints(meta.dependencies));
207
+ return meta;
208
+ }
209
+ // ---------------------------------------------------------------------------
210
+ // Phase 2 — Structure
211
+ // ---------------------------------------------------------------------------
212
+ async function phase2Structure(root, meta, allFiles) {
213
+ const modules = [];
214
+ const configFiles = [];
215
+ // Detect module roots from common source directories (single source of truth with Phase 3)
216
+ const sourceRoots = [...SOURCE_ROOTS];
217
+ for (const sr of sourceRoots) {
218
+ const srPath = path.join(root, sr);
219
+ if (await pathExists(srPath)) {
220
+ try {
221
+ const entries = await fs.readdir(srPath, { withFileTypes: true });
222
+ let hasSubdirs = false;
223
+ for (const ent of entries) {
224
+ if (ent.isDirectory() && !SKIP_DIRS.has(ent.name)) {
225
+ modules.push({ name: ent.name, relPath: `${sr}/${ent.name}` });
226
+ hasSubdirs = true;
227
+ }
228
+ }
229
+ if (!hasSubdirs) {
230
+ modules.push({ name: sr, relPath: sr });
231
+ }
232
+ }
233
+ catch {
234
+ logger.debug(`Cannot read ${srPath}, skipping.`);
235
+ }
236
+ }
237
+ }
238
+ // Walk full file tree to discover config files
239
+ for (const f of allFiles) {
240
+ const parts = f.split("/");
241
+ if (isSkipped(parts))
242
+ continue;
243
+ if (isConfigFile(f)) {
244
+ configFiles.push(f);
245
+ }
246
+ }
247
+ // Optional git analysis (last 10 commits)
248
+ let gitLogSummary = "";
249
+ try {
250
+ const result = await runCommand("git", ["log", "--oneline", "-10"], { cwd: root });
251
+ if (result.code === 0) {
252
+ gitLogSummary = result.stdout.trim();
253
+ }
254
+ }
255
+ catch {
256
+ logger.debug("Git log unavailable (not a git repo or git not installed).");
257
+ }
258
+ // Deduplicate modules by name
259
+ const seen = new Set();
260
+ const uniqueModules = modules.filter((m) => {
261
+ if (seen.has(m.name))
262
+ return false;
263
+ seen.add(m.name);
264
+ return true;
265
+ });
266
+ return {
267
+ metadata: meta,
268
+ modules: uniqueModules,
269
+ endpoints: [],
270
+ dataModels: [],
271
+ configFiles,
272
+ sourceFilesScanned: 0,
273
+ gitLogSummary,
274
+ };
275
+ }
276
+ // ---------------------------------------------------------------------------
277
+ // Phase 3 — Source Pattern Scanning
278
+ // ---------------------------------------------------------------------------
279
+ async function phase3SourcePatterns(root, result, allFiles) {
280
+ let scanned = 0;
281
+ for (const f of allFiles) {
282
+ if (scanned >= SCAN_LIMIT)
283
+ break;
284
+ const parts = f.split("/");
285
+ if (isSkipped(parts))
286
+ continue;
287
+ if (!isSourceFile(f))
288
+ continue;
289
+ if (!isUnderSourceRoot(parts))
290
+ continue;
291
+ const absPath = path.join(root, f);
292
+ scanned++;
293
+ const lines = await readFirstLines(absPath, MAX_FILE_LINES);
294
+ if (lines.length === 0)
295
+ continue;
296
+ const endpoints = extractEndpoints(lines, f);
297
+ result.endpoints.push(...endpoints);
298
+ const models = extractDataModels(lines, f);
299
+ result.dataModels.push(...models);
300
+ }
301
+ result.sourceFilesScanned = scanned;
302
+ logger.debug(`Source scanning complete: ${scanned} files, ${result.endpoints.length} endpoints, ${result.dataModels.length} data models`);
303
+ }
304
+ // ---------------------------------------------------------------------------
305
+ // Phase 4 — Output Generation
306
+ // ---------------------------------------------------------------------------
307
+ function generateAnalysisReport(result, root) {
308
+ const out = [];
309
+ out.push("# Retro-Require Analysis Report");
310
+ out.push("");
311
+ out.push(`**Project:** ${result.metadata.projectName || "(unnamed)"}`);
312
+ out.push(`**Description:** ${result.metadata.projectDescription || "(none)"}`);
313
+ out.push(`**Root:** ${root}`);
314
+ out.push(`**Generated:** ${new Date().toISOString()}`);
315
+ out.push("");
316
+ out.push("## Framework Hints");
317
+ out.push("");
318
+ if (result.metadata.frameworkHints.length > 0) {
319
+ for (const hint of result.metadata.frameworkHints) {
320
+ out.push(`- ${hint}`);
321
+ }
322
+ }
323
+ else {
324
+ out.push("(none detected)");
325
+ }
326
+ out.push("");
327
+ out.push("## Modules / Source Directories");
328
+ out.push("");
329
+ if (result.modules.length > 0) {
330
+ for (const m of result.modules) {
331
+ out.push(`- **${m.name}** — \`${m.relPath}\``);
332
+ }
333
+ }
334
+ else {
335
+ out.push("(no source modules detected)");
336
+ }
337
+ out.push("");
338
+ out.push("## API Endpoints");
339
+ out.push("");
340
+ if (result.endpoints.length > 0) {
341
+ out.push("| Method | Path | Source |");
342
+ out.push("|--------|------|--------|");
343
+ for (const ep of result.endpoints) {
344
+ out.push(`| ${ep.method.padEnd(6)} | \`${ep.path}\` | \`${ep.source}\` |`);
345
+ }
346
+ }
347
+ else {
348
+ out.push("(no endpoints detected)");
349
+ }
350
+ out.push("");
351
+ out.push("## Data Models");
352
+ out.push("");
353
+ if (result.dataModels.length > 0) {
354
+ out.push("| Name | Kind | Source |");
355
+ out.push("|------|------|--------|");
356
+ for (const dm of result.dataModels) {
357
+ out.push(`| \`${dm.name}\` | ${dm.kind} | \`${dm.source}\` |`);
358
+ }
359
+ }
360
+ else {
361
+ out.push("(no data models detected)");
362
+ }
363
+ out.push("");
364
+ out.push("## Config / Definition Files");
365
+ out.push("");
366
+ if (result.configFiles.length > 0) {
367
+ for (const cf of result.configFiles) {
368
+ out.push(`- \`${cf}\``);
369
+ }
370
+ }
371
+ else {
372
+ out.push("(none detected)");
373
+ }
374
+ out.push("");
375
+ out.push("## Scan Statistics");
376
+ out.push("");
377
+ out.push(`- Source files scanned during Phase 3: ${result.sourceFilesScanned}`);
378
+ out.push(`- Config files discovered: ${result.configFiles.length}`);
379
+ out.push(`- Data models found: ${result.dataModels.length}`);
380
+ out.push(`- API endpoints found: ${result.endpoints.length}`);
381
+ out.push("");
382
+ if (result.gitLogSummary) {
383
+ out.push("## Recent Git History");
384
+ out.push("");
385
+ out.push("```");
386
+ out.push(result.gitLogSummary);
387
+ out.push("```");
388
+ out.push("");
389
+ }
390
+ return out.join("\n");
391
+ }
392
+ function generateRequirementsDraft(result) {
393
+ const out = [];
394
+ // --- Header & managed block (matches template) ---
395
+ out.push("# REQUIREMENTS.md(需求与验收标准)");
396
+ out.push("");
397
+ out.push("<!-- AIWS_MANAGED_BEGIN:requirements:contract -->");
398
+ out.push("本文件是工作区需求的唯一真值来源。AI 在制定计划与执行测试时必须以此为准。");
399
+ out.push("");
400
+ out.push("约束:");
401
+ out.push("- 不写入任何 secrets(token、账号、内网端点等)");
402
+ out.push("- `aiws update` 只维护本托管块;其余内容由项目自由编辑");
403
+ out.push("");
404
+ out.push("相关合同:");
405
+ out.push("- `requirements/requirements-issues.csv`:需求拆解执行合同(校验:`python3 tools/requirements_contract.py validate`)");
406
+ out.push("<!-- AIWS_MANAGED_END:requirements:contract -->");
407
+ out.push("");
408
+ // --- 需求概述 ---
409
+ const projectName = result.metadata.projectName || "(未命名项目)";
410
+ const desc = result.metadata.projectDescription || "(无描述)";
411
+ out.push("## 需求概述");
412
+ out.push("");
413
+ out.push("> ⚠️ 以下内容为自动生成。请根据实际情况修改。");
414
+ out.push("");
415
+ out.push("### 背景");
416
+ out.push("");
417
+ out.push(desc);
418
+ out.push("");
419
+ out.push("### 目标");
420
+ out.push("");
421
+ out.push(`本项目 **${projectName}** 需要明确核心功能需求。`);
422
+ out.push("");
423
+ if (result.modules.length > 0) {
424
+ out.push("根据项目结构分析,包含以下主要模块:");
425
+ out.push("");
426
+ for (const m of result.modules) {
427
+ out.push(`- **${m.name}**(\`${m.relPath}\`)`);
428
+ }
429
+ out.push("");
430
+ out.push("需要对这些模块进行需求梳理和功能定义,以确保各模块职责清晰、接口对齐。");
431
+ }
432
+ out.push("");
433
+ out.push("### 非目标");
434
+ out.push("");
435
+ out.push("- 本次需求梳理不涉及超出 MVP 范围的功能。");
436
+ out.push("- 基础设施与 CI/CD 配置不在本需求文档范围内(详见 AI_WORKSPACE.md)。");
437
+ out.push("");
438
+ // --- 接口需求 ---
439
+ out.push("## 接口需求");
440
+ out.push("");
441
+ if (result.endpoints.length > 0) {
442
+ out.push("自动检测到的 API 端点(基于源码启发式扫描):");
443
+ out.push("");
444
+ out.push("| Method | Path | Source File |");
445
+ out.push("|--------|------|-------------|");
446
+ for (const ep of result.endpoints) {
447
+ out.push(`| ${ep.method.padEnd(6)} | \`${ep.path}\` | \`${ep.source}\` |`);
448
+ }
449
+ out.push("");
450
+ out.push("> ⚠️ 以上为自动扫描结果,可能存在遗漏或误报。请逐条确认并补充请求/响应示例。");
451
+ }
452
+ else {
453
+ out.push("未检测到 API 端点。请手动填写接口清单:");
454
+ out.push("");
455
+ out.push("| Method | Path | 鉴权要求 | 请求示例 | 响应示例 |");
456
+ out.push("|--------|------|----------|----------|----------|");
457
+ out.push("| | | | | |");
458
+ }
459
+ out.push("");
460
+ // --- 验收标准 ---
461
+ out.push("## 验收标准");
462
+ out.push("");
463
+ out.push("> ⚠️ auto-generated — review and customize");
464
+ out.push("");
465
+ out.push("- 代码:编译/构建无报错");
466
+ out.push("- 功能:需求覆盖完整(按接口清单逐项通过)");
467
+ out.push("- 日志:关键请求路径无异常(ERROR/Exception/Stacktrace)或已确认可接受");
468
+ out.push("");
469
+ // --- 业务链路 (placeholder) ---
470
+ out.push("## 业务链路(简短逻辑图输入,建议填写)");
471
+ out.push("");
472
+ out.push("为降低“每次让 AI 重新理解系统”的 token 消耗,并让自动化测试能按业务链路组合执行,建议维护一份**机器可读**的 FlowSpec。");
473
+ out.push("");
474
+ out.push("说明:");
475
+ out.push("- 该 FlowSpec 用于自动生成 `docs/api-flow.mmd`(简短逻辑图)与 `issues/server-scenario-issues.csv`(场景执行合同)。");
476
+ out.push("- 每次需求变更(例如运行 `/ws-req-change`)后,都应重新生成一次(不会修改 secrets)。");
477
+ out.push("");
478
+ out.push("<!-- FLOW_SPEC_BEGIN -->");
479
+ out.push("```json");
480
+ out.push("{");
481
+ out.push(' "flows": []');
482
+ out.push("}");
483
+ out.push("```");
484
+ out.push("<!-- FLOW_SPEC_END -->");
485
+ out.push("");
486
+ // --- 变更记录 (placeholder) ---
487
+ out.push("## 变更记录");
488
+ out.push("");
489
+ out.push("进行中的需求变更请使用独立变更日志(避免在本文件里堆历史):");
490
+ out.push("- `requirements/CHANGELOG.md`");
491
+ out.push("");
492
+ // --- 接口清单真值 (placeholder) ---
493
+ out.push("## 接口清单真值(推荐)");
494
+ out.push("");
495
+ out.push("- OpenAPI:以 `docs/openapi.json` 为接口清单真值来源");
496
+ out.push("- 若 OpenAPI 缺失:在本次任务中补齐导出方式(生成到 `docs/openapi.json`),否则自动化测试只能做“尽力覆盖”");
497
+ out.push("");
498
+ // --- 自动化测试闭环 (placeholder) ---
499
+ out.push("## 自动化测试闭环(建议)");
500
+ out.push("");
501
+ out.push("为减少“下一步操作”式的人工介入,建议把自动化测试的产物与边界固化为执行合同:");
502
+ out.push("- `docs/openapi.json`:接口清单真值来源(优先)");
503
+ out.push("- `issues/server-api-issues.csv`:每个 endpoint 的验收字段与状态机(TODO/DOING/DONE/BLOCKED/SKIP)");
504
+ out.push("- `issues/server-fix-issues.csv`:当出现 BLOCKED 时自动生成的“下一步修复清单”(用于持续闭环;包含 Failure_Category/Failure_Analysis/Suggestion)");
505
+ out.push("- `issues/server-triage-issues.csv`:当 runner 无法稳定归因/需要人工判断时生成的“人工介入清单”(避免把噪声混进 fix issues)");
506
+ out.push("- `.aiws/tmp/server-test/`:响应与日志片段(不入库)");
507
+ out.push("");
508
+ // --- 测试环境 (placeholder) ---
509
+ out.push("## 测试环境与副作用边界(强烈建议填写)");
510
+ out.push("");
511
+ out.push("- 环境:test / staging / prod(推荐写 `test`)");
512
+ out.push("- 是否允许测试有副作用接口(POST/PUT/DELETE):是/否");
513
+ out.push("- 如允许:是否要求测试数据隔离/幂等(例如使用测试账号、固定测试数据、或每次清理)");
514
+ out.push("");
515
+ // --- Request-ID (placeholder) ---
516
+ out.push("## Request-ID / Trace-ID 验收(推荐)");
517
+ out.push("");
518
+ out.push("- 服务端支持并回传 `X-Request-Id` 响应头(与请求一致或自动生成)");
519
+ out.push("- 服务端日志包含 `request_id=<id>`,便于按请求定位错误");
520
+ out.push("");
521
+ return out.join("\n");
522
+ }
523
+ // ---------------------------------------------------------------------------
524
+ // Public API
525
+ // ---------------------------------------------------------------------------
526
+ /**
527
+ * Run retroactive requirements analysis on an existing codebase.
528
+ *
529
+ * Scans the target workspace in four phases (Meta → Structure → Source Patterns
530
+ * → Synthesis) and generates:
531
+ * - `.aiws/tmp/retro-require/scan-summary.json`
532
+ * - `.aiws/tmp/retro-require/analysis-report.md`
533
+ * - A REQUIREMENTS.md draft (unless `--analyze-only`)
534
+ */
535
+ export async function retroRequireCommand(options) {
536
+ const workspaceRoot = await resolveWorkspaceRoot(options.targetPath);
537
+ logger.info(`Retro-require analysis for: ${workspaceRoot}`);
538
+ // ---- Phase 1: Meta ----
539
+ logger.debug("Phase 1/4 — Scanning project metadata...");
540
+ const scanMeta = await phase1Meta(workspaceRoot);
541
+ // ---- Phase 2: Structure ----
542
+ logger.debug("Phase 2/4 — Scanning project structure...");
543
+ // Scan file tree once, share between phases to avoid duplicate I/O
544
+ const allFiles = await listFilesRecursive(workspaceRoot, ".");
545
+ const scanResult = await phase2Structure(workspaceRoot, scanMeta, allFiles);
546
+ // ---- Phase 3: Source Patterns ----
547
+ logger.debug("Phase 3/4 — Scanning source patterns...");
548
+ await phase3SourcePatterns(workspaceRoot, scanResult, allFiles);
549
+ // ---- Phase 4: Synthesis ----
550
+ logger.debug("Phase 4/4 — Synthesizing results...");
551
+ const analysisDir = path.join(workspaceRoot, ".aiws", "tmp", "retro-require");
552
+ await ensureDir(analysisDir);
553
+ // Write scan-summary.json
554
+ const summaryPayload = {
555
+ metadata: {
556
+ projectName: scanResult.metadata.projectName,
557
+ projectDescription: scanResult.metadata.projectDescription,
558
+ frameworkHints: scanResult.metadata.frameworkHints,
559
+ dependencyCount: Object.keys(scanResult.metadata.dependencies).length,
560
+ },
561
+ modules: scanResult.modules,
562
+ endpoints: scanResult.endpoints,
563
+ dataModels: scanResult.dataModels,
564
+ configFiles: scanResult.configFiles,
565
+ sourceFilesScanned: scanResult.sourceFilesScanned,
566
+ gitLogSummary: scanResult.gitLogSummary,
567
+ scannedAt: new Date().toISOString(),
568
+ };
569
+ await writeText(path.join(analysisDir, "scan-summary.json"), JSON.stringify(summaryPayload, null, 2));
570
+ logger.info(`Scan summary written: ${path.join(analysisDir, "scan-summary.json")}`);
571
+ // Write analysis-report.md
572
+ const report = generateAnalysisReport(scanResult, workspaceRoot);
573
+ await writeText(path.join(analysisDir, "analysis-report.md"), report);
574
+ logger.info(`Analysis report written: ${path.join(analysisDir, "analysis-report.md")}`);
575
+ if (options.analyzeOnly) {
576
+ logger.info("--analyze-only set; skipping REQUIREMENTS.md generation.");
577
+ return;
578
+ }
579
+ // ---- REQUIREMENTS.md Draft ----
580
+ const draftPath = options.output
581
+ ? path.resolve(workspaceRoot, options.output)
582
+ : path.join(workspaceRoot, "REQUIREMENTS.md");
583
+ // Safety check: refuse to overwrite unless --yes is set
584
+ if (!options.yes && (await pathExists(draftPath))) {
585
+ throw new UserError(`REQUIREMENTS.md already exists at ${draftPath}. Use --yes to overwrite.`, { details: "Refusing to overwrite existing REQUIREMENTS.md without explicit --yes flag." });
586
+ }
587
+ const draft = generateRequirementsDraft(scanResult);
588
+ // Interactive confirmation (skip when --yes or non-TTY)
589
+ const isTTY = process.stdout.isTTY === true;
590
+ const autoConfirm = options.yes === true || !isTTY;
591
+ if (!autoConfirm) {
592
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
593
+ const answer = await new Promise((resolve) => {
594
+ rl.question(`Save to ${draftPath}? [y/N] `, resolve);
595
+ });
596
+ rl.close();
597
+ if (answer !== "y" && answer !== "yes") {
598
+ logger.info("Aborted by user.");
599
+ return;
600
+ }
601
+ }
602
+ await ensureDir(path.dirname(draftPath));
603
+ await writeText(draftPath, draft);
604
+ logger.info(`REQUIREMENTS.md draft written: ${draftPath}`);
605
+ }
606
+ //# sourceMappingURL=retro-require.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retro-require.js","sourceRoot":"","sources":["../../src/commands/retro-require.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};