prjct-cli 1.22.0 → 1.24.0
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 +230 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct-core.mjs +1748 -0
- package/dist/bin/prjct.mjs +17 -36672
- package/dist/cli/linear.mjs +14 -0
- package/dist/daemon/entry.mjs +1429 -0
- package/dist/templates.json +1 -0
- package/package.json +4 -5
- package/bin/prjct.ts +0 -342
- package/core/__tests__/agentic/analysis-injection.test.ts +0 -377
- package/core/__tests__/agentic/cache-eviction.test.ts +0 -294
- package/core/__tests__/agentic/command-context.test.ts +0 -281
- package/core/__tests__/agentic/command-executor.test.ts +0 -659
- package/core/__tests__/agentic/domain-classifier.test.ts +0 -330
- package/core/__tests__/agentic/injection-validator.test.ts +0 -255
- package/core/__tests__/agentic/memory-system.test.ts +0 -281
- package/core/__tests__/agentic/plan-mode.test.ts +0 -386
- package/core/__tests__/agentic/prompt-assembly.test.ts +0 -298
- package/core/__tests__/agentic/prompt-builder.test.ts +0 -243
- package/core/__tests__/agentic/response-validator.test.ts +0 -263
- package/core/__tests__/agentic/semantic-matching.test.ts +0 -131
- package/core/__tests__/agentic/smart-context.test.ts +0 -372
- package/core/__tests__/agentic/tech-normalizer.test.ts +0 -136
- package/core/__tests__/agentic/token-budget.test.ts +0 -294
- package/core/__tests__/ai-tools/formatters.test.ts +0 -476
- package/core/__tests__/domain/bm25.test.ts +0 -225
- package/core/__tests__/domain/change-propagator.test.ts +0 -100
- package/core/__tests__/domain/fibonacci.test.ts +0 -113
- package/core/__tests__/domain/file-hasher.test.ts +0 -146
- package/core/__tests__/domain/file-ranker.test.ts +0 -169
- package/core/__tests__/domain/git-cochange.test.ts +0 -121
- package/core/__tests__/domain/import-graph.test.ts +0 -156
- package/core/__tests__/domain/velocity.test.ts +0 -623
- package/core/__tests__/infrastructure/performance-tracker.test.ts +0 -328
- package/core/__tests__/schemas/model.test.ts +0 -272
- package/core/__tests__/services/dependency-validator.test.ts +0 -175
- package/core/__tests__/services/hierarchical-agent-resolver.test.ts +0 -359
- package/core/__tests__/services/nested-context-resolver.test.ts +0 -443
- package/core/__tests__/services/project-index.test.ts +0 -355
- package/core/__tests__/services/staleness-checker.test.ts +0 -204
- package/core/__tests__/storage/analysis-storage.test.ts +0 -641
- package/core/__tests__/storage/archive-storage.test.ts +0 -455
- package/core/__tests__/storage/safe-reader.test.ts +0 -262
- package/core/__tests__/storage/sqlite-migration.test.ts +0 -1016
- package/core/__tests__/storage/state-storage-feedback.test.ts +0 -463
- package/core/__tests__/storage/state-storage-history.test.ts +0 -469
- package/core/__tests__/storage/storage-manager.test.ts +0 -383
- package/core/__tests__/storage/subtask-handoff.test.ts +0 -237
- package/core/__tests__/types/fs.test.ts +0 -125
- package/core/__tests__/utils/date-helper.test.ts +0 -449
- package/core/__tests__/utils/output.test.ts +0 -278
- package/core/__tests__/utils/preserve-sections.test.ts +0 -216
- package/core/__tests__/utils/project-commands.test.ts +0 -71
- package/core/__tests__/utils/retry.test.ts +0 -381
- package/core/__tests__/workflow/state-machine.test.ts +0 -216
- package/core/agentic/agent-router.ts +0 -150
- package/core/agentic/anti-hallucination.ts +0 -141
- package/core/agentic/chain-of-thought.ts +0 -234
- package/core/agentic/command-classifier.ts +0 -141
- package/core/agentic/command-context.ts +0 -168
- package/core/agentic/command-executor.ts +0 -471
- package/core/agentic/context-builder.ts +0 -285
- package/core/agentic/domain-classifier.ts +0 -525
- package/core/agentic/environment-block.ts +0 -102
- package/core/agentic/ground-truth.ts +0 -706
- package/core/agentic/index.ts +0 -193
- package/core/agentic/injection-validator.ts +0 -208
- package/core/agentic/loop-detector.ts +0 -451
- package/core/agentic/memory-system.ts +0 -1547
- package/core/agentic/orchestrator-executor.ts +0 -579
- package/core/agentic/plan-mode.ts +0 -525
- package/core/agentic/prompt-builder.ts +0 -1069
- package/core/agentic/response-validator.ts +0 -98
- package/core/agentic/services.ts +0 -167
- package/core/agentic/skill-loader.ts +0 -106
- package/core/agentic/smart-context.ts +0 -393
- package/core/agentic/tech-normalizer.ts +0 -167
- package/core/agentic/template-executor.ts +0 -272
- package/core/agentic/template-loader.ts +0 -109
- package/core/agentic/token-budget.ts +0 -226
- package/core/agentic/tool-registry.ts +0 -146
- package/core/agents/index.ts +0 -28
- package/core/agents/performance.ts +0 -429
- package/core/ai-tools/formatters.ts +0 -341
- package/core/ai-tools/generator.ts +0 -144
- package/core/ai-tools/index.ts +0 -15
- package/core/ai-tools/registry.ts +0 -201
- package/core/bus/bus.ts +0 -314
- package/core/bus/index.ts +0 -8
- package/core/cli/linear.ts +0 -500
- package/core/cli/lint-meta-commentary.ts +0 -177
- package/core/cli/start.ts +0 -386
- package/core/commands/analysis.ts +0 -1274
- package/core/commands/analytics.ts +0 -342
- package/core/commands/base.ts +0 -118
- package/core/commands/cleanup.ts +0 -157
- package/core/commands/command-data.ts +0 -463
- package/core/commands/commands.ts +0 -306
- package/core/commands/context.ts +0 -238
- package/core/commands/design.ts +0 -77
- package/core/commands/index.ts +0 -19
- package/core/commands/maintenance.ts +0 -77
- package/core/commands/performance.ts +0 -114
- package/core/commands/planning.ts +0 -662
- package/core/commands/register.ts +0 -127
- package/core/commands/registry.ts +0 -444
- package/core/commands/setup.ts +0 -280
- package/core/commands/shipping.ts +0 -267
- package/core/commands/snapshots.ts +0 -297
- package/core/commands/uninstall.ts +0 -542
- package/core/commands/velocity.ts +0 -149
- package/core/commands/workflow.ts +0 -505
- package/core/config/command-context.config.json +0 -66
- package/core/constants/index.ts +0 -379
- package/core/context/generator.ts +0 -368
- package/core/context-tools/files-tool.ts +0 -577
- package/core/context-tools/imports-tool.ts +0 -400
- package/core/context-tools/index.ts +0 -434
- package/core/context-tools/recent-tool.ts +0 -301
- package/core/context-tools/signatures-tool.ts +0 -495
- package/core/context-tools/summary-tool.ts +0 -301
- package/core/context-tools/token-counter.ts +0 -273
- package/core/context-tools/types.ts +0 -253
- package/core/domain/agent-generator.ts +0 -186
- package/core/domain/agent-loader.ts +0 -419
- package/core/domain/analyzer.ts +0 -387
- package/core/domain/architecture-generator.ts +0 -108
- package/core/domain/bm25.ts +0 -525
- package/core/domain/change-propagator.ts +0 -162
- package/core/domain/context-estimator.ts +0 -175
- package/core/domain/fibonacci.ts +0 -128
- package/core/domain/file-hasher.ts +0 -296
- package/core/domain/file-ranker.ts +0 -151
- package/core/domain/git-cochange.ts +0 -250
- package/core/domain/import-graph.ts +0 -315
- package/core/domain/snapshot-manager.ts +0 -415
- package/core/domain/task-stack.ts +0 -578
- package/core/domain/velocity.ts +0 -470
- package/core/errors.ts +0 -335
- package/core/events/events.ts +0 -85
- package/core/events/index.ts +0 -8
- package/core/index.ts +0 -481
- package/core/infrastructure/agent-detector.ts +0 -135
- package/core/infrastructure/ai-provider.ts +0 -578
- package/core/infrastructure/author-detector.ts +0 -133
- package/core/infrastructure/capability-installer.ts +0 -76
- package/core/infrastructure/claude-agent.ts +0 -297
- package/core/infrastructure/command-installer.ts +0 -752
- package/core/infrastructure/config-manager.ts +0 -364
- package/core/infrastructure/editors-config.ts +0 -172
- package/core/infrastructure/path-manager.ts +0 -571
- package/core/infrastructure/performance-tracker.ts +0 -326
- package/core/infrastructure/permission-manager.ts +0 -289
- package/core/infrastructure/setup.ts +0 -1061
- package/core/infrastructure/update-checker.ts +0 -246
- package/core/integrations/issue-tracker/enricher.ts +0 -271
- package/core/integrations/issue-tracker/index.ts +0 -8
- package/core/integrations/issue-tracker/manager.ts +0 -286
- package/core/integrations/issue-tracker/types.ts +0 -310
- package/core/integrations/jira/cache.ts +0 -57
- package/core/integrations/jira/client.ts +0 -688
- package/core/integrations/jira/index.ts +0 -23
- package/core/integrations/jira/service.ts +0 -244
- package/core/integrations/linear/cache.ts +0 -68
- package/core/integrations/linear/client.ts +0 -436
- package/core/integrations/linear/index.ts +0 -20
- package/core/integrations/linear/service.ts +0 -260
- package/core/integrations/linear/sync.ts +0 -314
- package/core/outcomes/analyzer.ts +0 -286
- package/core/outcomes/index.ts +0 -34
- package/core/outcomes/recorder.ts +0 -195
- package/core/plugin/builtin/webhook.ts +0 -148
- package/core/plugin/hooks.ts +0 -315
- package/core/plugin/index.ts +0 -50
- package/core/plugin/loader.ts +0 -354
- package/core/plugin/registry.ts +0 -326
- package/core/schemas/agents.ts +0 -27
- package/core/schemas/analysis.ts +0 -530
- package/core/schemas/classification.ts +0 -91
- package/core/schemas/command-context.ts +0 -29
- package/core/schemas/enriched-task.ts +0 -291
- package/core/schemas/ideas.ts +0 -114
- package/core/schemas/index.ts +0 -53
- package/core/schemas/issues.ts +0 -159
- package/core/schemas/llm-output.ts +0 -170
- package/core/schemas/metrics.ts +0 -143
- package/core/schemas/model.ts +0 -153
- package/core/schemas/outcomes.ts +0 -487
- package/core/schemas/performance.ts +0 -128
- package/core/schemas/permissions.ts +0 -180
- package/core/schemas/prd.ts +0 -450
- package/core/schemas/project.ts +0 -57
- package/core/schemas/roadmap.ts +0 -322
- package/core/schemas/schemas.ts +0 -38
- package/core/schemas/shipped.ts +0 -109
- package/core/schemas/state.ts +0 -284
- package/core/schemas/velocity.ts +0 -103
- package/core/server/index.ts +0 -21
- package/core/server/routes-extended.ts +0 -566
- package/core/server/routes.ts +0 -176
- package/core/server/server.ts +0 -149
- package/core/server/sse.ts +0 -192
- package/core/services/agent-generator.ts +0 -385
- package/core/services/agent-service.ts +0 -168
- package/core/services/breakdown-service.ts +0 -124
- package/core/services/context-generator.ts +0 -445
- package/core/services/context-selector.ts +0 -429
- package/core/services/dependency-validator.ts +0 -318
- package/core/services/diff-generator.ts +0 -313
- package/core/services/doctor-service.ts +0 -423
- package/core/services/file-categorizer.ts +0 -448
- package/core/services/file-scorer.ts +0 -270
- package/core/services/git-analyzer.ts +0 -293
- package/core/services/hierarchical-agent-resolver.ts +0 -236
- package/core/services/hooks-service.ts +0 -685
- package/core/services/index.ts +0 -46
- package/core/services/local-state-generator.ts +0 -158
- package/core/services/memory-service.ts +0 -181
- package/core/services/nested-context-resolver.ts +0 -842
- package/core/services/project-index.ts +0 -911
- package/core/services/project-service.ts +0 -155
- package/core/services/session-tracker.ts +0 -287
- package/core/services/skill-installer.ts +0 -447
- package/core/services/skill-lock.ts +0 -132
- package/core/services/skill-service.ts +0 -306
- package/core/services/stack-detector.ts +0 -229
- package/core/services/staleness-checker.ts +0 -327
- package/core/services/sync-service.ts +0 -1515
- package/core/services/sync-verifier.ts +0 -253
- package/core/services/watch-service.ts +0 -312
- package/core/session/compaction.ts +0 -248
- package/core/session/index.ts +0 -35
- package/core/session/log-migration.ts +0 -88
- package/core/session/metrics.ts +0 -323
- package/core/session/session-log-manager.ts +0 -307
- package/core/session/task-session-manager.ts +0 -404
- package/core/session/utils.ts +0 -51
- package/core/storage/analysis-storage.ts +0 -373
- package/core/storage/archive-storage.ts +0 -205
- package/core/storage/database.ts +0 -575
- package/core/storage/ideas-storage.ts +0 -298
- package/core/storage/index-storage.ts +0 -523
- package/core/storage/index.ts +0 -79
- package/core/storage/metrics-storage.ts +0 -321
- package/core/storage/migrate-json.ts +0 -720
- package/core/storage/queue-storage.ts +0 -336
- package/core/storage/safe-reader.ts +0 -105
- package/core/storage/shipped-storage.ts +0 -253
- package/core/storage/state-storage.ts +0 -1035
- package/core/storage/storage-manager.ts +0 -205
- package/core/storage/storage.ts +0 -177
- package/core/storage/velocity-storage.ts +0 -149
- package/core/sync/auth-config.ts +0 -138
- package/core/sync/index.ts +0 -31
- package/core/sync/oauth-handler.ts +0 -143
- package/core/sync/sync-client.ts +0 -251
- package/core/sync/sync-manager.ts +0 -327
- package/core/tsconfig.json +0 -22
- package/core/types/agentic.ts +0 -760
- package/core/types/agents.ts +0 -150
- package/core/types/bus.ts +0 -193
- package/core/types/citations.ts +0 -22
- package/core/types/commands.ts +0 -399
- package/core/types/config.ts +0 -92
- package/core/types/core.ts +0 -96
- package/core/types/diff.ts +0 -41
- package/core/types/domain.ts +0 -71
- package/core/types/errors.ts +0 -111
- package/core/types/events.ts +0 -42
- package/core/types/fs.ts +0 -72
- package/core/types/index.ts +0 -510
- package/core/types/infrastructure.ts +0 -210
- package/core/types/integrations.ts +0 -31
- package/core/types/jira.ts +0 -51
- package/core/types/logger.ts +0 -17
- package/core/types/memory.ts +0 -313
- package/core/types/outcomes.ts +0 -190
- package/core/types/output.ts +0 -47
- package/core/types/plugin.ts +0 -25
- package/core/types/project-sync.ts +0 -129
- package/core/types/provider.ts +0 -163
- package/core/types/server.ts +0 -71
- package/core/types/services.ts +0 -84
- package/core/types/session.ts +0 -135
- package/core/types/stack.ts +0 -19
- package/core/types/storage.ts +0 -318
- package/core/types/sync-verifier.ts +0 -33
- package/core/types/sync.ts +0 -121
- package/core/types/task.ts +0 -72
- package/core/types/template.ts +0 -24
- package/core/types/utils.ts +0 -92
- package/core/types/workflow.ts +0 -23
- package/core/utils/agent-stream.ts +0 -140
- package/core/utils/animations.ts +0 -251
- package/core/utils/branding.ts +0 -88
- package/core/utils/cache.ts +0 -187
- package/core/utils/citations.ts +0 -39
- package/core/utils/collection-filters.ts +0 -209
- package/core/utils/date-helper.ts +0 -176
- package/core/utils/error-messages.ts +0 -38
- package/core/utils/file-helper.ts +0 -277
- package/core/utils/fs-helpers.ts +0 -14
- package/core/utils/help.ts +0 -314
- package/core/utils/jsonl-helper.ts +0 -290
- package/core/utils/keychain.ts +0 -127
- package/core/utils/logger.ts +0 -77
- package/core/utils/markdown-builder.ts +0 -280
- package/core/utils/next-steps.ts +0 -95
- package/core/utils/output.ts +0 -403
- package/core/utils/preserve-sections.ts +0 -218
- package/core/utils/project-commands.ts +0 -126
- package/core/utils/project-credentials.ts +0 -143
- package/core/utils/provider-cache.ts +0 -49
- package/core/utils/retry.ts +0 -318
- package/core/utils/runtime.ts +0 -108
- package/core/utils/session-helper.ts +0 -278
- package/core/utils/subtask-table.ts +0 -227
- package/core/utils/version.ts +0 -128
- package/core/wizard/index.ts +0 -13
- package/core/wizard/onboarding.ts +0 -633
- package/core/workflow/index.ts +0 -7
- package/core/workflow/state-machine.ts +0 -198
- package/core/workflow/workflow-preferences.ts +0 -294
- package/dist/core/infrastructure/command-installer.js +0 -1141
- package/dist/core/infrastructure/editors-config.js +0 -177
- package/dist/core/infrastructure/setup.js +0 -2244
- package/dist/core/utils/version.js +0 -141
- package/templates/agentic/agent-routing.md +0 -45
- package/templates/agentic/agents/uxui.md +0 -63
- package/templates/agentic/checklist-routing.md +0 -98
- package/templates/agentic/orchestrator.md +0 -68
- package/templates/agentic/task-fragmentation.md +0 -89
- package/templates/agents/AGENTS.md +0 -68
- package/templates/analysis/analyze.md +0 -84
- package/templates/analysis/patterns.md +0 -60
- package/templates/antigravity/SKILL.md +0 -39
- package/templates/architect/discovery.md +0 -67
- package/templates/architect/phases.md +0 -59
- package/templates/checklists/architecture.md +0 -28
- package/templates/checklists/code-quality.md +0 -28
- package/templates/checklists/data.md +0 -33
- package/templates/checklists/documentation.md +0 -33
- package/templates/checklists/infrastructure.md +0 -33
- package/templates/checklists/performance.md +0 -33
- package/templates/checklists/security.md +0 -33
- package/templates/checklists/testing.md +0 -33
- package/templates/checklists/ux-ui.md +0 -37
- package/templates/commands/analyze.md +0 -56
- package/templates/commands/auth.md +0 -234
- package/templates/commands/bug.md +0 -163
- package/templates/commands/cleanup.md +0 -19
- package/templates/commands/dash.md +0 -99
- package/templates/commands/design.md +0 -15
- package/templates/commands/done.md +0 -291
- package/templates/commands/enrich.md +0 -174
- package/templates/commands/git.md +0 -295
- package/templates/commands/history.md +0 -389
- package/templates/commands/idea.md +0 -88
- package/templates/commands/impact.md +0 -864
- package/templates/commands/init.md +0 -54
- package/templates/commands/jira.md +0 -278
- package/templates/commands/linear.md +0 -288
- package/templates/commands/merge.md +0 -206
- package/templates/commands/next.md +0 -80
- package/templates/commands/p.md +0 -67
- package/templates/commands/p.toml +0 -37
- package/templates/commands/pause.md +0 -136
- package/templates/commands/plan.md +0 -696
- package/templates/commands/prd.md +0 -356
- package/templates/commands/resume.md +0 -171
- package/templates/commands/review.md +0 -276
- package/templates/commands/serve.md +0 -118
- package/templates/commands/setup.md +0 -91
- package/templates/commands/ship.md +0 -475
- package/templates/commands/skill.md +0 -259
- package/templates/commands/spec.md +0 -218
- package/templates/commands/status.md +0 -207
- package/templates/commands/sync.md +0 -104
- package/templates/commands/task.md +0 -312
- package/templates/commands/test.md +0 -93
- package/templates/commands/update.md +0 -63
- package/templates/commands/verify.md +0 -204
- package/templates/commands/workflow.md +0 -150
- package/templates/config/skill-mappings.json +0 -82
- package/templates/context/dashboard.md +0 -256
- package/templates/context/roadmap.md +0 -221
- package/templates/cursor/commands/bug.md +0 -8
- package/templates/cursor/commands/done.md +0 -4
- package/templates/cursor/commands/pause.md +0 -6
- package/templates/cursor/commands/resume.md +0 -4
- package/templates/cursor/commands/ship.md +0 -8
- package/templates/cursor/commands/sync.md +0 -4
- package/templates/cursor/commands/task.md +0 -8
- package/templates/cursor/p.md +0 -29
- package/templates/cursor/router.mdc +0 -28
- package/templates/design/api.md +0 -95
- package/templates/design/architecture.md +0 -77
- package/templates/design/component.md +0 -89
- package/templates/design/database.md +0 -78
- package/templates/design/flow.md +0 -94
- package/templates/global/ANTIGRAVITY.md +0 -254
- package/templates/global/CLAUDE.md +0 -497
- package/templates/global/CURSOR.mdc +0 -266
- package/templates/global/GEMINI.md +0 -293
- package/templates/global/STORAGE-SPEC.md +0 -391
- package/templates/global/WINDSURF.md +0 -266
- package/templates/global/modules/CLAUDE-commands.md +0 -70
- package/templates/global/modules/CLAUDE-core.md +0 -105
- package/templates/global/modules/CLAUDE-git.md +0 -50
- package/templates/global/modules/CLAUDE-intelligence.md +0 -92
- package/templates/global/modules/CLAUDE-storage.md +0 -50
- package/templates/global/modules/module-config.json +0 -36
- package/templates/mcp-config.json +0 -19
- package/templates/permissions/default.jsonc +0 -60
- package/templates/permissions/permissive.jsonc +0 -49
- package/templates/permissions/strict.jsonc +0 -58
- package/templates/planning-methodology.md +0 -195
- package/templates/skills/code-review.md +0 -47
- package/templates/skills/debug.md +0 -61
- package/templates/skills/refactor.md +0 -47
- package/templates/subagents/agent-base.md +0 -20
- package/templates/subagents/domain/backend.md +0 -109
- package/templates/subagents/domain/database.md +0 -121
- package/templates/subagents/domain/devops.md +0 -152
- package/templates/subagents/domain/frontend.md +0 -103
- package/templates/subagents/domain/testing.md +0 -169
- package/templates/subagents/pm-expert.md +0 -366
- package/templates/subagents/workflow/chief-architect.md +0 -657
- package/templates/subagents/workflow/prjct-planner.md +0 -159
- package/templates/subagents/workflow/prjct-shipper.md +0 -188
- package/templates/subagents/workflow/prjct-workflow.md +0 -98
- package/templates/tools/bash.txt +0 -22
- package/templates/tools/edit.txt +0 -18
- package/templates/tools/glob.txt +0 -19
- package/templates/tools/grep.txt +0 -21
- package/templates/tools/read.txt +0 -14
- package/templates/tools/task.txt +0 -20
- package/templates/tools/webfetch.txt +0 -16
- package/templates/tools/websearch.txt +0 -18
- package/templates/tools/write.txt +0 -17
- package/templates/windsurf/router.md +0 -28
- package/templates/windsurf/workflows/bug.md +0 -8
- package/templates/windsurf/workflows/done.md +0 -4
- package/templates/windsurf/workflows/pause.md +0 -4
- package/templates/windsurf/workflows/resume.md +0 -4
- package/templates/windsurf/workflows/ship.md +0 -8
- package/templates/windsurf/workflows/sync.md +0 -4
- package/templates/windsurf/workflows/task.md +0 -8
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AgentLoader - Loads agents from project files with hierarchical AGENTS.md support
|
|
3
|
-
*
|
|
4
|
-
* CRITICAL: This ensures agents generated for a project are actually USED
|
|
5
|
-
*
|
|
6
|
-
* Supports two agent sources:
|
|
7
|
-
* 1. Generated agent files in ~/.prjct-cli/projects/{projectId}/agents/
|
|
8
|
-
* 2. Hierarchical AGENTS.md files in the project directory tree
|
|
9
|
-
*
|
|
10
|
-
* @version 2.0.0
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import fs from 'node:fs/promises'
|
|
14
|
-
import path from 'node:path'
|
|
15
|
-
import pathManager from '../infrastructure/path-manager'
|
|
16
|
-
import HierarchicalAgentResolver, {
|
|
17
|
-
type HierarchicalAgent,
|
|
18
|
-
} from '../services/hierarchical-agent-resolver'
|
|
19
|
-
import { isNotFoundError } from '../types/fs'
|
|
20
|
-
|
|
21
|
-
interface Agent {
|
|
22
|
-
name: string
|
|
23
|
-
content: string
|
|
24
|
-
path: string
|
|
25
|
-
role: string | null
|
|
26
|
-
domain: string
|
|
27
|
-
skills: string[]
|
|
28
|
-
effort?: 'low' | 'medium' | 'high' | 'max'
|
|
29
|
-
model?: string
|
|
30
|
-
modified: Date
|
|
31
|
-
/** Source of this agent: 'file' (generated) or 'hierarchical' (AGENTS.md) */
|
|
32
|
-
source?: 'file' | 'hierarchical'
|
|
33
|
-
/** If hierarchical, the files that contributed to this agent */
|
|
34
|
-
hierarchySources?: string[]
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
class AgentLoader {
|
|
38
|
-
projectId: string | null
|
|
39
|
-
agentsDir: string
|
|
40
|
-
cache: Map<string, Agent>
|
|
41
|
-
private projectPath: string | null
|
|
42
|
-
private hierarchicalResolver: HierarchicalAgentResolver | null = null
|
|
43
|
-
|
|
44
|
-
constructor(projectId: string | null = null, projectPath: string | null = null) {
|
|
45
|
-
this.projectId = projectId
|
|
46
|
-
this.projectPath = projectPath
|
|
47
|
-
this.agentsDir = pathManager.getAgentsPath(projectId)
|
|
48
|
-
this.cache = new Map()
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Initialize hierarchical agent resolution for a project path
|
|
53
|
-
*/
|
|
54
|
-
async initializeHierarchical(projectPath: string): Promise<void> {
|
|
55
|
-
this.projectPath = projectPath
|
|
56
|
-
this.hierarchicalResolver = new HierarchicalAgentResolver(projectPath)
|
|
57
|
-
await this.hierarchicalResolver.initialize()
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Load an agent from its file
|
|
62
|
-
*/
|
|
63
|
-
async loadAgent(agentName: string): Promise<Agent | null> {
|
|
64
|
-
// Check cache first
|
|
65
|
-
const cacheKey = `${this.projectId || 'global'}-${agentName}`
|
|
66
|
-
if (this.cache.has(cacheKey)) {
|
|
67
|
-
return this.cache.get(cacheKey)!
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
try {
|
|
71
|
-
const agentPath = path.join(this.agentsDir, `${agentName}.md`)
|
|
72
|
-
const content = await fs.readFile(agentPath, 'utf-8')
|
|
73
|
-
|
|
74
|
-
// Parse agent metadata from content (including frontmatter)
|
|
75
|
-
const { effort, model } = this.extractFrontmatterMeta(content)
|
|
76
|
-
const agent: Agent = {
|
|
77
|
-
name: agentName,
|
|
78
|
-
content,
|
|
79
|
-
path: agentPath,
|
|
80
|
-
role: this.extractRole(content),
|
|
81
|
-
domain: this.extractDomain(content),
|
|
82
|
-
skills: this.extractSkills(content),
|
|
83
|
-
effort,
|
|
84
|
-
model,
|
|
85
|
-
modified: (await fs.stat(agentPath)).mtime,
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Cache it
|
|
89
|
-
this.cache.set(cacheKey, agent)
|
|
90
|
-
|
|
91
|
-
return agent
|
|
92
|
-
} catch (error) {
|
|
93
|
-
if (isNotFoundError(error)) {
|
|
94
|
-
return null // Agent file doesn't exist
|
|
95
|
-
}
|
|
96
|
-
throw error
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Load all agents for the project
|
|
102
|
-
*
|
|
103
|
-
* Uses parallel file reads for performance (PRJ-110).
|
|
104
|
-
*/
|
|
105
|
-
async loadAllAgents(): Promise<Agent[]> {
|
|
106
|
-
try {
|
|
107
|
-
const files = await fs.readdir(this.agentsDir)
|
|
108
|
-
const agentFiles = files.filter((f) => f.endsWith('.md') && !f.startsWith('.'))
|
|
109
|
-
|
|
110
|
-
// Load all agents in parallel
|
|
111
|
-
const agentPromises = agentFiles.map((file) => {
|
|
112
|
-
const agentName = file.replace('.md', '')
|
|
113
|
-
return this.loadAgent(agentName)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
const results = await Promise.all(agentPromises)
|
|
117
|
-
return results.filter((agent): agent is Agent => agent !== null)
|
|
118
|
-
} catch (error) {
|
|
119
|
-
if (isNotFoundError(error)) {
|
|
120
|
-
return [] // Agents directory doesn't exist yet
|
|
121
|
-
}
|
|
122
|
-
throw error
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Check if an agent exists
|
|
128
|
-
*/
|
|
129
|
-
async agentExists(agentName: string): Promise<boolean> {
|
|
130
|
-
try {
|
|
131
|
-
const agentPath = path.join(this.agentsDir, `${agentName}.md`)
|
|
132
|
-
await fs.access(agentPath)
|
|
133
|
-
return true
|
|
134
|
-
} catch (_error) {
|
|
135
|
-
return false
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Clear cache (useful after agent updates)
|
|
141
|
-
*/
|
|
142
|
-
clearCache(): void {
|
|
143
|
-
this.cache.clear()
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Extract role from agent content
|
|
148
|
-
*/
|
|
149
|
-
private extractRole(content: string): string | null {
|
|
150
|
-
const roleMatch = content.match(/Role:\s*(.+)/i)
|
|
151
|
-
return roleMatch ? roleMatch[1].trim() : null
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Extract domain from agent content
|
|
156
|
-
*/
|
|
157
|
-
private extractDomain(content: string): string {
|
|
158
|
-
const domainMatch = content.match(/DOMAIN AUTHORITY[\s\S]*?the\s+(\w+)\s+domain/i)
|
|
159
|
-
if (domainMatch) {
|
|
160
|
-
return domainMatch[1].toLowerCase()
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return 'general'
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Extract skills/technologies mentioned in agent content
|
|
168
|
-
*/
|
|
169
|
-
private extractSkills(content: string): string[] {
|
|
170
|
-
const skills: string[] = []
|
|
171
|
-
|
|
172
|
-
// Look for common technology mentions
|
|
173
|
-
const techKeywords = [
|
|
174
|
-
'React',
|
|
175
|
-
'Vue',
|
|
176
|
-
'Angular',
|
|
177
|
-
'Svelte',
|
|
178
|
-
'Next.js',
|
|
179
|
-
'Nuxt',
|
|
180
|
-
'SvelteKit',
|
|
181
|
-
'TypeScript',
|
|
182
|
-
'JavaScript',
|
|
183
|
-
'Node.js',
|
|
184
|
-
'Express',
|
|
185
|
-
'Fastify',
|
|
186
|
-
'Python',
|
|
187
|
-
'Django',
|
|
188
|
-
'Flask',
|
|
189
|
-
'FastAPI',
|
|
190
|
-
'Go',
|
|
191
|
-
'Rust',
|
|
192
|
-
'Ruby',
|
|
193
|
-
'Rails',
|
|
194
|
-
'PostgreSQL',
|
|
195
|
-
'MySQL',
|
|
196
|
-
'MongoDB',
|
|
197
|
-
'Docker',
|
|
198
|
-
'Kubernetes',
|
|
199
|
-
'Terraform',
|
|
200
|
-
]
|
|
201
|
-
|
|
202
|
-
for (const tech of techKeywords) {
|
|
203
|
-
if (content.includes(tech)) {
|
|
204
|
-
skills.push(tech)
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return skills
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Extract effort and model from YAML frontmatter
|
|
213
|
-
*/
|
|
214
|
-
private extractFrontmatterMeta(content: string): {
|
|
215
|
-
effort?: 'low' | 'medium' | 'high' | 'max'
|
|
216
|
-
model?: string
|
|
217
|
-
} {
|
|
218
|
-
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/)
|
|
219
|
-
if (!frontmatterMatch) return {}
|
|
220
|
-
|
|
221
|
-
const fm = frontmatterMatch[1]
|
|
222
|
-
const result: { effort?: 'low' | 'medium' | 'high' | 'max'; model?: string } = {}
|
|
223
|
-
|
|
224
|
-
const effortMatch = fm.match(/^effort:\s*(.+)$/m)
|
|
225
|
-
if (effortMatch) {
|
|
226
|
-
const val = effortMatch[1].trim().replace(/['"]/g, '') as 'low' | 'medium' | 'high' | 'max'
|
|
227
|
-
if (['low', 'medium', 'high', 'max'].includes(val)) {
|
|
228
|
-
result.effort = val
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const modelMatch = fm.match(/^model:\s*(.+)$/m)
|
|
233
|
-
if (modelMatch) {
|
|
234
|
-
result.model = modelMatch[1].trim().replace(/['"]/g, '')
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
return result
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Get agents directory path
|
|
242
|
-
*/
|
|
243
|
-
getAgentsDir(): string {
|
|
244
|
-
return this.agentsDir
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// ==========================================================================
|
|
248
|
-
// HIERARCHICAL AGENTS.md SUPPORT
|
|
249
|
-
// ==========================================================================
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Load agents from hierarchical AGENTS.md files for a specific path
|
|
253
|
-
* Returns agents resolved from the directory tree
|
|
254
|
-
*/
|
|
255
|
-
async loadHierarchicalAgents(targetPath?: string): Promise<Agent[]> {
|
|
256
|
-
if (!this.hierarchicalResolver) {
|
|
257
|
-
if (this.projectPath) {
|
|
258
|
-
await this.initializeHierarchical(this.projectPath)
|
|
259
|
-
} else {
|
|
260
|
-
return [] // No project path, can't resolve hierarchical agents
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const result = await this.hierarchicalResolver!.resolveAgentsForPath(
|
|
265
|
-
targetPath || this.projectPath || process.cwd()
|
|
266
|
-
)
|
|
267
|
-
|
|
268
|
-
return result.agents.map((ha) => this.hierarchicalAgentToAgent(ha))
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Load a specific agent from AGENTS.md hierarchy
|
|
273
|
-
*/
|
|
274
|
-
async loadHierarchicalAgent(agentName: string, targetPath?: string): Promise<Agent | null> {
|
|
275
|
-
if (!this.hierarchicalResolver) {
|
|
276
|
-
if (this.projectPath) {
|
|
277
|
-
await this.initializeHierarchical(this.projectPath)
|
|
278
|
-
} else {
|
|
279
|
-
return null
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const agent = await this.hierarchicalResolver!.getAgentByName(
|
|
284
|
-
agentName,
|
|
285
|
-
targetPath || this.projectPath || undefined
|
|
286
|
-
)
|
|
287
|
-
|
|
288
|
-
return agent ? this.hierarchicalAgentToAgent(agent) : null
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Load all agents, merging generated files with AGENTS.md definitions
|
|
293
|
-
* Generated files take precedence for content, but AGENTS.md provides
|
|
294
|
-
* additional rules/triggers/patterns
|
|
295
|
-
*/
|
|
296
|
-
async loadAllAgentsMerged(targetPath?: string): Promise<Agent[]> {
|
|
297
|
-
// Load both sources
|
|
298
|
-
const fileAgents = await this.loadAllAgents()
|
|
299
|
-
const hierarchicalAgents = await this.loadHierarchicalAgents(targetPath)
|
|
300
|
-
|
|
301
|
-
// Create a map for merging
|
|
302
|
-
const mergedMap = new Map<string, Agent>()
|
|
303
|
-
|
|
304
|
-
// First, add all hierarchical agents
|
|
305
|
-
for (const agent of hierarchicalAgents) {
|
|
306
|
-
mergedMap.set(agent.name.toLowerCase(), agent)
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// Then, overlay with file agents (they take precedence for content)
|
|
310
|
-
for (const agent of fileAgents) {
|
|
311
|
-
const existing = mergedMap.get(agent.name.toLowerCase())
|
|
312
|
-
if (existing && existing.source === 'hierarchical') {
|
|
313
|
-
// Merge: file content + hierarchical metadata
|
|
314
|
-
mergedMap.set(agent.name.toLowerCase(), {
|
|
315
|
-
...agent,
|
|
316
|
-
source: 'file',
|
|
317
|
-
hierarchySources: existing.hierarchySources,
|
|
318
|
-
// Append hierarchical rules/patterns to content if present
|
|
319
|
-
content: this.mergeAgentContent(agent.content, existing),
|
|
320
|
-
})
|
|
321
|
-
} else {
|
|
322
|
-
mergedMap.set(agent.name.toLowerCase(), {
|
|
323
|
-
...agent,
|
|
324
|
-
source: 'file',
|
|
325
|
-
})
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
return Array.from(mergedMap.values())
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* Check if hierarchical agents are available for this project
|
|
334
|
-
*/
|
|
335
|
-
async hasHierarchicalAgents(): Promise<boolean> {
|
|
336
|
-
if (!this.hierarchicalResolver && this.projectPath) {
|
|
337
|
-
await this.initializeHierarchical(this.projectPath)
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (!this.hierarchicalResolver) {
|
|
341
|
-
return false
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const tree = await this.hierarchicalResolver.getAgentFileTree()
|
|
345
|
-
return tree.length > 0
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/**
|
|
349
|
-
* Get all agent names available (from both sources)
|
|
350
|
-
*/
|
|
351
|
-
async getAllAgentNames(): Promise<string[]> {
|
|
352
|
-
const names = new Set<string>()
|
|
353
|
-
|
|
354
|
-
// From generated files
|
|
355
|
-
const fileAgents = await this.loadAllAgents()
|
|
356
|
-
for (const agent of fileAgents) {
|
|
357
|
-
names.add(agent.name)
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// From AGENTS.md hierarchy
|
|
361
|
-
if (this.hierarchicalResolver || this.projectPath) {
|
|
362
|
-
if (!this.hierarchicalResolver && this.projectPath) {
|
|
363
|
-
await this.initializeHierarchical(this.projectPath)
|
|
364
|
-
}
|
|
365
|
-
if (this.hierarchicalResolver) {
|
|
366
|
-
const hierarchicalNames = await this.hierarchicalResolver.getAllAgentNames()
|
|
367
|
-
for (const name of hierarchicalNames) {
|
|
368
|
-
names.add(name)
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
return Array.from(names).sort()
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
/**
|
|
377
|
-
* Convert HierarchicalAgent to Agent interface
|
|
378
|
-
*/
|
|
379
|
-
private hierarchicalAgentToAgent(ha: HierarchicalAgent): Agent {
|
|
380
|
-
const resolver = this.hierarchicalResolver!
|
|
381
|
-
const content = resolver.generateAgentMarkdown(ha)
|
|
382
|
-
|
|
383
|
-
return {
|
|
384
|
-
name: ha.name,
|
|
385
|
-
content,
|
|
386
|
-
path: `AGENTS.md:${ha.name}`,
|
|
387
|
-
role: ha.description.split('\n')[0] || null,
|
|
388
|
-
domain: ha.domain || 'general',
|
|
389
|
-
skills: ha.triggers, // Use triggers as skills for routing
|
|
390
|
-
modified: new Date(),
|
|
391
|
-
source: 'hierarchical',
|
|
392
|
-
hierarchySources: ha.sources,
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Merge file agent content with hierarchical metadata
|
|
398
|
-
*/
|
|
399
|
-
private mergeAgentContent(fileContent: string, hierarchical: Agent): string {
|
|
400
|
-
// If the hierarchical agent has rules/patterns not in file content,
|
|
401
|
-
// append them as additional sections
|
|
402
|
-
const additions: string[] = []
|
|
403
|
-
|
|
404
|
-
// Check if file content already has the hierarchical rules
|
|
405
|
-
if (hierarchical.hierarchySources && hierarchical.hierarchySources.length > 0) {
|
|
406
|
-
additions.push('')
|
|
407
|
-
additions.push('---')
|
|
408
|
-
additions.push(`*Extended from: ${hierarchical.hierarchySources.join(' → ')}*`)
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
if (additions.length > 0) {
|
|
412
|
-
return fileContent + additions.join('\n')
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
return fileContent
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
export default AgentLoader
|