prjct-cli 0.45.0 → 0.45.3

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 (207) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/bin/prjct.ts +117 -10
  3. package/core/__tests__/agentic/memory-system.test.ts +39 -26
  4. package/core/__tests__/agentic/plan-mode.test.ts +64 -46
  5. package/core/__tests__/agentic/prompt-builder.test.ts +14 -14
  6. package/core/__tests__/services/project-index.test.ts +353 -0
  7. package/core/__tests__/types/fs.test.ts +3 -3
  8. package/core/__tests__/utils/date-helper.test.ts +10 -10
  9. package/core/__tests__/utils/output.test.ts +9 -6
  10. package/core/__tests__/utils/project-commands.test.ts +5 -6
  11. package/core/agentic/agent-router.ts +9 -10
  12. package/core/agentic/chain-of-thought.ts +16 -4
  13. package/core/agentic/command-executor.ts +66 -40
  14. package/core/agentic/context-builder.ts +8 -5
  15. package/core/agentic/ground-truth.ts +15 -9
  16. package/core/agentic/index.ts +145 -152
  17. package/core/agentic/loop-detector.ts +40 -11
  18. package/core/agentic/memory-system.ts +98 -35
  19. package/core/agentic/orchestrator-executor.ts +135 -71
  20. package/core/agentic/plan-mode.ts +46 -16
  21. package/core/agentic/prompt-builder.ts +108 -42
  22. package/core/agentic/services.ts +10 -9
  23. package/core/agentic/skill-loader.ts +9 -15
  24. package/core/agentic/smart-context.ts +129 -79
  25. package/core/agentic/template-executor.ts +13 -12
  26. package/core/agentic/template-loader.ts +7 -4
  27. package/core/agentic/tool-registry.ts +16 -13
  28. package/core/agents/index.ts +1 -1
  29. package/core/agents/performance.ts +10 -27
  30. package/core/ai-tools/formatters.ts +8 -6
  31. package/core/ai-tools/generator.ts +4 -4
  32. package/core/ai-tools/index.ts +1 -1
  33. package/core/ai-tools/registry.ts +21 -11
  34. package/core/bus/bus.ts +23 -16
  35. package/core/bus/index.ts +2 -2
  36. package/core/cli/linear.ts +3 -5
  37. package/core/cli/start.ts +28 -25
  38. package/core/commands/analysis.ts +58 -39
  39. package/core/commands/analytics.ts +52 -44
  40. package/core/commands/base.ts +15 -13
  41. package/core/commands/cleanup.ts +6 -13
  42. package/core/commands/command-data.ts +28 -4
  43. package/core/commands/commands.ts +57 -24
  44. package/core/commands/context.ts +4 -4
  45. package/core/commands/design.ts +3 -10
  46. package/core/commands/index.ts +5 -8
  47. package/core/commands/maintenance.ts +7 -4
  48. package/core/commands/planning.ts +179 -56
  49. package/core/commands/register.ts +13 -9
  50. package/core/commands/registry.ts +15 -14
  51. package/core/commands/setup.ts +26 -14
  52. package/core/commands/shipping.ts +11 -16
  53. package/core/commands/snapshots.ts +16 -32
  54. package/core/commands/uninstall.ts +541 -0
  55. package/core/commands/workflow.ts +24 -28
  56. package/core/constants/index.ts +10 -22
  57. package/core/context/generator.ts +82 -33
  58. package/core/context-tools/files-tool.ts +18 -19
  59. package/core/context-tools/imports-tool.ts +13 -33
  60. package/core/context-tools/index.ts +29 -54
  61. package/core/context-tools/recent-tool.ts +16 -22
  62. package/core/context-tools/signatures-tool.ts +17 -26
  63. package/core/context-tools/summary-tool.ts +20 -22
  64. package/core/context-tools/token-counter.ts +25 -20
  65. package/core/context-tools/types.ts +5 -5
  66. package/core/domain/agent-generator.ts +7 -5
  67. package/core/domain/agent-loader.ts +2 -2
  68. package/core/domain/analyzer.ts +19 -16
  69. package/core/domain/architecture-generator.ts +6 -3
  70. package/core/domain/context-estimator.ts +3 -4
  71. package/core/domain/snapshot-manager.ts +25 -22
  72. package/core/domain/task-stack.ts +24 -14
  73. package/core/errors.ts +1 -1
  74. package/core/events/events.ts +2 -4
  75. package/core/events/index.ts +1 -2
  76. package/core/index.ts +28 -16
  77. package/core/infrastructure/agent-detector.ts +3 -3
  78. package/core/infrastructure/ai-provider.ts +23 -20
  79. package/core/infrastructure/author-detector.ts +16 -10
  80. package/core/infrastructure/capability-installer.ts +2 -2
  81. package/core/infrastructure/claude-agent.ts +6 -6
  82. package/core/infrastructure/command-installer.ts +22 -17
  83. package/core/infrastructure/config-manager.ts +18 -14
  84. package/core/infrastructure/editors-config.ts +8 -4
  85. package/core/infrastructure/path-manager.ts +8 -6
  86. package/core/infrastructure/permission-manager.ts +20 -17
  87. package/core/infrastructure/setup.ts +42 -38
  88. package/core/infrastructure/update-checker.ts +5 -5
  89. package/core/integrations/issue-tracker/enricher.ts +8 -19
  90. package/core/integrations/issue-tracker/index.ts +2 -2
  91. package/core/integrations/issue-tracker/manager.ts +15 -15
  92. package/core/integrations/issue-tracker/types.ts +5 -22
  93. package/core/integrations/jira/client.ts +67 -59
  94. package/core/integrations/jira/index.ts +11 -14
  95. package/core/integrations/jira/mcp-adapter.ts +5 -10
  96. package/core/integrations/jira/service.ts +10 -10
  97. package/core/integrations/linear/client.ts +27 -18
  98. package/core/integrations/linear/index.ts +9 -12
  99. package/core/integrations/linear/service.ts +11 -11
  100. package/core/integrations/linear/sync.ts +8 -8
  101. package/core/outcomes/analyzer.ts +5 -18
  102. package/core/outcomes/index.ts +2 -2
  103. package/core/outcomes/recorder.ts +3 -3
  104. package/core/plugin/builtin/webhook.ts +19 -15
  105. package/core/plugin/hooks.ts +29 -21
  106. package/core/plugin/index.ts +7 -7
  107. package/core/plugin/loader.ts +19 -19
  108. package/core/plugin/registry.ts +12 -23
  109. package/core/schemas/agents.ts +1 -1
  110. package/core/schemas/analysis.ts +1 -1
  111. package/core/schemas/enriched-task.ts +62 -49
  112. package/core/schemas/ideas.ts +13 -13
  113. package/core/schemas/index.ts +17 -27
  114. package/core/schemas/issues.ts +40 -25
  115. package/core/schemas/metrics.ts +25 -25
  116. package/core/schemas/outcomes.ts +70 -62
  117. package/core/schemas/permissions.ts +15 -12
  118. package/core/schemas/prd.ts +27 -14
  119. package/core/schemas/project.ts +3 -3
  120. package/core/schemas/roadmap.ts +47 -34
  121. package/core/schemas/schemas.ts +3 -4
  122. package/core/schemas/shipped.ts +3 -3
  123. package/core/schemas/state.ts +43 -29
  124. package/core/server/index.ts +5 -6
  125. package/core/server/routes-extended.ts +68 -72
  126. package/core/server/routes.ts +3 -3
  127. package/core/server/server.ts +31 -26
  128. package/core/services/agent-generator.ts +237 -0
  129. package/core/services/agent-service.ts +2 -2
  130. package/core/services/breakdown-service.ts +2 -4
  131. package/core/services/context-generator.ts +299 -0
  132. package/core/services/context-selector.ts +420 -0
  133. package/core/services/doctor-service.ts +426 -0
  134. package/core/services/file-categorizer.ts +448 -0
  135. package/core/services/file-scorer.ts +270 -0
  136. package/core/services/git-analyzer.ts +267 -0
  137. package/core/services/index.ts +27 -10
  138. package/core/services/memory-service.ts +3 -4
  139. package/core/services/project-index.ts +911 -0
  140. package/core/services/project-service.ts +4 -4
  141. package/core/services/skill-installer.ts +14 -17
  142. package/core/services/skill-lock.ts +3 -3
  143. package/core/services/skill-service.ts +12 -6
  144. package/core/services/stack-detector.ts +245 -0
  145. package/core/services/sync-service.ts +87 -345
  146. package/core/services/watch-service.ts +294 -0
  147. package/core/session/compaction.ts +23 -31
  148. package/core/session/index.ts +11 -5
  149. package/core/session/log-migration.ts +3 -3
  150. package/core/session/metrics.ts +19 -14
  151. package/core/session/session-log-manager.ts +12 -17
  152. package/core/session/task-session-manager.ts +25 -25
  153. package/core/session/utils.ts +1 -1
  154. package/core/storage/ideas-storage.ts +41 -57
  155. package/core/storage/index-storage.ts +514 -0
  156. package/core/storage/index.ts +41 -17
  157. package/core/storage/metrics-storage.ts +39 -34
  158. package/core/storage/queue-storage.ts +35 -45
  159. package/core/storage/shipped-storage.ts +17 -20
  160. package/core/storage/state-storage.ts +50 -30
  161. package/core/storage/storage-manager.ts +6 -6
  162. package/core/storage/storage.ts +18 -15
  163. package/core/sync/auth-config.ts +3 -3
  164. package/core/sync/index.ts +13 -19
  165. package/core/sync/oauth-handler.ts +3 -3
  166. package/core/sync/sync-client.ts +4 -9
  167. package/core/sync/sync-manager.ts +12 -14
  168. package/core/types/commands.ts +42 -7
  169. package/core/types/index.ts +284 -305
  170. package/core/types/integrations.ts +3 -3
  171. package/core/types/storage.ts +14 -14
  172. package/core/types/utils.ts +3 -3
  173. package/core/utils/agent-stream.ts +3 -1
  174. package/core/utils/animations.ts +14 -11
  175. package/core/utils/branding.ts +7 -7
  176. package/core/utils/cache.ts +1 -3
  177. package/core/utils/collection-filters.ts +3 -15
  178. package/core/utils/date-helper.ts +2 -7
  179. package/core/utils/file-helper.ts +13 -8
  180. package/core/utils/jsonl-helper.ts +13 -10
  181. package/core/utils/keychain.ts +4 -8
  182. package/core/utils/logger.ts +1 -1
  183. package/core/utils/next-steps.ts +3 -3
  184. package/core/utils/output.ts +58 -11
  185. package/core/utils/project-commands.ts +6 -6
  186. package/core/utils/project-credentials.ts +5 -12
  187. package/core/utils/runtime.ts +2 -2
  188. package/core/utils/session-helper.ts +3 -4
  189. package/core/utils/version.ts +3 -3
  190. package/core/wizard/index.ts +13 -0
  191. package/core/wizard/onboarding.ts +633 -0
  192. package/core/workflow/state-machine.ts +7 -7
  193. package/dist/bin/prjct.mjs +18755 -15574
  194. package/dist/core/infrastructure/command-installer.js +86 -79
  195. package/dist/core/infrastructure/editors-config.js +6 -6
  196. package/dist/core/infrastructure/setup.js +246 -225
  197. package/dist/core/utils/version.js +9 -9
  198. package/package.json +11 -12
  199. package/scripts/build.js +3 -3
  200. package/scripts/postinstall.js +2 -2
  201. package/templates/mcp-config.json +6 -1
  202. package/templates/permissions/permissive.jsonc +1 -1
  203. package/templates/permissions/strict.jsonc +5 -9
  204. package/templates/global/docs/agents.md +0 -88
  205. package/templates/global/docs/architecture.md +0 -103
  206. package/templates/global/docs/commands.md +0 -96
  207. package/templates/global/docs/validation.md +0 -95
