prjct-cli 0.45.0 → 0.45.4
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/CHANGELOG.md +82 -0
- package/bin/prjct.ts +117 -10
- package/core/__tests__/agentic/memory-system.test.ts +39 -26
- package/core/__tests__/agentic/plan-mode.test.ts +64 -46
- package/core/__tests__/agentic/prompt-builder.test.ts +14 -14
- package/core/__tests__/services/project-index.test.ts +353 -0
- package/core/__tests__/types/fs.test.ts +3 -3
- package/core/__tests__/utils/date-helper.test.ts +10 -10
- package/core/__tests__/utils/output.test.ts +9 -6
- package/core/__tests__/utils/project-commands.test.ts +5 -6
- package/core/agentic/agent-router.ts +9 -10
- package/core/agentic/chain-of-thought.ts +16 -4
- package/core/agentic/command-executor.ts +66 -40
- package/core/agentic/context-builder.ts +8 -5
- package/core/agentic/ground-truth.ts +15 -9
- package/core/agentic/index.ts +145 -152
- package/core/agentic/loop-detector.ts +40 -11
- package/core/agentic/memory-system.ts +98 -35
- package/core/agentic/orchestrator-executor.ts +135 -71
- package/core/agentic/plan-mode.ts +46 -16
- package/core/agentic/prompt-builder.ts +108 -42
- package/core/agentic/services.ts +10 -9
- package/core/agentic/skill-loader.ts +9 -15
- package/core/agentic/smart-context.ts +129 -79
- package/core/agentic/template-executor.ts +13 -12
- package/core/agentic/template-loader.ts +7 -4
- package/core/agentic/tool-registry.ts +16 -13
- package/core/agents/index.ts +1 -1
- package/core/agents/performance.ts +10 -27
- package/core/ai-tools/formatters.ts +8 -6
- package/core/ai-tools/generator.ts +4 -4
- package/core/ai-tools/index.ts +1 -1
- package/core/ai-tools/registry.ts +21 -11
- package/core/bus/bus.ts +23 -16
- package/core/bus/index.ts +2 -2
- package/core/cli/linear.ts +3 -5
- package/core/cli/start.ts +28 -25
- package/core/commands/analysis.ts +58 -39
- package/core/commands/analytics.ts +52 -44
- package/core/commands/base.ts +15 -13
- package/core/commands/cleanup.ts +6 -13
- package/core/commands/command-data.ts +28 -4
- package/core/commands/commands.ts +57 -24
- package/core/commands/context.ts +4 -4
- package/core/commands/design.ts +3 -10
- package/core/commands/index.ts +5 -8
- package/core/commands/maintenance.ts +7 -4
- package/core/commands/planning.ts +179 -56
- package/core/commands/register.ts +13 -9
- package/core/commands/registry.ts +15 -14
- package/core/commands/setup.ts +26 -14
- package/core/commands/shipping.ts +11 -16
- package/core/commands/snapshots.ts +16 -32
- package/core/commands/uninstall.ts +541 -0
- package/core/commands/workflow.ts +24 -28
- package/core/constants/index.ts +10 -22
- package/core/context/generator.ts +82 -33
- package/core/context-tools/files-tool.ts +18 -19
- package/core/context-tools/imports-tool.ts +13 -33
- package/core/context-tools/index.ts +29 -54
- package/core/context-tools/recent-tool.ts +16 -22
- package/core/context-tools/signatures-tool.ts +17 -26
- package/core/context-tools/summary-tool.ts +20 -22
- package/core/context-tools/token-counter.ts +25 -20
- package/core/context-tools/types.ts +5 -5
- package/core/domain/agent-generator.ts +7 -5
- package/core/domain/agent-loader.ts +2 -2
- package/core/domain/analyzer.ts +19 -16
- package/core/domain/architecture-generator.ts +6 -3
- package/core/domain/context-estimator.ts +3 -4
- package/core/domain/snapshot-manager.ts +25 -22
- package/core/domain/task-stack.ts +24 -14
- package/core/errors.ts +1 -1
- package/core/events/events.ts +2 -4
- package/core/events/index.ts +1 -2
- package/core/index.ts +28 -16
- package/core/infrastructure/agent-detector.ts +3 -3
- package/core/infrastructure/ai-provider.ts +23 -20
- package/core/infrastructure/author-detector.ts +16 -10
- package/core/infrastructure/capability-installer.ts +2 -2
- package/core/infrastructure/claude-agent.ts +6 -6
- package/core/infrastructure/command-installer.ts +22 -17
- package/core/infrastructure/config-manager.ts +18 -14
- package/core/infrastructure/editors-config.ts +8 -4
- package/core/infrastructure/path-manager.ts +8 -6
- package/core/infrastructure/permission-manager.ts +20 -17
- package/core/infrastructure/setup.ts +42 -38
- package/core/infrastructure/update-checker.ts +5 -5
- package/core/integrations/issue-tracker/enricher.ts +8 -19
- package/core/integrations/issue-tracker/index.ts +2 -2
- package/core/integrations/issue-tracker/manager.ts +15 -15
- package/core/integrations/issue-tracker/types.ts +5 -22
- package/core/integrations/jira/client.ts +67 -59
- package/core/integrations/jira/index.ts +11 -14
- package/core/integrations/jira/mcp-adapter.ts +5 -10
- package/core/integrations/jira/service.ts +10 -10
- package/core/integrations/linear/client.ts +27 -18
- package/core/integrations/linear/index.ts +9 -12
- package/core/integrations/linear/service.ts +11 -11
- package/core/integrations/linear/sync.ts +8 -8
- package/core/outcomes/analyzer.ts +5 -18
- package/core/outcomes/index.ts +2 -2
- package/core/outcomes/recorder.ts +3 -3
- package/core/plugin/builtin/webhook.ts +19 -15
- package/core/plugin/hooks.ts +29 -21
- package/core/plugin/index.ts +7 -7
- package/core/plugin/loader.ts +19 -19
- package/core/plugin/registry.ts +12 -23
- package/core/schemas/agents.ts +1 -1
- package/core/schemas/analysis.ts +1 -1
- package/core/schemas/enriched-task.ts +62 -49
- package/core/schemas/ideas.ts +13 -13
- package/core/schemas/index.ts +17 -27
- package/core/schemas/issues.ts +40 -25
- package/core/schemas/metrics.ts +25 -25
- package/core/schemas/outcomes.ts +70 -62
- package/core/schemas/permissions.ts +15 -12
- package/core/schemas/prd.ts +27 -14
- package/core/schemas/project.ts +3 -3
- package/core/schemas/roadmap.ts +47 -34
- package/core/schemas/schemas.ts +3 -4
- package/core/schemas/shipped.ts +3 -3
- package/core/schemas/state.ts +43 -29
- package/core/server/index.ts +5 -6
- package/core/server/routes-extended.ts +68 -72
- package/core/server/routes.ts +3 -3
- package/core/server/server.ts +31 -26
- package/core/services/agent-generator.ts +237 -0
- package/core/services/agent-service.ts +2 -2
- package/core/services/breakdown-service.ts +2 -4
- package/core/services/context-generator.ts +299 -0
- package/core/services/context-selector.ts +420 -0
- package/core/services/doctor-service.ts +426 -0
- package/core/services/file-categorizer.ts +448 -0
- package/core/services/file-scorer.ts +270 -0
- package/core/services/git-analyzer.ts +267 -0
- package/core/services/index.ts +27 -10
- package/core/services/memory-service.ts +3 -4
- package/core/services/project-index.ts +911 -0
- package/core/services/project-service.ts +4 -4
- package/core/services/skill-installer.ts +14 -17
- package/core/services/skill-lock.ts +3 -3
- package/core/services/skill-service.ts +12 -6
- package/core/services/stack-detector.ts +245 -0
- package/core/services/sync-service.ts +87 -345
- package/core/services/watch-service.ts +294 -0
- package/core/session/compaction.ts +23 -31
- package/core/session/index.ts +11 -5
- package/core/session/log-migration.ts +3 -3
- package/core/session/metrics.ts +19 -14
- package/core/session/session-log-manager.ts +12 -17
- package/core/session/task-session-manager.ts +25 -25
- package/core/session/utils.ts +1 -1
- package/core/storage/ideas-storage.ts +41 -57
- package/core/storage/index-storage.ts +514 -0
- package/core/storage/index.ts +41 -17
- package/core/storage/metrics-storage.ts +39 -34
- package/core/storage/queue-storage.ts +35 -45
- package/core/storage/shipped-storage.ts +17 -20
- package/core/storage/state-storage.ts +50 -30
- package/core/storage/storage-manager.ts +6 -6
- package/core/storage/storage.ts +18 -15
- package/core/sync/auth-config.ts +3 -3
- package/core/sync/index.ts +13 -19
- package/core/sync/oauth-handler.ts +3 -3
- package/core/sync/sync-client.ts +4 -9
- package/core/sync/sync-manager.ts +12 -14
- package/core/types/commands.ts +42 -7
- package/core/types/index.ts +284 -305
- package/core/types/integrations.ts +3 -3
- package/core/types/storage.ts +14 -14
- package/core/types/utils.ts +3 -3
- package/core/utils/agent-stream.ts +3 -1
- package/core/utils/animations.ts +14 -11
- package/core/utils/branding.ts +7 -7
- package/core/utils/cache.ts +1 -3
- package/core/utils/collection-filters.ts +3 -15
- package/core/utils/date-helper.ts +2 -7
- package/core/utils/file-helper.ts +13 -8
- package/core/utils/jsonl-helper.ts +13 -10
- package/core/utils/keychain.ts +4 -8
- package/core/utils/logger.ts +1 -1
- package/core/utils/next-steps.ts +3 -3
- package/core/utils/output.ts +58 -11
- package/core/utils/project-commands.ts +6 -6
- package/core/utils/project-credentials.ts +5 -12
- package/core/utils/runtime.ts +2 -2
- package/core/utils/session-helper.ts +3 -4
- package/core/utils/version.ts +3 -3
- package/core/wizard/index.ts +13 -0
- package/core/wizard/onboarding.ts +633 -0
- package/core/workflow/state-machine.ts +7 -7
- package/dist/bin/prjct.mjs +18755 -15574
- package/dist/core/infrastructure/command-installer.js +86 -79
- package/dist/core/infrastructure/editors-config.js +6 -6
- package/dist/core/infrastructure/setup.js +246 -225
- package/dist/core/utils/version.js +9 -9
- package/package.json +11 -12
- package/scripts/build.js +3 -3
- package/scripts/postinstall.js +2 -2
- package/templates/mcp-config.json +6 -1
- package/templates/permissions/permissive.jsonc +1 -1
- package/templates/permissions/strict.jsonc +5 -9
- package/templates/global/docs/agents.md +0 -88
- package/templates/global/docs/architecture.md +0 -103
- package/templates/global/docs/commands.md +0 -96
- 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
|
-
|
|
19
|
-
|
|
17
|
+
LearnedPatterns,
|
|
18
|
+
Memory,
|
|
19
|
+
OrchestratorContext,
|
|
20
|
+
PlanInfo,
|
|
20
21
|
PromptAgent,
|
|
21
22
|
PromptContext,
|
|
23
|
+
PromptProjectState,
|
|
22
24
|
PromptState,
|
|
23
|
-
|
|
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(
|
|
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 = [
|
|
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 =
|
|
348
|
-
|
|
349
|
-
|
|
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 =
|
|
361
|
-
|
|
362
|
-
|
|
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(
|
|
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 =
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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(
|
|
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(
|
|
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 = [
|
|
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) ||
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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 = [
|
|
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(
|
|
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)
|
|
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(
|
|
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(
|
|
639
|
+
parts.push(`\nAvoid:\n${antiPatterns}`)
|
|
574
640
|
}
|
|
575
641
|
|
|
576
642
|
const result = parts.join('\n').substring(0, 800)
|
package/core/agentic/services.ts
CHANGED
|
@@ -22,27 +22,28 @@
|
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import
|
|
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
|
|
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
|
|
34
|
+
import promptBuilder from './prompt-builder'
|
|
35
35
|
import smartContext from './smart-context'
|
|
36
|
-
import
|
|
37
|
-
import
|
|
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 {
|
|
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(
|
|
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
|
-
'
|
|
107
|
-
|
|
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
|
}
|