@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.
- package/dist/cli/cli-factory.d.ts.map +1 -1
- package/dist/cli/cli-factory.js +34 -4
- package/dist/cli/cli-factory.js.map +1 -1
- package/dist/cli/commands/analyse.command.d.ts +11 -0
- package/dist/cli/commands/analyse.command.d.ts.map +1 -1
- package/dist/cli/commands/analyse.command.js +31 -0
- package/dist/cli/commands/analyse.command.js.map +1 -1
- package/dist/cli/commands/config.command.d.ts +10 -2
- package/dist/cli/commands/config.command.d.ts.map +1 -1
- package/dist/cli/commands/config.command.js +171 -3
- package/dist/cli/commands/config.command.js.map +1 -1
- package/dist/cli/commands/track-commit.command.d.ts +14 -2
- package/dist/cli/commands/track-commit.command.d.ts.map +1 -1
- package/dist/cli/commands/track-commit.command.js +102 -7
- package/dist/cli/commands/track-commit.command.js.map +1 -1
- package/dist/cli/commands/validate-commit-message.command.d.ts +47 -0
- package/dist/cli/commands/validate-commit-message.command.d.ts.map +1 -0
- package/dist/cli/commands/validate-commit-message.command.js +223 -0
- package/dist/cli/commands/validate-commit-message.command.js.map +1 -0
- package/dist/core/mcp-server.d.ts +1 -0
- package/dist/core/mcp-server.d.ts.map +1 -1
- package/dist/core/mcp-server.js +10 -0
- package/dist/core/mcp-server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -13
- package/dist/index.js.map +1 -1
- package/dist/prompts/planning/planning.prompt.d.ts.map +1 -1
- package/dist/prompts/planning/planning.prompt.js +2 -11
- package/dist/prompts/planning/planning.prompt.js.map +1 -1
- package/dist/services/adr-service.d.ts +70 -0
- package/dist/services/adr-service.d.ts.map +1 -0
- package/dist/services/adr-service.js +242 -0
- package/dist/services/adr-service.js.map +1 -0
- package/dist/services/analyse-service.d.ts +1 -0
- package/dist/services/analyse-service.d.ts.map +1 -1
- package/dist/services/analyse-service.js +16 -2
- package/dist/services/analyse-service.js.map +1 -1
- package/dist/services/repo-service.d.ts +12 -2
- package/dist/services/repo-service.d.ts.map +1 -1
- package/dist/services/repo-service.js +200 -30
- package/dist/services/repo-service.js.map +1 -1
- package/dist/tools/config/config.tool.d.ts +10 -0
- package/dist/tools/config/config.tool.d.ts.map +1 -0
- package/dist/tools/config/config.tool.js +199 -0
- package/dist/tools/config/config.tool.js.map +1 -0
- package/dist/tools/config/index.d.ts +2 -0
- package/dist/tools/config/index.d.ts.map +1 -0
- package/dist/tools/config/index.js +2 -0
- package/dist/tools/config/index.js.map +1 -0
- package/dist/tools/persona/as.tool.d.ts +4 -0
- package/dist/tools/persona/as.tool.d.ts.map +1 -1
- package/dist/tools/persona/as.tool.js +47 -8
- package/dist/tools/persona/as.tool.js.map +1 -1
- package/dist/tools/plan/plan.tool.d.ts +2 -1
- package/dist/tools/plan/plan.tool.d.ts.map +1 -1
- package/dist/tools/plan/plan.tool.js +284 -162
- package/dist/tools/plan/plan.tool.js.map +1 -1
- package/dist/utils/adr-pattern-detector.d.ts +38 -0
- package/dist/utils/adr-pattern-detector.d.ts.map +1 -0
- package/dist/utils/adr-pattern-detector.js +158 -0
- package/dist/utils/adr-pattern-detector.js.map +1 -0
- package/dist/utils/adr-suggestion-generator.d.ts +50 -0
- package/dist/utils/adr-suggestion-generator.d.ts.map +1 -0
- package/dist/utils/adr-suggestion-generator.js +63 -0
- package/dist/utils/adr-suggestion-generator.js.map +1 -0
- package/dist/utils/commit-parser.d.ts +25 -0
- package/dist/utils/commit-parser.d.ts.map +1 -0
- package/dist/utils/commit-parser.js +46 -0
- package/dist/utils/commit-parser.js.map +1 -0
- package/package.json +2 -2
- package/templates/prd/_template/feature-template.md +1 -1
- /package/templates/adr/{0001-record-architecture-decisions.md → _template/0001-record-architecture-decisions.md} +0 -0
- /package/templates/adr/{ADR_CREATION_INSTRUCTIONS.md → _template/ADR_CREATION_INSTRUCTIONS.md} +0 -0
- /package/templates/adr/{adr-schema.json → _template/adr-schema.json} +0 -0
- /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
|
-
|
|
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
|
-
|
|
18
|
-
|
|
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 (
|
|
36
|
+
if (/^feat(\([^)]+\))?:/i.test(message)) {
|
|
22
37
|
return 'impl';
|
|
23
38
|
}
|
|
24
|
-
if (
|
|
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.
|
|
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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"track-commit.command.js","sourceRoot":"","sources":["../../../src/cli/commands/track-commit.command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAUlC,MAAM,OAAO,kBAAkB;IACrB,eAAe,CAAkB;IACjC,aAAa,CAAiB;IAC9B,MAAM,CAAiF;IAE/F,YACE,QAAwB,EACxB,eAAgC,EAChC,aAA6B,EAC7B,MAAuF;QAEvF,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,SAAS,CAAC;IACpC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,0DAA0D;QAC1D,+FAA+F;QAC/F,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,OAAe;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEnD,iCAAiC;QACjC,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACzB,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACjC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;SACrC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,IAAS,EACT,SAAiB,EACjB,eAAuB;QAEvB,qBAAqB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uCAAuC;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,eAAe,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,aAAa,EAAE,OAAO,CAAC,MAAM;YAC7B,MAAM,EAAE,IAAI,CAAC,EAAE;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,OAA2B;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3F,IAAI,CAAC;YACH,eAAe;YACf,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEtD,wCAAwC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iHAAiH,CAAC,CAAC,CAAC;gBAC3I,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC,CAAC;YAEnE,uDAAuD;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,oEAAoE;gBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBAC1E,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBAC5E,CAAC;gBACD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,KAAK,cAAc,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAE3E,iFAAiF;YACjF,IAAI,IAAS,CAAC;YACd,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO;YACT,CAAC;YAED,2CAA2C;YAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;YAEvF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,iDAAiD,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,eAAe,EAAE,CAClG,CACF,CAAC;gBACF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,kCAAkC,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,eAAe,EAAE,CACnF,CACF,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2CAA2C,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;YAE3F,iDAAiD;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;YAClF,MAAM,WAAW,GAAG,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;YAE5E,qCAAqC;YACrC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAQ;gBACtB,EAAE,EAAE,KAAK,CAAC,MAAM;aACjB,CAAC;YAEF,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,UAAU,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;gBACvC,UAAU,CAAC,eAAe,GAAG,SAAS,CAAC;gBACvC,2DAA2D;gBAC3D,oDAAoD;gBACpD,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;oBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;oBAC3F,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,+BAA+B;gBAC/D,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACzI,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC5B,UAAU,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;gBACnC,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC;gBACnC,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC;gBACnC,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,iCAAiC;YACpE,CAAC;iBAAM,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,UAAU,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC;gBAC3C,UAAU,CAAC,mBAAmB,GAAG,SAAS,CAAC;gBAC3C,oDAAoD;YACtD,CAAC;YAED,cAAc;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,KAAK,gBAAgB,CAAC,CAAC,CAAC;YAEpF,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;gBACpC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE;oBACP,aAAa,EAAE;wBACb,aAAa,EAAE,KAAK,CAAC,aAAa;wBAClC,UAAU;qBACX;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,KAAK,WAAW,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;YAE3F,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,KAAK,WAAW,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;YAC5H,CAAC;YAED,kCAAkC;YAClC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,2BAA2B,EAAE,CAAC;oBAE1E,IAAI,UAAU,EAAE,CAAC;wBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC,CAAC;wBAEjG,sBAAsB;wBACtB,MAAM,IAAI,CAAC,MAAM,CAAC,kCAAkC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBAE9E,yCAAyC;wBACzC,MAAM,aAAa,GAAG,uCAAuC,OAAO,CAAC,KAAK;;sDAEhC,KAAK,WAAW,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;;QAEzF,OAAO,CAAC,eAAe;WACpB,OAAO,CAAC,SAAS,EAAE,CAAC;wBAEnB,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBAEnG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC;oBACpF,CAAC;yBAAM,CAAC;wBACN,yDAAyD;wBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;wBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;wBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;wBAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;wBAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;wBAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC,CAAC;wBAC7F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,oDAAoD;oBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,yDAAyD;gBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,0CAA0C;YAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACrF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/core/mcp-server.js
CHANGED
|
@@ -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);
|