@specforge/mcp 3.0.7 → 3.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.
Files changed (120) hide show
  1. package/dist/cli/commands/index.d.ts +2 -0
  2. package/dist/cli/commands/index.d.ts.map +1 -1
  3. package/dist/cli/commands/index.js +2 -0
  4. package/dist/cli/commands/index.js.map +1 -1
  5. package/dist/cli/commands/init.d.ts.map +1 -1
  6. package/dist/cli/commands/init.js +184 -2
  7. package/dist/cli/commands/init.js.map +1 -1
  8. package/dist/cli/commands/init.types.d.ts +37 -0
  9. package/dist/cli/commands/init.types.d.ts.map +1 -1
  10. package/dist/cli/commands/init.types.js +18 -0
  11. package/dist/cli/commands/init.types.js.map +1 -1
  12. package/dist/cli/commands/plan.d.ts +18 -0
  13. package/dist/cli/commands/plan.d.ts.map +1 -0
  14. package/dist/cli/commands/plan.js +154 -0
  15. package/dist/cli/commands/plan.js.map +1 -0
  16. package/dist/cli/commands/plan.types.d.ts +60 -0
  17. package/dist/cli/commands/plan.types.d.ts.map +1 -0
  18. package/dist/cli/commands/plan.types.js +8 -0
  19. package/dist/cli/commands/plan.types.js.map +1 -0
  20. package/dist/cli/commands/spec-activate.d.ts +29 -0
  21. package/dist/cli/commands/spec-activate.d.ts.map +1 -0
  22. package/dist/cli/commands/spec-activate.js +155 -0
  23. package/dist/cli/commands/spec-activate.js.map +1 -0
  24. package/dist/cli/commands/spec-activate.types.d.ts +24 -0
  25. package/dist/cli/commands/spec-activate.types.d.ts.map +1 -0
  26. package/dist/cli/commands/spec-activate.types.js +8 -0
  27. package/dist/cli/commands/spec-activate.types.js.map +1 -0
  28. package/dist/cli/commands/status.d.ts.map +1 -1
  29. package/dist/cli/commands/status.js +89 -1
  30. package/dist/cli/commands/status.js.map +1 -1
  31. package/dist/cli/commands/status.types.d.ts +2 -0
  32. package/dist/cli/commands/status.types.d.ts.map +1 -1
  33. package/dist/cli/commands/status.types.js.map +1 -1
  34. package/dist/cli/config/agent-teams.types.d.ts +194 -0
  35. package/dist/cli/config/agent-teams.types.d.ts.map +1 -0
  36. package/dist/cli/config/agent-teams.types.js +36 -0
  37. package/dist/cli/config/agent-teams.types.js.map +1 -0
  38. package/dist/cli/config/index.d.ts +2 -0
  39. package/dist/cli/config/index.d.ts.map +1 -1
  40. package/dist/cli/config/index.js +2 -0
  41. package/dist/cli/config/index.js.map +1 -1
  42. package/dist/cli/config/loader.d.ts +36 -2
  43. package/dist/cli/config/loader.d.ts.map +1 -1
  44. package/dist/cli/config/loader.js +65 -0
  45. package/dist/cli/config/loader.js.map +1 -1
  46. package/dist/cli/config/validation.d.ts +69 -0
  47. package/dist/cli/config/validation.d.ts.map +1 -0
  48. package/dist/cli/config/validation.js +295 -0
  49. package/dist/cli/config/validation.js.map +1 -0
  50. package/dist/cli/config/writer.d.ts +39 -0
  51. package/dist/cli/config/writer.d.ts.map +1 -1
  52. package/dist/cli/config/writer.js +58 -0
  53. package/dist/cli/config/writer.js.map +1 -1
  54. package/dist/cli/index.d.ts.map +1 -1
  55. package/dist/cli/index.js +5 -1
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/lib/index.d.ts +3 -0
  58. package/dist/lib/index.d.ts.map +1 -1
  59. package/dist/lib/index.js +3 -0
  60. package/dist/lib/index.js.map +1 -1
  61. package/dist/lib/monorepo-detector.d.ts +31 -0
  62. package/dist/lib/monorepo-detector.d.ts.map +1 -0
  63. package/dist/lib/monorepo-detector.js +271 -0
  64. package/dist/lib/monorepo-detector.js.map +1 -0
  65. package/dist/lib/prompt-generator.d.ts +65 -0
  66. package/dist/lib/prompt-generator.d.ts.map +1 -0
  67. package/dist/lib/prompt-generator.js +172 -0
  68. package/dist/lib/prompt-generator.js.map +1 -0
  69. package/dist/lib/strategy-analyzer.d.ts +59 -0
  70. package/dist/lib/strategy-analyzer.d.ts.map +1 -0
  71. package/dist/lib/strategy-analyzer.js +137 -0
  72. package/dist/lib/strategy-analyzer.js.map +1 -0
  73. package/dist/tools/core/context-helper.d.ts +22 -0
  74. package/dist/tools/core/context-helper.d.ts.map +1 -1
  75. package/dist/tools/core/context-helper.js +37 -1
  76. package/dist/tools/core/context-helper.js.map +1 -1
  77. package/dist/tools/core/workspace-files.d.ts +49 -0
  78. package/dist/tools/core/workspace-files.d.ts.map +1 -0
  79. package/dist/tools/core/workspace-files.js +259 -0
  80. package/dist/tools/core/workspace-files.js.map +1 -0
  81. package/dist/tools/index.d.ts.map +1 -1
  82. package/dist/tools/index.js +147 -0
  83. package/dist/tools/index.js.map +1 -1
  84. package/package.json +3 -2
  85. package/src/cli/templates/agents/content/core/sfag-implementer.ts +113 -0
  86. package/src/cli/templates/agents/content/core/sfag-orchestrator.ts +107 -0
  87. package/src/cli/templates/agents/content/core/sfag-spec-creator.ts +126 -0
  88. package/src/cli/templates/agents/content/core/sfag-ticket-implementer.ts +132 -0
  89. package/src/cli/templates/agents/content/research/sfag-package-researcher.ts +153 -0
  90. package/src/cli/templates/agents/content/task-type/sfag-api-implementer.ts +132 -0
  91. package/src/cli/templates/agents/content/task-type/sfag-docs-writer.ts +183 -0
  92. package/src/cli/templates/agents/content/task-type/sfag-frontend-builder.ts +141 -0
  93. package/src/cli/templates/agents/content/task-type/sfag-infra-architect.ts +149 -0
  94. package/src/cli/templates/agents/content/task-type/sfag-schema-designer.ts +132 -0
  95. package/src/cli/templates/agents/content/task-type/sfag-test-writer.ts +171 -0
  96. package/src/cli/templates/agents/index.ts +74 -0
  97. package/src/cli/templates/commands.ts +179 -0
  98. package/src/cli/templates/content/sf-autonomous.ts +78 -0
  99. package/src/cli/templates/content/sf-blockers.ts +68 -0
  100. package/src/cli/templates/content/sf-commit.ts +78 -0
  101. package/src/cli/templates/content/sf-context.ts +64 -0
  102. package/src/cli/templates/content/sf-create-epics.ts +129 -0
  103. package/src/cli/templates/content/sf-create-spec.ts +136 -0
  104. package/src/cli/templates/content/sf-create-tickets.ts +148 -0
  105. package/src/cli/templates/content/sf-epic.ts +69 -0
  106. package/src/cli/templates/content/sf-help.ts +61 -0
  107. package/src/cli/templates/content/sf-import.ts +88 -0
  108. package/src/cli/templates/content/sf-init.ts +61 -0
  109. package/src/cli/templates/content/sf-next.ts +67 -0
  110. package/src/cli/templates/content/sf-reset.ts +78 -0
  111. package/src/cli/templates/content/sf-review.ts +67 -0
  112. package/src/cli/templates/content/sf-search.ts +64 -0
  113. package/src/cli/templates/content/sf-status.ts +67 -0
  114. package/src/cli/templates/content/sf-ticket.ts +76 -0
  115. package/src/cli/templates/content/sf-validate.ts +78 -0
  116. package/src/cli/templates/index.ts +16 -0
  117. package/src/cli/templates/skills/specforge-conventions.md +109 -0
  118. package/src/cli/templates/skills/specforge-orchestrator.md +401 -0
  119. package/src/cli/templates/skills/specforge-validator.md +122 -0
  120. package/src/cli/templates/skills/specforge-worker.md +378 -0
