@specforge/mcp 3.0.7 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/autopilot/agents/agent-runner.d.ts.map +1 -1
  2. package/dist/autopilot/agents/agent-runner.js +7 -0
  3. package/dist/autopilot/agents/agent-runner.js.map +1 -1
  4. package/dist/autopilot/api/autopilot-api-client.d.ts +5 -4
  5. package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -1
  6. package/dist/autopilot/api/autopilot-api-client.js +21 -26
  7. package/dist/autopilot/api/autopilot-api-client.js.map +1 -1
  8. package/dist/autopilot/cli/run.d.ts.map +1 -1
  9. package/dist/autopilot/cli/run.js +28 -0
  10. package/dist/autopilot/cli/run.js.map +1 -1
  11. package/dist/autopilot/core/dependency-resolver.d.ts +10 -1
  12. package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -1
  13. package/dist/autopilot/core/dependency-resolver.js +27 -1
  14. package/dist/autopilot/core/dependency-resolver.js.map +1 -1
  15. package/dist/autopilot/core/dispatcher.d.ts +26 -0
  16. package/dist/autopilot/core/dispatcher.d.ts.map +1 -1
  17. package/dist/autopilot/core/dispatcher.js +116 -6
  18. package/dist/autopilot/core/dispatcher.js.map +1 -1
  19. package/dist/autopilot/readiness/aggregation.d.ts +56 -0
  20. package/dist/autopilot/readiness/aggregation.d.ts.map +1 -0
  21. package/dist/autopilot/readiness/aggregation.js +94 -0
  22. package/dist/autopilot/readiness/aggregation.js.map +1 -0
  23. package/dist/autopilot/readiness/config.d.ts +15 -0
  24. package/dist/autopilot/readiness/config.d.ts.map +1 -0
  25. package/dist/autopilot/readiness/config.js +76 -0
  26. package/dist/autopilot/readiness/config.js.map +1 -0
  27. package/dist/autopilot/readiness/index.d.ts +16 -0
  28. package/dist/autopilot/readiness/index.d.ts.map +1 -0
  29. package/dist/autopilot/readiness/index.js +11 -0
  30. package/dist/autopilot/readiness/index.js.map +1 -0
  31. package/dist/autopilot/readiness/post-scoring.d.ts +28 -0
  32. package/dist/autopilot/readiness/post-scoring.d.ts.map +1 -0
  33. package/dist/autopilot/readiness/post-scoring.js +41 -0
  34. package/dist/autopilot/readiness/post-scoring.js.map +1 -0
  35. package/dist/autopilot/readiness/preflight.d.ts +36 -0
  36. package/dist/autopilot/readiness/preflight.d.ts.map +1 -0
  37. package/dist/autopilot/readiness/preflight.js +93 -0
  38. package/dist/autopilot/readiness/preflight.js.map +1 -0
  39. package/dist/autopilot/readiness/prompt-section.d.ts +19 -0
  40. package/dist/autopilot/readiness/prompt-section.d.ts.map +1 -0
  41. package/dist/autopilot/readiness/prompt-section.js +33 -0
  42. package/dist/autopilot/readiness/prompt-section.js.map +1 -0
  43. package/dist/autopilot/readiness/types.d.ts +25 -0
  44. package/dist/autopilot/readiness/types.d.ts.map +1 -0
  45. package/dist/autopilot/readiness/types.js +8 -0
  46. package/dist/autopilot/readiness/types.js.map +1 -0
  47. package/dist/autopilot/sync/sync-manager.d.ts.map +1 -1
  48. package/dist/autopilot/sync/sync-manager.js +2 -1
  49. package/dist/autopilot/sync/sync-manager.js.map +1 -1
  50. package/dist/autopilot/types.d.ts +28 -0
  51. package/dist/autopilot/types.d.ts.map +1 -1
  52. package/dist/autopilot/types.js.map +1 -1
  53. package/dist/cli/commands/index.d.ts +5 -0
  54. package/dist/cli/commands/index.d.ts.map +1 -1
  55. package/dist/cli/commands/index.js +5 -0
  56. package/dist/cli/commands/index.js.map +1 -1
  57. package/dist/cli/commands/init.d.ts.map +1 -1
  58. package/dist/cli/commands/init.js +184 -2
  59. package/dist/cli/commands/init.js.map +1 -1
  60. package/dist/cli/commands/init.types.d.ts +37 -0
  61. package/dist/cli/commands/init.types.d.ts.map +1 -1
  62. package/dist/cli/commands/init.types.js +18 -0
  63. package/dist/cli/commands/init.types.js.map +1 -1
  64. package/dist/cli/commands/plan.d.ts +18 -0
  65. package/dist/cli/commands/plan.d.ts.map +1 -0
  66. package/dist/cli/commands/plan.js +154 -0
  67. package/dist/cli/commands/plan.js.map +1 -0
  68. package/dist/cli/commands/plan.types.d.ts +60 -0
  69. package/dist/cli/commands/plan.types.d.ts.map +1 -0
  70. package/dist/cli/commands/plan.types.js +8 -0
  71. package/dist/cli/commands/plan.types.js.map +1 -0
  72. package/dist/cli/commands/review-implementation.d.ts +16 -0
  73. package/dist/cli/commands/review-implementation.d.ts.map +1 -0
  74. package/dist/cli/commands/review-implementation.js +226 -0
  75. package/dist/cli/commands/review-implementation.js.map +1 -0
  76. package/dist/cli/commands/review-planning.d.ts +15 -0
  77. package/dist/cli/commands/review-planning.d.ts.map +1 -0
  78. package/dist/cli/commands/review-planning.js +177 -0
  79. package/dist/cli/commands/review-planning.js.map +1 -0
  80. package/dist/cli/commands/score/display.d.ts +20 -0
  81. package/dist/cli/commands/score/display.d.ts.map +1 -0
  82. package/dist/cli/commands/score/display.js +111 -0
  83. package/dist/cli/commands/score/display.js.map +1 -0
  84. package/dist/cli/commands/score/index.d.ts +9 -0
  85. package/dist/cli/commands/score/index.d.ts.map +1 -0
  86. package/dist/cli/commands/score/index.js +12 -0
  87. package/dist/cli/commands/score/index.js.map +1 -0
  88. package/dist/cli/commands/score/score.d.ts +17 -0
  89. package/dist/cli/commands/score/score.d.ts.map +1 -0
  90. package/dist/cli/commands/score/score.js +144 -0
  91. package/dist/cli/commands/score/score.js.map +1 -0
  92. package/dist/cli/commands/score/types.d.ts +79 -0
  93. package/dist/cli/commands/score/types.d.ts.map +1 -0
  94. package/dist/cli/commands/score/types.js +51 -0
  95. package/dist/cli/commands/score/types.js.map +1 -0
  96. package/dist/cli/commands/spec-activate.d.ts +29 -0
  97. package/dist/cli/commands/spec-activate.d.ts.map +1 -0
  98. package/dist/cli/commands/spec-activate.js +155 -0
  99. package/dist/cli/commands/spec-activate.js.map +1 -0
  100. package/dist/cli/commands/spec-activate.types.d.ts +24 -0
  101. package/dist/cli/commands/spec-activate.types.d.ts.map +1 -0
  102. package/dist/cli/commands/spec-activate.types.js +8 -0
  103. package/dist/cli/commands/spec-activate.types.js.map +1 -0
  104. package/dist/cli/commands/status.d.ts.map +1 -1
  105. package/dist/cli/commands/status.js +89 -1
  106. package/dist/cli/commands/status.js.map +1 -1
  107. package/dist/cli/commands/status.types.d.ts +2 -0
  108. package/dist/cli/commands/status.types.d.ts.map +1 -1
  109. package/dist/cli/commands/status.types.js.map +1 -1
  110. package/dist/cli/config/agent-teams.types.d.ts +194 -0
  111. package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
  112. package/dist/cli/config/agent-teams.types.js +36 -0
  113. package/dist/cli/config/agent-teams.types.js.map +1 -0
  114. package/dist/cli/config/index.d.ts +2 -0
  115. package/dist/cli/config/index.d.ts.map +1 -1
  116. package/dist/cli/config/index.js +2 -0
  117. package/dist/cli/config/index.js.map +1 -1
  118. package/dist/cli/config/loader.d.ts +36 -2
  119. package/dist/cli/config/loader.d.ts.map +1 -1
  120. package/dist/cli/config/loader.js +65 -0
  121. package/dist/cli/config/loader.js.map +1 -1
  122. package/dist/cli/config/validation.d.ts +69 -0
  123. package/dist/cli/config/validation.d.ts.map +1 -0
  124. package/dist/cli/config/validation.js +295 -0
  125. package/dist/cli/config/validation.js.map +1 -0
  126. package/dist/cli/config/writer.d.ts +39 -0
  127. package/dist/cli/config/writer.d.ts.map +1 -1
  128. package/dist/cli/config/writer.js +58 -0
  129. package/dist/cli/config/writer.js.map +1 -1
  130. package/dist/cli/index.d.ts.map +1 -1
  131. package/dist/cli/index.js +10 -8
  132. package/dist/cli/index.js.map +1 -1
  133. package/dist/lib/index.d.ts +3 -0
  134. package/dist/lib/index.d.ts.map +1 -1
  135. package/dist/lib/index.js +3 -0
  136. package/dist/lib/index.js.map +1 -1
  137. package/dist/lib/monorepo-detector.d.ts +31 -0
  138. package/dist/lib/monorepo-detector.d.ts.map +1 -0
  139. package/dist/lib/monorepo-detector.js +271 -0
  140. package/dist/lib/monorepo-detector.js.map +1 -0
  141. package/dist/lib/prompt-generator.d.ts +65 -0
  142. package/dist/lib/prompt-generator.d.ts.map +1 -0
  143. package/dist/lib/prompt-generator.js +174 -0
  144. package/dist/lib/prompt-generator.js.map +1 -0
  145. package/dist/lib/strategy-analyzer.d.ts +59 -0
  146. package/dist/lib/strategy-analyzer.d.ts.map +1 -0
  147. package/dist/lib/strategy-analyzer.js +137 -0
  148. package/dist/lib/strategy-analyzer.js.map +1 -0
  149. package/dist/tools/core/context-helper.d.ts +22 -0
  150. package/dist/tools/core/context-helper.d.ts.map +1 -1
  151. package/dist/tools/core/context-helper.js +37 -1
  152. package/dist/tools/core/context-helper.js.map +1 -1
  153. package/dist/tools/core/workspace-files.d.ts +49 -0
  154. package/dist/tools/core/workspace-files.d.ts.map +1 -0
  155. package/dist/tools/core/workspace-files.js +259 -0
  156. package/dist/tools/core/workspace-files.js.map +1 -0
  157. package/dist/tools/index.d.ts.map +1 -1
  158. package/dist/tools/index.js +147 -0
  159. package/dist/tools/index.js.map +1 -1
  160. package/package.json +3 -2
  161. package/src/cli/templates/agents/content/core/sfag-implementer.ts +113 -0
  162. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +107 -0
  163. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +126 -0
  164. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +132 -0
  165. package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +153 -0
  166. package/src/cli/templates/agents/content/task-type/sfag-api-implementer.ts +132 -0
  167. package/src/cli/templates/agents/content/task-type/sfag-docs-writer.ts +183 -0
  168. package/src/cli/templates/agents/content/task-type/sfag-frontend-builder.ts +141 -0
  169. package/src/cli/templates/agents/content/task-type/sfag-infra-architect.ts +149 -0
  170. package/src/cli/templates/agents/content/task-type/sfag-schema-designer.ts +132 -0
  171. package/src/cli/templates/agents/content/task-type/sfag-test-writer.ts +171 -0
  172. package/src/cli/templates/agents/index.ts +74 -0
  173. package/src/cli/templates/commands.ts +179 -0
  174. package/src/cli/templates/content/sf-autonomous.ts +78 -0
  175. package/src/cli/templates/content/sf-blockers.ts +68 -0
  176. package/src/cli/templates/content/sf-commit.ts +78 -0
  177. package/src/cli/templates/content/sf-context.ts +64 -0
  178. package/src/cli/templates/content/sf-create-epics.ts +129 -0
  179. package/src/cli/templates/content/sf-create-spec.ts +136 -0
  180. package/src/cli/templates/content/sf-create-tickets.ts +148 -0
  181. package/src/cli/templates/content/sf-epic.ts +69 -0
  182. package/src/cli/templates/content/sf-help.ts +61 -0
  183. package/src/cli/templates/content/sf-import.ts +88 -0
  184. package/src/cli/templates/content/sf-init.ts +61 -0
  185. package/src/cli/templates/content/sf-next.ts +67 -0
  186. package/src/cli/templates/content/sf-reset.ts +78 -0
  187. package/src/cli/templates/content/sf-review.ts +67 -0
  188. package/src/cli/templates/content/sf-search.ts +64 -0
  189. package/src/cli/templates/content/sf-status.ts +67 -0
  190. package/src/cli/templates/content/sf-ticket.ts +76 -0
  191. package/src/cli/templates/content/sf-validate.ts +78 -0
  192. package/src/cli/templates/index.ts +16 -0
  193. package/src/cli/templates/skills/specforge-conventions.md +109 -0
  194. package/src/cli/templates/skills/specforge-orchestrator.md +401 -0
  195. package/src/cli/templates/skills/specforge-validator.md +122 -0
  196. package/src/cli/templates/skills/specforge-worker.md +378 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Workspace-Scoped Worker Prompt Generator
