popeye-cli 1.10.0 → 2.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/CHANGELOG.md +114 -0
- package/CONTRIBUTING.md +38 -3
- package/README.md +104 -18
- package/dist/adapters/gemini.js +3 -3
- package/dist/adapters/openai.js +2 -2
- package/dist/adapters/openai.js.map +1 -1
- package/dist/auth/gemini.js +1 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +11 -5
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +9 -1
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +29 -3
- package/dist/cli/interactive.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +7 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +1 -7
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/popeye-md.d.ts +32 -0
- package/dist/config/popeye-md.d.ts.map +1 -0
- package/dist/config/popeye-md.js +111 -0
- package/dist/config/popeye-md.js.map +1 -0
- package/dist/config/schema.d.ts +3 -21
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +21 -8
- package/dist/config/schema.js.map +1 -1
- package/dist/pipeline/artifact-manager.d.ts +47 -0
- package/dist/pipeline/artifact-manager.d.ts.map +1 -0
- package/dist/pipeline/artifact-manager.js +251 -0
- package/dist/pipeline/artifact-manager.js.map +1 -0
- package/dist/pipeline/artifact-validators.d.ts +29 -0
- package/dist/pipeline/artifact-validators.d.ts.map +1 -0
- package/dist/pipeline/artifact-validators.js +173 -0
- package/dist/pipeline/artifact-validators.js.map +1 -0
- package/dist/pipeline/bridges/review-bridge.d.ts +70 -0
- package/dist/pipeline/bridges/review-bridge.d.ts.map +1 -0
- package/dist/pipeline/bridges/review-bridge.js +266 -0
- package/dist/pipeline/bridges/review-bridge.js.map +1 -0
- package/dist/pipeline/change-request.d.ts +47 -0
- package/dist/pipeline/change-request.d.ts.map +1 -0
- package/dist/pipeline/change-request.js +91 -0
- package/dist/pipeline/change-request.js.map +1 -0
- package/dist/pipeline/check-runner.d.ts +47 -0
- package/dist/pipeline/check-runner.d.ts.map +1 -0
- package/dist/pipeline/check-runner.js +417 -0
- package/dist/pipeline/check-runner.js.map +1 -0
- package/dist/pipeline/command-resolver.d.ts +9 -0
- package/dist/pipeline/command-resolver.d.ts.map +1 -0
- package/dist/pipeline/command-resolver.js +140 -0
- package/dist/pipeline/command-resolver.js.map +1 -0
- package/dist/pipeline/consensus/consensus-runner.d.ts +44 -0
- package/dist/pipeline/consensus/consensus-runner.d.ts.map +1 -0
- package/dist/pipeline/consensus/consensus-runner.js +212 -0
- package/dist/pipeline/consensus/consensus-runner.js.map +1 -0
- package/dist/pipeline/constitution.d.ts +45 -0
- package/dist/pipeline/constitution.d.ts.map +1 -0
- package/dist/pipeline/constitution.js +82 -0
- package/dist/pipeline/constitution.js.map +1 -0
- package/dist/pipeline/gate-engine.d.ts +55 -0
- package/dist/pipeline/gate-engine.d.ts.map +1 -0
- package/dist/pipeline/gate-engine.js +270 -0
- package/dist/pipeline/gate-engine.js.map +1 -0
- package/dist/pipeline/index.d.ts +26 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +35 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/migration.d.ts +15 -0
- package/dist/pipeline/migration.d.ts.map +1 -0
- package/dist/pipeline/migration.js +76 -0
- package/dist/pipeline/migration.js.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +30 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.js +242 -0
- package/dist/pipeline/orchestrator.js.map +1 -0
- package/dist/pipeline/packets/audit-report-builder.d.ts +11 -0
- package/dist/pipeline/packets/audit-report-builder.d.ts.map +1 -0
- package/dist/pipeline/packets/audit-report-builder.js +32 -0
- package/dist/pipeline/packets/audit-report-builder.js.map +1 -0
- package/dist/pipeline/packets/consensus-packet-builder.d.ts +35 -0
- package/dist/pipeline/packets/consensus-packet-builder.d.ts.map +1 -0
- package/dist/pipeline/packets/consensus-packet-builder.js +80 -0
- package/dist/pipeline/packets/consensus-packet-builder.js.map +1 -0
- package/dist/pipeline/packets/index.d.ts +12 -0
- package/dist/pipeline/packets/index.d.ts.map +1 -0
- package/dist/pipeline/packets/index.js +8 -0
- package/dist/pipeline/packets/index.js.map +1 -0
- package/dist/pipeline/packets/plan-packet-builder.d.ts +21 -0
- package/dist/pipeline/packets/plan-packet-builder.d.ts.map +1 -0
- package/dist/pipeline/packets/plan-packet-builder.js +27 -0
- package/dist/pipeline/packets/plan-packet-builder.js.map +1 -0
- package/dist/pipeline/packets/rca-packet-builder.d.ts +19 -0
- package/dist/pipeline/packets/rca-packet-builder.d.ts.map +1 -0
- package/dist/pipeline/packets/rca-packet-builder.js +22 -0
- package/dist/pipeline/packets/rca-packet-builder.js.map +1 -0
- package/dist/pipeline/phases/architecture.d.ts +7 -0
- package/dist/pipeline/phases/architecture.d.ts.map +1 -0
- package/dist/pipeline/phases/architecture.js +60 -0
- package/dist/pipeline/phases/architecture.js.map +1 -0
- package/dist/pipeline/phases/audit.d.ts +8 -0
- package/dist/pipeline/phases/audit.d.ts.map +1 -0
- package/dist/pipeline/phases/audit.js +144 -0
- package/dist/pipeline/phases/audit.js.map +1 -0
- package/dist/pipeline/phases/consensus-architecture.d.ts +7 -0
- package/dist/pipeline/phases/consensus-architecture.d.ts.map +1 -0
- package/dist/pipeline/phases/consensus-architecture.js +84 -0
- package/dist/pipeline/phases/consensus-architecture.js.map +1 -0
- package/dist/pipeline/phases/consensus-master-plan.d.ts +7 -0
- package/dist/pipeline/phases/consensus-master-plan.d.ts.map +1 -0
- package/dist/pipeline/phases/consensus-master-plan.js +81 -0
- package/dist/pipeline/phases/consensus-master-plan.js.map +1 -0
- package/dist/pipeline/phases/consensus-role-plans.d.ts +7 -0
- package/dist/pipeline/phases/consensus-role-plans.d.ts.map +1 -0
- package/dist/pipeline/phases/consensus-role-plans.js +85 -0
- package/dist/pipeline/phases/consensus-role-plans.js.map +1 -0
- package/dist/pipeline/phases/done.d.ts +7 -0
- package/dist/pipeline/phases/done.d.ts.map +1 -0
- package/dist/pipeline/phases/done.js +45 -0
- package/dist/pipeline/phases/done.js.map +1 -0
- package/dist/pipeline/phases/implementation.d.ts +8 -0
- package/dist/pipeline/phases/implementation.d.ts.map +1 -0
- package/dist/pipeline/phases/implementation.js +45 -0
- package/dist/pipeline/phases/implementation.js.map +1 -0
- package/dist/pipeline/phases/index.d.ts +20 -0
- package/dist/pipeline/phases/index.d.ts.map +1 -0
- package/dist/pipeline/phases/index.js +19 -0
- package/dist/pipeline/phases/index.js.map +1 -0
- package/dist/pipeline/phases/intake.d.ts +8 -0
- package/dist/pipeline/phases/intake.d.ts.map +1 -0
- package/dist/pipeline/phases/intake.js +49 -0
- package/dist/pipeline/phases/intake.js.map +1 -0
- package/dist/pipeline/phases/phase-context.d.ts +30 -0
- package/dist/pipeline/phases/phase-context.d.ts.map +1 -0
- package/dist/pipeline/phases/phase-context.js +33 -0
- package/dist/pipeline/phases/phase-context.js.map +1 -0
- package/dist/pipeline/phases/production-gate.d.ts +8 -0
- package/dist/pipeline/phases/production-gate.d.ts.map +1 -0
- package/dist/pipeline/phases/production-gate.js +84 -0
- package/dist/pipeline/phases/production-gate.js.map +1 -0
- package/dist/pipeline/phases/qa-validation.d.ts +7 -0
- package/dist/pipeline/phases/qa-validation.d.ts.map +1 -0
- package/dist/pipeline/phases/qa-validation.js +50 -0
- package/dist/pipeline/phases/qa-validation.js.map +1 -0
- package/dist/pipeline/phases/recovery-loop.d.ts +7 -0
- package/dist/pipeline/phases/recovery-loop.d.ts.map +1 -0
- package/dist/pipeline/phases/recovery-loop.js +93 -0
- package/dist/pipeline/phases/recovery-loop.js.map +1 -0
- package/dist/pipeline/phases/review.d.ts +8 -0
- package/dist/pipeline/phases/review.d.ts.map +1 -0
- package/dist/pipeline/phases/review.js +127 -0
- package/dist/pipeline/phases/review.js.map +1 -0
- package/dist/pipeline/phases/role-planning.d.ts +7 -0
- package/dist/pipeline/phases/role-planning.d.ts.map +1 -0
- package/dist/pipeline/phases/role-planning.js +75 -0
- package/dist/pipeline/phases/role-planning.js.map +1 -0
- package/dist/pipeline/phases/stuck.d.ts +7 -0
- package/dist/pipeline/phases/stuck.d.ts.map +1 -0
- package/dist/pipeline/phases/stuck.js +51 -0
- package/dist/pipeline/phases/stuck.js.map +1 -0
- package/dist/pipeline/repo-snapshot.d.ts +24 -0
- package/dist/pipeline/repo-snapshot.d.ts.map +1 -0
- package/dist/pipeline/repo-snapshot.js +343 -0
- package/dist/pipeline/repo-snapshot.js.map +1 -0
- package/dist/pipeline/role-execution-adapter.d.ts +59 -0
- package/dist/pipeline/role-execution-adapter.d.ts.map +1 -0
- package/dist/pipeline/role-execution-adapter.js +159 -0
- package/dist/pipeline/role-execution-adapter.js.map +1 -0
- package/dist/pipeline/skill-loader.d.ts +34 -0
- package/dist/pipeline/skill-loader.d.ts.map +1 -0
- package/dist/pipeline/skill-loader.js +156 -0
- package/dist/pipeline/skill-loader.js.map +1 -0
- package/dist/pipeline/skills/defaults.d.ts +16 -0
- package/dist/pipeline/skills/defaults.d.ts.map +1 -0
- package/dist/pipeline/skills/defaults.js +189 -0
- package/dist/pipeline/skills/defaults.js.map +1 -0
- package/dist/pipeline/type-defs/artifacts.d.ts +207 -0
- package/dist/pipeline/type-defs/artifacts.d.ts.map +1 -0
- package/dist/pipeline/type-defs/artifacts.js +67 -0
- package/dist/pipeline/type-defs/artifacts.js.map +1 -0
- package/dist/pipeline/type-defs/audit.d.ts +259 -0
- package/dist/pipeline/type-defs/audit.d.ts.map +1 -0
- package/dist/pipeline/type-defs/audit.js +54 -0
- package/dist/pipeline/type-defs/audit.js.map +1 -0
- package/dist/pipeline/type-defs/checks.d.ts +82 -0
- package/dist/pipeline/type-defs/checks.d.ts.map +1 -0
- package/dist/pipeline/type-defs/checks.js +38 -0
- package/dist/pipeline/type-defs/checks.js.map +1 -0
- package/dist/pipeline/type-defs/enums.d.ts +43 -0
- package/dist/pipeline/type-defs/enums.d.ts.map +1 -0
- package/dist/pipeline/type-defs/enums.js +55 -0
- package/dist/pipeline/type-defs/enums.js.map +1 -0
- package/dist/pipeline/type-defs/index.d.ts +12 -0
- package/dist/pipeline/type-defs/index.d.ts.map +1 -0
- package/dist/pipeline/type-defs/index.js +12 -0
- package/dist/pipeline/type-defs/index.js.map +1 -0
- package/dist/pipeline/type-defs/packets.d.ts +821 -0
- package/dist/pipeline/type-defs/packets.d.ts.map +1 -0
- package/dist/pipeline/type-defs/packets.js +109 -0
- package/dist/pipeline/type-defs/packets.js.map +1 -0
- package/dist/pipeline/type-defs/snapshot.d.ts +52 -0
- package/dist/pipeline/type-defs/snapshot.d.ts.map +1 -0
- package/dist/pipeline/type-defs/snapshot.js +35 -0
- package/dist/pipeline/type-defs/snapshot.js.map +1 -0
- package/dist/pipeline/type-defs/state.d.ts +455 -0
- package/dist/pipeline/type-defs/state.d.ts.map +1 -0
- package/dist/pipeline/type-defs/state.js +90 -0
- package/dist/pipeline/type-defs/state.js.map +1 -0
- package/dist/pipeline/types.d.ts +16 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +16 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/types/audit.d.ts +6 -6
- package/dist/types/consensus.d.ts +5 -1
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +15 -4
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/project.d.ts +1 -1
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +39 -10
- package/dist/types/project.js.map +1 -1
- package/dist/types/workflow.d.ts +1 -7
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +1 -1
- package/dist/types/workflow.js.map +1 -1
- package/dist/upgrade/handlers.js +5 -5
- package/dist/upgrade/handlers.js.map +1 -1
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +52 -0
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/website-strategy.js +1 -1
- package/dist/workflow/website-strategy.js.map +1 -1
- package/package.json +1 -1
- package/skills/PHASE_GATE_ENGINE_SPEC.md +113 -20
- package/skills/POPEYE_FULL_AUTONOMY_PIPELINE.md +66 -13
- package/src/adapters/gemini.ts +3 -3
- package/src/adapters/openai.ts +2 -2
- package/src/auth/gemini.ts +1 -1
- package/src/cli/commands/create.ts +12 -6
- package/src/cli/commands/resume.ts +9 -1
- package/src/cli/interactive.ts +32 -3
- package/src/config/defaults.ts +7 -2
- package/src/config/popeye-md.ts +139 -0
- package/src/config/schema.ts +21 -8
- package/src/pipeline/artifact-manager.ts +339 -0
- package/src/pipeline/artifact-validators.ts +224 -0
- package/src/pipeline/bridges/review-bridge.ts +371 -0
- package/src/pipeline/change-request.ts +119 -0
- package/src/pipeline/check-runner.ts +504 -0
- package/src/pipeline/command-resolver.ts +168 -0
- package/src/pipeline/consensus/consensus-runner.ts +317 -0
- package/src/pipeline/constitution.ts +109 -0
- package/src/pipeline/gate-engine.ts +347 -0
- package/src/pipeline/index.ts +82 -0
- package/src/pipeline/migration.ts +91 -0
- package/src/pipeline/orchestrator.ts +322 -0
- package/src/pipeline/packets/audit-report-builder.ts +47 -0
- package/src/pipeline/packets/consensus-packet-builder.ts +112 -0
- package/src/pipeline/packets/index.ts +15 -0
- package/src/pipeline/packets/plan-packet-builder.ts +52 -0
- package/src/pipeline/packets/rca-packet-builder.ts +38 -0
- package/src/pipeline/phases/architecture.ts +73 -0
- package/src/pipeline/phases/audit.ts +193 -0
- package/src/pipeline/phases/consensus-architecture.ts +104 -0
- package/src/pipeline/phases/consensus-master-plan.ts +100 -0
- package/src/pipeline/phases/consensus-role-plans.ts +105 -0
- package/src/pipeline/phases/done.ts +68 -0
- package/src/pipeline/phases/implementation.ts +52 -0
- package/src/pipeline/phases/index.ts +21 -0
- package/src/pipeline/phases/intake.ts +68 -0
- package/src/pipeline/phases/phase-context.ts +86 -0
- package/src/pipeline/phases/production-gate.ts +113 -0
- package/src/pipeline/phases/qa-validation.ts +63 -0
- package/src/pipeline/phases/recovery-loop.ts +120 -0
- package/src/pipeline/phases/review.ts +149 -0
- package/src/pipeline/phases/role-planning.ts +92 -0
- package/src/pipeline/phases/stuck.ts +62 -0
- package/src/pipeline/repo-snapshot.ts +395 -0
- package/src/pipeline/role-execution-adapter.ts +238 -0
- package/src/pipeline/skill-loader.ts +192 -0
- package/src/pipeline/skills/defaults.ts +215 -0
- package/src/pipeline/type-defs/artifacts.ts +82 -0
- package/src/pipeline/type-defs/audit.ts +67 -0
- package/src/pipeline/type-defs/checks.ts +47 -0
- package/src/pipeline/type-defs/enums.ts +62 -0
- package/src/pipeline/type-defs/index.ts +12 -0
- package/src/pipeline/type-defs/packets.ts +131 -0
- package/src/pipeline/type-defs/snapshot.ts +55 -0
- package/src/pipeline/type-defs/state.ts +167 -0
- package/src/pipeline/types.ts +16 -0
- package/src/types/consensus.ts +16 -4
- package/src/types/index.ts +1 -0
- package/src/types/project.ts +39 -10
- package/src/types/workflow.ts +1 -1
- package/src/upgrade/handlers.ts +5 -5
- package/src/workflow/index.ts +52 -0
- package/src/workflow/website-strategy.ts +1 -1
- package/tests/cli/model-command.test.ts +19 -9
- package/tests/config/config.test.ts +3 -3
- package/tests/config/popeye-md.test.ts +168 -0
- package/tests/pipeline/artifact-manager.test.ts +183 -0
- package/tests/pipeline/artifact-validators.test.ts +207 -0
- package/tests/pipeline/bridges/review-bridge.test.ts +243 -0
- package/tests/pipeline/change-request.test.ts +180 -0
- package/tests/pipeline/check-runner.test.ts +157 -0
- package/tests/pipeline/command-resolver.test.ts +159 -0
- package/tests/pipeline/consensus-runner.test.ts +206 -0
- package/tests/pipeline/consensus-scoring.test.ts +163 -0
- package/tests/pipeline/constitution.test.ts +122 -0
- package/tests/pipeline/gate-engine.test.ts +195 -0
- package/tests/pipeline/migration.test.ts +133 -0
- package/tests/pipeline/orchestrator.test.ts +614 -0
- package/tests/pipeline/packets/builders.test.ts +347 -0
- package/tests/pipeline/repo-snapshot.test.ts +189 -0
- package/tests/pipeline/role-execution-adapter.test.ts +299 -0
- package/tests/pipeline/session-guidance.test.ts +205 -0
- package/tests/pipeline/skill-loader.test.ts +186 -0
- package/tests/pipeline/start-env-checks.test.ts +123 -0
- package/tests/pipeline/types.test.ts +156 -0
- package/tests/types/consensus.test.ts +1 -1
- package/tests/workflow/pipeline-bootstrap.test.ts +162 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo Snapshot Generator — deterministic project state capture.
|
|
3
|
+
* Generated before every consensus gate for anti-hallucination.
|
|
4
|
+
* Supports caching via mtime for performance (P2-H).
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
8
|
+
import { join, extname } from 'node:path';
|
|
9
|
+
// ─── Constants ───────────────────────────────────────────
|
|
10
|
+
const EXCLUDE_DIRS = new Set([
|
|
11
|
+
'node_modules', '.git', 'dist', '__pycache__', '.next',
|
|
12
|
+
'.nuxt', 'build', 'coverage', '.turbo', '.cache',
|
|
13
|
+
'.venv', 'venv', 'env',
|
|
14
|
+
]);
|
|
15
|
+
const CONFIG_FILES = new Set([
|
|
16
|
+
'package.json', 'pyproject.toml', 'docker-compose.yml',
|
|
17
|
+
'docker-compose.yaml', 'Dockerfile', 'tsconfig.json',
|
|
18
|
+
'vite.config.ts', 'vite.config.js', 'next.config.js',
|
|
19
|
+
'next.config.mjs', 'next.config.ts', 'webpack.config.js',
|
|
20
|
+
'tailwind.config.ts', 'tailwind.config.js',
|
|
21
|
+
'jest.config.ts', 'jest.config.js', 'vitest.config.ts',
|
|
22
|
+
'vitest.config.js', '.eslintrc.js', '.eslintrc.json',
|
|
23
|
+
'eslint.config.js', 'eslint.config.mjs',
|
|
24
|
+
'prisma/schema.prisma', 'alembic.ini',
|
|
25
|
+
'requirements.txt', 'setup.py', 'setup.cfg',
|
|
26
|
+
'Makefile', 'Procfile',
|
|
27
|
+
]);
|
|
28
|
+
const CODE_EXTENSIONS = new Set([
|
|
29
|
+
'.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs',
|
|
30
|
+
'.java', '.rb', '.php', '.vue', '.svelte', '.astro',
|
|
31
|
+
'.css', '.scss', '.html', '.sql', '.prisma',
|
|
32
|
+
]);
|
|
33
|
+
const lineCache = new Map();
|
|
34
|
+
function countLinesWithCache(filePath) {
|
|
35
|
+
try {
|
|
36
|
+
const stat = statSync(filePath);
|
|
37
|
+
const cached = lineCache.get(filePath);
|
|
38
|
+
if (cached && cached.mtime === stat.mtimeMs) {
|
|
39
|
+
return cached.lines;
|
|
40
|
+
}
|
|
41
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
42
|
+
const lines = content.split('\n').length;
|
|
43
|
+
lineCache.set(filePath, { mtime: stat.mtimeMs, lines });
|
|
44
|
+
return lines;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ─── Snapshot Generation ─────────────────────────────────
|
|
51
|
+
/** Generate a deterministic snapshot of the project */
|
|
52
|
+
export async function generateRepoSnapshot(projectDir) {
|
|
53
|
+
const snapshotId = createHash('sha256')
|
|
54
|
+
.update(`${projectDir}-${Date.now()}`)
|
|
55
|
+
.digest('hex')
|
|
56
|
+
.slice(0, 16);
|
|
57
|
+
const treeSummary = buildTreeSummary(projectDir, '', 3);
|
|
58
|
+
const configFiles = scanConfigFiles(projectDir);
|
|
59
|
+
const languagesDetected = detectLanguages(projectDir);
|
|
60
|
+
const envFiles = findEnvFiles(projectDir);
|
|
61
|
+
const migrationsPresent = detectMigrations(projectDir);
|
|
62
|
+
const portsEntrypoints = detectPorts(configFiles);
|
|
63
|
+
const { totalFiles, totalLines } = countFilesAndLines(projectDir);
|
|
64
|
+
// Extract key info from config files
|
|
65
|
+
const packageManager = detectPackageManager(projectDir, configFiles);
|
|
66
|
+
const scripts = extractScripts(configFiles);
|
|
67
|
+
const testFramework = detectTestFramework(configFiles, scripts);
|
|
68
|
+
const buildTool = detectBuildTool(configFiles, scripts);
|
|
69
|
+
return {
|
|
70
|
+
snapshot_id: snapshotId,
|
|
71
|
+
timestamp: new Date().toISOString(),
|
|
72
|
+
tree_summary: treeSummary,
|
|
73
|
+
config_files: configFiles,
|
|
74
|
+
languages_detected: languagesDetected,
|
|
75
|
+
package_manager: packageManager,
|
|
76
|
+
scripts,
|
|
77
|
+
test_framework: testFramework,
|
|
78
|
+
build_tool: buildTool,
|
|
79
|
+
env_files: envFiles,
|
|
80
|
+
migrations_present: migrationsPresent,
|
|
81
|
+
ports_entrypoints: portsEntrypoints,
|
|
82
|
+
total_files: totalFiles,
|
|
83
|
+
total_lines: totalLines,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Store snapshot as an artifact */
|
|
87
|
+
export function createSnapshotArtifact(snapshot, artifactManager, phase) {
|
|
88
|
+
return artifactManager.createAndStoreJson('repo_snapshot', snapshot, phase);
|
|
89
|
+
}
|
|
90
|
+
/** Compare two snapshots to detect drift */
|
|
91
|
+
export function diffSnapshots(before, after) {
|
|
92
|
+
const addedConfigs = after.config_files
|
|
93
|
+
.filter((c) => !before.config_files.some((b) => b.path === c.path));
|
|
94
|
+
const removedConfigs = before.config_files
|
|
95
|
+
.filter((c) => !after.config_files.some((a) => a.path === c.path));
|
|
96
|
+
const changedConfigs = after.config_files.filter((ac) => {
|
|
97
|
+
const bc = before.config_files.find((b) => b.path === ac.path);
|
|
98
|
+
return bc && bc.content_hash !== ac.content_hash;
|
|
99
|
+
});
|
|
100
|
+
const filesChanged = after.total_files !== before.total_files;
|
|
101
|
+
const linesChanged = after.total_lines !== before.total_lines;
|
|
102
|
+
return {
|
|
103
|
+
added_configs: addedConfigs.map((c) => c.path),
|
|
104
|
+
removed_configs: removedConfigs.map((c) => c.path),
|
|
105
|
+
changed_configs: changedConfigs.map((c) => c.path),
|
|
106
|
+
files_delta: after.total_files - before.total_files,
|
|
107
|
+
lines_delta: after.total_lines - before.total_lines,
|
|
108
|
+
has_changes: filesChanged || linesChanged || changedConfigs.length > 0
|
|
109
|
+
|| addedConfigs.length > 0 || removedConfigs.length > 0,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// ─── Internal Helpers ────────────────────────────────────
|
|
113
|
+
function buildTreeSummary(dir, prefix, maxDepth) {
|
|
114
|
+
if (maxDepth <= 0)
|
|
115
|
+
return '';
|
|
116
|
+
const lines = [];
|
|
117
|
+
try {
|
|
118
|
+
const entries = readdirSync(dir, { withFileTypes: true })
|
|
119
|
+
.filter((e) => !EXCLUDE_DIRS.has(e.name) && !e.name.startsWith('.'));
|
|
120
|
+
for (const entry of entries.slice(0, 50)) {
|
|
121
|
+
const marker = entry.isDirectory() ? '/' : '';
|
|
122
|
+
lines.push(`${prefix}${entry.name}${marker}`);
|
|
123
|
+
if (entry.isDirectory() && maxDepth > 1) {
|
|
124
|
+
const sub = buildTreeSummary(join(dir, entry.name), prefix + ' ', maxDepth - 1);
|
|
125
|
+
if (sub)
|
|
126
|
+
lines.push(sub);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (entries.length > 50) {
|
|
130
|
+
lines.push(`${prefix}... (+${entries.length - 50} more)`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Directory unreadable
|
|
135
|
+
}
|
|
136
|
+
return lines.join('\n');
|
|
137
|
+
}
|
|
138
|
+
function scanConfigFiles(projectDir) {
|
|
139
|
+
const configs = [];
|
|
140
|
+
for (const configName of CONFIG_FILES) {
|
|
141
|
+
const fullPath = join(projectDir, configName);
|
|
142
|
+
if (!existsSync(fullPath))
|
|
143
|
+
continue;
|
|
144
|
+
try {
|
|
145
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
146
|
+
const contentHash = createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
147
|
+
const keyFields = extractKeyFields(configName, content);
|
|
148
|
+
configs.push({
|
|
149
|
+
path: configName,
|
|
150
|
+
type: configName,
|
|
151
|
+
content_hash: contentHash,
|
|
152
|
+
key_fields: keyFields,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Skip unreadable config files
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return configs;
|
|
160
|
+
}
|
|
161
|
+
function extractKeyFields(configName, content) {
|
|
162
|
+
try {
|
|
163
|
+
if (configName === 'package.json') {
|
|
164
|
+
const pkg = JSON.parse(content);
|
|
165
|
+
return {
|
|
166
|
+
name: pkg.name,
|
|
167
|
+
version: pkg.version,
|
|
168
|
+
scripts: pkg.scripts,
|
|
169
|
+
dependencies: pkg.dependencies ? Object.keys(pkg.dependencies) : [],
|
|
170
|
+
devDependencies: pkg.devDependencies ? Object.keys(pkg.devDependencies) : [],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (configName === 'tsconfig.json') {
|
|
174
|
+
const ts = JSON.parse(content);
|
|
175
|
+
return {
|
|
176
|
+
target: ts.compilerOptions?.target,
|
|
177
|
+
module: ts.compilerOptions?.module,
|
|
178
|
+
outDir: ts.compilerOptions?.outDir,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Not JSON parseable, return empty
|
|
184
|
+
}
|
|
185
|
+
return {};
|
|
186
|
+
}
|
|
187
|
+
function detectLanguages(projectDir) {
|
|
188
|
+
const languages = new Set();
|
|
189
|
+
const extensionMap = {
|
|
190
|
+
'.ts': 'typescript', '.tsx': 'typescript',
|
|
191
|
+
'.js': 'javascript', '.jsx': 'javascript',
|
|
192
|
+
'.py': 'python', '.go': 'go', '.rs': 'rust',
|
|
193
|
+
'.java': 'java', '.rb': 'ruby', '.php': 'php',
|
|
194
|
+
};
|
|
195
|
+
function scan(dir, depth) {
|
|
196
|
+
if (depth > 3)
|
|
197
|
+
return;
|
|
198
|
+
try {
|
|
199
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
200
|
+
for (const entry of entries) {
|
|
201
|
+
if (EXCLUDE_DIRS.has(entry.name))
|
|
202
|
+
continue;
|
|
203
|
+
if (entry.isDirectory()) {
|
|
204
|
+
scan(join(dir, entry.name), depth + 1);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
const ext = extname(entry.name);
|
|
208
|
+
if (extensionMap[ext])
|
|
209
|
+
languages.add(extensionMap[ext]);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Skip unreadable
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
scan(projectDir, 0);
|
|
218
|
+
return Array.from(languages).sort();
|
|
219
|
+
}
|
|
220
|
+
function findEnvFiles(projectDir) {
|
|
221
|
+
try {
|
|
222
|
+
return readdirSync(projectDir)
|
|
223
|
+
.filter((f) => f.startsWith('.env'))
|
|
224
|
+
.sort();
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function detectMigrations(projectDir) {
|
|
231
|
+
const migrationDirs = ['migrations', 'prisma/migrations', 'alembic/versions', 'db/migrate'];
|
|
232
|
+
return migrationDirs.some((d) => existsSync(join(projectDir, d)));
|
|
233
|
+
}
|
|
234
|
+
function detectPorts(configFiles) {
|
|
235
|
+
const ports = [];
|
|
236
|
+
for (const config of configFiles) {
|
|
237
|
+
if (config.type === 'docker-compose.yml' || config.type === 'docker-compose.yaml') {
|
|
238
|
+
// Basic port detection from docker-compose key_fields
|
|
239
|
+
// Full parsing would need YAML, keeping it simple
|
|
240
|
+
ports.push({ port: 3000, service: 'app', source: config.path });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Check package.json scripts for port hints
|
|
244
|
+
const pkg = configFiles.find((c) => c.type === 'package.json');
|
|
245
|
+
if (pkg) {
|
|
246
|
+
const scripts = pkg.key_fields.scripts;
|
|
247
|
+
if (scripts && typeof scripts === 'object') {
|
|
248
|
+
const startScript = scripts.start ?? '';
|
|
249
|
+
const portMatch = startScript.match(/(?:PORT|port)[=: ]?(\d+)/);
|
|
250
|
+
if (portMatch) {
|
|
251
|
+
ports.push({ port: parseInt(portMatch[1], 10), service: 'start', source: 'package.json' });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return ports;
|
|
256
|
+
}
|
|
257
|
+
function detectPackageManager(projectDir, _configFiles) {
|
|
258
|
+
if (existsSync(join(projectDir, 'pnpm-lock.yaml')))
|
|
259
|
+
return 'pnpm';
|
|
260
|
+
if (existsSync(join(projectDir, 'yarn.lock')))
|
|
261
|
+
return 'yarn';
|
|
262
|
+
if (existsSync(join(projectDir, 'bun.lockb')))
|
|
263
|
+
return 'bun';
|
|
264
|
+
if (existsSync(join(projectDir, 'package-lock.json')))
|
|
265
|
+
return 'npm';
|
|
266
|
+
if (existsSync(join(projectDir, 'requirements.txt')))
|
|
267
|
+
return 'pip';
|
|
268
|
+
if (existsSync(join(projectDir, 'pyproject.toml')))
|
|
269
|
+
return 'poetry';
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
function extractScripts(configFiles) {
|
|
273
|
+
const pkg = configFiles.find((c) => c.type === 'package.json');
|
|
274
|
+
if (!pkg)
|
|
275
|
+
return {};
|
|
276
|
+
const scripts = pkg.key_fields.scripts;
|
|
277
|
+
if (!scripts || typeof scripts !== 'object')
|
|
278
|
+
return {};
|
|
279
|
+
return scripts;
|
|
280
|
+
}
|
|
281
|
+
function detectTestFramework(configFiles, scripts) {
|
|
282
|
+
const testScript = scripts.test ?? '';
|
|
283
|
+
if (testScript.includes('vitest'))
|
|
284
|
+
return 'vitest';
|
|
285
|
+
if (testScript.includes('jest'))
|
|
286
|
+
return 'jest';
|
|
287
|
+
if (testScript.includes('pytest'))
|
|
288
|
+
return 'pytest';
|
|
289
|
+
if (testScript.includes('mocha'))
|
|
290
|
+
return 'mocha';
|
|
291
|
+
if (configFiles.some((c) => c.type.startsWith('vitest.config')))
|
|
292
|
+
return 'vitest';
|
|
293
|
+
if (configFiles.some((c) => c.type.startsWith('jest.config')))
|
|
294
|
+
return 'jest';
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
function detectBuildTool(configFiles, scripts) {
|
|
298
|
+
const buildScript = scripts.build ?? '';
|
|
299
|
+
if (buildScript.includes('tsc'))
|
|
300
|
+
return 'tsc';
|
|
301
|
+
if (buildScript.includes('vite'))
|
|
302
|
+
return 'vite';
|
|
303
|
+
if (buildScript.includes('webpack'))
|
|
304
|
+
return 'webpack';
|
|
305
|
+
if (buildScript.includes('next'))
|
|
306
|
+
return 'next';
|
|
307
|
+
if (buildScript.includes('turbo'))
|
|
308
|
+
return 'turbo';
|
|
309
|
+
if (configFiles.some((c) => c.type.startsWith('vite.config')))
|
|
310
|
+
return 'vite';
|
|
311
|
+
if (configFiles.some((c) => c.type.startsWith('next.config')))
|
|
312
|
+
return 'next';
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
315
|
+
function countFilesAndLines(projectDir) {
|
|
316
|
+
let totalFiles = 0;
|
|
317
|
+
let totalLines = 0;
|
|
318
|
+
function walk(dir, depth) {
|
|
319
|
+
if (depth > 8)
|
|
320
|
+
return;
|
|
321
|
+
try {
|
|
322
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
323
|
+
for (const entry of entries) {
|
|
324
|
+
if (EXCLUDE_DIRS.has(entry.name))
|
|
325
|
+
continue;
|
|
326
|
+
const fullPath = join(dir, entry.name);
|
|
327
|
+
if (entry.isDirectory()) {
|
|
328
|
+
walk(fullPath, depth + 1);
|
|
329
|
+
}
|
|
330
|
+
else if (CODE_EXTENSIONS.has(extname(entry.name))) {
|
|
331
|
+
totalFiles++;
|
|
332
|
+
totalLines += countLinesWithCache(fullPath);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// Skip unreadable
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
walk(projectDir, 0);
|
|
341
|
+
return { totalFiles, totalLines };
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=repo-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-snapshot.js","sourceRoot":"","sources":["../../src/pipeline/repo-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role Execution Adapter — bridges pipeline role planning
|
|
3
|
+
* with the existing runExecutionMode().
|
|
4
|
+
*
|
|
5
|
+
* Builds role-specific execution contexts by combining skill prompts
|
|
6
|
+
* with role plan constraints, then injects them as systemPrompt
|
|
7
|
+
* into ClaudeExecuteOptions for prompt-based enforcement.
|
|
8
|
+
*/
|
|
9
|
+
import type { PipelineRole, PipelineState, ArtifactEntry } from './types.js';
|
|
10
|
+
import type { SkillLoader, SkillDefinition } from './skill-loader.js';
|
|
11
|
+
export interface RoleExecutionContext {
|
|
12
|
+
role: PipelineRole;
|
|
13
|
+
systemPrompt: string;
|
|
14
|
+
allowedPaths: string[];
|
|
15
|
+
forbiddenPatterns: string[];
|
|
16
|
+
taskScope: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ClaudeExecuteOptions {
|
|
19
|
+
projectDir: string;
|
|
20
|
+
systemPrompt?: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Build a role-specific execution context from a skill definition and role plan artifact.
|
|
25
|
+
*
|
|
26
|
+
* Args:
|
|
27
|
+
* role: The pipeline role to build context for.
|
|
28
|
+
* skill: The skill definition loaded by SkillLoader.
|
|
29
|
+
* rolePlan: The approved role plan artifact entry.
|
|
30
|
+
* projectDir: Root project directory.
|
|
31
|
+
*
|
|
32
|
+
* Returns:
|
|
33
|
+
* RoleExecutionContext with system prompt, allowed paths, and task scope.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildRoleExecutionContext(role: PipelineRole, skill: SkillDefinition, rolePlan: ArtifactEntry, projectDir: string): RoleExecutionContext;
|
|
36
|
+
/**
|
|
37
|
+
* Inject role context into ClaudeExecuteOptions by setting the systemPrompt field.
|
|
38
|
+
*
|
|
39
|
+
* Args:
|
|
40
|
+
* context: The role execution context.
|
|
41
|
+
* options: The execution options to augment.
|
|
42
|
+
*
|
|
43
|
+
* Returns:
|
|
44
|
+
* Modified options with systemPrompt injected.
|
|
45
|
+
*/
|
|
46
|
+
export declare function executeWithRoleContext(context: RoleExecutionContext, options: ClaudeExecuteOptions): ClaudeExecuteOptions;
|
|
47
|
+
/**
|
|
48
|
+
* Find role plan artifacts for each active role in the pipeline.
|
|
49
|
+
*
|
|
50
|
+
* Args:
|
|
51
|
+
* pipeline: Current pipeline state.
|
|
52
|
+
* skillLoader: Skill loader instance.
|
|
53
|
+
* projectDir: Root project directory.
|
|
54
|
+
*
|
|
55
|
+
* Returns:
|
|
56
|
+
* Map of role to RoleExecutionContext.
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildAllRoleContexts(pipeline: PipelineState, skillLoader: SkillLoader, projectDir: string): Map<PipelineRole, RoleExecutionContext>;
|
|
59
|
+
//# sourceMappingURL=role-execution-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-execution-adapter.d.ts","sourceRoot":"","sources":["../../src/pipeline/role-execution-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAItE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,aAAa,EACvB,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAuBtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,CAKtB;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,GACjB,GAAG,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAoBzC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role Execution Adapter — bridges pipeline role planning
|
|
3
|
+
* with the existing runExecutionMode().
|
|
4
|
+
*
|
|
5
|
+
* Builds role-specific execution contexts by combining skill prompts
|
|
6
|
+
* with role plan constraints, then injects them as systemPrompt
|
|
7
|
+
* into ClaudeExecuteOptions for prompt-based enforcement.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
// ─── Context Builder ─────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Build a role-specific execution context from a skill definition and role plan artifact.
|
|
14
|
+
*
|
|
15
|
+
* Args:
|
|
16
|
+
* role: The pipeline role to build context for.
|
|
17
|
+
* skill: The skill definition loaded by SkillLoader.
|
|
18
|
+
* rolePlan: The approved role plan artifact entry.
|
|
19
|
+
* projectDir: Root project directory.
|
|
20
|
+
*
|
|
21
|
+
* Returns:
|
|
22
|
+
* RoleExecutionContext with system prompt, allowed paths, and task scope.
|
|
23
|
+
*/
|
|
24
|
+
export function buildRoleExecutionContext(role, skill, rolePlan, projectDir) {
|
|
25
|
+
// Read role plan content
|
|
26
|
+
const planPath = join(projectDir, rolePlan.path);
|
|
27
|
+
let planContent = '';
|
|
28
|
+
if (existsSync(planPath)) {
|
|
29
|
+
planContent = readFileSync(planPath, 'utf-8');
|
|
30
|
+
}
|
|
31
|
+
// Extract task scope from role plan
|
|
32
|
+
const taskScope = extractTaskScope(planContent);
|
|
33
|
+
const allowedPaths = extractAllowedPaths(planContent, role);
|
|
34
|
+
const forbiddenPatterns = extractForbiddenPatterns(role);
|
|
35
|
+
// Build system prompt combining skill + role constraints
|
|
36
|
+
const systemPrompt = buildRoleSystemPrompt(role, skill, planContent, forbiddenPatterns);
|
|
37
|
+
return {
|
|
38
|
+
role,
|
|
39
|
+
systemPrompt,
|
|
40
|
+
allowedPaths,
|
|
41
|
+
forbiddenPatterns,
|
|
42
|
+
taskScope,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Inject role context into ClaudeExecuteOptions by setting the systemPrompt field.
|
|
47
|
+
*
|
|
48
|
+
* Args:
|
|
49
|
+
* context: The role execution context.
|
|
50
|
+
* options: The execution options to augment.
|
|
51
|
+
*
|
|
52
|
+
* Returns:
|
|
53
|
+
* Modified options with systemPrompt injected.
|
|
54
|
+
*/
|
|
55
|
+
export function executeWithRoleContext(context, options) {
|
|
56
|
+
return {
|
|
57
|
+
...options,
|
|
58
|
+
systemPrompt: context.systemPrompt,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// ─── Role-to-Plan Mapping ────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Find role plan artifacts for each active role in the pipeline.
|
|
64
|
+
*
|
|
65
|
+
* Args:
|
|
66
|
+
* pipeline: Current pipeline state.
|
|
67
|
+
* skillLoader: Skill loader instance.
|
|
68
|
+
* projectDir: Root project directory.
|
|
69
|
+
*
|
|
70
|
+
* Returns:
|
|
71
|
+
* Map of role to RoleExecutionContext.
|
|
72
|
+
*/
|
|
73
|
+
export function buildAllRoleContexts(pipeline, skillLoader, projectDir) {
|
|
74
|
+
const contexts = new Map();
|
|
75
|
+
// Find all role_plan artifacts
|
|
76
|
+
const rolePlanArtifacts = pipeline.artifacts.filter((a) => a.type === 'role_plan');
|
|
77
|
+
for (const rolePlan of rolePlanArtifacts) {
|
|
78
|
+
// Determine which role this plan belongs to by checking plan content
|
|
79
|
+
const planPath = join(projectDir, rolePlan.path);
|
|
80
|
+
if (!existsSync(planPath))
|
|
81
|
+
continue;
|
|
82
|
+
const content = readFileSync(planPath, 'utf-8');
|
|
83
|
+
const role = detectRoleFromPlan(content, pipeline.activeRoles);
|
|
84
|
+
if (!role)
|
|
85
|
+
continue;
|
|
86
|
+
const skill = skillLoader.loadSkill(role);
|
|
87
|
+
contexts.set(role, buildRoleExecutionContext(role, skill, rolePlan, projectDir));
|
|
88
|
+
}
|
|
89
|
+
return contexts;
|
|
90
|
+
}
|
|
91
|
+
// ─── Internal Helpers ────────────────────────────────────
|
|
92
|
+
/** Extract task scope description from role plan content */
|
|
93
|
+
function extractTaskScope(planContent) {
|
|
94
|
+
// Look for "## Tasks" or "## Responsibilities" section
|
|
95
|
+
const taskMatch = planContent.match(/#+\s*(?:Tasks?|Responsibilities?|Work\s+Items?)\s*\n([\s\S]*?)(?=\n#+\s|\n---|\s*$)/i);
|
|
96
|
+
if (taskMatch) {
|
|
97
|
+
return taskMatch[1].trim().slice(0, 2000);
|
|
98
|
+
}
|
|
99
|
+
// Fallback: first 500 chars
|
|
100
|
+
return planContent.slice(0, 500).trim();
|
|
101
|
+
}
|
|
102
|
+
/** Extract allowed file paths from role plan */
|
|
103
|
+
function extractAllowedPaths(planContent, role) {
|
|
104
|
+
// Default paths based on role
|
|
105
|
+
const roleDefaults = {
|
|
106
|
+
FRONTEND_PROGRAMMER: ['src/', 'app/', 'pages/', 'components/', 'styles/', 'public/'],
|
|
107
|
+
BACKEND_PROGRAMMER: ['src/', 'server/', 'api/', 'lib/', 'db/', 'prisma/'],
|
|
108
|
+
WEBSITE_PROGRAMMER: ['apps/website/', 'src/', 'app/', 'pages/', 'public/'],
|
|
109
|
+
DB_EXPERT: ['prisma/', 'migrations/', 'db/', 'alembic/', 'models/'],
|
|
110
|
+
QA_TESTER: ['tests/', '__tests__/', 'test/', 'spec/'],
|
|
111
|
+
UI_UX_SPECIALIST: ['src/', 'app/', 'styles/', 'components/'],
|
|
112
|
+
};
|
|
113
|
+
// Extract explicit file references from plan
|
|
114
|
+
const fileRefs = planContent.match(/(?:src|app|pages|lib|server|api|tests?)\/[\w\-./]+/g) ?? [];
|
|
115
|
+
const defaults = roleDefaults[role] ?? [];
|
|
116
|
+
return [...new Set([...defaults, ...fileRefs])];
|
|
117
|
+
}
|
|
118
|
+
/** Get forbidden patterns based on role boundaries */
|
|
119
|
+
function extractForbiddenPatterns(role) {
|
|
120
|
+
const roleForbidden = {
|
|
121
|
+
FRONTEND_PROGRAMMER: ['server/', 'api/', 'prisma/', 'migrations/', 'alembic/'],
|
|
122
|
+
BACKEND_PROGRAMMER: ['components/', 'styles/', 'public/assets/'],
|
|
123
|
+
WEBSITE_PROGRAMMER: ['server/', 'api/', 'prisma/', 'migrations/'],
|
|
124
|
+
DB_EXPERT: ['components/', 'styles/', 'public/', 'pages/'],
|
|
125
|
+
QA_TESTER: [], // QA can touch anything
|
|
126
|
+
};
|
|
127
|
+
return roleForbidden[role] ?? [];
|
|
128
|
+
}
|
|
129
|
+
/** Build the full system prompt for a role */
|
|
130
|
+
function buildRoleSystemPrompt(role, skill, planContent, forbiddenPatterns) {
|
|
131
|
+
const lines = [
|
|
132
|
+
`# Role: ${role}`,
|
|
133
|
+
'',
|
|
134
|
+
'## Skill System Prompt',
|
|
135
|
+
skill.systemPrompt,
|
|
136
|
+
'',
|
|
137
|
+
'## Your Approved Role Plan',
|
|
138
|
+
planContent.slice(0, 4000),
|
|
139
|
+
'',
|
|
140
|
+
'## Constraints',
|
|
141
|
+
...skill.constraints.map((c) => `- ${c}`),
|
|
142
|
+
];
|
|
143
|
+
if (forbiddenPatterns.length > 0) {
|
|
144
|
+
lines.push('', '## Forbidden Paths (Do NOT modify these)', ...forbiddenPatterns.map((p) => `- ${p}`));
|
|
145
|
+
}
|
|
146
|
+
lines.push('', '## Rules', '- Stay within your role boundaries', '- Only modify files in your allowed paths', '- If you need changes outside your scope, flag them as dependencies', '- Follow the approved plan — do not add unplanned features');
|
|
147
|
+
return lines.join('\n');
|
|
148
|
+
}
|
|
149
|
+
/** Detect which role a plan belongs to by matching role names in content */
|
|
150
|
+
function detectRoleFromPlan(content, activeRoles) {
|
|
151
|
+
const uppercaseContent = content.toUpperCase();
|
|
152
|
+
for (const role of activeRoles) {
|
|
153
|
+
if (uppercaseContent.includes(role)) {
|
|
154
|
+
return role;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=role-execution-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-execution-adapter.js","sourceRoot":"","sources":["../../src/pipeline/role-execution-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyBjC,4DAA4D;AAE5D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAkB,EAClB,KAAsB,EACtB,QAAuB,EACvB,UAAkB;IAElB,yBAAyB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,oCAAoC;IACpC,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAEzD,yDAAyD;IACzD,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAExF,OAAO;QACL,IAAI;QACJ,YAAY;QACZ,YAAY;QACZ,iBAAiB;QACjB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA6B,EAC7B,OAA6B;IAE7B,OAAO;QACL,GAAG,OAAO;QACV,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;AACJ,CAAC;AAED,4DAA4D;AAE5D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAuB,EACvB,WAAwB,EACxB,UAAkB;IAElB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE/D,+BAA+B;IAC/B,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAEnF,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QACzC,qEAAqE;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,yBAAyB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4DAA4D;AAE5D,4DAA4D;AAC5D,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,uDAAuD;IACvD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CACjC,sFAAsF,CACvF,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,4BAA4B;IAC5B,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,gDAAgD;AAChD,SAAS,mBAAmB,CAAC,WAAmB,EAAE,IAAkB;IAClE,8BAA8B;IAC9B,MAAM,YAAY,GAA4C;QAC5D,mBAAmB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC;QACpF,kBAAkB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;QACzE,kBAAkB,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;QAC1E,SAAS,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC;QACnE,SAAS,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC;QACrD,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC;KAC7D,CAAC;IAEF,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,qDAAqD,CAAC,IAAI,EAAE,CAAC;IAChG,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAE1C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,sDAAsD;AACtD,SAAS,wBAAwB,CAAC,IAAkB;IAClD,MAAM,aAAa,GAA4C;QAC7D,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,CAAC;QAC9E,kBAAkB,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,gBAAgB,CAAC;QAChE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC;QACjE,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC;QAC1D,SAAS,EAAE,EAAE,EAAE,wBAAwB;KACxC,CAAC;IAEF,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,8CAA8C;AAC9C,SAAS,qBAAqB,CAC5B,IAAkB,EAClB,KAAsB,EACtB,WAAmB,EACnB,iBAA2B;IAE3B,MAAM,KAAK,GAAG;QACZ,WAAW,IAAI,EAAE;QACjB,EAAE;QACF,wBAAwB;QACxB,KAAK,CAAC,YAAY;QAClB,EAAE;QACF,4BAA4B;QAC5B,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;QAC1B,EAAE;QACF,gBAAgB;QAChB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;KAC1C,CAAC;IAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CACR,EAAE,EACF,0CAA0C,EAC1C,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAC1C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAE,EACF,UAAU,EACV,oCAAoC,EACpC,2CAA2C,EAC3C,qEAAqE,EACrE,4DAA4D,CAC7D,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,4EAA4E;AAC5E,SAAS,kBAAkB,CACzB,OAAe,EACf,WAA2B;IAE3B,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loader — hybrid system loading from TS defaults + .md overrides.
|
|
3
|
+
* .md files use YAML frontmatter for structured fields (P1-1).
|
|
4
|
+
* If no frontmatter, entire file treated as raw systemPrompt override.
|
|
5
|
+
*/
|
|
6
|
+
import type { PipelineRole } from './types.js';
|
|
7
|
+
export interface SkillDefinition {
|
|
8
|
+
role: PipelineRole;
|
|
9
|
+
version: string;
|
|
10
|
+
systemPrompt: string;
|
|
11
|
+
required_outputs: string[];
|
|
12
|
+
constraints: string[];
|
|
13
|
+
depends_on?: PipelineRole[];
|
|
14
|
+
}
|
|
15
|
+
export declare class SkillLoader {
|
|
16
|
+
private readonly skillsDir;
|
|
17
|
+
private readonly cache;
|
|
18
|
+
constructor(skillsDir?: string);
|
|
19
|
+
/** Load skill definition for a role. Merges TS default + .md override. */
|
|
20
|
+
loadSkill(role: PipelineRole): SkillDefinition;
|
|
21
|
+
/** Load all skills for the given roles */
|
|
22
|
+
loadAllSkills(roles: PipelineRole[]): Map<PipelineRole, SkillDefinition>;
|
|
23
|
+
/** Clear cache (useful after reloading .md files) */
|
|
24
|
+
clearCache(): void;
|
|
25
|
+
/** List available .md skill files */
|
|
26
|
+
listAvailableOverrides(): string[];
|
|
27
|
+
private loadMarkdownOverride;
|
|
28
|
+
}
|
|
29
|
+
export declare function getDefaultSkill(role: PipelineRole): SkillDefinition;
|
|
30
|
+
/** Parse skill markdown with optional YAML frontmatter */
|
|
31
|
+
export declare function parseSkillMarkdown(content: string): Partial<SkillDefinition>;
|
|
32
|
+
export declare function resolveSkillsDir(projectDir: string): string;
|
|
33
|
+
export declare function createSkillLoader(projectDir?: string): SkillLoader;
|
|
34
|
+
//# sourceMappingURL=skill-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/pipeline/skill-loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4C;gBAEtD,SAAS,CAAC,EAAE,MAAM;IAI9B,0EAA0E;IAC1E,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe;IAsB9C,0CAA0C;IAC1C,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC;IAQxE,qDAAqD;IACrD,UAAU,IAAI,IAAI;IAIlB,qCAAqC;IACrC,sBAAsB,IAAI,MAAM,EAAE;IASlC,OAAO,CAAC,oBAAoB;CAa7B;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,eAAe,CAQnE;AAID,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqD5E;AAqBD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAGlE"}
|