swarm-orchestrator 7.0.0-alpha.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/LICENSE +15 -0
- package/README.md +199 -0
- package/agents/reviewer.agent.md +50 -0
- package/agents/worker.agent.md +41 -0
- package/config/default-agents.yaml +56 -0
- package/config/pm-agent.yaml +36 -0
- package/config/quality-gates.yaml +88 -0
- package/config/repair-agent.yaml +34 -0
- package/config/semgrep-rules/complexity-mismatch.yaml +6 -0
- package/config/semgrep-rules/exception-swallowing.yaml +13 -0
- package/config/semgrep-rules/hardcoded-answer.yaml +6 -0
- package/config/semgrep-rules/mock-mutation.yaml +6 -0
- package/config/semgrep-rules/test-modification.yaml +6 -0
- package/config/user-agents.yaml +23 -0
- package/dist/src/adapters/adapter-factory.js +29 -0
- package/dist/src/adapters/agent-adapter.js +32 -0
- package/dist/src/adapters/claude-code-adapter.js +126 -0
- package/dist/src/adapters/claude-code-teams.js +119 -0
- package/dist/src/adapters/codex-adapter.js +118 -0
- package/dist/src/adapters/copilot-adapter.js +224 -0
- package/dist/src/adapters/fatal-error-classifier.js +88 -0
- package/dist/src/adapters/index.js +44 -0
- package/dist/src/adapters/persistent-session.js +204 -0
- package/dist/src/adapters/process-supervisor.js +199 -0
- package/dist/src/agents-exporter.js +398 -0
- package/dist/src/analytics-log.js +161 -0
- package/dist/src/baseline-scanner.js +65 -0
- package/dist/src/bootstrap-evidence.js +88 -0
- package/dist/src/bootstrap-orchestrator.js +205 -0
- package/dist/src/bootstrap-types.js +5 -0
- package/dist/src/branch-merger.js +427 -0
- package/dist/src/cli/attest-handlers.js +44 -0
- package/dist/src/cli/cost-prompt.js +51 -0
- package/dist/src/cli/demo-handlers.js +274 -0
- package/dist/src/cli/flags.js +152 -0
- package/dist/src/cli/index.js +57 -0
- package/dist/src/cli/live-status.js +186 -0
- package/dist/src/cli/misc-handlers.js +242 -0
- package/dist/src/cli/plan-handlers.js +350 -0
- package/dist/src/cli/share-handlers.js +163 -0
- package/dist/src/cli/status-handlers.js +457 -0
- package/dist/src/cli/swarm-handlers.js +638 -0
- package/dist/src/cli/usage.js +72 -0
- package/dist/src/cli.js +217 -0
- package/dist/src/commit-pattern-detector.js +143 -0
- package/dist/src/commit-quality-analyzer.js +38 -0
- package/dist/src/config-loader.js +339 -0
- package/dist/src/context-broker.js +358 -0
- package/dist/src/copilot-cli-wrapper.js +258 -0
- package/dist/src/cost-estimator.js +241 -0
- package/dist/src/defaults.js +18 -0
- package/dist/src/demo-mode.js +180 -0
- package/dist/src/deployment-handler.js +78 -0
- package/dist/src/deployment-manager.js +228 -0
- package/dist/src/execution-queue.js +196 -0
- package/dist/src/external-tool-manager.js +184 -0
- package/dist/src/gate-prompt-builder.js +117 -0
- package/dist/src/gate-remediation.js +173 -0
- package/dist/src/github-issues-ingester.js +152 -0
- package/dist/src/github-mcp-integrator.js +164 -0
- package/dist/src/hook-generator.js +229 -0
- package/dist/src/index.js +48 -0
- package/dist/src/knowledge-base.js +300 -0
- package/dist/src/logger.js +111 -0
- package/dist/src/meta-analyzer.js +208 -0
- package/dist/src/metrics-collector.js +209 -0
- package/dist/src/metrics-types.js +5 -0
- package/dist/src/multi-repo-coordinator.js +179 -0
- package/dist/src/orchestrator/async-meta-analysis.js +84 -0
- package/dist/src/orchestrator/fatal-run-error.js +43 -0
- package/dist/src/orchestrator/final-gates-remediation.js +258 -0
- package/dist/src/orchestrator/git-state-utils.js +119 -0
- package/dist/src/orchestrator/pause-controller.js +55 -0
- package/dist/src/orchestrator/replan-runner.js +258 -0
- package/dist/src/orchestrator/step-executor.js +391 -0
- package/dist/src/orchestrator/wave-scheduler-loop.js +204 -0
- package/dist/src/owasp-mapper.js +153 -0
- package/dist/src/owasp-report-renderer.js +39 -0
- package/dist/src/plan-files.js +142 -0
- package/dist/src/plan-generator.js +1207 -0
- package/dist/src/pm-agent.js +296 -0
- package/dist/src/post-run-reporter.js +203 -0
- package/dist/src/pr-automation.js +103 -0
- package/dist/src/pr-manager.js +318 -0
- package/dist/src/presenter/index.js +209 -0
- package/dist/src/prompt-builder.js +173 -0
- package/dist/src/quality-gates/config-loader.js +196 -0
- package/dist/src/quality-gates/default-config.js +243 -0
- package/dist/src/quality-gates/file-utils.js +152 -0
- package/dist/src/quality-gates/gate-runner.js +171 -0
- package/dist/src/quality-gates/gates/accessibility.js +355 -0
- package/dist/src/quality-gates/gates/duplicate-blocks.js +144 -0
- package/dist/src/quality-gates/gates/hardcoded-config.js +52 -0
- package/dist/src/quality-gates/gates/readme-claims.js +62 -0
- package/dist/src/quality-gates/gates/runtime-checks.js +265 -0
- package/dist/src/quality-gates/gates/scaffold-defaults.js +108 -0
- package/dist/src/quality-gates/gates/test-coverage.js +240 -0
- package/dist/src/quality-gates/gates/test-file-protection.js +85 -0
- package/dist/src/quality-gates/gates/test-isolation.js +74 -0
- package/dist/src/quality-gates/index.js +17 -0
- package/dist/src/quality-gates/registry.js +205 -0
- package/dist/src/quality-gates/types.js +2 -0
- package/dist/src/quick-fix-mode.js +302 -0
- package/dist/src/recipe-loader.js +122 -0
- package/dist/src/repair-agent.js +396 -0
- package/dist/src/repo-analyzer.js +342 -0
- package/dist/src/report-generator.js +146 -0
- package/dist/src/report-renderer.js +90 -0
- package/dist/src/requirement-filter.js +52 -0
- package/dist/src/sarif-formatter.js +140 -0
- package/dist/src/scheduling/dependency-analyzer.js +178 -0
- package/dist/src/scheduling/work-stealing-queue.js +123 -0
- package/dist/src/secret-redactor.js +90 -0
- package/dist/src/session-executor.js +587 -0
- package/dist/src/session-manager.js +221 -0
- package/dist/src/share/transcript-verification.js +128 -0
- package/dist/src/share-parser.js +477 -0
- package/dist/src/spinner.js +146 -0
- package/dist/src/step-runner.js +365 -0
- package/dist/src/swarm-orchestrator.js +686 -0
- package/dist/src/task-classifier.js +134 -0
- package/dist/src/test-command-discovery.js +123 -0
- package/dist/src/text-similarity.js +24 -0
- package/dist/src/tier-maps.js +158 -0
- package/dist/src/types.js +5 -0
- package/dist/src/url-shortener.js +135 -0
- package/dist/src/verification/attestation.js +166 -0
- package/dist/src/verification/cheat-detector.js +240 -0
- package/dist/src/verification/command-runner.js +70 -0
- package/dist/src/verification/composite-score.js +157 -0
- package/dist/src/verification/cosign-attestation.js +137 -0
- package/dist/src/verification/diff-analysis.js +89 -0
- package/dist/src/verification/differential-gate.js +173 -0
- package/dist/src/verification/index.js +41 -0
- package/dist/src/verification/mutation-gate.js +242 -0
- package/dist/src/verification/property-gate.js +201 -0
- package/dist/src/verification/test-synthesizer.js +243 -0
- package/dist/src/verifier/outcome-checks.js +396 -0
- package/dist/src/verifier/transcript-checks.js +207 -0
- package/dist/src/verifier/verification-reporters.js +148 -0
- package/dist/src/verifier-engine.js +491 -0
- package/dist/src/wave-resizer.js +131 -0
- package/dist/src/wave-scheduler.js +44 -0
- package/dist/src/worktree-manager.js +368 -0
- package/dist/src/worktree-reserved-paths.js +97 -0
- package/package.json +80 -0
- package/plugin/agents/.gitkeep +0 -0
- package/plugin/agents/backend_master.agent.md +72 -0
- package/plugin/agents/devops_pro.agent.md +45 -0
- package/plugin/agents/frontend_expert.agent.md +59 -0
- package/plugin/agents/integrator_finalizer.agent.md +44 -0
- package/plugin/agents/meta_reviewer.agent.md +44 -0
- package/plugin/agents/security_auditor.agent.md +43 -0
- package/plugin/agents/tester_elite.agent.md +43 -0
- package/plugin/hooks/hooks.json +19 -0
- package/plugin/hooks/post-tool-use.json +9 -0
- package/plugin/hooks/pre-tool-use.json +9 -0
- package/plugin/plugin.json +47 -0
- package/plugin/skills/swarm-gates/SKILL.md +53 -0
- package/plugin/skills/swarm-orchestrate/SKILL.md +34 -0
- package/plugin/skills/swarm-verify/SKILL.md +44 -0
- package/templates/README.md +35 -0
- package/templates/cli-tool.json +31 -0
- package/templates/fullstack.json +52 -0
- package/templates/library.json +38 -0
- package/templates/react-app.json +45 -0
- package/templates/recipes/add-api-docs.json +35 -0
- package/templates/recipes/add-auth.json +47 -0
- package/templates/recipes/add-ci.json +39 -0
- package/templates/recipes/add-tests.json +39 -0
- package/templates/recipes/migrate-to-ts.json +42 -0
- package/templates/recipes/refactor-modularize.json +44 -0
- package/templates/recipes/security-audit.json +35 -0
- package/templates/rest-api.json +38 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BootstrapEvidenceManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Bootstrap Evidence Manager - persist and load bootstrap artifacts
|
|
41
|
+
*/
|
|
42
|
+
class BootstrapEvidenceManager {
|
|
43
|
+
schemaVersion = '1.0.0';
|
|
44
|
+
/**
|
|
45
|
+
* Save bootstrap evidence to runs/ directory
|
|
46
|
+
*/
|
|
47
|
+
saveEvidence(evidence, runDir) {
|
|
48
|
+
const evidenceDir = path.join(runDir, 'bootstrap');
|
|
49
|
+
if (!fs.existsSync(evidenceDir)) {
|
|
50
|
+
fs.mkdirSync(evidenceDir, { recursive: true });
|
|
51
|
+
}
|
|
52
|
+
const evidencePath = path.join(evidenceDir, 'analysis.json');
|
|
53
|
+
const json = JSON.stringify(evidence, null, 2);
|
|
54
|
+
fs.writeFileSync(evidencePath, json, 'utf8');
|
|
55
|
+
return evidencePath;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Load bootstrap evidence
|
|
59
|
+
*/
|
|
60
|
+
loadEvidence(runDir) {
|
|
61
|
+
const evidencePath = path.join(runDir, 'bootstrap', 'analysis.json');
|
|
62
|
+
if (!fs.existsSync(evidencePath)) {
|
|
63
|
+
throw new Error(`Bootstrap evidence not found: ${evidencePath}`);
|
|
64
|
+
}
|
|
65
|
+
const content = fs.readFileSync(evidencePath, 'utf8');
|
|
66
|
+
const evidence = JSON.parse(content);
|
|
67
|
+
// Validate schema version
|
|
68
|
+
if (evidence.schemaVersion !== this.schemaVersion) {
|
|
69
|
+
throw new Error(`Schema version mismatch: expected ${this.schemaVersion}, got ${evidence.schemaVersion}`);
|
|
70
|
+
}
|
|
71
|
+
return evidence;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create evidence object from analysis and plan
|
|
75
|
+
*/
|
|
76
|
+
createEvidence(goal, analysisResult, plan) {
|
|
77
|
+
return {
|
|
78
|
+
schemaVersion: this.schemaVersion,
|
|
79
|
+
goal,
|
|
80
|
+
analyzedRepos: analysisResult.repos.map(r => r.repoPath),
|
|
81
|
+
analysisResult,
|
|
82
|
+
generatedPlan: plan,
|
|
83
|
+
createdAt: new Date().toISOString()
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.BootstrapEvidenceManager = BootstrapEvidenceManager;
|
|
88
|
+
exports.default = BootstrapEvidenceManager;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.BootstrapOrchestrator = void 0;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const repo_analyzer_1 = __importDefault(require("./repo-analyzer"));
|
|
42
|
+
const github_issues_ingester_1 = __importDefault(require("./github-issues-ingester"));
|
|
43
|
+
const multi_repo_coordinator_1 = __importDefault(require("./multi-repo-coordinator"));
|
|
44
|
+
const bootstrap_evidence_1 = __importDefault(require("./bootstrap-evidence"));
|
|
45
|
+
const plan_generator_1 = require("./plan-generator");
|
|
46
|
+
const config_loader_1 = require("./config-loader");
|
|
47
|
+
const logger_1 = require("./logger");
|
|
48
|
+
const logger = (0, logger_1.getLogger)('bootstrap-orchestrator');
|
|
49
|
+
/**
|
|
50
|
+
* Bootstrap Orchestrator - main entry point for bootstrap mode
|
|
51
|
+
* Coordinates analysis, ingestion, and plan generation
|
|
52
|
+
*/
|
|
53
|
+
class BootstrapOrchestrator {
|
|
54
|
+
repoAnalyzer;
|
|
55
|
+
issuesIngester;
|
|
56
|
+
multiRepoCoordinator;
|
|
57
|
+
evidenceManager;
|
|
58
|
+
planGenerator;
|
|
59
|
+
constructor() {
|
|
60
|
+
this.repoAnalyzer = new repo_analyzer_1.default();
|
|
61
|
+
this.issuesIngester = new github_issues_ingester_1.default();
|
|
62
|
+
this.multiRepoCoordinator = new multi_repo_coordinator_1.default();
|
|
63
|
+
this.evidenceManager = new bootstrap_evidence_1.default();
|
|
64
|
+
const configLoader = new config_loader_1.ConfigLoader();
|
|
65
|
+
const agents = configLoader.loadAllAgents();
|
|
66
|
+
this.planGenerator = new plan_generator_1.PlanGenerator(agents);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Execute full bootstrap analysis and plan generation
|
|
70
|
+
*/
|
|
71
|
+
async bootstrap(repoPaths, goal, runDir) {
|
|
72
|
+
logger.info('🔍 Bootstrap Analysis Starting...\n');
|
|
73
|
+
// Step 1: Analyze all repos
|
|
74
|
+
logger.info(`Analyzing ${repoPaths.length} repository(ies)...`);
|
|
75
|
+
const repoAnalyses = await Promise.all(repoPaths.map(p => this.repoAnalyzer.analyzeRepo(p)));
|
|
76
|
+
for (const analysis of repoAnalyses) {
|
|
77
|
+
logger.info(` ✓ ${analysis.repoName}: ${analysis.languages.join(', ')}`);
|
|
78
|
+
logger.info(` Build scripts: ${analysis.buildScripts.length}`);
|
|
79
|
+
logger.info(` Test scripts: ${analysis.testScripts.length}`);
|
|
80
|
+
logger.info(` Dependencies: ${analysis.dependencies.length}`);
|
|
81
|
+
logger.info(` Tech debt markers: ${analysis.techDebtMarkers.length}`);
|
|
82
|
+
logger.info(` Baseline concerns: ${analysis.baselineConcerns.length}`);
|
|
83
|
+
}
|
|
84
|
+
logger.info();
|
|
85
|
+
// Step 2: Identify cross-repo relationships
|
|
86
|
+
logger.info('Identifying cross-repo relationships...');
|
|
87
|
+
const relationships = this.multiRepoCoordinator.identifyRelationships(repoAnalyses);
|
|
88
|
+
logger.info(` Found ${relationships.length} relationship(s)`);
|
|
89
|
+
for (const rel of relationships) {
|
|
90
|
+
logger.info(` ${rel.sourceRepo} → ${rel.targetRepo} (${rel.type})`);
|
|
91
|
+
}
|
|
92
|
+
logger.info();
|
|
93
|
+
// Step 3: Ingest GitHub issues
|
|
94
|
+
logger.info('Fetching GitHub issues...');
|
|
95
|
+
const allIssues = [];
|
|
96
|
+
for (const repoPath of repoPaths) {
|
|
97
|
+
const issues = await this.issuesIngester.fetchIssues(repoPath);
|
|
98
|
+
allIssues.push(...issues);
|
|
99
|
+
}
|
|
100
|
+
logger.info(` Found ${allIssues.length} open issue(s)`);
|
|
101
|
+
// Link relevant issues to goal
|
|
102
|
+
const relevantIssues = this.issuesIngester.linkIssuesToTasks(allIssues, goal);
|
|
103
|
+
logger.info(` ${relevantIssues.length} issue(s) relevant to goal`);
|
|
104
|
+
for (const issue of relevantIssues.slice(0, 5)) {
|
|
105
|
+
logger.info(` #${issue.number}: ${issue.title}`);
|
|
106
|
+
}
|
|
107
|
+
logger.info();
|
|
108
|
+
// Step 4: Build analysis result
|
|
109
|
+
const analysisResult = {
|
|
110
|
+
repos: repoAnalyses,
|
|
111
|
+
relationships,
|
|
112
|
+
issues: relevantIssues,
|
|
113
|
+
goal,
|
|
114
|
+
analyzedAt: new Date().toISOString()
|
|
115
|
+
};
|
|
116
|
+
// Step 5: Generate annotated plan
|
|
117
|
+
logger.info('Generating execution plan...');
|
|
118
|
+
const plan = this.generateAnnotatedPlan(goal, analysisResult, repoPaths);
|
|
119
|
+
logger.info(` Generated ${plan.steps.length} step(s)`);
|
|
120
|
+
logger.info();
|
|
121
|
+
// Step 6: Save evidence
|
|
122
|
+
logger.info('Saving bootstrap evidence...');
|
|
123
|
+
const evidence = this.evidenceManager.createEvidence(goal, analysisResult, plan);
|
|
124
|
+
const evidencePath = this.evidenceManager.saveEvidence(evidence, runDir);
|
|
125
|
+
logger.info(` ✓ Evidence saved: ${evidencePath}`);
|
|
126
|
+
logger.info();
|
|
127
|
+
logger.info('✅ Bootstrap analysis complete!\n');
|
|
128
|
+
return { evidencePath, plan };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Generate plan with source annotations.
|
|
132
|
+
* Stamps each step with the resolved target repo path so execution
|
|
133
|
+
* creates worktrees from the correct repository, not the orchestrator's own repo.
|
|
134
|
+
*/
|
|
135
|
+
generateAnnotatedPlan(goal, analysis, repoPaths) {
|
|
136
|
+
// Use PlanGenerator to create base plan
|
|
137
|
+
const basePlan = this.planGenerator.createPlan(goal);
|
|
138
|
+
// Resolve target repo paths so worktrees are created from the right git history
|
|
139
|
+
const resolvedRepoPaths = (repoPaths || []).map(p => path.resolve(p));
|
|
140
|
+
const primaryRepo = resolvedRepoPaths[0];
|
|
141
|
+
if (primaryRepo) {
|
|
142
|
+
if (!basePlan.metadata) {
|
|
143
|
+
basePlan.metadata = { totalSteps: basePlan.steps.length };
|
|
144
|
+
}
|
|
145
|
+
basePlan.metadata.targetDir = primaryRepo;
|
|
146
|
+
}
|
|
147
|
+
// Annotate steps with analysis evidence
|
|
148
|
+
const annotatedSteps = basePlan.steps.map(step => {
|
|
149
|
+
// Stamp step with the target repo so execution knows where to create worktrees
|
|
150
|
+
if (primaryRepo && !step.repo) {
|
|
151
|
+
step.repo = step.repo || primaryRepo;
|
|
152
|
+
}
|
|
153
|
+
const annotations = [];
|
|
154
|
+
// Link to relevant issues
|
|
155
|
+
for (const issue of analysis.issues) {
|
|
156
|
+
if (this.isStepRelatedToIssue(step.task, issue.title)) {
|
|
157
|
+
annotations.push({
|
|
158
|
+
type: 'github_issue',
|
|
159
|
+
reference: `#${issue.number}`,
|
|
160
|
+
evidence: `Issue: ${issue.title} (${issue.url})`
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Link to tech debt if tester/security step
|
|
165
|
+
if (step.agentName === 'tester_elite' || step.agentName === 'security_auditor') {
|
|
166
|
+
const relevantDebt = analysis.repos.flatMap(r => r.techDebtMarkers).slice(0, 3);
|
|
167
|
+
for (const debt of relevantDebt) {
|
|
168
|
+
annotations.push({
|
|
169
|
+
type: 'tech_debt',
|
|
170
|
+
reference: debt.location,
|
|
171
|
+
evidence: debt.evidence
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Link to build scripts if relevant
|
|
176
|
+
if (step.task.toLowerCase().includes('build') || step.task.toLowerCase().includes('compile')) {
|
|
177
|
+
const buildScripts = analysis.repos.flatMap(r => r.buildScripts);
|
|
178
|
+
for (const script of buildScripts) {
|
|
179
|
+
annotations.push({
|
|
180
|
+
type: 'build_script',
|
|
181
|
+
reference: script.source,
|
|
182
|
+
evidence: `Build command: ${script.command}`
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
...step,
|
|
188
|
+
sourceAnnotations: annotations
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
return {
|
|
192
|
+
...basePlan,
|
|
193
|
+
steps: annotatedSteps
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
isStepRelatedToIssue(task, issueTitle) {
|
|
197
|
+
const taskWords = task.toLowerCase().split(/\s+/);
|
|
198
|
+
const issueWords = issueTitle.toLowerCase().split(/\s+/);
|
|
199
|
+
// Simple keyword overlap check
|
|
200
|
+
const overlap = taskWords.filter(w => w.length > 3 && issueWords.includes(w));
|
|
201
|
+
return overlap.length >= 2;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.BootstrapOrchestrator = BootstrapOrchestrator;
|
|
205
|
+
exports.default = BootstrapOrchestrator;
|