@magic-ingredients/tiny-brain-local 0.13.0 → 0.14.10
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/agents/formatters/claude-code-formatter.js +0 -1
- package/dist/agents/formatters/formatter-factory.js +0 -1
- package/dist/agents/types.js +0 -1
- package/dist/core/console-logger.js +0 -1
- package/dist/core/file-logger.js +0 -1
- package/dist/core/mcp-server.js +0 -1
- package/dist/index.d.ts +22 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -148
- package/dist/prompts/index.js +0 -1
- package/dist/prompts/persona/persona.prompt.js +0 -1
- package/dist/prompts/planning/planning.prompt.js +0 -1
- package/dist/prompts/prompt-registry.js +0 -1
- package/dist/prompts/rules/rules.prompt.js +0 -1
- package/dist/prompts/thinking/thinking.prompt.js +0 -1
- package/dist/services/UpdateService.js +0 -1
- package/dist/services/agent-installation-service.js +0 -1
- package/dist/services/agent-manager.js +0 -1
- package/dist/services/agent-service.js +0 -1
- package/dist/services/analyse-service.d.ts +52 -8
- package/dist/services/analyse-service.d.ts.map +1 -1
- package/dist/services/analyse-service.js +325 -66
- package/dist/services/credential-storage.service.js +0 -1
- package/dist/services/dashboard-launcher.service.js +0 -1
- package/dist/services/persona-enhancer.js +0 -1
- package/dist/services/persona-service.js +0 -1
- package/dist/services/remote/auth-token-service.js +0 -1
- package/dist/services/remote/persona-sync-service.js +0 -1
- package/dist/services/remote/system-persona-service.js +0 -1
- package/dist/services/repo-service.d.ts.map +1 -1
- package/dist/services/repo-service.js +31 -25
- package/dist/services/versioning-service.js +0 -1
- package/dist/storage/local-filesystem-adapter.js +0 -1
- package/dist/storage/platform-config-adapter.js +0 -1
- package/dist/storage/platform-path-builder.js +0 -1
- package/dist/storage/storage-path-builder.js +0 -1
- package/dist/tools/analyse-request/analyse-request.tool.js +0 -1
- package/dist/tools/analyse.tool.d.ts +4 -0
- package/dist/tools/analyse.tool.d.ts.map +1 -1
- package/dist/tools/analyse.tool.js +34 -3
- package/dist/tools/config/config.tool.d.ts +3 -0
- package/dist/tools/config/config.tool.d.ts.map +1 -1
- package/dist/tools/config/config.tool.js +139 -70
- package/dist/tools/config/index.js +0 -1
- package/dist/tools/index.d.ts +4 -4
- package/dist/tools/index.js +0 -1
- package/dist/tools/persona/as.tool.js +0 -1
- package/dist/tools/persona/persona.tool.js +0 -1
- package/dist/tools/plan/plan.tool.d.ts +4 -0
- package/dist/tools/plan/plan.tool.d.ts.map +1 -1
- package/dist/tools/plan/plan.tool.js +144 -32
- package/dist/tools/rules/rules.tool.js +0 -1
- package/dist/tools/strategy/strategy.tool.js +0 -1
- package/dist/tools/thinking/thinking.tool.js +0 -1
- package/dist/tools/tool-registry.js +0 -1
- package/dist/tools/update/update.tool.js +0 -1
- package/dist/tools/validate-response/validate-response.tool.js +0 -1
- package/dist/types/local-context.js +0 -1
- package/dist/types/request-context.d.ts +1 -1
- package/dist/types/request-context.d.ts.map +1 -1
- package/dist/types/request-context.js +0 -1
- package/dist/utils/package-version.js +0 -1
- package/dist/utils/repo-utils.js +0 -1
- package/package.json +8 -32
- package/LICENSE +0 -21
- package/README.md +0 -260
- package/dist/agents/formatters/claude-code-formatter.js.map +0 -1
- package/dist/agents/formatters/formatter-factory.js.map +0 -1
- package/dist/agents/types.js.map +0 -1
- package/dist/analyser/analyzers/script-analyzer.d.ts +0 -10
- package/dist/analyser/analyzers/script-analyzer.d.ts.map +0 -1
- package/dist/analyser/analyzers/script-analyzer.js +0 -205
- package/dist/analyser/analyzers/script-analyzer.js.map +0 -1
- package/dist/analyser/detectors/base-detector.d.ts +0 -12
- package/dist/analyser/detectors/base-detector.d.ts.map +0 -1
- package/dist/analyser/detectors/base-detector.js +0 -50
- package/dist/analyser/detectors/base-detector.js.map +0 -1
- package/dist/analyser/detectors/javascript-detector.d.ts +0 -19
- package/dist/analyser/detectors/javascript-detector.d.ts.map +0 -1
- package/dist/analyser/detectors/javascript-detector.js +0 -347
- package/dist/analyser/detectors/javascript-detector.js.map +0 -1
- package/dist/analyser/index.d.ts +0 -5
- package/dist/analyser/index.d.ts.map +0 -1
- package/dist/analyser/index.js +0 -315
- package/dist/analyser/index.js.map +0 -1
- package/dist/analyser/types.d.ts +0 -2
- package/dist/analyser/types.d.ts.map +0 -1
- package/dist/analyser/types.js +0 -2
- package/dist/analyser/types.js.map +0 -1
- package/dist/analyser/utils.d.ts +0 -5
- package/dist/analyser/utils.d.ts.map +0 -1
- package/dist/analyser/utils.js +0 -24
- package/dist/analyser/utils.js.map +0 -1
- package/dist/cli/cli-factory.d.ts +0 -3
- package/dist/cli/cli-factory.d.ts.map +0 -1
- package/dist/cli/cli-factory.js +0 -235
- package/dist/cli/cli-factory.js.map +0 -1
- package/dist/cli/commands/analyse.command.d.ts +0 -18
- package/dist/cli/commands/analyse.command.d.ts.map +0 -1
- package/dist/cli/commands/analyse.command.js +0 -161
- package/dist/cli/commands/analyse.command.js.map +0 -1
- package/dist/cli/commands/config.command.d.ts +0 -25
- package/dist/cli/commands/config.command.d.ts.map +0 -1
- package/dist/cli/commands/config.command.js +0 -285
- package/dist/cli/commands/config.command.js.map +0 -1
- package/dist/cli/commands/install.command.d.ts +0 -23
- package/dist/cli/commands/install.command.d.ts.map +0 -1
- package/dist/cli/commands/install.command.js +0 -189
- package/dist/cli/commands/install.command.js.map +0 -1
- package/dist/cli/commands/list.command.d.ts +0 -15
- package/dist/cli/commands/list.command.d.ts.map +0 -1
- package/dist/cli/commands/list.command.js +0 -90
- package/dist/cli/commands/list.command.js.map +0 -1
- package/dist/cli/commands/status.command.d.ts +0 -25
- package/dist/cli/commands/status.command.d.ts.map +0 -1
- package/dist/cli/commands/status.command.js +0 -367
- package/dist/cli/commands/status.command.js.map +0 -1
- package/dist/cli/commands/track-commit.command.d.ts +0 -52
- package/dist/cli/commands/track-commit.command.d.ts.map +0 -1
- package/dist/cli/commands/track-commit.command.js +0 -239
- package/dist/cli/commands/track-commit.command.js.map +0 -1
- package/dist/cli/commands/uninstall.command.d.ts +0 -23
- package/dist/cli/commands/uninstall.command.d.ts.map +0 -1
- package/dist/cli/commands/uninstall.command.js +0 -176
- package/dist/cli/commands/uninstall.command.js.map +0 -1
- package/dist/cli/commands/validate-commit-message.command.d.ts +0 -47
- package/dist/cli/commands/validate-commit-message.command.d.ts.map +0 -1
- package/dist/cli/commands/validate-commit-message.command.js +0 -223
- package/dist/cli/commands/validate-commit-message.command.js.map +0 -1
- package/dist/cli/installers/base-installer.d.ts +0 -20
- package/dist/cli/installers/base-installer.d.ts.map +0 -1
- package/dist/cli/installers/base-installer.js +0 -3
- package/dist/cli/installers/base-installer.js.map +0 -1
- package/dist/cli/installers/chatgpt-installer.d.ts +0 -18
- package/dist/cli/installers/chatgpt-installer.d.ts.map +0 -1
- package/dist/cli/installers/chatgpt-installer.js +0 -45
- package/dist/cli/installers/chatgpt-installer.js.map +0 -1
- package/dist/cli/installers/claude-code-installer.d.ts +0 -23
- package/dist/cli/installers/claude-code-installer.d.ts.map +0 -1
- package/dist/cli/installers/claude-code-installer.js +0 -127
- package/dist/cli/installers/claude-code-installer.js.map +0 -1
- package/dist/cli/installers/claude-desktop-installer.d.ts +0 -18
- package/dist/cli/installers/claude-desktop-installer.d.ts.map +0 -1
- package/dist/cli/installers/claude-desktop-installer.js +0 -48
- package/dist/cli/installers/claude-desktop-installer.js.map +0 -1
- package/dist/cli/installers/cursor-installer.d.ts +0 -18
- package/dist/cli/installers/cursor-installer.d.ts.map +0 -1
- package/dist/cli/installers/cursor-installer.js +0 -45
- package/dist/cli/installers/cursor-installer.js.map +0 -1
- package/dist/cli/installers/installer-factory.d.ts +0 -30
- package/dist/cli/installers/installer-factory.d.ts.map +0 -1
- package/dist/cli/installers/installer-factory.js +0 -90
- package/dist/cli/installers/installer-factory.js.map +0 -1
- package/dist/cli/utils/node-resolver.d.ts +0 -53
- package/dist/cli/utils/node-resolver.d.ts.map +0 -1
- package/dist/cli/utils/node-resolver.js +0 -200
- package/dist/cli/utils/node-resolver.js.map +0 -1
- package/dist/cli/utils/package-locator.d.ts +0 -9
- package/dist/cli/utils/package-locator.d.ts.map +0 -1
- package/dist/cli/utils/package-locator.js +0 -81
- package/dist/cli/utils/package-locator.js.map +0 -1
- package/dist/cli/utils/system-info.d.ts +0 -20
- package/dist/cli/utils/system-info.d.ts.map +0 -1
- package/dist/cli/utils/system-info.js +0 -90
- package/dist/cli/utils/system-info.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -27
- package/dist/cli.js.map +0 -1
- package/dist/core/console-logger.js.map +0 -1
- package/dist/core/file-logger.js.map +0 -1
- package/dist/core/mcp-server.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/prompts/index.js.map +0 -1
- package/dist/prompts/persona/persona.prompt.js.map +0 -1
- package/dist/prompts/planning/planning.prompt.js.map +0 -1
- package/dist/prompts/prompt-registry.js.map +0 -1
- package/dist/prompts/rules/rules.prompt.js.map +0 -1
- package/dist/prompts/thinking/thinking.prompt.js.map +0 -1
- package/dist/services/UpdateService.js.map +0 -1
- package/dist/services/adr-service.d.ts +0 -70
- package/dist/services/adr-service.d.ts.map +0 -1
- package/dist/services/adr-service.js +0 -242
- package/dist/services/adr-service.js.map +0 -1
- package/dist/services/agent-installation-service.js.map +0 -1
- package/dist/services/agent-manager.js.map +0 -1
- package/dist/services/agent-service.js.map +0 -1
- package/dist/services/analyse-service.js.map +0 -1
- package/dist/services/credential-storage.service.js.map +0 -1
- package/dist/services/dashboard-launcher.service.js.map +0 -1
- package/dist/services/persona-enhancer.js.map +0 -1
- package/dist/services/persona-grouper.d.ts +0 -29
- package/dist/services/persona-grouper.d.ts.map +0 -1
- package/dist/services/persona-grouper.js +0 -111
- package/dist/services/persona-grouper.js.map +0 -1
- package/dist/services/persona-service.js.map +0 -1
- package/dist/services/remote/auth-token-service.js.map +0 -1
- package/dist/services/remote/persona-sync-service.js.map +0 -1
- package/dist/services/remote/system-persona-service.js.map +0 -1
- package/dist/services/repo-service.js.map +0 -1
- package/dist/services/types/persona-types.d.ts +0 -84
- package/dist/services/types/persona-types.d.ts.map +0 -1
- package/dist/services/types/persona-types.js +0 -5
- package/dist/services/types/persona-types.js.map +0 -1
- package/dist/services/versioning-service.js.map +0 -1
- package/dist/storage/local-filesystem-adapter.js.map +0 -1
- package/dist/storage/platform-config-adapter.js.map +0 -1
- package/dist/storage/platform-path-builder.js.map +0 -1
- package/dist/storage/storage-path-builder.js.map +0 -1
- package/dist/test-setup.d.ts +0 -2
- package/dist/test-setup.d.ts.map +0 -1
- package/dist/test-setup.js +0 -12
- package/dist/test-setup.js.map +0 -1
- package/dist/tools/analyse-request/analyse-request.tool.js.map +0 -1
- package/dist/tools/analyse.tool.js.map +0 -1
- package/dist/tools/config/config.tool.js.map +0 -1
- package/dist/tools/config/index.js.map +0 -1
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/persona/as.tool.js.map +0 -1
- package/dist/tools/persona/persona.tool.js.map +0 -1
- package/dist/tools/plan/plan.tool.js.map +0 -1
- package/dist/tools/rules/rules.tool.js.map +0 -1
- package/dist/tools/strategy/strategy.tool.js.map +0 -1
- package/dist/tools/thinking/thinking.tool.js.map +0 -1
- package/dist/tools/tool-registry.js.map +0 -1
- package/dist/tools/update/update.tool.js.map +0 -1
- package/dist/tools/validate-response/validate-response.tool.js.map +0 -1
- package/dist/types/local-context.js.map +0 -1
- package/dist/types/request-context.js.map +0 -1
- package/dist/utils/adr-pattern-detector.d.ts +0 -38
- package/dist/utils/adr-pattern-detector.d.ts.map +0 -1
- package/dist/utils/adr-pattern-detector.js +0 -158
- package/dist/utils/adr-pattern-detector.js.map +0 -1
- package/dist/utils/adr-suggestion-generator.d.ts +0 -50
- package/dist/utils/adr-suggestion-generator.d.ts.map +0 -1
- package/dist/utils/adr-suggestion-generator.js +0 -63
- package/dist/utils/adr-suggestion-generator.js.map +0 -1
- package/dist/utils/commit-parser.d.ts +0 -25
- package/dist/utils/commit-parser.d.ts.map +0 -1
- package/dist/utils/commit-parser.js +0 -46
- package/dist/utils/commit-parser.js.map +0 -1
- package/dist/utils/package-version.js.map +0 -1
- package/dist/utils/repo-utils.js.map +0 -1
- package/templates/adr/README.md +0 -243
- package/templates/adr/_template/0001-record-architecture-decisions.md +0 -223
- package/templates/adr/_template/ADR_CREATION_INSTRUCTIONS.md +0 -234
- package/templates/adr/_template/adr-schema.json +0 -74
- package/templates/adr/_template/adr-template.md +0 -136
- package/templates/prd/PRD_CREATION_INSTRUCTIONS.md +0 -268
- package/templates/prd/README.md +0 -252
- package/templates/prd/_template/feature-template.md +0 -105
- package/templates/prd/_template/prd-template.md +0 -126
- package/templates/prd/example-task-management/features/task-collaboration.md +0 -84
- package/templates/prd/example-task-management/features/task-crud.md +0 -222
- package/templates/prd/example-task-management/features/task-workflow.md +0 -62
- package/templates/prd/example-task-management/prd.md +0 -177
- package/templates/prd/feature-schema.json +0 -54
- package/templates/prd/prd-schema.json +0 -60
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { createSuccessResult, createErrorResult } from '../index.js';
|
|
3
|
-
import { PlanningService } from '@magic-ingredients/tiny-brain-core';
|
|
3
|
+
import { PlanningService, RepoConfigService, ADRService } from '@magic-ingredients/tiny-brain-core';
|
|
4
4
|
import { toKebabCase } from '@magic-ingredients/tiny-brain-core';
|
|
5
5
|
import { DashboardLauncher } from '../../services/dashboard-launcher.service.js';
|
|
6
6
|
import { promises as fs } from 'fs';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import { exec } from 'child_process';
|
|
9
9
|
import { promisify } from 'util';
|
|
10
|
-
import { ADRService } from '../../services/adr-service.js';
|
|
11
10
|
const execAsync = promisify(exec);
|
|
12
11
|
const PlanArgsSchema = z.object({
|
|
13
|
-
operation: z.enum(['accept', 'feature', 'implement', 'update', 'status', 'report', 'list', 'archive', 'adr', 'create-adr', 'start-dashboard', 'stop-dashboard', 'dashboard-status']),
|
|
12
|
+
operation: z.enum(['accept', 'feature', 'implement', 'update', 'status', 'report', 'list', 'archive', 'adr', 'create-adr', 'sync', 'start-dashboard', 'stop-dashboard', 'dashboard-status']),
|
|
14
13
|
// For 'accept' operation
|
|
15
14
|
planName: z.string().optional(),
|
|
16
15
|
planDetails: z.string().optional(),
|
|
@@ -140,6 +139,41 @@ async function findUniqueSlug(baseSlug) {
|
|
|
140
139
|
// Fallback to timestamp-based if we can't find a unique slug
|
|
141
140
|
return `${baseSlug}-${Date.now()}`;
|
|
142
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Count PRD directories in docs/prd/ folder
|
|
144
|
+
*/
|
|
145
|
+
async function countPrdsInRepo(repoRoot) {
|
|
146
|
+
try {
|
|
147
|
+
const prdDir = path.join(repoRoot, 'docs', 'prd');
|
|
148
|
+
const entries = await fs.readdir(prdDir, { withFileTypes: true });
|
|
149
|
+
return entries.filter(entry => entry.isDirectory()).length;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// If docs/prd doesn't exist or can't be read, return 0
|
|
153
|
+
return 0;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Register repository in the dashboard after accepting a PRD
|
|
158
|
+
*/
|
|
159
|
+
async function registerRepository(context) {
|
|
160
|
+
try {
|
|
161
|
+
if (!context.repositoryRoot) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const repoConfigService = new RepoConfigService(context);
|
|
165
|
+
const repoName = path.basename(context.repositoryRoot);
|
|
166
|
+
const prdCount = await countPrdsInRepo(context.repositoryRoot);
|
|
167
|
+
await repoConfigService.registerRepo({
|
|
168
|
+
name: repoName,
|
|
169
|
+
path: context.repositoryRoot,
|
|
170
|
+
prdCount,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// Don't fail PRD creation if registration fails
|
|
175
|
+
}
|
|
176
|
+
}
|
|
143
177
|
export class PlanTool {
|
|
144
178
|
static getToolDefinition() {
|
|
145
179
|
return {
|
|
@@ -330,12 +364,16 @@ export class PlanTool {
|
|
|
330
364
|
context.logger?.info?.('[PLAN TOOL] Execute called', { operation: args.operation, cwd: process.cwd() });
|
|
331
365
|
try {
|
|
332
366
|
const validatedArgs = PlanArgsSchema.parse(args);
|
|
333
|
-
//
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
'
|
|
367
|
+
// Operations that don't require a persona - they're global or repo-scoped only
|
|
368
|
+
const personaFreeOperations = ['start-dashboard', 'stop-dashboard', 'dashboard-status', 'sync'];
|
|
369
|
+
// Validate persona is set for persona-specific operations
|
|
370
|
+
if (!personaFreeOperations.includes(validatedArgs.operation)) {
|
|
371
|
+
if (!context.activePersona?.id || context.activePersona.id.trim() === '') {
|
|
372
|
+
return createErrorResult('No active persona found. Plans are persona-specific.\n\n' +
|
|
373
|
+
'Use the "as" tool to switch to a persona first:\n' +
|
|
374
|
+
' as <persona-name>\n\n' +
|
|
375
|
+
'Or create a new persona if needed.');
|
|
376
|
+
}
|
|
339
377
|
}
|
|
340
378
|
// Detect repository root and add to context
|
|
341
379
|
// This ensures git operations work even when MCP server is not in the repo
|
|
@@ -368,6 +406,8 @@ export class PlanTool {
|
|
|
368
406
|
return await PlanTool.handleAdr(validatedArgs, contextWithRepo);
|
|
369
407
|
case 'create-adr':
|
|
370
408
|
return await PlanTool.handleCreateAdr(validatedArgs, contextWithRepo);
|
|
409
|
+
case 'sync':
|
|
410
|
+
return await PlanTool.handleSync(validatedArgs, contextWithRepo);
|
|
371
411
|
case 'start-dashboard':
|
|
372
412
|
return await PlanTool.handleStartDashboard(validatedArgs, contextWithRepo);
|
|
373
413
|
case 'stop-dashboard':
|
|
@@ -399,36 +439,48 @@ export class PlanTool {
|
|
|
399
439
|
overview: args.planDetails,
|
|
400
440
|
planDetails: args.planDetails, // Service will extract phases from this
|
|
401
441
|
});
|
|
402
|
-
// Create PRD
|
|
442
|
+
// Create PRD files in repository using new helper methods
|
|
403
443
|
// Generate human-readable slug from plan title
|
|
404
444
|
const baseSlug = toKebabCase(plan.title);
|
|
405
445
|
const prdSlug = await findUniqueSlug(baseSlug);
|
|
406
|
-
|
|
407
|
-
|
|
446
|
+
// Attempt PRD creation
|
|
447
|
+
// Error handling strategy: Verification instead of rollback
|
|
448
|
+
// - On failure, partial artifacts (empty dirs) are left for retry to reuse
|
|
449
|
+
// - verifyPRDCreation() ensures we only claim success when files exist
|
|
450
|
+
// - This approach is simpler and safer than attempting cleanup/rollback
|
|
451
|
+
let prdCreated = false;
|
|
452
|
+
let prdErrorMessage = '';
|
|
408
453
|
try {
|
|
409
|
-
|
|
454
|
+
// Step 1: Create PRD directory structure (docs/prd/{plan-name}/ and features/)
|
|
455
|
+
const prdPath = await planningService.createPRDStructure(prdSlug);
|
|
456
|
+
// Step 2: Write PRD markdown file with YAML frontmatter
|
|
457
|
+
await planningService.writePRDFile(prdSlug, args.planDetails);
|
|
458
|
+
// Step 3: Write progress.json file with plan metadata
|
|
459
|
+
await planningService.writeProgressFile(prdPath, {
|
|
410
460
|
id: plan.id,
|
|
411
461
|
title: plan.title,
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
created: now,
|
|
415
|
-
updated: now,
|
|
416
|
-
author: 'Claude Code',
|
|
417
|
-
}, {
|
|
418
|
-
purpose: args.planDetails,
|
|
419
|
-
userNeeds: 'To be defined during feature planning',
|
|
420
|
-
design: 'To be defined during feature planning',
|
|
421
|
-
releaseCriteria: 'To be defined during feature planning',
|
|
422
|
-
successMetrics: 'To be defined during feature planning',
|
|
423
|
-
constraints: 'To be defined during feature planning',
|
|
462
|
+
overview: plan.overview || args.planDetails,
|
|
463
|
+
features: plan.features || []
|
|
424
464
|
});
|
|
425
|
-
//
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
465
|
+
// Step 4: Verify PRD creation was successful
|
|
466
|
+
prdCreated = await planningService.verifyPRDCreation(prdSlug);
|
|
467
|
+
if (prdCreated) {
|
|
468
|
+
// Update plan with PRD reference
|
|
469
|
+
plan.prdId = prdSlug;
|
|
470
|
+
plan.prdDirPath = `${prdPath}/prd.md`;
|
|
471
|
+
context.logger?.info?.(`Created PRD files at ${prdPath}`);
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
// Detailed error: includes full path to help user locate/debug
|
|
475
|
+
prdErrorMessage = `PRD verification failed for ${prdPath}/prd.md`;
|
|
476
|
+
context.logger?.warn?.(prdErrorMessage);
|
|
477
|
+
}
|
|
429
478
|
}
|
|
430
479
|
catch (error) {
|
|
431
|
-
|
|
480
|
+
// Detailed error: includes underlying error message and context
|
|
481
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
482
|
+
prdErrorMessage = `Failed to create PRD files: ${errorMsg}`;
|
|
483
|
+
context.logger?.warn?.(prdErrorMessage);
|
|
432
484
|
// Continue anyway - the JSON plan was created successfully
|
|
433
485
|
}
|
|
434
486
|
// Set the new plan as active
|
|
@@ -440,11 +492,21 @@ export class PlanTool {
|
|
|
440
492
|
// Format response using service method
|
|
441
493
|
const planStructureJson = await planningService.formatPlanStructure(plan);
|
|
442
494
|
const planStructure = JSON.parse(planStructureJson);
|
|
495
|
+
// Build response with accurate PRD creation status
|
|
496
|
+
// Response accuracy: Only show PRD path if verification succeeded
|
|
497
|
+
// - Success (verified): Show "📋 PRD: {absolute-path}"
|
|
498
|
+
// - Failure (verified): Show "⚠️ PRD creation failed: {error-details}"
|
|
499
|
+
// - No attempt: Show empty string
|
|
500
|
+
const prdStatusLine = prdCreated && plan.prdDirPath
|
|
501
|
+
? `📋 PRD: ${plan.prdDirPath}`
|
|
502
|
+
: prdErrorMessage
|
|
503
|
+
? `⚠️ PRD creation failed: ${prdErrorMessage}`
|
|
504
|
+
: '';
|
|
443
505
|
const response = [
|
|
444
506
|
`✅ Created plan: "${plan.title}"`,
|
|
445
507
|
`Plan ID: ${plan.id}`,
|
|
446
508
|
`Persona: ${context.activePersona?.id || 'unknown'}`,
|
|
447
|
-
|
|
509
|
+
prdStatusLine,
|
|
448
510
|
'',
|
|
449
511
|
`Extracted ${plan.features?.length || 0} features:`,
|
|
450
512
|
...(plan.features || []).map((feature, i) => `${i + 1}. ${feature.title}`),
|
|
@@ -513,6 +575,8 @@ export class PlanTool {
|
|
|
513
575
|
'',
|
|
514
576
|
'Use "plan operation=status" to see the current status.',
|
|
515
577
|
].join('\n');
|
|
578
|
+
// Register repository in dashboard after successful PRD creation
|
|
579
|
+
await registerRepository(context);
|
|
516
580
|
return createSuccessResult(response);
|
|
517
581
|
}
|
|
518
582
|
catch (error) {
|
|
@@ -992,5 +1056,53 @@ export class PlanTool {
|
|
|
992
1056
|
return createErrorResult(`Failed to create ADR: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
993
1057
|
}
|
|
994
1058
|
}
|
|
1059
|
+
/**
|
|
1060
|
+
* Handle sync operation - regenerate progress.json from markdown files
|
|
1061
|
+
*/
|
|
1062
|
+
static async handleSync(args, context) {
|
|
1063
|
+
try {
|
|
1064
|
+
if (!context.repositoryRoot) {
|
|
1065
|
+
return createErrorResult('Repository root not found. Please run from within a git repository.');
|
|
1066
|
+
}
|
|
1067
|
+
const planningService = new PlanningService(context);
|
|
1068
|
+
// Determine which PRD to sync
|
|
1069
|
+
let prdPath;
|
|
1070
|
+
if (args.planId) {
|
|
1071
|
+
// Sync specific PRD
|
|
1072
|
+
prdPath = path.join(context.repositoryRoot, 'docs', 'prd', args.planId);
|
|
1073
|
+
}
|
|
1074
|
+
else {
|
|
1075
|
+
// Try to sync the active plan
|
|
1076
|
+
const activePlan = await planningService.getActivePlan();
|
|
1077
|
+
if (!activePlan?.prdDirPath) {
|
|
1078
|
+
return createErrorResult('No active plan found. Specify a planId to sync a specific PRD: plan sync --planId my-prd');
|
|
1079
|
+
}
|
|
1080
|
+
prdPath = path.join(context.repositoryRoot, activePlan.prdDirPath);
|
|
1081
|
+
}
|
|
1082
|
+
// Check if PRD exists
|
|
1083
|
+
const prdMdPath = path.join(prdPath, 'prd.md');
|
|
1084
|
+
try {
|
|
1085
|
+
await fs.access(prdMdPath);
|
|
1086
|
+
}
|
|
1087
|
+
catch {
|
|
1088
|
+
return createErrorResult(`PRD not found at ${prdPath}. Ensure prd.md exists in the specified directory.`);
|
|
1089
|
+
}
|
|
1090
|
+
// Sync the plan from markdown
|
|
1091
|
+
const plan = await planningService.syncPlanFromMarkdown(prdPath);
|
|
1092
|
+
const response = [
|
|
1093
|
+
'✅ Progress synced from markdown!',
|
|
1094
|
+
'',
|
|
1095
|
+
`📋 PRD: ${plan.title}`,
|
|
1096
|
+
`📁 Path: ${plan.prdDirPath}`,
|
|
1097
|
+
`📊 Features: ${plan.features.length}`,
|
|
1098
|
+
`📝 Tasks: ${plan.metadata.totalTasks} (${plan.metadata.completedTasks} completed)`,
|
|
1099
|
+
'',
|
|
1100
|
+
'Progress.json has been updated from the markdown files.',
|
|
1101
|
+
].join('\n');
|
|
1102
|
+
return createSuccessResult(response);
|
|
1103
|
+
}
|
|
1104
|
+
catch (error) {
|
|
1105
|
+
return createErrorResult(`Failed to sync plan: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
995
1108
|
}
|
|
996
|
-
//# sourceMappingURL=plan.tool.js.map
|
|
@@ -62,4 +62,3 @@ export class ToolRegistry {
|
|
|
62
62
|
// Export convenience functions
|
|
63
63
|
export const getToolByName = (name) => ToolRegistry.getToolByName(name);
|
|
64
64
|
export const getAllToolNames = () => ToolRegistry.getTools().map((tool) => tool.name);
|
|
65
|
-
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/types/request-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/types/request-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC"}
|
package/dist/utils/repo-utils.js
CHANGED
package/package.json
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@magic-ingredients/tiny-brain-local",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.14.10",
|
|
4
|
+
"description": "MCP server for Tiny Brain AI assistant",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"module": "./dist/index.js",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
|
-
"bin": {
|
|
10
|
-
"tiny-brain": "./dist/cli.js"
|
|
11
|
-
},
|
|
12
9
|
"exports": {
|
|
13
10
|
".": {
|
|
14
11
|
"types": "./dist/index.d.ts",
|
|
@@ -17,46 +14,30 @@
|
|
|
17
14
|
},
|
|
18
15
|
"files": [
|
|
19
16
|
"dist",
|
|
20
|
-
"README.md"
|
|
21
|
-
"templates"
|
|
17
|
+
"README.md"
|
|
22
18
|
],
|
|
23
19
|
"scripts": {
|
|
24
20
|
"build": "tsc",
|
|
25
|
-
"build:server": "tsc",
|
|
26
|
-
"build:cli": "tsc",
|
|
27
|
-
"build:all": "npm run build",
|
|
28
21
|
"dev": "tsx src/index.ts",
|
|
29
|
-
"dev:cli": "tsx src/cli.ts",
|
|
30
|
-
"dev:server": "tsx src/index.ts",
|
|
31
22
|
"test": "vitest run",
|
|
32
23
|
"test:coverage": "vitest run --coverage",
|
|
33
|
-
"test:cli": "vitest run src/cli",
|
|
34
24
|
"lint": "eslint src",
|
|
35
25
|
"typecheck": "tsc --noEmit",
|
|
36
|
-
"prepublishOnly": "npm run build"
|
|
37
|
-
"dxt:clean": "rm -rf dxt/node_modules dxt/package-lock.json dxt/dist dxt/server/index.js",
|
|
38
|
-
"dxt:build": "npm run dxt:clean && npm run build && node scripts/bundle-dxt.js",
|
|
39
|
-
"dxt:pack": "npm run dxt:build && cd dxt && npm install && npx @anthropic-ai/dxt pack . dist/tiny-brain-$(node -p \"require('../package.json').version\").dxt",
|
|
40
|
-
"dxt:install": "npm install -g @anthropic-ai/dxt",
|
|
41
|
-
"dxt:init": "cd dxt && dxt init"
|
|
26
|
+
"prepublishOnly": "npm run build"
|
|
42
27
|
},
|
|
43
28
|
"dependencies": {
|
|
44
|
-
"@magic-ingredients/tiny-brain-core": "^0.
|
|
29
|
+
"@magic-ingredients/tiny-brain-core": "^0.14.10",
|
|
45
30
|
"@magic-ingredients/tiny-brain-dashboard": "file:../tiny-brain-dashboard",
|
|
46
31
|
"@modelcontextprotocol/sdk": "^1.0.6",
|
|
47
32
|
"chalk": "^5.3.0",
|
|
48
|
-
"commander": "^12.0.0",
|
|
49
33
|
"dotenv": "^17.2.1",
|
|
50
|
-
"inquirer": "^9.2.15",
|
|
51
34
|
"marked": "^15.0.0",
|
|
52
35
|
"semver": "^7.7.2",
|
|
53
36
|
"zod": "^3.23.8"
|
|
54
37
|
},
|
|
55
38
|
"devDependencies": {
|
|
56
|
-
"@anthropic-ai/dxt": "^0.2.5",
|
|
57
39
|
"@types/node": "^20.14.2",
|
|
58
40
|
"@types/semver": "^7.7.1",
|
|
59
|
-
"@vercel/blob": "^1.1.1",
|
|
60
41
|
"@vitest/coverage-v8": "^2.1.8",
|
|
61
42
|
"eslint": "^8.57.0",
|
|
62
43
|
"tsx": "^4.19.2",
|
|
@@ -71,19 +52,14 @@
|
|
|
71
52
|
"ai",
|
|
72
53
|
"assistant",
|
|
73
54
|
"tiny-brain",
|
|
74
|
-
"model-context-protocol"
|
|
75
|
-
"local-server"
|
|
55
|
+
"model-context-protocol"
|
|
76
56
|
],
|
|
77
57
|
"author": "Magic Ingredients",
|
|
78
58
|
"license": "MIT",
|
|
79
59
|
"repository": {
|
|
80
60
|
"type": "git",
|
|
81
|
-
"url": "https://github.com/magic-ingredients/tiny-brain-local.git",
|
|
82
|
-
"directory": "packages/tiny-brain-
|
|
83
|
-
},
|
|
84
|
-
"homepage": "https://github.com/magic-ingredients/tiny-brain-local#readme",
|
|
85
|
-
"bugs": {
|
|
86
|
-
"url": "https://github.com/magic-ingredients/tiny-brain-local/issues"
|
|
61
|
+
"url": "git+https://github.com/magic-ingredients/tiny-brain-local.git",
|
|
62
|
+
"directory": "packages/tiny-brain-mcp"
|
|
87
63
|
},
|
|
88
64
|
"publishConfig": {
|
|
89
65
|
"access": "public",
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 Magic Ingredients
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|