@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.
Files changed (258) hide show
  1. package/dist/agents/formatters/claude-code-formatter.js +0 -1
  2. package/dist/agents/formatters/formatter-factory.js +0 -1
  3. package/dist/agents/types.js +0 -1
  4. package/dist/core/console-logger.js +0 -1
  5. package/dist/core/file-logger.js +0 -1
  6. package/dist/core/mcp-server.js +0 -1
  7. package/dist/index.d.ts +22 -8
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +20 -148
  10. package/dist/prompts/index.js +0 -1
  11. package/dist/prompts/persona/persona.prompt.js +0 -1
  12. package/dist/prompts/planning/planning.prompt.js +0 -1
  13. package/dist/prompts/prompt-registry.js +0 -1
  14. package/dist/prompts/rules/rules.prompt.js +0 -1
  15. package/dist/prompts/thinking/thinking.prompt.js +0 -1
  16. package/dist/services/UpdateService.js +0 -1
  17. package/dist/services/agent-installation-service.js +0 -1
  18. package/dist/services/agent-manager.js +0 -1
  19. package/dist/services/agent-service.js +0 -1
  20. package/dist/services/analyse-service.d.ts +52 -8
  21. package/dist/services/analyse-service.d.ts.map +1 -1
  22. package/dist/services/analyse-service.js +325 -66
  23. package/dist/services/credential-storage.service.js +0 -1
  24. package/dist/services/dashboard-launcher.service.js +0 -1
  25. package/dist/services/persona-enhancer.js +0 -1
  26. package/dist/services/persona-service.js +0 -1
  27. package/dist/services/remote/auth-token-service.js +0 -1
  28. package/dist/services/remote/persona-sync-service.js +0 -1
  29. package/dist/services/remote/system-persona-service.js +0 -1
  30. package/dist/services/repo-service.d.ts.map +1 -1
  31. package/dist/services/repo-service.js +31 -25
  32. package/dist/services/versioning-service.js +0 -1
  33. package/dist/storage/local-filesystem-adapter.js +0 -1
  34. package/dist/storage/platform-config-adapter.js +0 -1
  35. package/dist/storage/platform-path-builder.js +0 -1
  36. package/dist/storage/storage-path-builder.js +0 -1
  37. package/dist/tools/analyse-request/analyse-request.tool.js +0 -1
  38. package/dist/tools/analyse.tool.d.ts +4 -0
  39. package/dist/tools/analyse.tool.d.ts.map +1 -1
  40. package/dist/tools/analyse.tool.js +34 -3
  41. package/dist/tools/config/config.tool.d.ts +3 -0
  42. package/dist/tools/config/config.tool.d.ts.map +1 -1
  43. package/dist/tools/config/config.tool.js +139 -70
  44. package/dist/tools/config/index.js +0 -1
  45. package/dist/tools/index.d.ts +4 -4
  46. package/dist/tools/index.js +0 -1
  47. package/dist/tools/persona/as.tool.js +0 -1
  48. package/dist/tools/persona/persona.tool.js +0 -1
  49. package/dist/tools/plan/plan.tool.d.ts +4 -0
  50. package/dist/tools/plan/plan.tool.d.ts.map +1 -1
  51. package/dist/tools/plan/plan.tool.js +144 -32
  52. package/dist/tools/rules/rules.tool.js +0 -1
  53. package/dist/tools/strategy/strategy.tool.js +0 -1
  54. package/dist/tools/thinking/thinking.tool.js +0 -1
  55. package/dist/tools/tool-registry.js +0 -1
  56. package/dist/tools/update/update.tool.js +0 -1
  57. package/dist/tools/validate-response/validate-response.tool.js +0 -1
  58. package/dist/types/local-context.js +0 -1
  59. package/dist/types/request-context.d.ts +1 -1
  60. package/dist/types/request-context.d.ts.map +1 -1
  61. package/dist/types/request-context.js +0 -1
  62. package/dist/utils/package-version.js +0 -1
  63. package/dist/utils/repo-utils.js +0 -1
  64. package/package.json +8 -32
  65. package/LICENSE +0 -21
  66. package/README.md +0 -260
  67. package/dist/agents/formatters/claude-code-formatter.js.map +0 -1
  68. package/dist/agents/formatters/formatter-factory.js.map +0 -1
  69. package/dist/agents/types.js.map +0 -1
  70. package/dist/analyser/analyzers/script-analyzer.d.ts +0 -10
  71. package/dist/analyser/analyzers/script-analyzer.d.ts.map +0 -1
  72. package/dist/analyser/analyzers/script-analyzer.js +0 -205
  73. package/dist/analyser/analyzers/script-analyzer.js.map +0 -1
  74. package/dist/analyser/detectors/base-detector.d.ts +0 -12
  75. package/dist/analyser/detectors/base-detector.d.ts.map +0 -1
  76. package/dist/analyser/detectors/base-detector.js +0 -50
  77. package/dist/analyser/detectors/base-detector.js.map +0 -1
  78. package/dist/analyser/detectors/javascript-detector.d.ts +0 -19
  79. package/dist/analyser/detectors/javascript-detector.d.ts.map +0 -1
  80. package/dist/analyser/detectors/javascript-detector.js +0 -347
  81. package/dist/analyser/detectors/javascript-detector.js.map +0 -1
  82. package/dist/analyser/index.d.ts +0 -5
  83. package/dist/analyser/index.d.ts.map +0 -1
  84. package/dist/analyser/index.js +0 -315
  85. package/dist/analyser/index.js.map +0 -1
  86. package/dist/analyser/types.d.ts +0 -2
  87. package/dist/analyser/types.d.ts.map +0 -1
  88. package/dist/analyser/types.js +0 -2
  89. package/dist/analyser/types.js.map +0 -1
  90. package/dist/analyser/utils.d.ts +0 -5
  91. package/dist/analyser/utils.d.ts.map +0 -1
  92. package/dist/analyser/utils.js +0 -24
  93. package/dist/analyser/utils.js.map +0 -1
  94. package/dist/cli/cli-factory.d.ts +0 -3
  95. package/dist/cli/cli-factory.d.ts.map +0 -1
  96. package/dist/cli/cli-factory.js +0 -235
  97. package/dist/cli/cli-factory.js.map +0 -1
  98. package/dist/cli/commands/analyse.command.d.ts +0 -18
  99. package/dist/cli/commands/analyse.command.d.ts.map +0 -1
  100. package/dist/cli/commands/analyse.command.js +0 -161
  101. package/dist/cli/commands/analyse.command.js.map +0 -1
  102. package/dist/cli/commands/config.command.d.ts +0 -25
  103. package/dist/cli/commands/config.command.d.ts.map +0 -1
  104. package/dist/cli/commands/config.command.js +0 -285
  105. package/dist/cli/commands/config.command.js.map +0 -1
  106. package/dist/cli/commands/install.command.d.ts +0 -23
  107. package/dist/cli/commands/install.command.d.ts.map +0 -1
  108. package/dist/cli/commands/install.command.js +0 -189
  109. package/dist/cli/commands/install.command.js.map +0 -1
  110. package/dist/cli/commands/list.command.d.ts +0 -15
  111. package/dist/cli/commands/list.command.d.ts.map +0 -1
  112. package/dist/cli/commands/list.command.js +0 -90
  113. package/dist/cli/commands/list.command.js.map +0 -1
  114. package/dist/cli/commands/status.command.d.ts +0 -25
  115. package/dist/cli/commands/status.command.d.ts.map +0 -1
  116. package/dist/cli/commands/status.command.js +0 -367
  117. package/dist/cli/commands/status.command.js.map +0 -1
  118. package/dist/cli/commands/track-commit.command.d.ts +0 -52
  119. package/dist/cli/commands/track-commit.command.d.ts.map +0 -1
  120. package/dist/cli/commands/track-commit.command.js +0 -239
  121. package/dist/cli/commands/track-commit.command.js.map +0 -1
  122. package/dist/cli/commands/uninstall.command.d.ts +0 -23
  123. package/dist/cli/commands/uninstall.command.d.ts.map +0 -1
  124. package/dist/cli/commands/uninstall.command.js +0 -176
  125. package/dist/cli/commands/uninstall.command.js.map +0 -1
  126. package/dist/cli/commands/validate-commit-message.command.d.ts +0 -47
  127. package/dist/cli/commands/validate-commit-message.command.d.ts.map +0 -1
  128. package/dist/cli/commands/validate-commit-message.command.js +0 -223
  129. package/dist/cli/commands/validate-commit-message.command.js.map +0 -1
  130. package/dist/cli/installers/base-installer.d.ts +0 -20
  131. package/dist/cli/installers/base-installer.d.ts.map +0 -1
  132. package/dist/cli/installers/base-installer.js +0 -3
  133. package/dist/cli/installers/base-installer.js.map +0 -1
  134. package/dist/cli/installers/chatgpt-installer.d.ts +0 -18
  135. package/dist/cli/installers/chatgpt-installer.d.ts.map +0 -1
  136. package/dist/cli/installers/chatgpt-installer.js +0 -45
  137. package/dist/cli/installers/chatgpt-installer.js.map +0 -1
  138. package/dist/cli/installers/claude-code-installer.d.ts +0 -23
  139. package/dist/cli/installers/claude-code-installer.d.ts.map +0 -1
  140. package/dist/cli/installers/claude-code-installer.js +0 -127
  141. package/dist/cli/installers/claude-code-installer.js.map +0 -1
  142. package/dist/cli/installers/claude-desktop-installer.d.ts +0 -18
  143. package/dist/cli/installers/claude-desktop-installer.d.ts.map +0 -1
  144. package/dist/cli/installers/claude-desktop-installer.js +0 -48
  145. package/dist/cli/installers/claude-desktop-installer.js.map +0 -1
  146. package/dist/cli/installers/cursor-installer.d.ts +0 -18
  147. package/dist/cli/installers/cursor-installer.d.ts.map +0 -1
  148. package/dist/cli/installers/cursor-installer.js +0 -45
  149. package/dist/cli/installers/cursor-installer.js.map +0 -1
  150. package/dist/cli/installers/installer-factory.d.ts +0 -30
  151. package/dist/cli/installers/installer-factory.d.ts.map +0 -1
  152. package/dist/cli/installers/installer-factory.js +0 -90
  153. package/dist/cli/installers/installer-factory.js.map +0 -1
  154. package/dist/cli/utils/node-resolver.d.ts +0 -53
  155. package/dist/cli/utils/node-resolver.d.ts.map +0 -1
  156. package/dist/cli/utils/node-resolver.js +0 -200
  157. package/dist/cli/utils/node-resolver.js.map +0 -1
  158. package/dist/cli/utils/package-locator.d.ts +0 -9
  159. package/dist/cli/utils/package-locator.d.ts.map +0 -1
  160. package/dist/cli/utils/package-locator.js +0 -81
  161. package/dist/cli/utils/package-locator.js.map +0 -1
  162. package/dist/cli/utils/system-info.d.ts +0 -20
  163. package/dist/cli/utils/system-info.d.ts.map +0 -1
  164. package/dist/cli/utils/system-info.js +0 -90
  165. package/dist/cli/utils/system-info.js.map +0 -1
  166. package/dist/cli.d.ts +0 -3
  167. package/dist/cli.d.ts.map +0 -1
  168. package/dist/cli.js +0 -27
  169. package/dist/cli.js.map +0 -1
  170. package/dist/core/console-logger.js.map +0 -1
  171. package/dist/core/file-logger.js.map +0 -1
  172. package/dist/core/mcp-server.js.map +0 -1
  173. package/dist/index.js.map +0 -1
  174. package/dist/prompts/index.js.map +0 -1
  175. package/dist/prompts/persona/persona.prompt.js.map +0 -1
  176. package/dist/prompts/planning/planning.prompt.js.map +0 -1
  177. package/dist/prompts/prompt-registry.js.map +0 -1
  178. package/dist/prompts/rules/rules.prompt.js.map +0 -1
  179. package/dist/prompts/thinking/thinking.prompt.js.map +0 -1
  180. package/dist/services/UpdateService.js.map +0 -1
  181. package/dist/services/adr-service.d.ts +0 -70
  182. package/dist/services/adr-service.d.ts.map +0 -1
  183. package/dist/services/adr-service.js +0 -242
  184. package/dist/services/adr-service.js.map +0 -1
  185. package/dist/services/agent-installation-service.js.map +0 -1
  186. package/dist/services/agent-manager.js.map +0 -1
  187. package/dist/services/agent-service.js.map +0 -1
  188. package/dist/services/analyse-service.js.map +0 -1
  189. package/dist/services/credential-storage.service.js.map +0 -1
  190. package/dist/services/dashboard-launcher.service.js.map +0 -1
  191. package/dist/services/persona-enhancer.js.map +0 -1
  192. package/dist/services/persona-grouper.d.ts +0 -29
  193. package/dist/services/persona-grouper.d.ts.map +0 -1
  194. package/dist/services/persona-grouper.js +0 -111
  195. package/dist/services/persona-grouper.js.map +0 -1
  196. package/dist/services/persona-service.js.map +0 -1
  197. package/dist/services/remote/auth-token-service.js.map +0 -1
  198. package/dist/services/remote/persona-sync-service.js.map +0 -1
  199. package/dist/services/remote/system-persona-service.js.map +0 -1
  200. package/dist/services/repo-service.js.map +0 -1
  201. package/dist/services/types/persona-types.d.ts +0 -84
  202. package/dist/services/types/persona-types.d.ts.map +0 -1
  203. package/dist/services/types/persona-types.js +0 -5
  204. package/dist/services/types/persona-types.js.map +0 -1
  205. package/dist/services/versioning-service.js.map +0 -1
  206. package/dist/storage/local-filesystem-adapter.js.map +0 -1
  207. package/dist/storage/platform-config-adapter.js.map +0 -1
  208. package/dist/storage/platform-path-builder.js.map +0 -1
  209. package/dist/storage/storage-path-builder.js.map +0 -1
  210. package/dist/test-setup.d.ts +0 -2
  211. package/dist/test-setup.d.ts.map +0 -1
  212. package/dist/test-setup.js +0 -12
  213. package/dist/test-setup.js.map +0 -1
  214. package/dist/tools/analyse-request/analyse-request.tool.js.map +0 -1
  215. package/dist/tools/analyse.tool.js.map +0 -1
  216. package/dist/tools/config/config.tool.js.map +0 -1
  217. package/dist/tools/config/index.js.map +0 -1
  218. package/dist/tools/index.js.map +0 -1
  219. package/dist/tools/persona/as.tool.js.map +0 -1
  220. package/dist/tools/persona/persona.tool.js.map +0 -1
  221. package/dist/tools/plan/plan.tool.js.map +0 -1
  222. package/dist/tools/rules/rules.tool.js.map +0 -1
  223. package/dist/tools/strategy/strategy.tool.js.map +0 -1
  224. package/dist/tools/thinking/thinking.tool.js.map +0 -1
  225. package/dist/tools/tool-registry.js.map +0 -1
  226. package/dist/tools/update/update.tool.js.map +0 -1
  227. package/dist/tools/validate-response/validate-response.tool.js.map +0 -1
  228. package/dist/types/local-context.js.map +0 -1
  229. package/dist/types/request-context.js.map +0 -1
  230. package/dist/utils/adr-pattern-detector.d.ts +0 -38
  231. package/dist/utils/adr-pattern-detector.d.ts.map +0 -1
  232. package/dist/utils/adr-pattern-detector.js +0 -158
  233. package/dist/utils/adr-pattern-detector.js.map +0 -1
  234. package/dist/utils/adr-suggestion-generator.d.ts +0 -50
  235. package/dist/utils/adr-suggestion-generator.d.ts.map +0 -1
  236. package/dist/utils/adr-suggestion-generator.js +0 -63
  237. package/dist/utils/adr-suggestion-generator.js.map +0 -1
  238. package/dist/utils/commit-parser.d.ts +0 -25
  239. package/dist/utils/commit-parser.d.ts.map +0 -1
  240. package/dist/utils/commit-parser.js +0 -46
  241. package/dist/utils/commit-parser.js.map +0 -1
  242. package/dist/utils/package-version.js.map +0 -1
  243. package/dist/utils/repo-utils.js.map +0 -1
  244. package/templates/adr/README.md +0 -243
  245. package/templates/adr/_template/0001-record-architecture-decisions.md +0 -223
  246. package/templates/adr/_template/ADR_CREATION_INSTRUCTIONS.md +0 -234
  247. package/templates/adr/_template/adr-schema.json +0 -74
  248. package/templates/adr/_template/adr-template.md +0 -136
  249. package/templates/prd/PRD_CREATION_INSTRUCTIONS.md +0 -268
  250. package/templates/prd/README.md +0 -252
  251. package/templates/prd/_template/feature-template.md +0 -105
  252. package/templates/prd/_template/prd-template.md +0 -126
  253. package/templates/prd/example-task-management/features/task-collaboration.md +0 -84
  254. package/templates/prd/example-task-management/features/task-crud.md +0 -222
  255. package/templates/prd/example-task-management/features/task-workflow.md +0 -62
  256. package/templates/prd/example-task-management/prd.md +0 -177
  257. package/templates/prd/feature-schema.json +0 -54
  258. 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