3
+ *
4
+ * Generates context-rich prompts for Agent Teams workers and validators.
5
+ * Follows the Worker Initial Prompt and Validation Watcher Prompt templates
6
+ * from the design doc.
7
+ *
8
+ * Prompts are kept concise (~2000-4000 tokens) for worker context efficiency.
9
+ * Sections with no data are omitted entirely.
10
+ */
11
+ // ---------------------------------------------------------------------------
12
+ // Worker prompt
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * Generate a context-rich prompt for an Agent Teams worker.
16
+ *
17
+ * Omits entire sections when the corresponding data is missing.
18
+ */
19
+ export function generateWorkerPrompt(ticket, epic, spec, workspace, conventions) {
20
+ const sections = [];
21
+ // Header
22
+ sections.push(`# SpecForge Worker: Implementing E-T${ticket.ticketNumber}`, '', `**Epic:** ${epic.title}`, `**Spec:** ${spec.title}`, '');
23
+ // Ticket details
24
+ sections.push(`## Ticket: ${ticket.title}`, '');
25
+ sections.push('### Description', ticket.description, '');
26
+ // Implementation guide
27
+ const impl = ticket.implementation;
28
+ if (impl) {
29
+ const hasSteps = impl.steps && impl.steps.length > 0;
30
+ const hasCreate = impl.filesToCreate && impl.filesToCreate.length > 0;
31
+ const hasModify = impl.filesToModify && impl.filesToModify.length > 0;
32
+ if (hasSteps || hasCreate || hasModify) {
33
+ sections.push('### Implementation Guide', '');
34
+ if (hasSteps) {
35
+ sections.push(...impl.steps.map((step, i) => `${i + 1}. ${step}`), '');
36
+ }
37
+ if (hasCreate) {
38
+ sections.push('**Files to create:**');
39
+ sections.push(...impl.filesToCreate.map(f => `- \`${f}\``), '');
40
+ }
41
+ if (hasModify) {
42
+ sections.push('**Files to modify:**');
43
+ sections.push(...impl.filesToModify.map(f => `- \`${f}\``), '');
44
+ }
45
+ }
46
+ }
47
+ // Acceptance criteria
48
+ if (ticket.acceptanceCriteria && ticket.acceptanceCriteria.length > 0) {
49
+ sections.push('### Acceptance Criteria');
50
+ sections.push(...ticket.acceptanceCriteria.map(ac => `- [ ] ${ac.description}`), '');
51
+ }
52
+ // Technical details
53
+ if (ticket.technicalDetails && Object.keys(ticket.technicalDetails).length > 0) {
54
+ sections.push('### Technical Details');
55
+ sections.push(formatTechnicalDetails(ticket.technicalDetails), '');
56
+ }
57
+ // Tech stack from spec
58
+ if (spec.techStack && spec.techStack.length > 0) {
59
+ sections.push('### Tech Stack');
60
+ sections.push(spec.techStack.join(', '), '');
61
+ }
62
+ // Workspace info (monorepo)
63
+ if (workspace) {
64
+ sections.push('### Workspace');
65
+ sections.push(`- **Path:** ${workspace.path}`);
66
+ if (workspace.name) {
67
+ sections.push(`- **Package:** ${workspace.name}`);
68
+ }
69
+ if (workspace.framework) {
70
+ sections.push(`- **Framework:** ${workspace.framework}`);
71
+ }
72
+ if (workspace.dependencies && workspace.dependencies.length > 0) {
73
+ sections.push(`- **Key dependencies:** ${workspace.dependencies.join(', ')}`);
74
+ }
75
+ sections.push('');
76
+ }
77
+ // Conventions
78
+ if (conventions?.content) {
79
+ sections.push('### Conventions', conventions.content, '');
80
+ }
81
+ // Code standards from spec
82
+ if (spec.codeStandards) {
83
+ sections.push('### Code Standards', spec.codeStandards, '');
84
+ }
85
+ // Rules
86
+ sections.push('### Rules');
87
+ const rules = [
88
+ 'Only modify files listed in the implementation guide unless necessary',
89
+ "Follow the project's coding conventions",
90
+ 'Write tests for new functionality',
91
+ 'BEFORE starting implementation: call `start_work_session` with the ticketId to mark it active',
92
+ 'AFTER completing implementation and tests: call `complete_work_session` with ticketId, summary of work done, filesCreated, filesModified, filesDeleted, and validated: true',
93
+ 'If blocked: call `report_progress` with ticketId and a description of the blocker',
94
+ 'Report any blockers or discoveries to team-lead immediately',
95
+ ];
96
+ if (workspace) {
97
+ rules.unshift(`Only modify files within \`${workspace.path}/\` unless the ticket explicitly requires cross-workspace changes`);
98
+ }
99
+ sections.push(...rules.map(r => `- ${r}`), '');
100
+ return sections.join('\n').trimEnd();
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Validator prompt
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * Generate a prompt for an Agent Teams validation watcher.
107
+ */
108
+ export function generateValidatorPrompt(epic, validationCommands, workspace) {
109
+ const sections = [];
110
+ sections.push(`# SpecForge Validator: ${epic.title}`, '');
111
+ sections.push('## Your Role');
112
+ sections.push('You are the validation watcher for this epic.', 'After each teammate reports a ticket as complete:', '');
113
+ // Validation commands
114
+ const steps = [];
115
+ steps.push('1. Pull their changes');
116
+ if (validationCommands?.test) {
117
+ steps.push(`2. Run tests: \`${validationCommands.test}\``);
118
+ }
119
+ if (validationCommands?.lint) {
120
+ steps.push(`${steps.length + 1}. Run lint: \`${validationCommands.lint}\``);
121
+ }
122
+ if (validationCommands?.typeCheck) {
123
+ steps.push(`${steps.length + 1}. Run type check: \`${validationCommands.typeCheck}\``);
124
+ }
125
+ if (validationCommands?.build) {
126
+ steps.push(`${steps.length + 1}. Run build: \`${validationCommands.build}\``);
127
+ }
128
+ steps.push(`${steps.length + 1}. Report results to team-lead`);
129
+ sections.push(...steps, '');
130
+ // Workspace scope
131
+ if (workspace) {
132
+ sections.push('## Workspace');
133
+ sections.push(`- **Path:** ${workspace.path}`);
134
+ if (workspace.framework) {
135
+ sections.push(`- **Framework:** ${workspace.framework}`);
136
+ }
137
+ sections.push('');
138
+ }
139
+ // Rules
140
+ sections.push('## Rules');
141
+ sections.push('- Do NOT modify code yourself', '- If tests fail, message the worker with specific errors and file:line references', '- If all checks pass, confirm to team-lead', '- Run validations in the correct workspace directory', '');
142
+ // Reporting format
143
+ sections.push('## Reporting Format');
144
+ sections.push('**On success:**', '> Ticket E-T{n} validated. All checks passed.', '', '**On failure:**', '> Ticket E-T{n} failed validation:', '> - {check}: {error message} ({file}:{line})', '');
145
+ return sections.join('\n').trimEnd();
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // Helpers
149
+ // ---------------------------------------------------------------------------
150
+ /**
151
+ * Format technical details as a readable key-value list.
152
+ * Handles nested objects and arrays.
153
+ */
154
+ function formatTechnicalDetails(details) {
155
+ const lines = [];
156
+ for (const [key, value] of Object.entries(details)) {
157
+ if (value === null || value === undefined)
158
+ continue;
159
+ const label = key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase());
160
+ if (Array.isArray(value)) {
161
+ if (value.length > 0) {
162
+ lines.push(`- **${label}:** ${value.join(', ')}`);
163
+ }
164
+ }
165
+ else if (typeof value === 'object') {
166
+ lines.push(`- **${label}:** ${JSON.stringify(value)}`);
167
+ }
168
+ else {
169
+ lines.push(`- **${label}:** ${String(value)}`);
170
+ }
171
+ }
172
+ return lines.join('\n');
173
+ }
174
+ //# sourceMappingURL=prompt-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-generator.js","sourceRoot":"","sources":["../../src/lib/prompt-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Strategy Auto-Detection Analyzer
3
+ *
4
+ * Pure function that determines the optimal Agent Teams strategy
5
+ * based on a specification's structure: epic count, ticket distribution,
6
+ * and cross-epic dependency density.
7
+ *
8
+ * Decision matrix (from design doc):
9
+ * - 1 epic, ≤3 tickets → single-session
10
+ * - 1 epic, >3 tickets → spec-as-team
11
+ * - N epics, 0 cross-deps → epic-as-team
12
+ * - N epics, >50% cross-deps → spec-as-team
13
+ * - N epics, moderate cross-deps → epic-as-team with merged pairs
14
+ */
15
+ /** Tickets with cross-epic deps / total tickets. Above this → spec-as-team. */
16
+ export declare const CROSS_DEP_THRESHOLD = 0.5;
17
+ /** Max tickets for a single-session recommendation (single epic only). */
18
+ export declare const SINGLE_SESSION_MAX_TICKETS = 3;
19
+ export interface SpecSummary {
20
+ id: string;
21
+ title: string;
22
+ epicCount: number;
23
+ }
24
+ export interface EpicSummary {
25
+ id: string;
26
+ title: string;
27
+ ticketCount: number;
28
+ }
29
+ export interface TicketSummary {
30
+ id: string;
31
+ epicId: string;
32
+ dependencies: string[];
33
+ }
34
+ /**
35
+ * A dependency edge between two tickets in different epics.
36
+ */
37
+ export interface DependencyEdge {
38
+ fromEpicId: string;
39
+ toEpicId: string;
40
+ fromTicketId: string;
41
+ toTicketId: string;
42
+ }
43
+ export type Strategy = 'single-session' | 'spec-as-team' | 'epic-as-team';
44
+ export interface StrategyRecommendation {
45
+ strategy: Strategy;
46
+ reasoning: string;
47
+ /** Epic ID groups that should be merged into a single team (for moderate cross-deps). */
48
+ mergedEpics?: string[][];
49
+ }
50
+ /**
51
+ * Analyze a specification's structure and recommend an Agent Teams strategy.
52
+ *
53
+ * This is a **pure function** — no side effects, no API calls.
54
+ * All data must be pre-fetched and passed in.
55
+ *
56
+ * @throws {Error} If the specification has no epics or no tickets.
57
+ */
58
+ export declare function analyzeStrategy(spec: SpecSummary, epics: EpicSummary[], ticketsByEpic: Map<string, TicketSummary[]>, dependencyEdges: DependencyEdge[]): StrategyRecommendation;
59
+ //# sourceMappingURL=strategy-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy-analyzer.d.ts","sourceRoot":"","sources":["../../src/lib/strategy-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,0EAA0E;AAC1E,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAM5C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC1B;AAMD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,WAAW,EAAE,EACpB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,EAC3C,eAAe,EAAE,cAAc,EAAE,GAChC,sBAAsB,CA+DxB"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Strategy Auto-Detection Analyzer
3
+ *
4
+ * Pure function that determines the optimal Agent Teams strategy
5
+ * based on a specification's structure: epic count, ticket distribution,
6
+ * and cross-epic dependency density.
7
+ *
8
+ * Decision matrix (from design doc):
9
+ * - 1 epic, ≤3 tickets → single-session
10
+ * - 1 epic, >3 tickets → spec-as-team
11
+ * - N epics, 0 cross-deps → epic-as-team
12
+ * - N epics, >50% cross-deps → spec-as-team
13
+ * - N epics, moderate cross-deps → epic-as-team with merged pairs
14
+ */
15
+ // ---------------------------------------------------------------------------
16
+ // Tuning constants
17
+ // ---------------------------------------------------------------------------
18
+ /** Tickets with cross-epic deps / total tickets. Above this → spec-as-team. */
19
+ export const CROSS_DEP_THRESHOLD = 0.5;
20
+ /** Max tickets for a single-session recommendation (single epic only). */
21
+ export const SINGLE_SESSION_MAX_TICKETS = 3;
22
+ // ---------------------------------------------------------------------------
23
+ // Core analyzer
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Analyze a specification's structure and recommend an Agent Teams strategy.
27
+ *
28
+ * This is a **pure function** — no side effects, no API calls.
29
+ * All data must be pre-fetched and passed in.
30
+ *
31
+ * @throws {Error} If the specification has no epics or no tickets.
32
+ */
33
+ export function analyzeStrategy(spec, epics, ticketsByEpic, dependencyEdges) {
34
+ // --- Guard: empty specification ---
35
+ const totalTickets = epics.reduce((sum, e) => sum + e.ticketCount, 0);
36
+ if (epics.length === 0 || totalTickets === 0) {
37
+ throw new Error('Cannot analyze empty specification');
38
+ }
39
+ // --- Single epic path ---
40
+ if (epics.length === 1) {
41
+ const epic = epics[0];
42
+ if (epic.ticketCount <= SINGLE_SESSION_MAX_TICKETS) {
43
+ return {
44
+ strategy: 'single-session',
45
+ reasoning: `Small specification with ${epic.ticketCount} ticket${epic.ticketCount === 1 ? '' : 's'} in single epic`,
46
+ };
47
+ }
48
+ return {
49
+ strategy: 'spec-as-team',
50
+ reasoning: `Single epic with ${epic.ticketCount} tickets benefits from parallel workers`,
51
+ };
52
+ }
53
+ // --- Multiple epics path ---
54
+ // Count tickets that have at least one dependency on a ticket in another epic.
55
+ const crossDepTicketIds = new Set();
56
+ for (const edge of dependencyEdges) {
57
+ crossDepTicketIds.add(edge.fromTicketId);
58
+ crossDepTicketIds.add(edge.toTicketId);
59
+ }
60
+ const crossDepRatio = totalTickets > 0 ? crossDepTicketIds.size / totalTickets : 0;
61
+ // No cross-epic dependencies → each epic can run independently.
62
+ if (dependencyEdges.length === 0) {
63
+ return {
64
+ strategy: 'epic-as-team',
65
+ reasoning: `Multiple independent epics (${epics.length}) can be parallelized as separate teams`,
66
+ };
67
+ }
68
+ // Heavy cross-epic dependencies → single unified team.
69
+ if (crossDepRatio > CROSS_DEP_THRESHOLD) {
70
+ const pct = Math.round(crossDepRatio * 100);
71
+ return {
72
+ strategy: 'spec-as-team',
73
+ reasoning: `Heavy cross-epic dependencies (${pct}%) require unified team coordination`,
74
+ };
75
+ }
76
+ // Moderate cross-epic dependencies → epic-as-team with merged pairs.
77
+ const mergedEpics = buildMergedEpicGroups(epics, dependencyEdges);
78
+ const pct = Math.round(crossDepRatio * 100);
79
+ return {
80
+ strategy: 'epic-as-team',
81
+ reasoning: `Multiple epics with moderate cross-dependencies (${pct}%); tightly coupled epics merged into ${mergedEpics.length} group${mergedEpics.length === 1 ? '' : 's'}`,
82
+ mergedEpics,
83
+ };
84
+ }
85
+ // ---------------------------------------------------------------------------
86
+ // Helpers
87
+ // ---------------------------------------------------------------------------
88
+ /**
89
+ * Build groups of epics that should be merged into a single team
90
+ * because they share bidirectional (or dense) dependency edges.
91
+ *
92
+ * Uses a simple union-find to cluster epics connected by dependency edges.
93
+ */
94
+ function buildMergedEpicGroups(epics, edges) {
95
+ // Union-Find (disjoint set)
96
+ const parent = new Map();
97
+ function find(x) {
98
+ let root = x;
99
+ while (parent.get(root) !== root) {
100
+ root = parent.get(root);
101
+ }
102
+ // Path compression
103
+ let current = x;
104
+ while (current !== root) {
105
+ const next = parent.get(current);
106
+ parent.set(current, root);
107
+ current = next;
108
+ }
109
+ return root;
110
+ }
111
+ function union(a, b) {
112
+ const ra = find(a);
113
+ const rb = find(b);
114
+ if (ra !== rb) {
115
+ parent.set(ra, rb);
116
+ }
117
+ }
118
+ // Initialize each epic as its own set.
119
+ for (const epic of epics) {
120
+ parent.set(epic.id, epic.id);
121
+ }
122
+ // Merge epics that share dependency edges.
123
+ for (const edge of edges) {
124
+ union(edge.fromEpicId, edge.toEpicId);
125
+ }
126
+ // Collect groups (only groups with >1 epic are meaningful merges).
127
+ const groups = new Map();
128
+ for (const epic of epics) {
129
+ const root = find(epic.id);
130
+ if (!groups.has(root)) {
131
+ groups.set(root, []);
132
+ }
133
+ groups.get(root).push(epic.id);
134
+ }
135
+ return Array.from(groups.values()).filter(g => g.length > 1);
136
+ }
137
+ //# sourceMappingURL=strategy-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy-analyzer.js","sourceRoot":"","sources":["../../src/lib/strategy-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AA+C5C,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAiB,EACjB,KAAoB,EACpB,aAA2C,EAC3C,eAAiC;IAEjC,qCAAqC;IACrC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAEtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,2BAA2B;IAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,IAAI,CAAC,WAAW,IAAI,0BAA0B,EAAE,CAAC;YACnD,OAAO;gBACL,QAAQ,EAAE,gBAAgB;gBAC1B,SAAS,EAAE,4BAA4B,IAAI,CAAC,WAAW,UAAU,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,iBAAiB;aACpH,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,oBAAoB,IAAI,CAAC,WAAW,yCAAyC;SACzF,CAAC;IACJ,CAAC;IAED,8BAA8B;IAE9B,+EAA+E;IAC/E,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,gEAAgE;IAChE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,+BAA+B,KAAK,CAAC,MAAM,yCAAyC;SAChG,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,aAAa,GAAG,mBAAmB,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;QAC5C,OAAO;YACL,QAAQ,EAAE,cAAc;YACxB,SAAS,EAAE,kCAAkC,GAAG,sCAAsC;SACvF,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,MAAM,WAAW,GAAG,qBAAqB,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;IAE5C,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,oDAAoD,GAAG,yCAAyC,WAAW,CAAC,MAAM,SAAS,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;QAC3K,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,qBAAqB,CAC5B,KAAoB,EACpB,KAAuB;IAEvB,4BAA4B;IAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,SAAS,IAAI,CAAC,CAAS;QACrB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAC3B,CAAC;QACD,mBAAmB;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,2CAA2C;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,mEAAmE;IACnE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -1,4 +1,26 @@
1
+ import type { ResolvedAgentTeamsConfig } from '../../cli/config/loader.js';
2
+ import type { ActiveSpecification, MonorepoConfig } from '../../cli/config/agent-teams.types.js';
1
3
  type ContextField = 'projectId' | 'specificationId';
4
+ /**
5
+ * Get the resolved Agent Teams config from .specforge.json.
6
+ *
7
+ * Always returns a fully-resolved config with defaults applied (never null).
8
+ * Tools like `get_implementation_plan` use this to read the user's preferred
9
+ * strategy, worker limits, and other settings.
10
+ */
11
+ export declare function getAgentTeamsContext(): ResolvedAgentTeamsConfig;
12
+ /**
13
+ * Get the active specification from .specforge.json.
14
+ *
15
+ * @returns ActiveSpecification if set, null if no spec is activated
16
+ */
17
+ export declare function getActiveSpecificationContext(): ActiveSpecification | null;
18
+ /**
19
+ * Get the monorepo config from .specforge.json.
20
+ *
21
+ * @returns MonorepoConfig with defaults applied, or null if section absent
22
+ */
23
+ export declare function getMonorepoContext(): MonorepoConfig | null;
2
24
  /**
3
25
  * Inject missing context fields from .specforge.json
4
26
  * Explicit args always take precedence over config values
@@ -1 +1 @@
1
- {"version":3,"file":"context-helper.d.ts","sourceRoot":"","sources":["../../../src/tools/core/context-helper.ts"],"names":[],"mappings":"AAYA,KAAK,YAAY,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAmBpD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,YAAY,EAAE,GACrB,CAAC,CAaH;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrE,IAAI,EAAE,CAAC,EACP,cAAc,EAAE,YAAY,EAAE,EAC9B,cAAc,GAAE,YAAY,EAAO,GAClC,CAAC,CAWH"}
1
+ {"version":3,"file":"context-helper.d.ts","sourceRoot":"","sources":["../../../src/tools/core/context-helper.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACf,MAAM,uCAAuC,CAAC;AAE/C,KAAK,YAAY,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAuBpD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,wBAAwB,CAG/D;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,mBAAmB,GAAG,IAAI,CAG1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,GAAG,IAAI,CAG1D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7D,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,YAAY,EAAE,GACrB,CAAC,CAaH;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrE,IAAI,EAAE,CAAC,EACP,cAAc,EAAE,YAAY,EAAE,EAC9B,cAAc,GAAE,YAAY,EAAO,GAClC,CAAC,CAWH"}
@@ -5,8 +5,12 @@
5
5
  * Provides utilities for injecting working context from .specforge.json
6
6
  * into tool arguments. This ensures tools scope to the correct project/specification
7
7
  * when not explicitly provided.
8
+ *
9
+ * Also exposes Agent Teams configuration sections (agentTeams, activeSpecification,
10
+ * monorepo) so that MCP operations can access user preferences without
11
+ * re-reading the config file.
8
12
  */
9
- import { loadProjectConfig } from '../../cli/config/loader.js';
13
+ import { loadProjectConfig, getAgentTeamsConfig as resolveAgentTeamsConfig, getActiveSpecification as resolveActiveSpecification, getMonorepoConfig as resolveMonorepoConfig, } from '../../cli/config/loader.js';
10
14
  /**
11
15
  * Get context from .specforge.json file
12
16
  * This is the source of truth for the current project/specification
@@ -18,6 +22,38 @@ function getLocalContext() {
18
22
  specificationId: config?.specificationId,
19
23
  };
20
24
  }
25
+ // ---------------------------------------------------------------------------
26
+ // Agent Teams config accessors
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Get the resolved Agent Teams config from .specforge.json.
30
+ *
31
+ * Always returns a fully-resolved config with defaults applied (never null).
32
+ * Tools like `get_implementation_plan` use this to read the user's preferred
33
+ * strategy, worker limits, and other settings.
34
+ */
35
+ export function getAgentTeamsContext() {
36
+ const config = loadProjectConfig();
37
+ return resolveAgentTeamsConfig(config);
38
+ }
39
+ /**
40
+ * Get the active specification from .specforge.json.
41
+ *
42
+ * @returns ActiveSpecification if set, null if no spec is activated
43
+ */
44
+ export function getActiveSpecificationContext() {
45
+ const config = loadProjectConfig();
46
+ return resolveActiveSpecification(config);
47
+ }
48
+ /**
49
+ * Get the monorepo config from .specforge.json.
50
+ *
51
+ * @returns MonorepoConfig with defaults applied, or null if section absent
52
+ */
53
+ export function getMonorepoContext() {
54
+ const config = loadProjectConfig();
55
+ return resolveMonorepoConfig(config);
56
+ }
21
57
  /**
22
58
  * Inject missing context fields from .specforge.json
23
59
  * Explicit args always take precedence over config values
@@ -1 +1 @@
1
- {"version":3,"file":"context-helper.js","sourceRoot":"","sources":["../../../src/tools/core/context-helper.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAS/D;;;GAGG;AACH,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,OAAO;QACL,SAAS,EAAE,MAAM,EAAE,SAAS;QAC5B,eAAe,EAAE,MAAM,EAAE,eAAe;KACzC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAO,EACP,MAAsB;IAEtB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAO,EACP,cAA8B,EAC9B,iBAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACnD,sEAAsE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"context-helper.js","sourceRoot":"","sources":["../../../src/tools/core/context-helper.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC;;;;;;;;;;GAUG;AAEH,OAAO,EACL,iBAAiB,EACjB,mBAAmB,IAAI,uBAAuB,EAC9C,sBAAsB,IAAI,0BAA0B,EACpD,iBAAiB,IAAI,qBAAqB,GAC3C,MAAM,4BAA4B,CAAC;AAcpC;;;GAGG;AACH,SAAS,eAAe;IACtB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,OAAO;QACL,SAAS,EAAE,MAAM,EAAE,SAAS;QAC5B,eAAe,EAAE,MAAM,EAAE,eAAe;KACzC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,OAAO,uBAAuB,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,OAAO,0BAA0B,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAO,EACP,MAAsB;IAEtB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEpD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAO,EACP,cAA8B,EAC9B,iBAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACnD,sEAAsE,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,49 @@
1
+ interface PackageJsonSummary {
2
+ name: string;
3
+ version?: string;
4
+ scripts: Record<string, string>;
5
+ dependencies: Record<string, string>;
6
+ devDependencies: Record<string, string>;
7
+ }
8
+ interface TsConfigSummary {
9
+ compilerOptions: Record<string, unknown> | null;
10
+ paths: Record<string, string[]> | null;
11
+ }
12
+ interface WorkspaceMetadata {
13
+ /** Absolute path to the workspace */
14
+ path: string;
15
+ /** Package name from package.json */
16
+ name: string | null;
17
+ /** Detected framework (Next.js, Express, React, etc.) */
18
+ framework: string | null;
19
+ /** Whether the workspace has tests */
20
+ hasTests: boolean;
21
+ /** Test command from scripts */
22
+ testCommand: string | null;
23
+ /** Lint command from scripts */
24
+ lintCommand: string | null;
25
+ /** Type check command from scripts */
26
+ typecheckCommand: string | null;
27
+ /** Build command from scripts */
28
+ buildCommand: string | null;
29
+ /** Parsed package.json summary (null if not found) */
30
+ packageJson: PackageJsonSummary | null;
31
+ /** Parsed tsconfig.json summary (null if not found) */
32
+ tsConfig: TsConfigSummary | null;
33
+ /** First 50 lines of README.md (null if not found) */
34
+ readme: string | null;
35
+ /** Contents of .env.example (null if not found) */
36
+ envExample: string | null;
37
+ /** Key dependencies relevant to the workspace */
38
+ keyDependencies: Record<string, string>;
39
+ }
40
+ /**
41
+ * Get workspace metadata for a given directory path.
42
+ *
43
+ * @param args.workspacePath - Path to the workspace (absolute or relative to projectRoot)
44
+ * @param args.projectRoot - Optional project root for resolving relative paths
45
+ * @returns Structured workspace metadata
46
+ */
47
+ export declare function getWorkspaceFiles(args: Record<string, unknown>): Promise<WorkspaceMetadata>;
48
+ export {};
49
+ //# sourceMappingURL=workspace-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../../src/tools/core/workspace-files.ts"],"names":[],"mappings":"AAqBA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,UAAU,eAAe;IACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;CACxC;AAED,UAAU,iBAAiB;IACzB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,yDAAyD;IACzD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,gCAAgC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,gCAAgC;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iCAAiC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sDAAsD;IACtD,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACvC,uDAAuD;IACvD,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,sDAAsD;IACtD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,mDAAmD;IACnD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAkKD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAyG5B"}