@magic-ingredients/tiny-brain-local 0.12.2 → 0.13.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 (75) hide show
  1. package/dist/cli/cli-factory.d.ts.map +1 -1
  2. package/dist/cli/cli-factory.js +34 -4
  3. package/dist/cli/cli-factory.js.map +1 -1
  4. package/dist/cli/commands/analyse.command.d.ts +11 -0
  5. package/dist/cli/commands/analyse.command.d.ts.map +1 -1
  6. package/dist/cli/commands/analyse.command.js +31 -0
  7. package/dist/cli/commands/analyse.command.js.map +1 -1
  8. package/dist/cli/commands/config.command.d.ts +10 -2
  9. package/dist/cli/commands/config.command.d.ts.map +1 -1
  10. package/dist/cli/commands/config.command.js +171 -3
  11. package/dist/cli/commands/config.command.js.map +1 -1
  12. package/dist/cli/commands/track-commit.command.d.ts +14 -2
  13. package/dist/cli/commands/track-commit.command.d.ts.map +1 -1
  14. package/dist/cli/commands/track-commit.command.js +102 -7
  15. package/dist/cli/commands/track-commit.command.js.map +1 -1
  16. package/dist/cli/commands/validate-commit-message.command.d.ts +47 -0
  17. package/dist/cli/commands/validate-commit-message.command.d.ts.map +1 -0
  18. package/dist/cli/commands/validate-commit-message.command.js +223 -0
  19. package/dist/cli/commands/validate-commit-message.command.js.map +1 -0
  20. package/dist/core/mcp-server.d.ts +1 -0
  21. package/dist/core/mcp-server.d.ts.map +1 -1
  22. package/dist/core/mcp-server.js +10 -0
  23. package/dist/core/mcp-server.js.map +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +16 -13
  26. package/dist/index.js.map +1 -1
  27. package/dist/prompts/planning/planning.prompt.d.ts.map +1 -1
  28. package/dist/prompts/planning/planning.prompt.js +2 -11
  29. package/dist/prompts/planning/planning.prompt.js.map +1 -1
  30. package/dist/services/adr-service.d.ts +70 -0
  31. package/dist/services/adr-service.d.ts.map +1 -0
  32. package/dist/services/adr-service.js +242 -0
  33. package/dist/services/adr-service.js.map +1 -0
  34. package/dist/services/analyse-service.d.ts +1 -0
  35. package/dist/services/analyse-service.d.ts.map +1 -1
  36. package/dist/services/analyse-service.js +16 -2
  37. package/dist/services/analyse-service.js.map +1 -1
  38. package/dist/services/repo-service.d.ts +12 -2
  39. package/dist/services/repo-service.d.ts.map +1 -1
  40. package/dist/services/repo-service.js +200 -30
  41. package/dist/services/repo-service.js.map +1 -1
  42. package/dist/tools/config/config.tool.d.ts +10 -0
  43. package/dist/tools/config/config.tool.d.ts.map +1 -0
  44. package/dist/tools/config/config.tool.js +199 -0
  45. package/dist/tools/config/config.tool.js.map +1 -0
  46. package/dist/tools/config/index.d.ts +2 -0
  47. package/dist/tools/config/index.d.ts.map +1 -0
  48. package/dist/tools/config/index.js +2 -0
  49. package/dist/tools/config/index.js.map +1 -0
  50. package/dist/tools/persona/as.tool.d.ts +4 -0
  51. package/dist/tools/persona/as.tool.d.ts.map +1 -1
  52. package/dist/tools/persona/as.tool.js +47 -8
  53. package/dist/tools/persona/as.tool.js.map +1 -1
  54. package/dist/tools/plan/plan.tool.d.ts +2 -1
  55. package/dist/tools/plan/plan.tool.d.ts.map +1 -1
  56. package/dist/tools/plan/plan.tool.js +284 -162
  57. package/dist/tools/plan/plan.tool.js.map +1 -1
  58. package/dist/utils/adr-pattern-detector.d.ts +38 -0
  59. package/dist/utils/adr-pattern-detector.d.ts.map +1 -0
  60. package/dist/utils/adr-pattern-detector.js +158 -0
  61. package/dist/utils/adr-pattern-detector.js.map +1 -0
  62. package/dist/utils/adr-suggestion-generator.d.ts +50 -0
  63. package/dist/utils/adr-suggestion-generator.d.ts.map +1 -0
  64. package/dist/utils/adr-suggestion-generator.js +63 -0
  65. package/dist/utils/adr-suggestion-generator.js.map +1 -0
  66. package/dist/utils/commit-parser.d.ts +25 -0
  67. package/dist/utils/commit-parser.d.ts.map +1 -0
  68. package/dist/utils/commit-parser.js +46 -0
  69. package/dist/utils/commit-parser.js.map +1 -0
  70. package/package.json +2 -2
  71. package/templates/prd/_template/feature-template.md +1 -1
  72. /package/templates/adr/{0001-record-architecture-decisions.md → _template/0001-record-architecture-decisions.md} +0 -0
  73. /package/templates/adr/{ADR_CREATION_INSTRUCTIONS.md → _template/ADR_CREATION_INSTRUCTIONS.md} +0 -0
  74. /package/templates/adr/{adr-schema.json → _template/adr-schema.json} +0 -0
  75. /package/templates/adr/{adr-template.md → _template/adr-template.md} +0 -0
