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,451 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Loop Detector
|
|
3
|
-
* Detects and prevents execution loops and hallucinations.
|
|
4
|
-
*
|
|
5
|
-
* OPTIMIZATION (P2.4): Loop Detection
|
|
6
|
-
* - Track attempt counts per command/error type
|
|
7
|
-
* - Auto-escalate after 3 failed attempts
|
|
8
|
-
* - Provide specific help based on error patterns
|
|
9
|
-
*
|
|
10
|
-
* ANTI-HALLUCINATION: Detects contradictory/impossible outputs
|
|
11
|
-
* - Patterns that indicate Claude is hallucinating (saying file exists when it doesn't)
|
|
12
|
-
* - Contradictory statements in same response
|
|
13
|
-
* - Completing tasks that were never started
|
|
14
|
-
*
|
|
15
|
-
* Source: Augment Code pattern
|
|
16
|
-
* "If you notice yourself going around in circles... ask the user for help"
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
import type {
|
|
20
|
-
AttemptInfo,
|
|
21
|
-
AttemptRecord,
|
|
22
|
-
AttemptResult,
|
|
23
|
-
ErrorEntry,
|
|
24
|
-
ErrorPattern,
|
|
25
|
-
EscalationInfo,
|
|
26
|
-
HallucinationPattern,
|
|
27
|
-
HallucinationResult,
|
|
28
|
-
OutputAnalysis,
|
|
29
|
-
} from '../types'
|
|
30
|
-
|
|
31
|
-
// =============================================================================
|
|
32
|
-
// Constants
|
|
33
|
-
// =============================================================================
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* ANTI-HALLUCINATION: Patterns that indicate Claude may be hallucinating
|
|
37
|
-
* These patterns detect contradictory or impossible statements
|
|
38
|
-
*/
|
|
39
|
-
export const HALLUCINATION_PATTERNS: HallucinationPattern[] = [
|
|
40
|
-
// Contradictory file operations
|
|
41
|
-
{
|
|
42
|
-
pattern: /file.*not found.*created/i,
|
|
43
|
-
type: 'contradiction',
|
|
44
|
-
description: 'Claims file created but also not found',
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
pattern: /created.*but.*error/i,
|
|
48
|
-
type: 'contradiction',
|
|
49
|
-
description: 'Claims success but also error',
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
pattern: /successfully.*failed/i,
|
|
53
|
-
type: 'contradiction',
|
|
54
|
-
description: 'Contradictory success/failure',
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
// Impossible task states
|
|
58
|
-
{
|
|
59
|
-
pattern: /already.*completed.*completing/i,
|
|
60
|
-
type: 'state',
|
|
61
|
-
description: 'Completing already-completed task',
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
pattern: /no task.*marking complete/i,
|
|
65
|
-
type: 'state',
|
|
66
|
-
description: 'Completing non-existent task',
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
pattern: /no.*active.*done with/i,
|
|
70
|
-
type: 'state',
|
|
71
|
-
description: 'Finishing task that doesnt exist',
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
// Invented data
|
|
75
|
-
{
|
|
76
|
-
pattern: /version.*updated.*no package/i,
|
|
77
|
-
type: 'invented',
|
|
78
|
-
description: 'Version update without package.json',
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
pattern: /committed.*nothing to commit/i,
|
|
82
|
-
type: 'invented',
|
|
83
|
-
description: 'Commit without changes',
|
|
84
|
-
},
|
|
85
|
-
{ pattern: /pushed.*no remote/i, type: 'invented', description: 'Push without remote' },
|
|
86
|
-
]
|
|
87
|
-
|
|
88
|
-
// =============================================================================
|
|
89
|
-
// Hallucination Detection
|
|
90
|
-
// =============================================================================
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Get suggestion for handling detected hallucination
|
|
94
|
-
*/
|
|
95
|
-
export function getHallucinationSuggestion(type: string): string {
|
|
96
|
-
const suggestions: Record<string, string> = {
|
|
97
|
-
contradiction:
|
|
98
|
-
'Verify file/resource state before reporting. Use Read tool to check actual state.',
|
|
99
|
-
state: 'Check current task state from now.md before assuming completion.',
|
|
100
|
-
invented: 'Verify prerequisites exist (package.json, git remote) before claiming actions.',
|
|
101
|
-
}
|
|
102
|
-
return suggestions[type] || 'Verify actual state before proceeding.'
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Detect potential hallucination patterns in output
|
|
107
|
-
*/
|
|
108
|
-
export function detectHallucination(output: string): HallucinationResult {
|
|
109
|
-
if (!output || typeof output !== 'string') {
|
|
110
|
-
return { detected: false }
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
for (const { pattern, type, description } of HALLUCINATION_PATTERNS) {
|
|
114
|
-
if (pattern.test(output)) {
|
|
115
|
-
return {
|
|
116
|
-
detected: true,
|
|
117
|
-
type,
|
|
118
|
-
pattern: pattern.source,
|
|
119
|
-
description,
|
|
120
|
-
message: `Potential hallucination detected: ${description}`,
|
|
121
|
-
suggestion: getHallucinationSuggestion(type),
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return { detected: false }
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// =============================================================================
|
|
130
|
-
// Error Analysis
|
|
131
|
-
// =============================================================================
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Check if two errors are similar
|
|
135
|
-
*/
|
|
136
|
-
export function isSimilarError(error1: string, error2: string): boolean {
|
|
137
|
-
if (!error1 || !error2) return false
|
|
138
|
-
|
|
139
|
-
// Normalize errors
|
|
140
|
-
const normalize = (e: string) =>
|
|
141
|
-
e
|
|
142
|
-
.toLowerCase()
|
|
143
|
-
.replace(/[0-9]+/g, 'N') // Replace numbers
|
|
144
|
-
.replace(/['"`]/g, '') // Remove quotes
|
|
145
|
-
.replace(/\s+/g, ' ') // Normalize whitespace
|
|
146
|
-
.trim()
|
|
147
|
-
|
|
148
|
-
return normalize(error1) === normalize(error2)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Analyze error pattern from history
|
|
153
|
-
*/
|
|
154
|
-
export function analyzeErrorPattern(errors: ErrorEntry[]): ErrorPattern {
|
|
155
|
-
if (!errors || errors.length === 0) {
|
|
156
|
-
return { type: 'unknown', description: 'No error information' }
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const lastError = errors[errors.length - 1]?.message?.toLowerCase() || ''
|
|
160
|
-
|
|
161
|
-
// Detect common patterns (ORDER MATTERS - more specific patterns first)
|
|
162
|
-
if (lastError.includes('permission') || lastError.includes('access denied')) {
|
|
163
|
-
return { type: 'permission', description: 'File or directory permission issue' }
|
|
164
|
-
}
|
|
165
|
-
if (lastError.includes('not found') || lastError.includes('no such file')) {
|
|
166
|
-
return { type: 'not_found', description: 'File or resource not found' }
|
|
167
|
-
}
|
|
168
|
-
if (lastError.includes('syntax') || lastError.includes('parse')) {
|
|
169
|
-
return { type: 'syntax', description: 'Syntax or parsing error' }
|
|
170
|
-
}
|
|
171
|
-
if (lastError.includes('timeout') || lastError.includes('timed out')) {
|
|
172
|
-
return { type: 'timeout', description: 'Operation timed out' }
|
|
173
|
-
}
|
|
174
|
-
if (lastError.includes('network') || lastError.includes('connection')) {
|
|
175
|
-
return { type: 'network', description: 'Network or connection issue' }
|
|
176
|
-
}
|
|
177
|
-
// Config pattern MUST be checked before validation (since "invalid config" contains both)
|
|
178
|
-
if (lastError.includes('config') || lastError.includes('configuration')) {
|
|
179
|
-
return { type: 'config', description: 'Configuration issue' }
|
|
180
|
-
}
|
|
181
|
-
if (lastError.includes('validation') || lastError.includes('invalid')) {
|
|
182
|
-
return { type: 'validation', description: 'Validation failed' }
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return { type: 'unknown', description: 'Unrecognized error pattern' }
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* Generate user-friendly escalation message
|
|
190
|
-
*/
|
|
191
|
-
export function generateEscalationMessage(
|
|
192
|
-
command: string,
|
|
193
|
-
errorPattern: ErrorPattern,
|
|
194
|
-
maxAttempts: number
|
|
195
|
-
): string {
|
|
196
|
-
const messages: Record<string, string> = {
|
|
197
|
-
permission: `I've tried ${command} ${maxAttempts} times but keep hitting permission issues.`,
|
|
198
|
-
not_found: `After ${maxAttempts} attempts, I still can't find the required file or resource.`,
|
|
199
|
-
syntax: `I'm encountering repeated syntax errors with ${command}.`,
|
|
200
|
-
timeout: `The operation keeps timing out after ${maxAttempts} attempts.`,
|
|
201
|
-
network: `Network issues are preventing ${command} from completing.`,
|
|
202
|
-
validation: `Validation keeps failing for ${command}.`,
|
|
203
|
-
config: `There seems to be a configuration issue affecting ${command}.`,
|
|
204
|
-
unknown: `I've tried ${command} ${maxAttempts} times without success.`,
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return messages[errorPattern.type] || messages.unknown
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Generate actionable suggestion based on error pattern
|
|
212
|
-
*/
|
|
213
|
-
export function generateSuggestion(errorPattern: ErrorPattern): string {
|
|
214
|
-
const suggestions: Record<string, string> = {
|
|
215
|
-
permission: 'Check file permissions. Try: chmod -R u+w ~/.prjct-cli/',
|
|
216
|
-
not_found: 'Verify the file path exists. Run /p:init if project not initialized.',
|
|
217
|
-
syntax: 'Check the file format. There may be invalid JSON or markdown.',
|
|
218
|
-
timeout: 'Check your network connection or try again in a moment.',
|
|
219
|
-
network: 'Verify internet connection and try again.',
|
|
220
|
-
validation: 'Review the input parameters and try with different values.',
|
|
221
|
-
config: 'Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.',
|
|
222
|
-
unknown: 'Can you check the issue manually and provide more context?',
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
return suggestions[errorPattern.type] || suggestions.unknown
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
// =============================================================================
|
|
229
|
-
// Loop Detector Class
|
|
230
|
-
// =============================================================================
|
|
231
|
-
|
|
232
|
-
export class LoopDetector {
|
|
233
|
-
private _attempts: Map<string, AttemptRecord>
|
|
234
|
-
private _errorPatterns: Map<string, unknown>
|
|
235
|
-
maxAttempts: number
|
|
236
|
-
sessionTimeout: number
|
|
237
|
-
|
|
238
|
-
constructor() {
|
|
239
|
-
// Track attempts per command session
|
|
240
|
-
this._attempts = new Map()
|
|
241
|
-
|
|
242
|
-
// Track error patterns
|
|
243
|
-
this._errorPatterns = new Map()
|
|
244
|
-
|
|
245
|
-
// Configuration
|
|
246
|
-
this.maxAttempts = 3
|
|
247
|
-
this.sessionTimeout = 5 * 60 * 1000 // 5 minutes
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
/**
|
|
251
|
-
* Generate a unique key for tracking attempts
|
|
252
|
-
*/
|
|
253
|
-
private _getKey(command: string, context: string = ''): string {
|
|
254
|
-
return `${command}:${context}`.toLowerCase()
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Record an attempt for a command
|
|
259
|
-
*/
|
|
260
|
-
recordAttempt(command: string, context: string = '', result: AttemptResult = {}): AttemptInfo {
|
|
261
|
-
const key = this._getKey(command, context)
|
|
262
|
-
const now = Date.now()
|
|
263
|
-
|
|
264
|
-
// Get or create attempt record
|
|
265
|
-
let record = this._attempts.get(key)
|
|
266
|
-
|
|
267
|
-
if (!record || now - record.lastAttempt > this.sessionTimeout) {
|
|
268
|
-
// New session or timed out
|
|
269
|
-
record = {
|
|
270
|
-
command,
|
|
271
|
-
context,
|
|
272
|
-
attempts: 0,
|
|
273
|
-
errors: [],
|
|
274
|
-
firstAttempt: now,
|
|
275
|
-
lastAttempt: now,
|
|
276
|
-
success: false,
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Update record
|
|
281
|
-
record.attempts++
|
|
282
|
-
record.lastAttempt = now
|
|
283
|
-
record.success = result.success || false
|
|
284
|
-
|
|
285
|
-
if (result.error) {
|
|
286
|
-
record.errors.push({
|
|
287
|
-
message: result.error,
|
|
288
|
-
timestamp: now,
|
|
289
|
-
})
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
this._attempts.set(key, record)
|
|
293
|
-
|
|
294
|
-
return {
|
|
295
|
-
attemptNumber: record.attempts,
|
|
296
|
-
isLooping: this.isLooping(command, context),
|
|
297
|
-
shouldEscalate: this.shouldEscalate(command, context),
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Check if a command is in a loop (repeated failures)
|
|
303
|
-
*/
|
|
304
|
-
isLooping(command: string, context: string = ''): boolean {
|
|
305
|
-
const key = this._getKey(command, context)
|
|
306
|
-
const record = this._attempts.get(key)
|
|
307
|
-
|
|
308
|
-
if (!record) return false
|
|
309
|
-
|
|
310
|
-
// Check if multiple failures with same error
|
|
311
|
-
if (record.attempts >= 2 && !record.success) {
|
|
312
|
-
const recentErrors = record.errors.slice(-3)
|
|
313
|
-
if (recentErrors.length >= 2) {
|
|
314
|
-
// Check if errors are similar
|
|
315
|
-
const firstError = recentErrors[0]?.message || ''
|
|
316
|
-
const sameError = recentErrors.every((e) => isSimilarError(e.message, firstError))
|
|
317
|
-
return sameError
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
return false
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Check if we should escalate to user
|
|
326
|
-
*/
|
|
327
|
-
shouldEscalate(command: string, context: string = ''): boolean {
|
|
328
|
-
const key = this._getKey(command, context)
|
|
329
|
-
const record = this._attempts.get(key)
|
|
330
|
-
|
|
331
|
-
if (!record) return false
|
|
332
|
-
|
|
333
|
-
// Escalate after max attempts without success
|
|
334
|
-
return record.attempts >= this.maxAttempts && !record.success
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* Get escalation message for user
|
|
339
|
-
*/
|
|
340
|
-
getEscalationInfo(command: string, context: string = ''): EscalationInfo | null {
|
|
341
|
-
const key = this._getKey(command, context)
|
|
342
|
-
const record = this._attempts.get(key)
|
|
343
|
-
|
|
344
|
-
if (!record) {
|
|
345
|
-
return null
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// Analyze error pattern
|
|
349
|
-
const errorPattern = analyzeErrorPattern(record.errors)
|
|
350
|
-
|
|
351
|
-
return {
|
|
352
|
-
status: 'BLOCKED',
|
|
353
|
-
command,
|
|
354
|
-
context,
|
|
355
|
-
attempts: record.attempts,
|
|
356
|
-
duration: record.lastAttempt - record.firstAttempt,
|
|
357
|
-
errorPattern,
|
|
358
|
-
message: generateEscalationMessage(command, errorPattern, this.maxAttempts),
|
|
359
|
-
suggestion: generateSuggestion(errorPattern),
|
|
360
|
-
lastError: record.errors[record.errors.length - 1]?.message || null,
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
/**
|
|
365
|
-
* Mark a command as successful (resets tracking)
|
|
366
|
-
*/
|
|
367
|
-
recordSuccess(command: string, context: string = ''): void {
|
|
368
|
-
const key = this._getKey(command, context)
|
|
369
|
-
const record = this._attempts.get(key)
|
|
370
|
-
|
|
371
|
-
if (record) {
|
|
372
|
-
record.success = true
|
|
373
|
-
record.attempts = 0
|
|
374
|
-
record.errors = []
|
|
375
|
-
this._attempts.set(key, record)
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Clear all tracking for a command
|
|
381
|
-
*/
|
|
382
|
-
clearTracking(command: string, context: string = ''): void {
|
|
383
|
-
const key = this._getKey(command, context)
|
|
384
|
-
this._attempts.delete(key)
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Clear all tracking data
|
|
389
|
-
*/
|
|
390
|
-
clearAll(): void {
|
|
391
|
-
this._attempts.clear()
|
|
392
|
-
this._errorPatterns.clear()
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
/**
|
|
396
|
-
* Get statistics for debugging
|
|
397
|
-
*/
|
|
398
|
-
getStats(): { activeTracking: number; commands: Record<string, unknown> } {
|
|
399
|
-
const stats: { activeTracking: number; commands: Record<string, unknown> } = {
|
|
400
|
-
activeTracking: this._attempts.size,
|
|
401
|
-
commands: {},
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
for (const [key, record] of this._attempts) {
|
|
405
|
-
stats.commands[key] = {
|
|
406
|
-
attempts: record.attempts,
|
|
407
|
-
success: record.success,
|
|
408
|
-
errorCount: record.errors.length,
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
return stats
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* ANTI-HALLUCINATION: Detect potential hallucination patterns in output
|
|
417
|
-
*/
|
|
418
|
-
detectHallucination(output: string) {
|
|
419
|
-
return detectHallucination(output)
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
/**
|
|
423
|
-
* Analyze output and record if hallucination detected
|
|
424
|
-
*/
|
|
425
|
-
analyzeOutput(command: string, output: string): OutputAnalysis {
|
|
426
|
-
const hallucination = this.detectHallucination(output)
|
|
427
|
-
|
|
428
|
-
if (hallucination.detected) {
|
|
429
|
-
// Record as a special type of error
|
|
430
|
-
this.recordAttempt(command, 'hallucination', {
|
|
431
|
-
success: false,
|
|
432
|
-
error: `HALLUCINATION: ${hallucination.description}`,
|
|
433
|
-
})
|
|
434
|
-
|
|
435
|
-
return {
|
|
436
|
-
...hallucination,
|
|
437
|
-
shouldBlock: true,
|
|
438
|
-
action: 'VERIFY_STATE',
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
return { detected: false, shouldBlock: false }
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// =============================================================================
|
|
447
|
-
// Default Export
|
|
448
|
-
// =============================================================================
|
|
449
|
-
|
|
450
|
-
const loopDetector = new LoopDetector()
|
|
451
|
-
export default loopDetector
|