- // Validate persona is set for all operations
334
- if (!context.activePersona?.id || context.activePersona.id.trim() === '') {
335
- return createErrorResult('No active persona found. Plans are persona-specific.\n\n' +
336
- 'Use the "as" tool to switch to a persona first:\n' +
337
- ' as <persona-name>\n\n' +
338
- 'Or create a new persona if needed.');
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 markdown in repository
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
- const prdPath = `docs/prd/${prdSlug}`;
407
- const now = new Date().toISOString();
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
- const prdDirPath = await planningService.createPRDMarkdown(prdPath, {
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
- version: '1.0.0',
413
- status: 'not_started',
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
- // Update plan with PRD reference
426
- plan.prdId = prdSlug;
427
- plan.prdDirPath = `${prdPath}/prd.md`;
428
- context.logger?.info?.(`Created PRD markdown at ${prdDirPath}`);
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
- context.logger?.warn?.(`Failed to create PRD markdown: ${error}`);
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
- plan.prdDirPath ? `📋 PRD: ${plan.prdDirPath}` : '',
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
@@ -130,4 +130,3 @@ export class RulesTool {
130
130
  }
131
131
  }
132
132
  }
133
- //# sourceMappingURL=rules.tool.js.map
@@ -196,4 +196,3 @@ export class StrategyTool {
196
196
  }
197
197
  }
