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.
Files changed (174) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +199 -0
  3. package/agents/reviewer.agent.md +50 -0
  4. package/agents/worker.agent.md +41 -0
  5. package/config/default-agents.yaml +56 -0
  6. package/config/pm-agent.yaml +36 -0
  7. package/config/quality-gates.yaml +88 -0
  8. package/config/repair-agent.yaml +34 -0
  9. package/config/semgrep-rules/complexity-mismatch.yaml +6 -0
  10. package/config/semgrep-rules/exception-swallowing.yaml +13 -0
  11. package/config/semgrep-rules/hardcoded-answer.yaml +6 -0
  12. package/config/semgrep-rules/mock-mutation.yaml +6 -0
  13. package/config/semgrep-rules/test-modification.yaml +6 -0
  14. package/config/user-agents.yaml +23 -0
  15. package/dist/src/adapters/adapter-factory.js +29 -0
  16. package/dist/src/adapters/agent-adapter.js +32 -0
  17. package/dist/src/adapters/claude-code-adapter.js +126 -0
  18. package/dist/src/adapters/claude-code-teams.js +119 -0
  19. package/dist/src/adapters/codex-adapter.js +118 -0
  20. package/dist/src/adapters/copilot-adapter.js +224 -0
  21. package/dist/src/adapters/fatal-error-classifier.js +88 -0
  22. package/dist/src/adapters/index.js +44 -0
  23. package/dist/src/adapters/persistent-session.js +204 -0
  24. package/dist/src/adapters/process-supervisor.js +199 -0
  25. package/dist/src/agents-exporter.js +398 -0
  26. package/dist/src/analytics-log.js +161 -0
  27. package/dist/src/baseline-scanner.js +65 -0
  28. package/dist/src/bootstrap-evidence.js +88 -0
  29. package/dist/src/bootstrap-orchestrator.js +205 -0
  30. package/dist/src/bootstrap-types.js +5 -0
  31. package/dist/src/branch-merger.js +427 -0
  32. package/dist/src/cli/attest-handlers.js +44 -0
  33. package/dist/src/cli/cost-prompt.js +51 -0
  34. package/dist/src/cli/demo-handlers.js +274 -0
  35. package/dist/src/cli/flags.js +152 -0
  36. package/dist/src/cli/index.js +57 -0
  37. package/dist/src/cli/live-status.js +186 -0
  38. package/dist/src/cli/misc-handlers.js +242 -0
  39. package/dist/src/cli/plan-handlers.js +350 -0
  40. package/dist/src/cli/share-handlers.js +163 -0
  41. package/dist/src/cli/status-handlers.js +457 -0
  42. package/dist/src/cli/swarm-handlers.js +638 -0
  43. package/dist/src/cli/usage.js +72 -0
  44. package/dist/src/cli.js +217 -0
  45. package/dist/src/commit-pattern-detector.js +143 -0
  46. package/dist/src/commit-quality-analyzer.js +38 -0
  47. package/dist/src/config-loader.js +339 -0
  48. package/dist/src/context-broker.js +358 -0
  49. package/dist/src/copilot-cli-wrapper.js +258 -0
  50. package/dist/src/cost-estimator.js +241 -0
  51. package/dist/src/defaults.js +18 -0
  52. package/dist/src/demo-mode.js +180 -0
  53. package/dist/src/deployment-handler.js +78 -0
  54. package/dist/src/deployment-manager.js +228 -0
  55. package/dist/src/execution-queue.js +196 -0
  56. package/dist/src/external-tool-manager.js +184 -0
  57. package/dist/src/gate-prompt-builder.js +117 -0
  58. package/dist/src/gate-remediation.js +173 -0
  59. package/dist/src/github-issues-ingester.js +152 -0
  60. package/dist/src/github-mcp-integrator.js +164 -0
  61. package/dist/src/hook-generator.js +229 -0
  62. package/dist/src/index.js +48 -0
  63. package/dist/src/knowledge-base.js +300 -0
  64. package/dist/src/logger.js +111 -0
  65. package/dist/src/meta-analyzer.js +208 -0
  66. package/dist/src/metrics-collector.js +209 -0
  67. package/dist/src/metrics-types.js +5 -0
  68. package/dist/src/multi-repo-coordinator.js +179 -0
  69. package/dist/src/orchestrator/async-meta-analysis.js +84 -0
  70. package/dist/src/orchestrator/fatal-run-error.js +43 -0
  71. package/dist/src/orchestrator/final-gates-remediation.js +258 -0
  72. package/dist/src/orchestrator/git-state-utils.js +119 -0
  73. package/dist/src/orchestrator/pause-controller.js +55 -0
  74. package/dist/src/orchestrator/replan-runner.js +258 -0
  75. package/dist/src/orchestrator/step-executor.js +391 -0
  76. package/dist/src/orchestrator/wave-scheduler-loop.js +204 -0
  77. package/dist/src/owasp-mapper.js +153 -0
  78. package/dist/src/owasp-report-renderer.js +39 -0
  79. package/dist/src/plan-files.js +142 -0
  80. package/dist/src/plan-generator.js +1207 -0
  81. package/dist/src/pm-agent.js +296 -0
  82. package/dist/src/post-run-reporter.js +203 -0
  83. package/dist/src/pr-automation.js +103 -0
  84. package/dist/src/pr-manager.js +318 -0
  85. package/dist/src/presenter/index.js +209 -0
  86. package/dist/src/prompt-builder.js +173 -0
  87. package/dist/src/quality-gates/config-loader.js +196 -0
  88. package/dist/src/quality-gates/default-config.js +243 -0
  89. package/dist/src/quality-gates/file-utils.js +152 -0
  90. package/dist/src/quality-gates/gate-runner.js +171 -0
  91. package/dist/src/quality-gates/gates/accessibility.js +355 -0
  92. package/dist/src/quality-gates/gates/duplicate-blocks.js +144 -0
  93. package/dist/src/quality-gates/gates/hardcoded-config.js +52 -0
  94. package/dist/src/quality-gates/gates/readme-claims.js +62 -0
  95. package/dist/src/quality-gates/gates/runtime-checks.js +265 -0
  96. package/dist/src/quality-gates/gates/scaffold-defaults.js +108 -0
  97. package/dist/src/quality-gates/gates/test-coverage.js +240 -0
  98. package/dist/src/quality-gates/gates/test-file-protection.js +85 -0
  99. package/dist/src/quality-gates/gates/test-isolation.js +74 -0
  100. package/dist/src/quality-gates/index.js +17 -0
  101. package/dist/src/quality-gates/registry.js +205 -0
  102. package/dist/src/quality-gates/types.js +2 -0
  103. package/dist/src/quick-fix-mode.js +302 -0
  104. package/dist/src/recipe-loader.js +122 -0
  105. package/dist/src/repair-agent.js +396 -0
  106. package/dist/src/repo-analyzer.js +342 -0
  107. package/dist/src/report-generator.js +146 -0
  108. package/dist/src/report-renderer.js +90 -0
  109. package/dist/src/requirement-filter.js +52 -0
  110. package/dist/src/sarif-formatter.js +140 -0
  111. package/dist/src/scheduling/dependency-analyzer.js +178 -0
  112. package/dist/src/scheduling/work-stealing-queue.js +123 -0
  113. package/dist/src/secret-redactor.js +90 -0
  114. package/dist/src/session-executor.js +587 -0
  115. package/dist/src/session-manager.js +221 -0
  116. package/dist/src/share/transcript-verification.js +128 -0
  117. package/dist/src/share-parser.js +477 -0
  118. package/dist/src/spinner.js +146 -0
  119. package/dist/src/step-runner.js +365 -0
  120. package/dist/src/swarm-orchestrator.js +686 -0
  121. package/dist/src/task-classifier.js +134 -0
  122. package/dist/src/test-command-discovery.js +123 -0
  123. package/dist/src/text-similarity.js +24 -0
  124. package/dist/src/tier-maps.js +158 -0
  125. package/dist/src/types.js +5 -0
  126. package/dist/src/url-shortener.js +135 -0
  127. package/dist/src/verification/attestation.js +166 -0
  128. package/dist/src/verification/cheat-detector.js +240 -0
  129. package/dist/src/verification/command-runner.js +70 -0
  130. package/dist/src/verification/composite-score.js +157 -0
  131. package/dist/src/verification/cosign-attestation.js +137 -0
  132. package/dist/src/verification/diff-analysis.js +89 -0
  133. package/dist/src/verification/differential-gate.js +173 -0
  134. package/dist/src/verification/index.js +41 -0
  135. package/dist/src/verification/mutation-gate.js +242 -0
  136. package/dist/src/verification/property-gate.js +201 -0
  137. package/dist/src/verification/test-synthesizer.js +243 -0
  138. package/dist/src/verifier/outcome-checks.js +396 -0
  139. package/dist/src/verifier/transcript-checks.js +207 -0
  140. package/dist/src/verifier/verification-reporters.js +148 -0
  141. package/dist/src/verifier-engine.js +491 -0
  142. package/dist/src/wave-resizer.js +131 -0
  143. package/dist/src/wave-scheduler.js +44 -0
  144. package/dist/src/worktree-manager.js +368 -0
  145. package/dist/src/worktree-reserved-paths.js +97 -0
  146. package/package.json +80 -0
  147. package/plugin/agents/.gitkeep +0 -0
  148. package/plugin/agents/backend_master.agent.md +72 -0
  149. package/plugin/agents/devops_pro.agent.md +45 -0
  150. package/plugin/agents/frontend_expert.agent.md +59 -0
  151. package/plugin/agents/integrator_finalizer.agent.md +44 -0
  152. package/plugin/agents/meta_reviewer.agent.md +44 -0
  153. package/plugin/agents/security_auditor.agent.md +43 -0
  154. package/plugin/agents/tester_elite.agent.md +43 -0
  155. package/plugin/hooks/hooks.json +19 -0
  156. package/plugin/hooks/post-tool-use.json +9 -0
  157. package/plugin/hooks/pre-tool-use.json +9 -0
  158. package/plugin/plugin.json +47 -0
  159. package/plugin/skills/swarm-gates/SKILL.md +53 -0
  160. package/plugin/skills/swarm-orchestrate/SKILL.md +34 -0
  161. package/plugin/skills/swarm-verify/SKILL.md +44 -0
  162. package/templates/README.md +35 -0
  163. package/templates/cli-tool.json +31 -0
  164. package/templates/fullstack.json +52 -0
  165. package/templates/library.json +38 -0
  166. package/templates/react-app.json +45 -0
  167. package/templates/recipes/add-api-docs.json +35 -0
  168. package/templates/recipes/add-auth.json +47 -0
  169. package/templates/recipes/add-ci.json +39 -0
  170. package/templates/recipes/add-tests.json +39 -0
  171. package/templates/recipes/migrate-to-ts.json +42 -0
  172. package/templates/recipes/refactor-modularize.json +44 -0
  173. package/templates/recipes/security-audit.json +35 -0
  174. 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;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * Types for bootstrap analysis and multi-repo orchestration
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });