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.
- package/package.json +3 -2
- package/dist/gates/codex-gate.d.ts +0 -51
- package/dist/gates/codex-gate.js +0 -121
- package/dist/gates/codex-gate.js.map +0 -1
- package/dist/gates/prd-gate.d.ts +0 -7
- package/dist/gates/prd-gate.js +0 -193
- package/dist/gates/prd-gate.js.map +0 -1
- package/dist/gates/remediation.d.ts +0 -46
- package/dist/gates/remediation.js +0 -423
- package/dist/gates/remediation.js.map +0 -1
- package/dist/gates/review-gate.d.ts +0 -16
- package/dist/gates/review-gate.js +0 -479
- package/dist/gates/review-gate.js.map +0 -1
- package/dist/gates/runtime-gate.d.ts +0 -5
- package/dist/gates/runtime-gate.js +0 -99
- package/dist/gates/runtime-gate.js.map +0 -1
- package/dist/gates/test-analysis.d.ts +0 -21
- package/dist/gates/test-analysis.js +0 -394
- package/dist/gates/test-analysis.js.map +0 -1
- package/dist/gates/visual-capture.d.ts +0 -24
- package/dist/gates/visual-capture.js +0 -144
- package/dist/gates/visual-capture.js.map +0 -1
- package/dist/gates/visual-gate.d.ts +0 -18
- package/dist/gates/visual-gate.js +0 -234
- package/dist/gates/visual-gate.js.map +0 -1
- package/dist/gates/visual-reviewer.d.ts +0 -11
- package/dist/gates/visual-reviewer.js +0 -211
- package/dist/gates/visual-reviewer.js.map +0 -1
- package/dist/go/auto-chain.d.ts +0 -136
- package/dist/go/auto-chain.js +0 -389
- package/dist/go/auto-chain.js.map +0 -1
- package/dist/go/executor.d.ts +0 -137
- package/dist/go/executor.js +0 -447
- package/dist/go/executor.js.map +0 -1
- package/dist/go/finalize.d.ts +0 -108
- package/dist/go/finalize.js +0 -331
- package/dist/go/finalize.js.map +0 -1
- package/dist/go/linear-sync-cli.d.ts +0 -55
- package/dist/go/linear-sync-cli.js +0 -192
- package/dist/go/linear-sync-cli.js.map +0 -1
- package/dist/go/linear-sync.d.ts +0 -112
- package/dist/go/linear-sync.js +0 -375
- package/dist/go/linear-sync.js.map +0 -1
- package/dist/go/prd-queue.d.ts +0 -43
- package/dist/go/prd-queue.js +0 -67
- package/dist/go/prd-queue.js.map +0 -1
- package/dist/go/prd-selector.d.ts +0 -57
- package/dist/go/prd-selector.js +0 -101
- package/dist/go/prd-selector.js.map +0 -1
- package/dist/go/verify-loop.d.ts +0 -64
- package/dist/go/verify-loop.js +0 -327
- package/dist/go/verify-loop.js.map +0 -1
- package/dist/hooks/pre-commit.d.ts +0 -5
- package/dist/hooks/pre-commit.js +0 -75
- package/dist/hooks/pre-commit.js.map +0 -1
- package/dist/linear/issues.d.ts +0 -22
- package/dist/linear/issues.js +0 -51
- package/dist/linear/issues.js.map +0 -1
- package/dist/linear/milestones.d.ts +0 -11
- package/dist/linear/milestones.js +0 -32
- package/dist/linear/milestones.js.map +0 -1
- package/dist/linear/projects.d.ts +0 -16
- package/dist/linear/projects.js +0 -51
- package/dist/linear/projects.js.map +0 -1
- package/dist/reporter/human.d.ts +0 -7
- package/dist/reporter/human.js +0 -93
- package/dist/reporter/human.js.map +0 -1
- package/dist/reporter/json.d.ts +0 -2
- package/dist/reporter/json.js +0 -4
- package/dist/reporter/json.js.map +0 -1
- package/dist/setup/structural-templates.d.ts +0 -12
- package/dist/setup/structural-templates.js +0 -288
- package/dist/setup/structural-templates.js.map +0 -1
- package/dist/setup/templates.d.ts +0 -17
- package/dist/setup/templates.js +0 -109
- package/dist/setup/templates.js.map +0 -1
- package/dist/setup/test-planner.d.ts +0 -38
- package/dist/setup/test-planner.js +0 -91
- package/dist/setup/test-planner.js.map +0 -1
- package/dist/setup/test-scaffold.d.ts +0 -31
- package/dist/setup/test-scaffold.js +0 -209
- package/dist/setup/test-scaffold.js.map +0 -1
- package/dist/setup/test-templates.d.ts +0 -37
- package/dist/setup/test-templates.js +0 -313
- package/dist/setup/test-templates.js.map +0 -1
- package/dist/spec/generator.d.ts +0 -34
- package/dist/spec/generator.js +0 -227
- package/dist/spec/generator.js.map +0 -1
- package/dist/spec/interview.d.ts +0 -142
- package/dist/spec/interview.js +0 -287
- package/dist/spec/interview.js.map +0 -1
- package/dist/spec/linear-sync.d.ts +0 -48
- package/dist/spec/linear-sync.js +0 -125
- package/dist/spec/linear-sync.js.map +0 -1
- package/dist/spec/scanner.d.ts +0 -79
- package/dist/spec/scanner.js +0 -566
- package/dist/spec/scanner.js.map +0 -1
- package/dist/spec/templates.d.ts +0 -375
- package/dist/spec/templates.js +0 -95
- package/dist/spec/templates.js.map +0 -1
- package/dist/state/prd-status.d.ts +0 -62
- package/dist/state/prd-status.js +0 -122
- package/dist/state/prd-status.js.map +0 -1
- package/dist/state/reader.d.ts +0 -7
- package/dist/state/reader.js +0 -43
- package/dist/state/reader.js.map +0 -1
- package/dist/state/writer.d.ts +0 -21
- package/dist/state/writer.js +0 -106
- package/dist/state/writer.js.map +0 -1
- package/dist/team/consensus.d.ts +0 -28
- package/dist/team/consensus.js +0 -130
- package/dist/team/consensus.js.map +0 -1
- package/dist/team/index.d.ts +0 -4
- package/dist/team/index.js +0 -5
- package/dist/team/index.js.map +0 -1
- package/dist/team/lifecycle.d.ts +0 -37
- package/dist/team/lifecycle.js +0 -92
- package/dist/team/lifecycle.js.map +0 -1
- package/dist/team/reviewer.d.ts +0 -10
- package/dist/team/reviewer.js +0 -345
- package/dist/team/reviewer.js.map +0 -1
- package/dist/team/types.d.ts +0 -269
- package/dist/team/types.js +0 -70
- package/dist/team/types.js.map +0 -1
- package/dist/utils/browser.d.ts +0 -10
- package/dist/utils/browser.js +0 -96
- package/dist/utils/browser.js.map +0 -1
- package/dist/utils/platform.d.ts +0 -29
- package/dist/utils/platform.js +0 -90
- package/dist/utils/platform.js.map +0 -1
- package/dist/worktree/identity.d.ts +0 -9
- package/dist/worktree/identity.js +0 -32
- package/dist/worktree/identity.js.map +0 -1
- package/dist/worktree/parallel.d.ts +0 -87
- package/dist/worktree/parallel.js +0 -328
- package/dist/worktree/parallel.js.map +0 -1
- package/dist/worktree/session.d.ts +0 -67
- package/dist/worktree/session.js +0 -194
- package/dist/worktree/session.js.map +0 -1
- package/dist/worktree/state-merge.d.ts +0 -43
- package/dist/worktree/state-merge.js +0 -162
- package/dist/worktree/state-merge.js.map +0 -1
package/dist/spec/scanner.d.ts
DELETED
|
@@ -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;
|
package/dist/spec/scanner.js
DELETED
|
@@ -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
|
package/dist/spec/scanner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/spec/scanner.ts"],"names":[],"mappings":"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"}
|