198
198
  }
199
- //# sourceMappingURL=strategy.tool.js.map
@@ -223,4 +223,3 @@ export class ThinkingTool {
223
223
  }
224
224
  }
225
225
  }
226
- //# sourceMappingURL=thinking.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
@@ -83,4 +83,3 @@ export class UpdateTool {
83
83
  }
84
84
  }
85
85
  }
86
- //# sourceMappingURL=update.tool.js.map
@@ -139,4 +139,3 @@ export class ValidateResponseTool {
139
139
  }
140
140
  }
141
141
  }
142
- //# sourceMappingURL=validate-response.tool.js.map
@@ -4,4 +4,3 @@
4
4
  * Adds local-specific fields to the base RequestContext
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=local-context.js.map
@@ -3,5 +3,5 @@
3
3
  *
4
4
  * Re-export the RequestContext from core and extend if needed
5
5
  */
6
- export { RequestContext } from '@magic-ingredients/tiny-brain-core';
6
+ export type { RequestContext } from '@magic-ingredients/tiny-brain-core';
7
7
  //# sourceMappingURL=request-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/types/request-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC"}
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"}
@@ -4,4 +4,3 @@
4
4
  * Re-export the RequestContext from core and extend if needed
5
5
  */
6
6
  export {};
7
- //# sourceMappingURL=request-context.js.map
@@ -23,4 +23,3 @@ export function getPackageVersion() {
23
23
  throw new Error(`Failed to read package version: ${error instanceof Error ? error.message : 'Unknown error'}`);
24
24
  }
25
25
  }
26
- //# sourceMappingURL=package-version.js.map
@@ -52,4 +52,3 @@ export function getRepoRoot() {
52
52
  }
53
53
  return cachedRepoRoot;
54
54
  }
55
- //# sourceMappingURL=repo-utils.js.map
package/package.json CHANGED
@@ -1,14 +1,11 @@
1
1
  {
2
2
  "name": "@magic-ingredients/tiny-brain-local",
3
- "version": "0.13.0",
4
- "description": "Local MCP server implementation for Tiny Brain AI assistant",
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.13.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-local"
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.