@@ -9,32 +9,32 @@
9
9
  * @version 5.0
10
10
  */
11
11
 
12
- import fs from 'fs'
13
- import path from 'path'
14
- import { isNotFoundError } from '../types/fs'
15
- import { stateStorage, queueStorage } from '../storage'
12
+ import fs from 'node:fs'
13
+ import path from 'node:path'
16
14
  import { outcomeAnalyzer } from '../outcomes'
15
+ import { queueStorage, stateStorage } from '../storage'
17
16
  import type {
18
- PromptProjectState,
19
- Template,
17
+ LearnedPatterns,
18
+ Memory,
19
+ OrchestratorContext,
20
+ PlanInfo,
20
21
  PromptAgent,
21
22
  PromptContext,
23
+ PromptProjectState,
22
24
  PromptState,
23
- LearnedPatterns,
25
+ Template,
24
26
  ThinkBlock,
25
- Memory,
26
- PlanInfo,
27
- OrchestratorContext,
28
27
  } from '../types'
28
+ import { isNotFoundError } from '../types/fs'
29
29
 
30
30
  // Re-export types for convenience
31
31
  export type {
32
32
  Frontmatter,
33
- Template,
34
33
  LearnedPatterns,
35
- ThinkBlock,
36
34
  Memory,
37
35
  PlanInfo,
36
+ Template,
37
+ ThinkBlock,
38
38
  } from '../types'