@@ -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":"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"}
@@ -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"}
@@ -0,0 +1,259 @@
1
+ // mcp/src/tools/core/workspace-files.ts
2
+ /**
3
+ * Workspace Files Tool
4
+ *
5
+ * Local filesystem operation that returns workspace metadata needed by workers.
6
+ * Given a workspace path (or auto-detected from project root), returns parsed
7
+ * configuration files, framework detection, and key dependency information.
8
+ *
9
+ * NOTE: This runs locally in the MCP server (stdio transport). It requires
10
+ * filesystem access and will not work over SSE/cloud transports.
11
+ */
12
+ import * as fs from 'node:fs';
13
+ import * as path from 'node:path';
14
+ import { findProjectRoot } from '../../cli/config/paths.js';
15
+ // ============================================================================
16
+ // Framework detection mapping
17
+ // ============================================================================
18
+ const FRAMEWORK_DETECTION = {
19
+ 'next': 'Next.js',
20
+ 'nuxt': 'Nuxt',
21
+ '@nestjs/core': 'NestJS',
22
+ 'express': 'Express',
23
+ 'fastify': 'Fastify',
24
+ '@angular/core': 'Angular',
25
+ 'react': 'React',
26
+ 'vue': 'Vue',
27
+ 'svelte': 'Svelte',
28
+ '@remix-run/react': 'Remix',
29
+ 'gatsby': 'Gatsby',
30
+ 'hono': 'Hono',
31
+ 'elysia': 'Elysia',
32
+ };
33
+ /**
34
+ * Well-known dependencies that are useful context for workers.
35
+ * Only included if present in the workspace.
36
+ */
37
+ const KEY_DEPENDENCY_NAMES = new Set([
38
+ // Frameworks
39
+ 'next', 'react', 'react-dom', 'vue', 'angular', 'svelte', 'express', 'fastify', '@nestjs/core',
40
+ // State management
41
+ 'redux', '@reduxjs/toolkit', 'zustand', 'mobx', 'jotai', 'recoil',
42
+ // UI
43
+ '@mui/material', '@chakra-ui/react', 'tailwindcss', 'styled-components', '@emotion/react',
44
+ // Data fetching
45
+ 'axios', '@tanstack/react-query', 'swr', '@apollo/client', 'graphql',
46
+ // Database
47
+ 'prisma', '@prisma/client', 'drizzle-orm', 'typeorm', 'sequelize', 'mongoose', 'knex',
48
+ // Auth
49
+ 'next-auth', 'passport', 'jsonwebtoken', '@auth/core',
50
+ // Testing
51
+ 'jest', 'vitest', '@testing-library/react', 'playwright', 'cypress', 'mocha',
52
+ // AWS
53
+ 'aws-amplify', '@aws-sdk/client-s3', '@aws-sdk/client-dynamodb', 'aws-cdk-lib',
54
+ // Build tools
55
+ 'typescript', 'vite', 'webpack', 'esbuild', 'turbo',
56
+ // Linting
57
+ 'eslint', 'prettier', 'biome',
58
+ ]);
59
+ // ============================================================================
60
+ // Implementation
61
+ // ============================================================================
62
+ /**
63
+ * Read and parse a JSON file. Returns null if file is missing or invalid.
64
+ */
65
+ function readJsonFile(filePath) {
66
+ try {
67
+ const content = fs.readFileSync(filePath, 'utf-8');
68
+ return JSON.parse(content);
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ /**
75
+ * Read a text file. Returns null if file is missing.
76
+ */
77
+ function readTextFile(filePath) {
78
+ try {
79
+ return fs.readFileSync(filePath, 'utf-8');
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ /**
86
+ * Read the first N lines of a text file. Returns null if file is missing.
87
+ */
88
+ function readFirstLines(filePath, maxLines) {
89
+ try {
90
+ const content = fs.readFileSync(filePath, 'utf-8');
91
+ const lines = content.split('\n').slice(0, maxLines);
92
+ return lines.join('\n');
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ /**
99
+ * Detect framework from dependencies.
100
+ * Checks in priority order (more specific frameworks first).
101
+ */
102
+ function detectFramework(deps) {
103
+ for (const [pkg, name] of Object.entries(FRAMEWORK_DETECTION)) {
104
+ if (pkg in deps) {
105
+ return name;
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ /**
111
+ * Extract key dependencies from package.json deps/devDeps.
112
+ */
113
+ function extractKeyDependencies(deps, devDeps) {
114
+ const result = {};
115
+ const all = { ...deps, ...devDeps };
116
+ for (const [name, version] of Object.entries(all)) {
117
+ if (KEY_DEPENDENCY_NAMES.has(name)) {
118
+ result[name] = version;
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ /**
124
+ * Check if the workspace has tests by looking at scripts and directories.
125
+ */
126
+ function detectHasTests(workspacePath, scripts) {
127
+ // Check for test script
128
+ if (scripts.test && scripts.test !== 'echo "Error: no test specified" && exit 1') {
129
+ return true;
130
+ }
131
+ // Check for common test directories
132
+ const testDirs = ['__tests__', 'test', 'tests', 'spec'];
133
+ for (const dir of testDirs) {
134
+ const dirPath = path.join(workspacePath, dir);
135
+ try {
136
+ if (fs.statSync(dirPath).isDirectory()) {
137
+ return true;
138
+ }
139
+ }
140
+ catch {
141
+ // Directory doesn't exist
142
+ }
143
+ }
144
+ // Check for test files in src
145
+ const srcDir = path.join(workspacePath, 'src');
146
+ try {
147
+ if (fs.statSync(srcDir).isDirectory()) {
148
+ const srcTestDir = path.join(srcDir, '__tests__');
149
+ if (fs.statSync(srcTestDir).isDirectory()) {
150
+ return true;
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // Directory doesn't exist
156
+ }
157
+ return false;
158
+ }
159
+ /**
160
+ * Get workspace metadata for a given directory path.
161
+ *
162
+ * @param args.workspacePath - Path to the workspace (absolute or relative to projectRoot)
163
+ * @param args.projectRoot - Optional project root for resolving relative paths
164
+ * @returns Structured workspace metadata
165
+ */
166
+ export async function getWorkspaceFiles(args) {
167
+ let workspacePath = args.workspacePath;
168
+ const projectRoot = args.projectRoot || findProjectRoot() || process.cwd();
169
+ // Resolve workspace path
170
+ if (workspacePath) {
171
+ workspacePath = path.resolve(projectRoot, workspacePath);
172
+ }
173
+ else {
174
+ workspacePath = projectRoot;
175
+ }
176
+ // Verify directory exists
177
+ try {
178
+ const stat = fs.statSync(workspacePath);
179
+ if (!stat.isDirectory()) {
180
+ throw new Error(`Path is not a directory: ${workspacePath}`);
181
+ }
182
+ }
183
+ catch (err) {
184
+ if (err.code === 'ENOENT') {
185
+ throw new Error(`Workspace directory not found: ${workspacePath}`);
186
+ }
187
+ throw err;
188
+ }
189
+ // Read package.json
190
+ const pkgJsonPath = path.join(workspacePath, 'package.json');
191
+ const rawPkg = readJsonFile(pkgJsonPath);
192
+ let packageJson = null;
193
+ let name = null;
194
+ let framework = null;
195
+ let scripts = {};
196
+ let deps = {};
197
+ let devDeps = {};
198
+ let keyDependencies = {};
199
+ if (rawPkg) {
200
+ name = rawPkg.name || null;
201
+ scripts = rawPkg.scripts || {};
202
+ deps = rawPkg.dependencies || {};
203
+ devDeps = rawPkg.devDependencies || {};
204
+ packageJson = {
205
+ name: name || '',
206
+ version: rawPkg.version,
207
+ scripts,
208
+ dependencies: deps,
209
+ devDependencies: devDeps,
210
+ };
211
+ framework = detectFramework({ ...deps, ...devDeps });
212
+ keyDependencies = extractKeyDependencies(deps, devDeps);
213
+ }
214
+ // Read tsconfig.json
215
+ const tsconfigPath = path.join(workspacePath, 'tsconfig.json');
216
+ const rawTsConfig = readJsonFile(tsconfigPath);
217
+ let tsConfig = null;
218
+ if (rawTsConfig) {
219
+ const compilerOptions = rawTsConfig.compilerOptions || null;
220
+ const paths = compilerOptions?.paths;
221
+ tsConfig = {
222
+ compilerOptions,
223
+ paths: paths || null,
224
+ };
225
+ }
226
+ // Read README.md (first 50 lines)
227
+ const readmePath = path.join(workspacePath, 'README.md');
228
+ const readme = readFirstLines(readmePath, 50);
229
+ // Read .env.example
230
+ const envExamplePath = path.join(workspacePath, '.env.example');
231
+ const envExample = readTextFile(envExamplePath);
232
+ // Detect test/lint/typecheck commands
233
+ const hasTests = detectHasTests(workspacePath, scripts);
234
+ const testCommand = scripts.test || null;
235
+ const lintCommand = scripts.lint || null;
236
+ const buildCommand = scripts.build || null;
237
+ // Detect typecheck command
238
+ let typecheckCommand = scripts.typecheck || scripts['type-check'] || null;
239
+ if (!typecheckCommand && rawTsConfig) {
240
+ // If tsconfig exists but no typecheck script, suggest one
241
+ typecheckCommand = 'npx tsc --noEmit';
242
+ }
243
+ return {
244
+ path: workspacePath,
245
+ name,
246
+ framework,
247
+ hasTests,
248
+ testCommand,
249
+ lintCommand,
250
+ typecheckCommand,
251
+ buildCommand,
252
+ packageJson,
253
+ tsConfig,
254
+ readme,
255
+ envExample,
256
+ keyDependencies,
257
+ };
258
+ }
259
+ //# sourceMappingURL=workspace-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../../src/tools/core/workspace-files.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAML,gBAAgB,EAKjB,MAAM,wBAAwB,CAAC;AAwBhC;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAgFD,wBAAgB,QAAQ,IAAI,IAAI,EAAE,CAugFjC;AAED;;GAEG;AACH,KAAK,WAAW,GAAG,CACjB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AA6EtB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,GACnB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAmoC7B;AAqCD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,CAAC,CA4DlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAOrC;AAGD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAML,gBAAgB,EAKjB,MAAM,wBAAwB,CAAC;AA2BhC;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAmFD,wBAAgB,QAAQ,IAAI,IAAI,EAAE,CAsmFjC;AAED;;GAEG;AACH,KAAK,WAAW,GAAG,CACjB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AA6EtB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,GACnB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAsrC7B;AAqCD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,CAAC,CA4DlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAOrC;AAGD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}