forge-cc 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/package.json +3 -2
  2. package/dist/gates/codex-gate.d.ts +0 -51
  3. package/dist/gates/codex-gate.js +0 -121
  4. package/dist/gates/codex-gate.js.map +0 -1
  5. package/dist/gates/prd-gate.d.ts +0 -7
  6. package/dist/gates/prd-gate.js +0 -193
  7. package/dist/gates/prd-gate.js.map +0 -1
  8. package/dist/gates/remediation.d.ts +0 -46
  9. package/dist/gates/remediation.js +0 -423
  10. package/dist/gates/remediation.js.map +0 -1
  11. package/dist/gates/review-gate.d.ts +0 -16
  12. package/dist/gates/review-gate.js +0 -479
  13. package/dist/gates/review-gate.js.map +0 -1
  14. package/dist/gates/runtime-gate.d.ts +0 -5
  15. package/dist/gates/runtime-gate.js +0 -99
  16. package/dist/gates/runtime-gate.js.map +0 -1
  17. package/dist/gates/test-analysis.d.ts +0 -21
  18. package/dist/gates/test-analysis.js +0 -394
  19. package/dist/gates/test-analysis.js.map +0 -1
  20. package/dist/gates/visual-capture.d.ts +0 -24
  21. package/dist/gates/visual-capture.js +0 -144
  22. package/dist/gates/visual-capture.js.map +0 -1
  23. package/dist/gates/visual-gate.d.ts +0 -18
  24. package/dist/gates/visual-gate.js +0 -234
  25. package/dist/gates/visual-gate.js.map +0 -1
  26. package/dist/gates/visual-reviewer.d.ts +0 -11
  27. package/dist/gates/visual-reviewer.js +0 -211
  28. package/dist/gates/visual-reviewer.js.map +0 -1
  29. package/dist/go/auto-chain.d.ts +0 -136
  30. package/dist/go/auto-chain.js +0 -389
  31. package/dist/go/auto-chain.js.map +0 -1
  32. package/dist/go/executor.d.ts +0 -137
  33. package/dist/go/executor.js +0 -447
  34. package/dist/go/executor.js.map +0 -1
  35. package/dist/go/finalize.d.ts +0 -108
  36. package/dist/go/finalize.js +0 -331
  37. package/dist/go/finalize.js.map +0 -1
  38. package/dist/go/linear-sync-cli.d.ts +0 -55
  39. package/dist/go/linear-sync-cli.js +0 -192
  40. package/dist/go/linear-sync-cli.js.map +0 -1
  41. package/dist/go/linear-sync.d.ts +0 -112
  42. package/dist/go/linear-sync.js +0 -375
  43. package/dist/go/linear-sync.js.map +0 -1
  44. package/dist/go/prd-queue.d.ts +0 -43
  45. package/dist/go/prd-queue.js +0 -67
  46. package/dist/go/prd-queue.js.map +0 -1
  47. package/dist/go/prd-selector.d.ts +0 -57
  48. package/dist/go/prd-selector.js +0 -101
  49. package/dist/go/prd-selector.js.map +0 -1
  50. package/dist/go/verify-loop.d.ts +0 -64
  51. package/dist/go/verify-loop.js +0 -327
  52. package/dist/go/verify-loop.js.map +0 -1
  53. package/dist/hooks/pre-commit.d.ts +0 -5
  54. package/dist/hooks/pre-commit.js +0 -75
  55. package/dist/hooks/pre-commit.js.map +0 -1
  56. package/dist/linear/issues.d.ts +0 -22
  57. package/dist/linear/issues.js +0 -51
  58. package/dist/linear/issues.js.map +0 -1
  59. package/dist/linear/milestones.d.ts +0 -11
  60. package/dist/linear/milestones.js +0 -32
  61. package/dist/linear/milestones.js.map +0 -1
  62. package/dist/linear/projects.d.ts +0 -16
  63. package/dist/linear/projects.js +0 -51
  64. package/dist/linear/projects.js.map +0 -1
  65. package/dist/reporter/human.d.ts +0 -7
  66. package/dist/reporter/human.js +0 -93
  67. package/dist/reporter/human.js.map +0 -1
  68. package/dist/reporter/json.d.ts +0 -2
  69. package/dist/reporter/json.js +0 -4
  70. package/dist/reporter/json.js.map +0 -1
  71. package/dist/setup/structural-templates.d.ts +0 -12
  72. package/dist/setup/structural-templates.js +0 -288
  73. package/dist/setup/structural-templates.js.map +0 -1
  74. package/dist/setup/templates.d.ts +0 -17
  75. package/dist/setup/templates.js +0 -109
  76. package/dist/setup/templates.js.map +0 -1
  77. package/dist/setup/test-planner.d.ts +0 -38
  78. package/dist/setup/test-planner.js +0 -91
  79. package/dist/setup/test-planner.js.map +0 -1
  80. package/dist/setup/test-scaffold.d.ts +0 -31
  81. package/dist/setup/test-scaffold.js +0 -209
  82. package/dist/setup/test-scaffold.js.map +0 -1
  83. package/dist/setup/test-templates.d.ts +0 -37
  84. package/dist/setup/test-templates.js +0 -313
  85. package/dist/setup/test-templates.js.map +0 -1
  86. package/dist/spec/generator.d.ts +0 -34
  87. package/dist/spec/generator.js +0 -227
  88. package/dist/spec/generator.js.map +0 -1
  89. package/dist/spec/interview.d.ts +0 -142
  90. package/dist/spec/interview.js +0 -287
  91. package/dist/spec/interview.js.map +0 -1
  92. package/dist/spec/linear-sync.d.ts +0 -48
  93. package/dist/spec/linear-sync.js +0 -125
  94. package/dist/spec/linear-sync.js.map +0 -1
  95. package/dist/spec/scanner.d.ts +0 -79
  96. package/dist/spec/scanner.js +0 -566
  97. package/dist/spec/scanner.js.map +0 -1
  98. package/dist/spec/templates.d.ts +0 -375
  99. package/dist/spec/templates.js +0 -95
  100. package/dist/spec/templates.js.map +0 -1
  101. package/dist/state/prd-status.d.ts +0 -62
  102. package/dist/state/prd-status.js +0 -122
  103. package/dist/state/prd-status.js.map +0 -1
  104. package/dist/state/reader.d.ts +0 -7
  105. package/dist/state/reader.js +0 -43
  106. package/dist/state/reader.js.map +0 -1
  107. package/dist/state/writer.d.ts +0 -21
  108. package/dist/state/writer.js +0 -106
  109. package/dist/state/writer.js.map +0 -1
  110. package/dist/team/consensus.d.ts +0 -28
  111. package/dist/team/consensus.js +0 -130
  112. package/dist/team/consensus.js.map +0 -1
  113. package/dist/team/index.d.ts +0 -4
  114. package/dist/team/index.js +0 -5
  115. package/dist/team/index.js.map +0 -1
  116. package/dist/team/lifecycle.d.ts +0 -37
  117. package/dist/team/lifecycle.js +0 -92
  118. package/dist/team/lifecycle.js.map +0 -1
  119. package/dist/team/reviewer.d.ts +0 -10
  120. package/dist/team/reviewer.js +0 -345
  121. package/dist/team/reviewer.js.map +0 -1
  122. package/dist/team/types.d.ts +0 -269
  123. package/dist/team/types.js +0 -70
  124. package/dist/team/types.js.map +0 -1
  125. package/dist/utils/browser.d.ts +0 -10
  126. package/dist/utils/browser.js +0 -96
  127. package/dist/utils/browser.js.map +0 -1
  128. package/dist/utils/platform.d.ts +0 -29
  129. package/dist/utils/platform.js +0 -90
  130. package/dist/utils/platform.js.map +0 -1
  131. package/dist/worktree/identity.d.ts +0 -9
  132. package/dist/worktree/identity.js +0 -32
  133. package/dist/worktree/identity.js.map +0 -1
  134. package/dist/worktree/parallel.d.ts +0 -87
  135. package/dist/worktree/parallel.js +0 -328
  136. package/dist/worktree/parallel.js.map +0 -1
  137. package/dist/worktree/session.d.ts +0 -67
  138. package/dist/worktree/session.js +0 -194
  139. package/dist/worktree/session.js.map +0 -1
  140. package/dist/worktree/state-merge.d.ts +0 -43
  141. package/dist/worktree/state-merge.js +0 -162
  142. package/dist/worktree/state-merge.js.map +0 -1