39
39
 
40
40
  // Local type aliases for backward compatibility
@@ -112,13 +112,13 @@ class PromptBuilder {
112
112
  try {
113
113
  const [stateData, queueData] = await Promise.all([
114
114
  stateStorage.read(projectId),
115
- queueStorage.read(projectId)
115
+ queueStorage.read(projectId),
116
116
  ])
117
117
 
118
118
  const state: ProjectState = {
119
119
  projectId,
120
120
  currentTask: stateData.currentTask,
121
- queue: queueData.tasks
121
+ queue: queueData.tasks,
122
122
  }
123
123
 
124
124
  this._stateCache.set(projectId, { state, timestamp: Date.now() })
@@ -219,7 +219,14 @@ class PromptBuilder {
219
219
  loadChecklistRouting(): string | null {
220
220
  if (this._checklistRoutingCache) return this._checklistRoutingCache
221
221
 
222
- const routingPath = path.join(__dirname, '..', '..', 'templates', 'agentic', 'checklist-routing.md')
222
+ const routingPath = path.join(
223
+ __dirname,
224
+ '..',
225
+ '..',
226
+ 'templates',
227
+ 'agentic',
228
+ 'checklist-routing.md'
229
+ )
223
230
 
224
231
  try {
225
232
  if (fs.existsSync(routingPath)) {
@@ -298,7 +305,18 @@ class PromptBuilder {
298
305
 
299
306
  // Agent assignment (CONDITIONAL - only for code-modifying commands)
300
307
  const commandName = template.frontmatter?.name?.replace('p:', '') || ''
301
- const agentCommands = ['now', 'build', 'feature', 'design', 'fix', 'bug', 'test', 'work', 'cleanup', 'spec']
308
+ const agentCommands = [
309
+ 'now',
310
+ 'build',
311
+ 'feature',
312
+ 'design',
313
+ 'fix',
314
+ 'bug',
315
+ 'test',
316
+ 'work',
317
+ 'cleanup',
318
+ 'spec',
319
+ ]
302
320
  const needsAgent = agentCommands.includes(commandName)
303
321
 
304
322
  if (agent && needsAgent) {
@@ -344,9 +362,10 @@ class PromptBuilder {
344
362
  parts.push(`Skills: ${agent.skills.join(', ')}\n`)
345
363
  }
346
364
  // Include first 1500 chars of agent content
347
- const truncatedContent = agent.content.length > 1500
348
- ? agent.content.substring(0, 1500) + '\n... (truncated, read full file for more)'
349
- : agent.content
365
+ const truncatedContent =
366
+ agent.content.length > 1500
367
+ ? `${agent.content.substring(0, 1500)}\n... (truncated, read full file for more)`
368
+ : agent.content
350
369
  parts.push(`\`\`\`markdown\n${truncatedContent}\n\`\`\`\n\n`)
351
370
  }
352
371
  }
@@ -357,9 +376,10 @@ class PromptBuilder {
357
376
  for (const skill of orchestratorContext.skills) {
358
377
  parts.push(`#### Skill: ${skill.name}\n`)
359
378
  // Include first 1000 chars of skill content
360
- const truncatedContent = skill.content.length > 1000
361
- ? skill.content.substring(0, 1000) + '\n... (truncated)'
362
- : skill.content
379
+ const truncatedContent =
380
+ skill.content.length > 1000
381
+ ? `${skill.content.substring(0, 1000)}\n... (truncated)`
382
+ : skill.content
363
383
  parts.push(`\`\`\`markdown\n${truncatedContent}\n\`\`\`\n\n`)
364
384
  }
365
385
  }
@@ -367,22 +387,32 @@ class PromptBuilder {
367
387
  // Inject subtasks if fragmented
368
388
  if (orchestratorContext.requiresFragmentation && orchestratorContext.subtasks) {
369
389
  parts.push('### SUBTASKS (Execute in Order)\n\n')
370
- parts.push('**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n')
390
+ parts.push(
391
+ '**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n'
392
+ )
371
393
  parts.push('| # | Domain | Description | Status |\n')
372
394
  parts.push('|---|--------|-------------|--------|\n')
373
395
 
374
396
  for (const subtask of orchestratorContext.subtasks) {
375
- const statusIcon = subtask.status === 'in_progress' ? '▶️ **CURRENT**'
376
- : subtask.status === 'completed' ? '✅ Done'
377
- : subtask.status === 'failed' ? ' Failed'
378
- : '⏳ Pending'
379
- parts.push(`| ${subtask.order} | ${subtask.domain} | ${subtask.description} | ${statusIcon} |\n`)
397
+ const statusIcon =
398
+ subtask.status === 'in_progress'
399
+ ? '▶️ **CURRENT**'
400
+ : subtask.status === 'completed'
401
+ ? '✅ Done'
402
+ : subtask.status === 'failed'
403
+ ? '❌ Failed'
404
+ : '⏳ Pending'
405
+ parts.push(
406
+ `| ${subtask.order} | ${subtask.domain} | ${subtask.description} | ${statusIcon} |\n`
407
+ )
380
408
  }
381
409
 
382
410
  // Find and highlight current subtask
383
- const currentSubtask = orchestratorContext.subtasks.find(s => s.status === 'in_progress')
411
+ const currentSubtask = orchestratorContext.subtasks.find((s) => s.status === 'in_progress')
384
412
  if (currentSubtask) {
385
- parts.push(`\n**FOCUS ON SUBTASK #${currentSubtask.order}**: ${currentSubtask.description}\n`)
413
+ parts.push(
414
+ `\n**FOCUS ON SUBTASK #${currentSubtask.order}**: ${currentSubtask.description}\n`
415
+ )
386
416
  parts.push(`Agent: ${currentSubtask.agent} | Domain: ${currentSubtask.domain}\n`)
387
417
  if (currentSubtask.dependsOn.length > 0) {
388
418
  parts.push(`Dependencies: ${currentSubtask.dependsOn.join(', ')}\n`)
@@ -407,11 +437,25 @@ class PromptBuilder {
407
437
  parts.push(`\n## FILES: ${files.length} available. Top: ${top5}\n`)
408
438
  parts.push('Read BEFORE modifying. Use Glob/Grep to find more.\n\n')
409
439
  } else if ((context as { projectPath?: string }).projectPath) {
410
- parts.push(`\n## PROJECT: ${(context as { projectPath: string }).projectPath}\nRead files before modifying.\n\n`)
440
+ parts.push(
441
+ `\n## PROJECT: ${(context as { projectPath: string }).projectPath}\nRead files before modifying.\n\n`
442
+ )
411
443
  }
412
444
 
413
445
  // OPTIMIZED: Only include patterns for code-modifying commands
414
- const codeCommands = ['now', 'build', 'feature', 'design', 'cleanup', 'fix', 'bug', 'test', 'init', 'spec', 'work']
446
+ const codeCommands = [
447
+ 'now',
448
+ 'build',
449
+ 'feature',
450
+ 'design',
451
+ 'cleanup',
452
+ 'fix',
453
+ 'bug',
454
+ 'test',
455
+ 'init',
456
+ 'spec',
457
+ 'work',
458
+ ]
415
459
  const needsPatterns = codeCommands.includes(commandName)
416
460
 
417
461
  // Include code patterns analysis for code-modifying commands
@@ -428,12 +472,15 @@ class PromptBuilder {
428
472
  const analysisContent = state?.analysis || ''
429
473
  if (needsPatterns && analysisContent && analysisContent.trim()) {
430
474
  const stackMatch =
431
- analysisContent.match(/Stack[:\s]+([^\n]+)/i) || analysisContent.match(/Technology[:\s]+([^\n]+)/i)
475
+ analysisContent.match(/Stack[:\s]+([^\n]+)/i) ||
476
+ analysisContent.match(/Technology[:\s]+([^\n]+)/i)
432
477
  const stack = stackMatch ? stackMatch[1].trim() : 'detected'
433
478
 
434
479
  parts.push(`\n## STACK\nStack: ${stack}\n`)
435
480
  if (!codePatternsContent) {
436
- parts.push('Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.\n')
481
+ parts.push(
482
+ 'Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.\n'
483
+ )
437
484
  }
438
485
  }
439
486
 
@@ -451,7 +498,7 @@ class PromptBuilder {
451
498
  }
452
499
 
453
500
  // P3.1: Think Block
454
- if (thinkBlock && thinkBlock.plan && thinkBlock.plan.length > 0) {
501
+ if (thinkBlock?.plan && thinkBlock.plan.length > 0) {
455
502
  parts.push('\n## THINK FIRST (reasoning from analysis)\n')
456
503
  if (thinkBlock.conclusions && thinkBlock.conclusions.length > 0) {
457
504
  parts.push('Conclusions:\n')
@@ -475,22 +522,38 @@ class PromptBuilder {
475
522
 
476
523
  // P3.4: Plan Mode
477
524
  if (planInfo?.isPlanning) {
478
- parts.push(`\n## PLAN MODE\nRead-only. Gather info → Analyze → Propose plan → Wait for approval.\n`)
525
+ parts.push(
526
+ `\n## PLAN MODE\nRead-only. Gather info → Analyze → Propose plan → Wait for approval.\n`
527
+ )
479
528
  if (planInfo.allowedTools) parts.push(`Tools: ${planInfo.allowedTools.join(', ')}\n`)
480
529
  }
481
530
  if (planInfo?.requiresApproval) {
482
- parts.push(`\n## APPROVAL REQUIRED\nShow changes, list affected files, ask for confirmation.\n`)
531
+ parts.push(
532
+ `\n## APPROVAL REQUIRED\nShow changes, list affected files, ask for confirmation.\n`
533
+ )
483
534
  }
484
535
 
485
536
  // P4.1: Quality Checklists
486
- const checklistCommands = ['now', 'build', 'feature', 'design', 'fix', 'bug', 'cleanup', 'spec', 'work']
537
+ const checklistCommands = [
538
+ 'now',
539
+ 'build',
540
+ 'feature',
541
+ 'design',
542
+ 'fix',
543
+ 'bug',
544
+ 'cleanup',
545
+ 'spec',
546
+ 'work',
547
+ ]
487
548
  if (checklistCommands.includes(commandName)) {
488
549
  const routing = this.loadChecklistRouting()
489
550
  const checklists = this.loadChecklists()
490
551
 
491
552
  if (routing && Object.keys(checklists).length > 0) {
492
553
  parts.push('\n## QUALITY CHECKLISTS\n')
493
- parts.push('Apply relevant checklists based on task. Read checklist-routing.md for guidance.\n')
554
+ parts.push(
555
+ 'Apply relevant checklists based on task. Read checklist-routing.md for guidance.\n'
556
+ )
494
557
  parts.push(`Available: ${Object.keys(checklists).join(', ')}\n`)
495
558
  parts.push('Path: templates/checklists/{name}.md\n')
496
559
  parts.push('Use Read tool to load checklists you determine are relevant.\n')
@@ -516,7 +579,7 @@ class PromptBuilder {
516
579
  if (criticalFiles.includes(key)) {
517
580
  const display =
518
581
  (content as string).length > 2000
519
- ? (content as string).substring(0, 2000) + '\n... (truncated)'
582
+ ? `${(content as string).substring(0, 2000)}\n... (truncated)`
520
583
  : content
521
584
  relevant.push(`### ${key}\n${display}`)
522
585
  } else if ((content as string).length < 1000) {
@@ -535,7 +598,10 @@ class PromptBuilder {
535
598
  /**
536
599
  * Build an analysis prompt for pre-action investigation tasks
537
600
  */
538
- buildAnalysis(analysisType: string, context: { projectPath: string; projectId?: string }): string {
601
+ buildAnalysis(
602
+ analysisType: string,
603
+ context: { projectPath: string; projectId?: string }
604
+ ): string {
539
605
  const parts: string[] = []
540
606
 
541
607
  parts.push(`# Analyze: ${analysisType}\n\n`)
@@ -570,7 +636,7 @@ class PromptBuilder {
570
636
  const antiPatternsMatch = content.match(/### High Priority[\s\S]*?(?=###|##|$)/i)
571
637
  if (antiPatternsMatch) {
572
638
  const antiPatterns = antiPatternsMatch[0].substring(0, 300)
573
- parts.push('\nAvoid:\n' + antiPatterns)
639
+ parts.push(`\nAvoid:\n${antiPatterns}`)
574
640
  }
575
641
 
576
642
  const result = parts.join('\n').substring(0, 800)
@@ -22,27 +22,28 @@
22
22
  * ```
23
23
  */
24
24
 
25
- import templateLoader from './template-loader'
25
+ import { outcomeAnalyzer, outcomeRecorder } from '../outcomes'
26
+ import { ideasStorage, queueStorage, shippedStorage, stateStorage } from '../storage'
27
+ import agentRouter from './agent-router'
28
+ import chainOfThought from './chain-of-thought'
26
29
  import contextBuilder from './context-builder'
27
- import promptBuilder from './prompt-builder'
28
- import toolRegistry from './tool-registry'
30
+ import groundTruth from './ground-truth'
29
31
  import loopDetector from './loop-detector'
30
32
  import memorySystem from './memory-system'
31
- import groundTruth from './ground-truth'
32
- import chainOfThought from './chain-of-thought'
33
33
  import planMode from './plan-mode'
34
- import agentRouter from './agent-router'
34
+ import promptBuilder from './prompt-builder'
35
35
  import smartContext from './smart-context'
36
- import { stateStorage, queueStorage, ideasStorage, shippedStorage } from '../storage'
37
- import { outcomeRecorder, outcomeAnalyzer } from '../outcomes'
36
+ import templateLoader from './template-loader'
37
+ import toolRegistry from './tool-registry'
38
38
 
39
39
  // Storage managers object (replaces mdManagers)
40
40
  const storageManagers = {
41
41
  state: stateStorage,
42
42
  queue: queueStorage,
43
43
  ideas: ideasStorage,
44
- shipped: shippedStorage
44
+ shipped: shippedStorage,
45
45
  }
46
+
46
47
  import { agentPerformanceTracker } from '../agents'
47
48
 
48
49
  /**
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import skillService from '../services/skill-service'
11
- import type { Skill, FormattedSkill, SkillContext } from '../types'
11
+ import type { FormattedSkill, Skill, SkillContext } from '../types'
12
12
 
13
13
  /**
14
14
  * Format a skill for inclusion in prompts
@@ -30,12 +30,7 @@ function generateSkillsMarkdown(skills: Skill[]): string {
30
30
  return ''
31
31
  }
32
32
 
33
- const lines: string[] = [
34
- '## Available Skills',
35
- '',
36
- 'The following skills can be invoked:',
37
- '',
38
- ]
33
+ const lines: string[] = ['## Available Skills', '', 'The following skills can be invoked:', '']
39
34
 
40
35
  for (const skill of skills) {
41
36
  lines.push(`- **${skill.name}** (\`${skill.id}\`): ${skill.description || 'No description'}`)
@@ -65,7 +60,10 @@ export async function loadSkillContext(projectPath?: string): Promise<SkillConte
65
60
  /**
66
61
  * Get a specific skill's prompt content
67
62
  */
68
- export async function getSkillPrompt(skillId: string, projectPath?: string): Promise<string | null> {
63
+ export async function getSkillPrompt(
64
+ skillId: string,
65
+ projectPath?: string
66
+ ): Promise<string | null> {
69
67
  const skill = await skillService.get(skillId, projectPath)
70
68
  return skill?.content || null
71
69
  }
@@ -102,11 +100,7 @@ export async function buildSkillSystemPrompt(projectPath?: string): Promise<stri
102
100
  return ''
103
101
  }
104
102
 
105
- return [
106
- '<skills>',
107
- skillsMarkdown,
108
- '',
109
- 'To invoke a skill, use the skill ID.',
110
- '</skills>',
111
- ].join('\n')
103
+ return ['<skills>', skillsMarkdown, '', 'To invoke a skill, use the skill ID.', '</skills>'].join(
104
+ '\n'
105
+ )
112
106
  }