@@ -5,23 +5,41 @@
5
5
  * Maps commit message prefixes to TDD phases and updates feature markdown files.
6
6
  */
7
7
  import chalk from 'chalk';
8
+ import { exec } from 'node:child_process';
9
+ import { promisify } from 'node:util';
10
+ const execAsync = promisify(exec);
8
11
  export class TrackCommitCommand {
9
12
  planningService;
10
- constructor(_context, planningService) {
13
+ configService;
14
+ execFn;
15
+ constructor(_context, planningService, configService, execFn) {
11
16
  this.planningService = planningService;
17
+ this.configService = configService;
18
+ this.execFn = execFn || execAsync;
12
19
  }
13
20
  /**
14
21
  * Detect TDD phase from commit message prefix
22
+ * Supports conventional commit format with optional scope:
23
+ * - test: or test(scope):
24
+ * - feat: or feat(scope):
25
+ * - fix: or fix(scope):
26
+ * - refactor: or refactor(scope):
27
+ *
28
+ * See: https://www.conventionalcommits.org/en/v1.0.0/
15
29
  */
16
30
  async detectPhase(message) {
17
- const lowercaseMessage = message.toLowerCase();
18
- if (lowercaseMessage.startsWith('test:')) {
31
+ // Match conventional commit format: type(optional-scope):
32
+ // Examples: test:, test(api):, feat:, feat(auth):, fix:, fix(api):, refactor:, refactor(plan):
33
+ if (/^test(\([^)]+\))?:/i.test(message)) {
19
34
  return 'test';
20
35
  }
21
- if (lowercaseMessage.startsWith('feat:')) {
36
+ if (/^feat(\([^)]+\))?:/i.test(message)) {
22
37
  return 'impl';
23
38
  }
24
- if (lowercaseMessage.startsWith('refactor:')) {
39
+ if (/^fix(\([^)]+\))?:/i.test(message)) {
40
+ return 'impl';
41
+ }
42
+ if (/^refactor(\([^)]+\))?:/i.test(message)) {
25
43
  return 'refactor';
26
44
  }
27
45
  return null;
@@ -67,41 +85,54 @@ export class TrackCommitCommand {
67
85
  * Execute the commit tracking
68
86
  */
69
87
  async execute(options) {
88
+ console.log(chalk.blue(`[track-commit] Processing commit ${options.sha.substring(0, 7)}`));
70
89
  try {
71
90
  // Detect phase
72
91
  const phase = await this.detectPhase(options.message);
73
92
  // Silently ignore non-trackable commits
74
93
  if (!phase) {
94
+ console.log(chalk.gray('[track-commit] No TDD phase detected (expected test:, feat:, fix:, or refactor: with optional scope) - skipping'));
75
95
  return;
76
96
  }
97
+ console.log(chalk.blue(`[track-commit] Detected phase: ${phase}`));
77
98
  // Parse commit headers (required for repo-scoped PRDs)
78
99
  const headers = this.parseCommitHeaders(options.message);
79
100
  if (!headers) {
80
101
  // No headers - silently ignore (commit not related to PRD tracking)
102
+ console.log(chalk.gray('[track-commit] No PRD headers found - skipping'));
81
103
  if (options.verbose) {
82
104
  console.error(chalk.yellow('⚠️ No PRD headers found in commit message'));
83
105
  }
84
106
  return;
85
107
  }
108
+ console.log(chalk.blue(`[track-commit] PRD: ${headers.prdId}, Feature: ${headers.featureId}`));
109
+ console.log(chalk.blue(`[track-commit] Task: ${headers.taskDescription}`));
86
110
  // Load plan by PRD ID from headers (use 'default' persona for repo-scoped plans)
87
111
  let plan;
88
112
  try {
89
113
  plan = await this.planningService.loadPlanForPersona('default', headers.prdId);
114
+ console.log(chalk.green(`[track-commit] ✓ Loaded plan: ${plan.title}`));
90
115
  }
91
- catch {
116
+ catch (error) {
117
+ console.error(chalk.yellow(`[track-commit] ⚠️ PRD not found: ${headers.prdId}`));
92
118
  if (options.verbose) {
93
- console.error(chalk.yellow(`⚠️ PRD not found: ${headers.prdId}`));
119
+ console.error(chalk.red(`[track-commit] Error: ${error.message}`));
94
120
  }
95
121
  return;
96
122
  }
97
123
  // Find task using headers (exact matching)
98
124
  const match = this.findTaskByHeaders(plan, headers.featureId, headers.taskDescription);
99
125
  if (!match) {
126
+ console.error(chalk.yellow(`[track-commit] ⚠️ Task not found in feature "${headers.featureId}": ${headers.taskDescription}`));
100
127
  if (options.verbose) {
101
128
  console.error(chalk.yellow(`⚠️ Task not found in feature "${headers.featureId}": ${headers.taskDescription}`));
102
129
  }
103
130
  return;
104
131
  }
132
+ console.log(chalk.green(`[track-commit] ✓ Found task in feature #${match.featureNumber}`));
133
+ // Get the current task to check existing commits
134
+ const feature = plan.features?.find((f) => f.number === match.featureNumber);
135
+ const currentTask = feature?.tasks?.find((t) => t.id === match.taskId);
105
136
  // Build update object based on phase
106
137
  const timestamp = new Date().toISOString();
107
138
  const updateTask = {
@@ -110,16 +141,29 @@ export class TrackCommitCommand {
110
141
  if (phase === 'test') {
111
142
  updateTask.testCommitSha = options.sha;
112
143
  updateTask.testCommittedAt = timestamp;
144
+ // Only transition to 'tested' if no impl commit exists yet
145
+ // If impl commit exists, keep status as 'completed'
146
+ if (!currentTask?.commitSha) {
147
+ console.log(chalk.blue('[track-commit] No impl commit exists - setting status to tested'));
148
+ updateTask.status = 'tested'; // Auto-transition to RED phase
149
+ }
150
+ else {
151
+ console.log(chalk.green(`[track-commit] Impl commit exists (${currentTask.commitSha.substring(0, 7)}) - preserving completed status`));
152
+ }
113
153
  }
114
154
  else if (phase === 'impl') {
115
155
  updateTask.commitSha = options.sha;
116
156
  updateTask.committedAt = timestamp;
157
+ updateTask.completedAt = timestamp;
158
+ updateTask.status = 'completed'; // Auto-transition to GREEN phase
117
159
  }
118
160
  else if (phase === 'refactor') {
119
161
  updateTask.refactorCommitSha = options.sha;
120
162
  updateTask.refactorCommittedAt = timestamp;
163
+ // Status remains 'completed' - no transition needed
121
164
  }
122
165
  // Update plan
166
+ console.log(chalk.blue(`[track-commit] Updating task with ${phase} commit SHA...`));
123
167
  await this.planningService.updatePlan({
124
168
  planId: plan.id,
125
169
  updates: {
@@ -129,12 +173,63 @@ export class TrackCommitCommand {
129
173
  },
130
174
  },
131
175
  });
176
+ console.log(chalk.green(`[track-commit] ✅ Successfully tracked ${phase} commit ${options.sha.substring(0, 7)}`));
177
+ console.log(chalk.green(`[track-commit] ✅ Updated progress.json (changes not committed)`));
132
178
  if (options.verbose) {
133
179
  console.log(chalk.green(`✅ Tracked ${phase} commit ${options.sha.substring(0, 7)} for task: ${headers.taskDescription}`));
134
180
  }
181
+ // Check if auto-commit is enabled
182
+ if (this.configService) {
183
+ try {
184
+ const autoCommit = await this.configService.isAutoCommitProgressEnabled();
185
+ if (autoCommit) {
186
+ console.log(chalk.blue('[track-commit] Auto-commit enabled - committing progress.json changes'));
187
+ // Stage progress.json
188
+ await this.execFn('git add docs/prd/*/progress.json', { cwd: process.cwd() });
189
+ // Create commit for progress.json update
190
+ const commitMessage = `chore: update progress tracking for ${headers.prdId}
191
+
192
+ Auto-committed progress.json changes after tracking ${phase} commit ${options.sha.substring(0, 7)}
193
+
194
+ Task: ${headers.taskDescription}
195
+ Feature: ${headers.featureId}`;
196
+ await this.execFn(`git commit -m "${commitMessage.replace(/"/g, '\\"')}"`, { cwd: process.cwd() });
197
+ console.log(chalk.green('[track-commit] ✅ Auto-committed progress.json changes'));
198
+ }
199
+ else {
200
+ // Auto-commit disabled - show user-friendly instructions
201
+ console.log('');
202
+ console.log(chalk.cyan('📝 Progress tracking updated!'));
203
+ console.log('');
204
+ console.log(chalk.gray(' To commit progress.json changes, run:'));
205
+ console.log(chalk.white(' git add docs/prd/*/progress.json'));
206
+ console.log(chalk.white(' git commit -m "chore: update progress tracking"'));
207
+ console.log('');
208
+ console.log(chalk.gray(' 💡 Tip: Enable auto-commit to skip this step:'));
209
+ console.log(chalk.white(' npx tiny-brain config preferences set autoCommitProgress true'));
210
+ console.log('');
211
+ }
212
+ }
213
+ catch (error) {
214
+ // Don't fail the whole command if auto-commit fails
215
+ console.log(chalk.yellow(`[track-commit] ⚠️ Auto-commit failed: ${error.message}`));
216
+ console.log(chalk.gray('[track-commit] You can manually commit progress.json changes'));
217
+ }
218
+ }
219
+ else {
220
+ // ConfigService not available - show manual instructions
221
+ console.log('');
222
+ console.log(chalk.cyan('📝 Progress tracking updated!'));
223
+ console.log('');
224
+ console.log(chalk.gray(' To commit progress.json changes, run:'));
225
+ console.log(chalk.white(' git add docs/prd/*/progress.json'));
226
+ console.log(chalk.white(' git commit -m "chore: update progress tracking"'));
227
+ console.log('');
228
+ }
135
229
  }
136
230
  catch (error) {
137
231
  // Fail silently to avoid blocking commits
232
+ console.error(chalk.red(`[track-commit] ❌ Error tracking commit: ${error.message}`));
138
233
  if (options.verbose) {
139
234
  console.error(chalk.red('❌ Error tracking commit:'), error);
140
235
  }
@@ -1 +1 @@
1
- {"version":3,"file":"track-commit.command.js","sourceRoot":"","sources":["../../../src/cli/commands/track-commit.command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"track-commit.command.js","sourceRoot":"","sources":["../../../src/cli/commands/track-commit.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Validate Commit Message Command
3
+ *
4
+ * CLI command called by commit-msg git hook to validate PRD/Feature/Task references.
5
+ * Prevents commits with invalid references from being created.
6
+ */
7
+ interface ValidateCommitMessageOptions {
8
+ messageFile: string;
9
+ prdBasePath?: string;
10
+ }
11
+ interface ValidationResult {
12
+ valid: boolean;
13
+ error?: string;
14
+ }
15
+ export declare class ValidateCommitMessageCommand {
16
+ /**
17
+ * Read commit message from file
18
+ */
19
+ readCommitMessage(filePath: string): Promise<string>;
20
+ /**
21
+ * Parse commit headers for PRD, Feature, and Task metadata
22
+ * @returns Parsed headers or null if any required header is missing
23
+ */
24
+ parseCommitHeaders(message: string): {
25
+ prdId: string;
26
+ featureId: string;
27
+ taskDescription: string;
28
+ } | null;
29
+ /**
30
+ * Validate that PRD directory exists
31
+ */
32
+ validatePRDExists(prdId: string, prdBasePath: string): Promise<ValidationResult>;
33
+ /**
34
+ * Validate that feature exists in progress.json
35
+ */
36
+ validateFeatureExists(prdId: string, featureId: string, prdBasePath: string): Promise<ValidationResult>;
37
+ /**
38
+ * Validate that task exists in feature's tasks array by exact description match
39
+ */
40
+ validateTaskExists(prdId: string, featureId: string, taskDescription: string, prdBasePath: string): Promise<ValidationResult>;
41
+ /**
42
+ * Execute validation
43
+ */
44
+ execute(options: ValidateCommitMessageOptions): Promise<void>;
45
+ }
46
+ export {};
47
+ //# sourceMappingURL=validate-commit-message.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-commit-message.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate-commit-message.command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,UAAU,4BAA4B;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,4BAA4B;IACvC;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1D;;;OAGG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiBzG;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgDtF;;OAEG;IACG,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+C7G;;OAEG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC;IA8D5B;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;CA4CpE"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Validate Commit Message Command
3
+ *
4
+ * CLI command called by commit-msg git hook to validate PRD/Feature/Task references.
5
+ * Prevents commits with invalid references from being created.
6
+ */
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ export class ValidateCommitMessageCommand {
10
+ /**
11
+ * Read commit message from file
12
+ */
13
+ async readCommitMessage(filePath) {
14
+ try {
15
+ return await fs.readFile(filePath, 'utf-8');
16
+ }
17
+ catch (error) {
18
+ throw new Error(`Failed to read commit message file: ${error.message}`);
19
+ }
20
+ }
21
+ /**
22
+ * Parse commit headers for PRD, Feature, and Task metadata
23
+ * @returns Parsed headers or null if any required header is missing
24
+ */
25
+ parseCommitHeaders(message) {
26
+ const prdMatch = message.match(/^PRD:\s*(.+)$/m);
27
+ const featureMatch = message.match(/^Feature:\s*(.+)$/m);
28
+ const taskMatch = message.match(/^Task:\s*(.+)$/m);
29
+ // All three headers are required
30
+ if (!prdMatch || !featureMatch || !taskMatch) {
31
+ return null;
32
+ }
33
+ return {
34
+ prdId: prdMatch[1].trim(),
35
+ featureId: featureMatch[1].trim(),
36
+ taskDescription: taskMatch[1].trim(),
37
+ };
38
+ }
39
+ /**
40
+ * Validate that PRD directory exists
41
+ */
42
+ async validatePRDExists(prdId, prdBasePath) {
43
+ try {
44
+ const prdPath = path.join(prdBasePath, prdId);
45
+ // Check if PRD directory exists
46
+ try {
47
+ const stats = await fs.stat(prdPath);
48
+ if (stats.isDirectory()) {
49
+ return { valid: true };
50
+ }
51
+ }
52
+ catch {
53
+ // Directory doesn't exist - list available PRDs
54
+ }
55
+ // List available PRDs
56
+ let availablePRDs = [];
57
+ try {
58
+ const entries = await fs.readdir(prdBasePath, { withFileTypes: true });
59
+ availablePRDs = entries
60
+ .filter(entry => entry.isDirectory())
61
+ .map(entry => entry.name)
62
+ .sort();
63
+ }
64
+ catch {
65
+ return {
66
+ valid: false,
67
+ error: `No PRDs found in ${prdBasePath}. Please create a PRD first.`
68
+ };
69
+ }
70
+ if (availablePRDs.length === 0) {
71
+ return {
72
+ valid: false,
73
+ error: `No PRDs found in ${prdBasePath}. Please create a PRD first.`
74
+ };
75
+ }
76
+ return {
77
+ valid: false,
78
+ error: `PRD not found: ${prdId}\n\nAvailable PRDs:\n - ${availablePRDs.join('\n - ')}`
79
+ };
80
+ }
81
+ catch (error) {
82
+ return {
83
+ valid: false,
84
+ error: `Error validating PRD: ${error.message}`
85
+ };
86
+ }
87
+ }
88
+ /**
89
+ * Validate that feature exists in progress.json
90
+ */
91
+ async validateFeatureExists(prdId, featureId, prdBasePath) {
92
+ try {
93
+ const progressJsonPath = path.join(prdBasePath, prdId, 'progress.json');
94
+ // Check if progress.json exists
95
+ let progressData;
96
+ try {
97
+ const content = await fs.readFile(progressJsonPath, 'utf-8');
98
+ progressData = JSON.parse(content);
99
+ }
100
+ catch {
101
+ return {
102
+ valid: false,
103
+ error: `No progress.json found for PRD: ${prdId}`
104
+ };
105
+ }
106
+ // Check if features array exists
107
+ if (!progressData.features || !Array.isArray(progressData.features)) {
108
+ return {
109
+ valid: false,
110
+ error: `No features found in PRD: ${prdId}`
111
+ };
112
+ }
113
+ // Find feature by ID
114
+ const feature = progressData.features.find((f) => f.id === featureId);
115
+ if (feature) {
116
+ return { valid: true };
117
+ }
118
+ // Feature not found - list available features
119
+ const availableFeatures = progressData.features.map((f) => `${f.id} (#${f.number}: ${f.title})`);
120
+ return {
121
+ valid: false,
122
+ error: `Feature not found: ${featureId}\n\nAvailable features:\n - ${availableFeatures.join('\n - ')}`
123
+ };
124
+ }
125
+ catch (error) {
126
+ return {
127
+ valid: false,
128
+ error: `Error validating feature: ${error.message}`
129
+ };
130
+ }
131
+ }
132
+ /**
133
+ * Validate that task exists in feature's tasks array by exact description match
134
+ */
135
+ async validateTaskExists(prdId, featureId, taskDescription, prdBasePath) {
136
+ try {
137
+ const progressJsonPath = path.join(prdBasePath, prdId, 'progress.json');
138
+ // Check if progress.json exists
139
+ let progressData;
140
+ try {
141
+ const content = await fs.readFile(progressJsonPath, 'utf-8');
142
+ progressData = JSON.parse(content);
143
+ }
144
+ catch {
145
+ return {
146
+ valid: false,
147
+ error: `No progress.json found for PRD: ${prdId}`
148
+ };
149
+ }
150
+ // Check if features array exists
151
+ if (!progressData.features || !Array.isArray(progressData.features)) {
152
+ return {
153
+ valid: false,
154
+ error: `No features found in PRD: ${prdId}`
155
+ };
156
+ }
157
+ // Find feature by ID
158
+ const feature = progressData.features.find((f) => f.id === featureId);
159
+ if (!feature) {
160
+ return {
161
+ valid: false,
162
+ error: `Feature not found: ${featureId}`
163
+ };
164
+ }
165
+ // Check if tasks array exists
166
+ if (!feature.tasks || !Array.isArray(feature.tasks)) {
167
+ return {
168
+ valid: false,
169
+ error: `No tasks found in feature: ${featureId}`
170
+ };
171
+ }
172
+ // Find task by exact case-sensitive description match
173
+ const task = feature.tasks.find((t) => t.description === taskDescription);
174
+ if (task) {
175
+ return { valid: true };
176
+ }
177
+ // Task not found - list available tasks
178
+ const availableTasks = feature.tasks.map((t) => t.description);
179
+ return {
180
+ valid: false,
181
+ error: `Task not found: ${taskDescription}\n\nAvailable tasks in ${featureId}:\n - ${availableTasks.join('\n - ')}`
182
+ };
183
+ }
184
+ catch (error) {
185
+ return {
186
+ valid: false,
187
+ error: `Error validating task: ${error.message}`
188
+ };
189
+ }
190
+ }
191
+ /**
192
+ * Execute validation
193
+ */
194
+ async execute(options) {
195
+ // Read commit message from file
196
+ const message = await this.readCommitMessage(options.messageFile);
197
+ // Parse headers
198
+ const headers = this.parseCommitHeaders(message);
199
+ // If no headers, allow commit (not PRD-tracked)
200
+ if (!headers) {
201
+ return;
202
+ }
203
+ // Determine PRD base path (default to docs/prd in current directory)
204
+ const prdBasePath = options.prdBasePath || path.join(process.cwd(), 'docs/prd');
205
+ // Validate PRD exists
206
+ const prdValidation = await this.validatePRDExists(headers.prdId, prdBasePath);
207
+ if (!prdValidation.valid) {
208
+ throw new Error(prdValidation.error);
209
+ }
210
+ // Validate feature exists
211
+ const featureValidation = await this.validateFeatureExists(headers.prdId, headers.featureId, prdBasePath);
212
+ if (!featureValidation.valid) {
213
+ throw new Error(featureValidation.error);
214
+ }
215
+ // Validate task exists
216
+ const taskValidation = await this.validateTaskExists(headers.prdId, headers.featureId, headers.taskDescription, prdBasePath);
217
+ if (!taskValidation.valid) {
218
+ throw new Error(taskValidation.error);
219
+ }
220
+ // All validations passed
221
+ }
222
+ }
223
+ //# sourceMappingURL=validate-commit-message.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-commit-message.command.js","sourceRoot":"","sources":["../../../src/cli/commands/validate-commit-message.command.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,7 @@ export declare class MCPServer {
35
35
  private activePersona;
36
36
  private userId;
37
37
  private personaChangeListeners;
38
+ private planChangeListeners;
38
39
  private instanceId;
39
40
  private dashboardLauncher;
40
41
  private baseContext;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,OAAO,KAAK,EAA4B,QAAQ,EAAkC,MAAM,oCAAoC,CAAC;AAE7H,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAQ5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,sBAAsB,CAA0D;IACxF,OAAO,CAAC,UAAU,CAA6E;IAC/F,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAmB;gBAEhC,MAAM,GAAE,SAAc;IAsFlC,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,SAAS,IAAI,SAAS;IAItB;;OAEG;IACH,mBAAmB,IAAI,gBAAgB,GAAG,SAAS;IAInD;;OAEG;IACH,oBAAoB,IAAI,iBAAiB,GAAG,IAAI;IAIhD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;;;;;;OAOG;YACW,sBAAsB;IA+DpC;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;YACW,oBAAoB;IAgFlC;;OAEG;YACW,kBAAkB;IAsBhC;;OAEG;YACW,wBAAwB;IA8BtC;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBjB,eAAe;YAMf,cAAc;YAuFd,iBAAiB;YAMjB,eAAe;YAkEf,iBAAiB;CAQhC"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/core/mcp-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,OAAO,KAAK,EAA4B,QAAQ,EAAkC,MAAM,oCAAoC,CAAC;AAE7H,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAQ5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE9E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,sBAAsB,CAA0D;IACxF,OAAO,CAAC,mBAAmB,CAA2G;IACtI,OAAO,CAAC,UAAU,CAA6E;IAC/F,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,gBAAgB,CAAC,CAAmB;gBAEhC,MAAM,GAAE,SAAc;IAwFlC,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,SAAS,IAAI,SAAS;IAItB;;OAEG;IACH,mBAAmB,IAAI,gBAAgB,GAAG,SAAS;IAInD;;OAEG;IACH,oBAAoB,IAAI,iBAAiB,GAAG,IAAI;IAIhD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;;;;;;OAOG;YACW,sBAAsB;IA+DpC;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;YACW,oBAAoB;IAgFlC;;OAEG;YACW,kBAAkB;IAsBhC;;OAEG;YACW,wBAAwB;IA8BtC;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBjB,eAAe;YAMf,cAAc;YA6Fd,iBAAiB;YAMjB,eAAe;YAmEf,iBAAiB;CAQhC"}
@@ -27,6 +27,7 @@ export class MCPServer {
27
27
  activePersona = undefined;
28
28
  userId = 'local-user';
29
29
  personaChangeListeners = [];
30
+ planChangeListeners = [];
30
31
  instanceId = `mcp-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
31
32
  dashboardLauncher = null;
32
33
  baseContext;
@@ -89,6 +90,8 @@ export class MCPServer {
89
90
  requestId: `server-${Date.now()}`, // Will be overridden per request
90
91
  timestamp: new Date(),
91
92
  personaChangeListeners: this.personaChangeListeners,
93
+ planChangeListeners: this.planChangeListeners,
94
+ repositoryRoot: process.cwd(), // Set to current working directory for file watcher
92
95
  };
93
96
  // Create MCP server instance
94
97
  this.server = new McpServer({
@@ -463,6 +466,7 @@ export class MCPServer {
463
466
  },
464
467
  getCurrentActivePersona: () => this.activePersona,
465
468
  personaChangeListeners: this.personaChangeListeners,
469
+ planChangeListeners: this.planChangeListeners,
466
470
  };
467
471
  // Get the tool
468
472
  const ToolClass = ToolRegistry.getToolByName(name);
@@ -476,7 +480,12 @@ export class MCPServer {
476
480
  }
477
481
  try {
478
482
  // Execute the tool
483
+ this.logger.info(`[MCP] About to execute tool ${name}`, {
484
+ hasCwd: 'cwd' in process,
485
+ processCwd: process.cwd()
486
+ });
479
487
  const result = await ToolClass.execute(args || {}, context);
488
+ this.logger.info(`[MCP] Tool ${name} execution completed`);
480
489
  // Result already has content and isError properties
481
490
  if (!result.isError) {
482
491
  this.logger.debug(`Tool ${name} executed successfully`, {
@@ -550,6 +559,7 @@ export class MCPServer {
550
559
  },
551
560
  getCurrentActivePersona: () => this.activePersona,
552
561
  personaChangeListeners: this.personaChangeListeners,
562
+ planChangeListeners: this.planChangeListeners,
553
563
  };
554
564
  // Get the prompt class
555
565
  const PromptClass = PromptRegistry.getPromptByName(name);