@@ -1,79 +0,0 @@
1
- export interface StructureScanResult {
2
- projectName: string;
3
- frameworks: string[];
4
- language: "typescript" | "javascript" | "unknown";
5
- packageManager: "npm" | "yarn" | "pnpm" | "bun" | "unknown";
6
- configFiles: string[];
7
- topLevelDirs: string[];
8
- entryPoints: string[];
9
- }
10
- export interface RouteInfo {
11
- path: string;
12
- file: string;
13
- type: "page" | "api" | "layout" | "component" | "middleware";
14
- }
15
- export interface RoutesScanResult {
16
- framework: string | null;
17
- routeDir: string | null;
18
- routes: RouteInfo[];
19
- components: string[];
20
- }
21
- export interface APIEndpoint {
22
- method: string;
23
- path: string;
24
- file: string;
25
- }
26
- export interface DataModel {
27
- name: string;
28
- file: string;
29
- source: "prisma" | "drizzle" | "mongoose" | "typeorm" | "sql" | "unknown";
30
- }
31
- export interface DataAPIsScanResult {
32
- apiEndpoints: APIEndpoint[];
33
- dataModels: DataModel[];
34
- externalServices: string[];
35
- databaseType: string | null;
36
- }
37
- export interface ScanAllResult {
38
- structure: StructureScanResult;
39
- routes: RoutesScanResult;
40
- dataAPIs: DataAPIsScanResult;
41
- }
42
- export declare function scanStructure(projectDir: string): Promise<StructureScanResult>;
43
- export declare function scanRoutes(projectDir: string): Promise<RoutesScanResult>;
44
- export declare function scanDataAPIs(projectDir: string): Promise<DataAPIsScanResult>;
45
- export declare function scanAll(projectDir: string): Promise<ScanAllResult>;
46
- export interface SpecSessionOptions {
47
- /** Main project directory to scan. */
48
- projectDir: string;
49
- /** Git repo root (defaults to detected from projectDir). */
50
- repoRoot?: string;
51
- /** User name for worktree branch naming (defaults to git config). */
52
- userName?: string;
53
- /** Project slug for worktree naming (e.g. "my-feature"). */
54
- slug?: string;
55
- }
56
- export interface SpecSession {
57
- sessionId: string;
58
- worktreePath: string;
59
- worktreeBranch: string;
60
- scanResult: ScanAllResult;
61
- }
62
- /**
63
- * Start a spec session: create worktree, register session, scan project.
64
- *
65
- * The caller should use `worktreePath` to write PRD files (via
66
- * `writePRDToWorktree`), then call `completeSpecSession` when done.
67
- * The scan runs against `projectDir` (the real codebase), not the worktree.
68
- */
69
- export declare function startSpecSession(options: SpecSessionOptions): Promise<SpecSession>;
70
- /**
71
- * Complete a spec session: commit PRD files in the worktree, merge the
72
- * worktree branch into `targetBranch`, deregister session, and remove
73
- * the worktree.
74
- *
75
- * @param repoRoot - The main repo root directory.
76
- * @param session - The spec session returned by `startSpecSession`.
77
- * @param targetBranch - The branch to merge the PRD files into.
78
- */
79
- export declare function completeSpecSession(repoRoot: string, session: SpecSession, targetBranch: string): void;
@@ -1,566 +0,0 @@
1
- import { readdir, readFile, stat } from "node:fs/promises";
2
- import { execSync } from "node:child_process";
3
- import { join, relative, extname, basename } from "node:path";
4
- import { createWorktree, removeWorktree, getRepoRoot } from "../worktree/manager.js";
5
- import { registerSession, deregisterSession, updateSessionStatus } from "../worktree/session.js";
6
- import { getCurrentUser } from "../worktree/identity.js";
7
- // ── Helpers ────────────────────────────────────────────────────────────────
8
- const IGNORE_DIRS = new Set([
9
- "node_modules", ".git", "dist", "build", ".next", ".nuxt",
10
- ".svelte-kit", ".output", "coverage", ".turbo", ".cache",
11
- ]);
12
- async function exists(p) {
13
- try {
14
- await stat(p);
15
- return true;
16
- }
17
- catch {
18
- return false;
19
- }
20
- }
21
- async function readJson(p) {
22
- try {
23
- const raw = await readFile(p, "utf-8");
24
- return JSON.parse(raw);
25
- }
26
- catch {
27
- return null;
28
- }
29
- }
30
- async function walkDir(dir, base, maxDepth, depth = 0) {
31
- if (depth > maxDepth)
32
- return [];
33
- let entries;
34
- try {
35
- const items = await readdir(dir, { withFileTypes: true });
36
- entries = [];
37
- for (const item of items) {
38
- const full = join(dir, item.name);
39
- const rel = relative(base, full);
40
- if (item.isDirectory()) {
41
- if (!IGNORE_DIRS.has(item.name)) {
42
- entries.push(rel + "/");
43
- const sub = await walkDir(full, base, maxDepth, depth + 1);
44
- entries.push(...sub);
45
- }
46
- }
47
- else {
48
- entries.push(rel);
49
- }
50
- }
51
- }
52
- catch {
53
- entries = [];
54
- }
55
- return entries;
56
- }
57
- const CODE_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".vue", ".svelte"]);
58
- function isCodeFile(file) {
59
- return CODE_EXTS.has(extname(file));
60
- }
61
- // ── Structure Scan ─────────────────────────────────────────────────────────
62
- const FRAMEWORK_MARKERS = {
63
- next: "Next.js",
64
- nuxt: "Nuxt",
65
- "react-dom": "React",
66
- vue: "Vue",
67
- svelte: "Svelte",
68
- "@sveltejs/kit": "SvelteKit",
69
- angular: "Angular",
70
- "@angular/core": "Angular",
71
- express: "Express",
72
- fastify: "Fastify",
73
- hono: "Hono",
74
- koa: "Koa",
75
- "react-native": "React Native",
76
- expo: "Expo",
77
- electron: "Electron",
78
- astro: "Astro",
79
- remix: "Remix",
80
- gatsby: "Gatsby",
81
- "@nestjs/core": "NestJS",
82
- };
83
- const CONFIG_FILES = [
84
- "tsconfig.json", "jsconfig.json",
85
- "tailwind.config.ts", "tailwind.config.js", "tailwind.config.mjs",
86
- "postcss.config.js", "postcss.config.mjs",
87
- "vite.config.ts", "vite.config.js",
88
- "next.config.ts", "next.config.js", "next.config.mjs",
89
- "nuxt.config.ts",
90
- "svelte.config.js",
91
- "astro.config.mjs",
92
- ".env", ".env.local", ".env.example",
93
- "docker-compose.yml", "Dockerfile",
94
- ".eslintrc.json", ".eslintrc.js", "eslint.config.js", "eslint.config.mjs",
95
- "biome.json", "biome.jsonc",
96
- "vitest.config.ts", "jest.config.ts", "jest.config.js",
97
- "playwright.config.ts",
98
- ".prettierrc", ".prettierrc.json",
99
- "drizzle.config.ts", "prisma/schema.prisma",
100
- ];
101
- const ENTRY_CANDIDATES = [
102
- "src/index.ts", "src/index.tsx", "src/main.ts", "src/main.tsx",
103
- "src/app.ts", "src/app.tsx", "src/server.ts",
104
- "index.ts", "index.js", "app.ts", "server.ts",
105
- "src/index.js", "src/main.js", "src/app.js",
106
- ];
107
- export async function scanStructure(projectDir) {
108
- const pkg = await readJson(join(projectDir, "package.json"));
109
- // Project name
110
- const projectName = pkg?.name || basename(projectDir);
111
- // Detect frameworks from dependencies
112
- const allDeps = {
113
- ...(typeof pkg?.dependencies === "object" ? pkg.dependencies : {}),
114
- ...(typeof pkg?.devDependencies === "object" ? pkg.devDependencies : {}),
115
- };
116
- const frameworks = [];
117
- for (const [dep, label] of Object.entries(FRAMEWORK_MARKERS)) {
118
- if (dep in allDeps) {
119
- frameworks.push(label);
120
- }
121
- }
122
- // Deduplicate (e.g. React appears via react-dom and next)
123
- const uniqueFrameworks = [...new Set(frameworks)];
124
- // Language
125
- const hasTs = await exists(join(projectDir, "tsconfig.json"));
126
- const language = hasTs
127
- ? "typescript"
128
- : pkg ? "javascript" : "unknown";
129
- // Package manager
130
- let packageManager = "unknown";
131
- if (await exists(join(projectDir, "bun.lockb")) || await exists(join(projectDir, "bun.lock"))) {
132
- packageManager = "bun";
133
- }
134
- else if (await exists(join(projectDir, "pnpm-lock.yaml"))) {
135
- packageManager = "pnpm";
136
- }
137
- else if (await exists(join(projectDir, "yarn.lock"))) {
138
- packageManager = "yarn";
139
- }
140
- else if (await exists(join(projectDir, "package-lock.json"))) {
141
- packageManager = "npm";
142
- }
143
- // Config files present
144
- const configFiles = [];
145
- for (const cf of CONFIG_FILES) {
146
- if (await exists(join(projectDir, cf))) {
147
- configFiles.push(cf);
148
- }
149
- }
150
- // Top-level directories
151
- const topLevelDirs = [];
152
- try {
153
- const items = await readdir(projectDir, { withFileTypes: true });
154
- for (const item of items) {
155
- if (item.isDirectory() && !IGNORE_DIRS.has(item.name) && !item.name.startsWith(".")) {
156
- topLevelDirs.push(item.name);
157
- }
158
- }
159
- }
160
- catch { /* empty */ }
161
- // Entry points
162
- const entryPoints = [];
163
- for (const ep of ENTRY_CANDIDATES) {
164
- if (await exists(join(projectDir, ep))) {
165
- entryPoints.push(ep);
166
- }
167
- }
168
- return {
169
- projectName,
170
- frameworks: uniqueFrameworks,
171
- language,
172
- packageManager,
173
- configFiles,
174
- topLevelDirs,
175
- entryPoints,
176
- };
177
- }
178
- // ── Routes / UI Scan ───────────────────────────────────────────────────────
179
- const ROUTE_DIRS = [
180
- { dir: "app", framework: "Next.js (App Router)" },
181
- { dir: "pages", framework: "Next.js (Pages Router)" },
182
- { dir: "src/app", framework: "Next.js (App Router)" },
183
- { dir: "src/pages", framework: "Next.js (Pages Router)" },
184
- { dir: "src/routes", framework: "SvelteKit/Remix" },
185
- { dir: "routes", framework: "Remix" },
186
- { dir: "src/views", framework: "Vue" },
187
- { dir: "src/screens", framework: "React Native" },
188
- ];
189
- const COMPONENT_DIRS = [
190
- "src/components", "components", "src/ui", "ui",
191
- "src/features", "src/modules",
192
- ];
193
- function classifyRouteFile(filePath) {
194
- const name = basename(filePath).toLowerCase();
195
- if (name.startsWith("layout"))
196
- return "layout";
197
- if (name.startsWith("middleware") || name === "_middleware.ts" || name === "_middleware.js")
198
- return "middleware";
199
- if (filePath.includes("/api/") || filePath.includes("\\api\\"))
200
- return "api";
201
- return "page";
202
- }
203
- function fileToRoutePath(file, routeDir) {
204
- let route = file
205
- .replace(routeDir, "")
206
- .replace(/\\/g, "/");
207
- // Strip file extension
208
- route = route.replace(/\.(ts|tsx|js|jsx|vue|svelte)$/, "");
209
- // Strip index suffix
210
- route = route.replace(/\/index$/, "") || "/";
211
- // Strip Next.js page.tsx pattern
212
- route = route.replace(/\/page$/, "") || "/";
213
- return route;
214
- }
215
- export async function scanRoutes(projectDir) {
216
- let framework = null;
217
- let routeDir = null;
218
- const routes = [];
219
- // Find the route directory
220
- for (const candidate of ROUTE_DIRS) {
221
- const fullPath = join(projectDir, candidate.dir);
222
- if (await exists(fullPath)) {
223
- framework = candidate.framework;
224
- routeDir = candidate.dir;
225
- break;
226
- }
227
- }
228
- // Scan routes if found
229
- if (routeDir) {
230
- const fullRouteDir = join(projectDir, routeDir);
231
- const files = await walkDir(fullRouteDir, fullRouteDir, 5);
232
- for (const file of files) {
233
- if (file.endsWith("/"))
234
- continue; // skip directories
235
- if (!isCodeFile(file))
236
- continue;
237
- const name = basename(file).toLowerCase();
238
- // Skip test files and non-route utilities
239
- if (name.includes(".test.") || name.includes(".spec.") || name.startsWith("_"))
240
- continue;
241
- const type = classifyRouteFile(file);
242
- routes.push({
243
- path: fileToRoutePath(file, ""),
244
- file: join(routeDir, file),
245
- type,
246
- });
247
- }
248
- }
249
- // Scan component directories
250
- const components = [];
251
- for (const compDir of COMPONENT_DIRS) {
252
- const fullPath = join(projectDir, compDir);
253
- if (!(await exists(fullPath)))
254
- continue;
255
- const files = await walkDir(fullPath, fullPath, 3);
256
- for (const file of files) {
257
- if (file.endsWith("/"))
258
- continue;
259
- if (!isCodeFile(file))
260
- continue;
261
- const name = basename(file).toLowerCase();
262
- if (name.includes(".test.") || name.includes(".spec."))
263
- continue;
264
- components.push(join(compDir, file));
265
- }
266
- }
267
- return { framework, routeDir, routes, components };
268
- }
269
- // ── Data / APIs Scan ───────────────────────────────────────────────────────
270
- const API_DIRS = [
271
- "src/api", "api", "src/server", "server",
272
- "src/controllers", "controllers",
273
- "src/handlers", "handlers",
274
- "app/api", "pages/api", "src/app/api", "src/pages/api",
275
- ];
276
- const HTTP_METHOD_RE = /\.(get|post|put|patch|delete|all)\s*\(/gi;
277
- const ROUTE_STRING_RE = /['"`](\/[a-zA-Z0-9/:_\-.*[\]{}]*?)['"`]/g;
278
- async function extractAPIEndpoints(projectDir, filePath) {
279
- const endpoints = [];
280
- try {
281
- const content = await readFile(join(projectDir, filePath), "utf-8");
282
- // Check for HTTP method patterns (Express/Hono/Fastify style)
283
- let match;
284
- const methodRe = new RegExp(HTTP_METHOD_RE.source, "gi");
285
- while ((match = methodRe.exec(content)) !== null) {
286
- const method = match[1].toUpperCase();
287
- // Try to find route string near this match
288
- const nearby = content.slice(Math.max(0, match.index - 100), match.index + 200);
289
- const routeMatch = ROUTE_STRING_RE.exec(nearby);
290
- ROUTE_STRING_RE.lastIndex = 0;
291
- endpoints.push({
292
- method,
293
- path: routeMatch ? routeMatch[1] : "(dynamic)",
294
- file: filePath,
295
- });
296
- }
297
- // Next.js API route convention: file path IS the route
298
- if (filePath.includes("/api/")) {
299
- const routePath = "/" + filePath
300
- .replace(/.*\/api\//, "api/")
301
- .replace(/\.(ts|tsx|js|jsx)$/, "")
302
- .replace(/\/route$/, "")
303
- .replace(/\/index$/, "");
304
- // Check for exported HTTP methods (Next.js App Router)
305
- const exportedMethods = ["GET", "POST", "PUT", "PATCH", "DELETE"];
306
- for (const m of exportedMethods) {
307
- if (content.includes(`export function ${m}`) || content.includes(`export async function ${m}`)) {
308
- endpoints.push({ method: m, path: routePath, file: filePath });
309
- }
310
- }
311
- // If no explicit methods found, add a generic entry
312
- if (endpoints.filter(e => e.file === filePath).length === 0) {
313
- endpoints.push({ method: "ANY", path: routePath, file: filePath });
314
- }
315
- }
316
- }
317
- catch { /* unreadable file */ }
318
- return endpoints;
319
- }
320
- const PRISMA_MODEL_RE = /^model\s+(\w+)/gm;
321
- const DRIZZLE_TABLE_RE = /export\s+const\s+(\w+)\s*=\s*(?:pgTable|mysqlTable|sqliteTable)\(/g;
322
- const MONGOOSE_MODEL_RE = /mongoose\.model\s*[<(]\s*['"`]?(\w+)/g;
323
- async function extractDataModels(projectDir) {
324
- const models = [];
325
- // Prisma
326
- const prismaPath = join(projectDir, "prisma/schema.prisma");
327
- try {
328
- const content = await readFile(prismaPath, "utf-8");
329
- let match;
330
- const re = new RegExp(PRISMA_MODEL_RE.source, "gm");
331
- while ((match = re.exec(content)) !== null) {
332
- models.push({ name: match[1], file: "prisma/schema.prisma", source: "prisma" });
333
- }
334
- }
335
- catch { /* no prisma */ }
336
- // Drizzle — look for schema files
337
- const drizzleCandidates = [
338
- "src/db/schema.ts", "src/schema.ts", "drizzle/schema.ts",
339
- "src/db/schema/index.ts", "src/lib/db/schema.ts",
340
- ];
341
- for (const candidate of drizzleCandidates) {
342
- try {
343
- const content = await readFile(join(projectDir, candidate), "utf-8");
344
- let match;
345
- const re = new RegExp(DRIZZLE_TABLE_RE.source, "g");
346
- while ((match = re.exec(content)) !== null) {
347
- models.push({ name: match[1], file: candidate, source: "drizzle" });
348
- }
349
- }
350
- catch { /* not found */ }
351
- }
352
- // Mongoose — look for model files
353
- const mongooseDirs = ["src/models", "models", "src/db/models"];
354
- for (const dir of mongooseDirs) {
355
- try {
356
- const files = await readdir(join(projectDir, dir));
357
- for (const file of files) {
358
- if (!isCodeFile(file))
359
- continue;
360
- const content = await readFile(join(projectDir, dir, file), "utf-8");
361
- let match;
362
- const re = new RegExp(MONGOOSE_MODEL_RE.source, "g");
363
- while ((match = re.exec(content)) !== null) {
364
- models.push({ name: match[1], file: join(dir, file), source: "mongoose" });
365
- }
366
- }
367
- }
368
- catch { /* not found */ }
369
- }
370
- return models;
371
- }
372
- const EXTERNAL_SERVICE_MARKERS = {
373
- stripe: "Stripe",
374
- "@stripe/stripe-js": "Stripe",
375
- "@supabase/supabase-js": "Supabase",
376
- firebase: "Firebase",
377
- "firebase-admin": "Firebase Admin",
378
- "@aws-sdk": "AWS",
379
- "@azure": "Azure",
380
- "@google-cloud": "Google Cloud",
381
- "@sendgrid/mail": "SendGrid",
382
- resend: "Resend",
383
- "@clerk/nextjs": "Clerk Auth",
384
- "@auth/core": "Auth.js",
385
- "next-auth": "NextAuth",
386
- "@lucia-auth/core": "Lucia Auth",
387
- "@upstash/redis": "Upstash Redis",
388
- ioredis: "Redis",
389
- "@sentry/node": "Sentry",
390
- posthog: "PostHog",
391
- "@vercel/analytics": "Vercel Analytics",
392
- openai: "OpenAI",
393
- "@anthropic-ai/sdk": "Anthropic",
394
- "@pinecone-database/pinecone": "Pinecone",
395
- "@linear/sdk": "Linear",
396
- };
397
- const DB_TYPE_MARKERS = {
398
- "@prisma/client": "PostgreSQL (Prisma)",
399
- pg: "PostgreSQL",
400
- mysql2: "MySQL",
401
- "better-sqlite3": "SQLite",
402
- "@libsql/client": "SQLite (Turso)",
403
- mongoose: "MongoDB",
404
- mongodb: "MongoDB",
405
- "@neondatabase/serverless": "PostgreSQL (Neon)",
406
- "@planetscale/database": "MySQL (PlanetScale)",
407
- };
408
- export async function scanDataAPIs(projectDir) {
409
- const pkg = await readJson(join(projectDir, "package.json"));
410
- const allDeps = {
411
- ...(typeof pkg?.dependencies === "object" ? pkg.dependencies : {}),
412
- ...(typeof pkg?.devDependencies === "object" ? pkg.devDependencies : {}),
413
- };
414
- // External services
415
- const externalServices = [];
416
- for (const [dep, label] of Object.entries(EXTERNAL_SERVICE_MARKERS)) {
417
- const found = dep.startsWith("@")
418
- ? Object.keys(allDeps).some(d => d.startsWith(dep))
419
- : dep in allDeps;
420
- if (found) {
421
- externalServices.push(label);
422
- }
423
- }
424
- // Database type
425
- let databaseType = null;
426
- for (const [dep, label] of Object.entries(DB_TYPE_MARKERS)) {
427
- if (dep in allDeps) {
428
- databaseType = label;
429
- break;
430
- }
431
- }
432
- // API endpoints
433
- const apiEndpoints = [];
434
- for (const apiDir of API_DIRS) {
435
- const fullPath = join(projectDir, apiDir);
436
- if (!(await exists(fullPath)))
437
- continue;
438
- const files = await walkDir(fullPath, fullPath, 4);
439
- for (const file of files) {
440
- if (file.endsWith("/"))
441
- continue;
442
- if (!isCodeFile(file))
443
- continue;
444
- const name = basename(file).toLowerCase();
445
- if (name.includes(".test.") || name.includes(".spec."))
446
- continue;
447
- const eps = await extractAPIEndpoints(projectDir, join(apiDir, file));
448
- apiEndpoints.push(...eps);
449
- }
450
- }
451
- // Also check for standalone server files
452
- const serverFiles = ["src/server.ts", "server.ts", "src/app.ts", "app.ts", "src/index.ts"];
453
- for (const sf of serverFiles) {
454
- if (await exists(join(projectDir, sf))) {
455
- const eps = await extractAPIEndpoints(projectDir, sf);
456
- apiEndpoints.push(...eps);
457
- }
458
- }
459
- // Data models
460
- const dataModels = await extractDataModels(projectDir);
461
- return {
462
- apiEndpoints,
463
- dataModels,
464
- externalServices: [...new Set(externalServices)],
465
- databaseType,
466
- };
467
- }
468
- // ── Combined Scan ──────────────────────────────────────────────────────────
469
- export async function scanAll(projectDir) {
470
- const [structure, routes, dataAPIs] = await Promise.all([
471
- scanStructure(projectDir),
472
- scanRoutes(projectDir),
473
- scanDataAPIs(projectDir),
474
- ]);
475
- return { structure, routes, dataAPIs };
476
- }
477
- /**
478
- * Start a spec session: create worktree, register session, scan project.
479
- *
480
- * The caller should use `worktreePath` to write PRD files (via
481
- * `writePRDToWorktree`), then call `completeSpecSession` when done.
482
- * The scan runs against `projectDir` (the real codebase), not the worktree.
483
- */
484
- export async function startSpecSession(options) {
485
- const repoRoot = options.repoRoot ?? getRepoRoot(options.projectDir);
486
- const user = getCurrentUser(repoRoot);
487
- const userName = options.userName ?? user.name;
488
- const slug = options.slug ?? "spec";
489
- const branchName = `forge/${userName}/spec-${slug}`;
490
- // 1. Create a worktree for isolation
491
- const wt = createWorktree(repoRoot, `spec-${slug}`, userName, {
492
- branchName,
493
- });
494
- // 2. Register the session
495
- const session = registerSession(repoRoot, {
496
- user,
497
- skill: "spec",
498
- branch: wt.branch,
499
- worktreePath: wt.worktreePath,
500
- });
501
- // 3. Scan the main project directory (not the worktree)
502
- let scanResult;
503
- try {
504
- scanResult = await scanAll(options.projectDir);
505
- }
506
- catch (err) {
507
- // Cleanup on scan failure
508
- deregisterSession(repoRoot, session.id);
509
- removeWorktree(repoRoot, wt.worktreePath);
510
- throw err;
511
- }
512
- return {
513
- sessionId: session.id,
514
- worktreePath: wt.worktreePath,
515
- worktreeBranch: wt.branch,
516
- scanResult,
517
- };
518
- }
519
- /**
520
- * Complete a spec session: commit PRD files in the worktree, merge the
521
- * worktree branch into `targetBranch`, deregister session, and remove
522
- * the worktree.
523
- *
524
- * @param repoRoot - The main repo root directory.
525
- * @param session - The spec session returned by `startSpecSession`.
526
- * @param targetBranch - The branch to merge the PRD files into.
527
- */
528
- export function completeSpecSession(repoRoot, session, targetBranch) {
529
- try {
530
- // Mark session as completing
531
- updateSessionStatus(repoRoot, session.sessionId, "completing");
532
- // 1. Stage and commit all new/changed files in the worktree
533
- try {
534
- execSync("git add -A", {
535
- cwd: session.worktreePath,
536
- encoding: "utf-8",
537
- stdio: "pipe",
538
- });
539
- execSync('git commit -m "spec: add PRD from spec session"', {
540
- cwd: session.worktreePath,
541
- encoding: "utf-8",
542
- stdio: "pipe",
543
- });
544
- }
545
- catch {
546
- // No changes to commit — that's fine, the worktree may be empty
547
- }
548
- // 2. Checkout the target branch, then merge the worktree branch into it
549
- execSync(`git checkout ${targetBranch}`, {
550
- cwd: repoRoot,
551
- encoding: "utf-8",
552
- stdio: "pipe",
553
- });
554
- execSync(`git merge --no-edit ${session.worktreeBranch}`, {
555
- cwd: repoRoot,
556
- encoding: "utf-8",
557
- stdio: "pipe",
558
- });
559
- }
560
- finally {
561
- // 3. Always clean up: deregister + remove worktree
562
- deregisterSession(repoRoot, session.sessionId);
563
- removeWorktree(repoRoot, session.worktreePath);
564
- }
565
- }
566
- //# sourceMappingURL=scanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/spec/scanner.ts"],"names":[],"mappings":"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"}