prjct-cli 1.22.0 → 1.23.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 +147 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct.mjs +917 -35845
- package/dist/bin/prjct.mjs.map +7 -0
- package/dist/cli/linear.mjs +16 -0
- package/dist/cli/linear.mjs.map +7 -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,298 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Prompt Assembly Tests (PRJ-301)
|
|
3
|
-
*
|
|
4
|
-
* Tests for the redesigned prompt assembly:
|
|
5
|
-
* - Section ordering (Identity → Env → Ground Truth → ... → Efficiency)
|
|
6
|
-
* - Environment block generation
|
|
7
|
-
* - Anti-hallucination block generation
|
|
8
|
-
* - Token efficiency directive
|
|
9
|
-
* - Budget trimming with priorities
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { beforeEach, describe, expect, it } from 'bun:test'
|
|
13
|
-
import {
|
|
14
|
-
buildAntiHallucinationBlock,
|
|
15
|
-
type ProjectGroundTruth,
|
|
16
|
-
} from '../../agentic/anti-hallucination'
|
|
17
|
-
import { buildEnvironmentBlock, type EnvironmentBlockInput } from '../../agentic/environment-block'
|
|
18
|
-
import promptBuilder, { PROMPT_SECTION_ORDER } from '../../agentic/prompt-builder'
|
|
19
|
-
|
|
20
|
-
// =============================================================================
|
|
21
|
-
// Environment Block
|
|
22
|
-
// =============================================================================
|
|
23
|
-
|
|
24
|
-
describe('Environment Block (PRJ-301)', () => {
|
|
25
|
-
it('should generate <env> block with all fields', () => {
|
|
26
|
-
const input: EnvironmentBlockInput = {
|
|
27
|
-
projectName: 'my-app',
|
|
28
|
-
projectPath: '/home/user/my-app',
|
|
29
|
-
isGitRepo: true,
|
|
30
|
-
gitBranch: 'feature/login',
|
|
31
|
-
platform: 'darwin',
|
|
32
|
-
runtime: 'bun',
|
|
33
|
-
date: '2026-02-07',
|
|
34
|
-
model: 'opus',
|
|
35
|
-
provider: 'claude',
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const block = buildEnvironmentBlock(input)
|
|
39
|
-
|
|
40
|
-
expect(block).toContain('<env>')
|
|
41
|
-
expect(block).toContain('</env>')
|
|
42
|
-
expect(block).toContain('project: my-app')
|
|
43
|
-
expect(block).toContain('path: /home/user/my-app')
|
|
44
|
-
expect(block).toContain('git: true')
|
|
45
|
-
expect(block).toContain('branch: feature/login')
|
|
46
|
-
expect(block).toContain('platform: macOS')
|
|
47
|
-
expect(block).toContain('runtime: bun')
|
|
48
|
-
expect(block).toContain('date: 2026-02-07')
|
|
49
|
-
expect(block).toContain('model: opus')
|
|
50
|
-
expect(block).toContain('provider: claude')
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('should omit undefined fields', () => {
|
|
54
|
-
const input: EnvironmentBlockInput = {
|
|
55
|
-
projectName: 'my-app',
|
|
56
|
-
projectPath: '/test',
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const block = buildEnvironmentBlock(input)
|
|
60
|
-
|
|
61
|
-
expect(block).toContain('project: my-app')
|
|
62
|
-
expect(block).toContain('path: /test')
|
|
63
|
-
expect(block).not.toContain('model:')
|
|
64
|
-
expect(block).not.toContain('provider:')
|
|
65
|
-
expect(block).not.toContain('branch:')
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('should normalize platform names', () => {
|
|
69
|
-
expect(
|
|
70
|
-
buildEnvironmentBlock({ projectName: 'x', projectPath: '/x', platform: 'darwin' })
|
|
71
|
-
).toContain('platform: macOS')
|
|
72
|
-
expect(
|
|
73
|
-
buildEnvironmentBlock({ projectName: 'x', projectPath: '/x', platform: 'linux' })
|
|
74
|
-
).toContain('platform: Linux')
|
|
75
|
-
expect(
|
|
76
|
-
buildEnvironmentBlock({ projectName: 'x', projectPath: '/x', platform: 'win32' })
|
|
77
|
-
).toContain('platform: Windows')
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
it('should auto-detect runtime and date when not provided', () => {
|
|
81
|
-
const block = buildEnvironmentBlock({ projectName: 'x', projectPath: '/x' })
|
|
82
|
-
|
|
83
|
-
// Should have a runtime (bun or node)
|
|
84
|
-
expect(block).toMatch(/runtime: (bun|node)/)
|
|
85
|
-
// Should have a date in YYYY-MM-DD format
|
|
86
|
-
expect(block).toMatch(/date: \d{4}-\d{2}-\d{2}/)
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
// =============================================================================
|
|
91
|
-
// Anti-Hallucination Block
|
|
92
|
-
// =============================================================================
|
|
93
|
-
|
|
94
|
-
describe('Anti-Hallucination Block (PRJ-301)', () => {
|
|
95
|
-
it('should generate constraints block with availability', () => {
|
|
96
|
-
const truth: ProjectGroundTruth = {
|
|
97
|
-
projectPath: '/home/user/my-app',
|
|
98
|
-
language: 'TypeScript',
|
|
99
|
-
framework: 'Hono',
|
|
100
|
-
techStack: ['Hono', 'Zod', 'Vitest'],
|
|
101
|
-
domains: {
|
|
102
|
-
hasFrontend: false,
|
|
103
|
-
hasBackend: true,
|
|
104
|
-
hasDatabase: false,
|
|
105
|
-
hasTesting: true,
|
|
106
|
-
hasDocker: false,
|
|
107
|
-
},
|
|
108
|
-
fileCount: 292,
|
|
109
|
-
availableAgents: ['backend', 'testing'],
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const block = buildAntiHallucinationBlock(truth)
|
|
113
|
-
|
|
114
|
-
// Section header
|
|
115
|
-
expect(block).toContain('CONSTRAINTS (Read Before Acting)')
|
|
116
|
-
|
|
117
|
-
// Availability
|
|
118
|
-
expect(block).toContain('AVAILABLE in this project: TypeScript, Hono, Zod, Vitest')
|
|
119
|
-
|
|
120
|
-
// Unavailability (no frontend, no database, no docker)
|
|
121
|
-
expect(block).toContain('NOT PRESENT:')
|
|
122
|
-
expect(block).toContain('Frontend (UI/components)')
|
|
123
|
-
expect(block).toContain('Database (SQL/ORM)')
|
|
124
|
-
expect(block).toContain('Docker/containers')
|
|
125
|
-
|
|
126
|
-
// Should NOT list present domains as absent
|
|
127
|
-
expect(block).not.toContain('NOT PRESENT: Backend')
|
|
128
|
-
expect(block).not.toContain('NOT PRESENT: Testing')
|
|
129
|
-
|
|
130
|
-
// Agents
|
|
131
|
-
expect(block).toContain('AGENTS: backend, testing')
|
|
132
|
-
|
|
133
|
-
// Grounding rules
|
|
134
|
-
expect(block).toContain('SCOPE: Only files in `/home/user/my-app` are accessible.')
|
|
135
|
-
expect(block).toContain('Do NOT infer or guess paths')
|
|
136
|
-
expect(block).toContain('NEVER assume a library is available')
|
|
137
|
-
expect(block).toContain('trust this section')
|
|
138
|
-
|
|
139
|
-
// File count
|
|
140
|
-
expect(block).toContain('292 files in project')
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
it('should handle minimal input', () => {
|
|
144
|
-
const truth: ProjectGroundTruth = {
|
|
145
|
-
projectPath: '/test',
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const block = buildAntiHallucinationBlock(truth)
|
|
149
|
-
|
|
150
|
-
expect(block).toContain('CONSTRAINTS')
|
|
151
|
-
expect(block).toContain('SCOPE: Only files in `/test` are accessible.')
|
|
152
|
-
// Should not have AVAILABLE or NOT PRESENT lines
|
|
153
|
-
expect(block).not.toContain('AVAILABLE in this project:')
|
|
154
|
-
expect(block).not.toContain('NOT PRESENT:')
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
it('should not duplicate framework in techStack listing', () => {
|
|
158
|
-
const truth: ProjectGroundTruth = {
|
|
159
|
-
projectPath: '/test',
|
|
160
|
-
language: 'TypeScript',
|
|
161
|
-
framework: 'Next.js',
|
|
162
|
-
techStack: ['Next.js', 'React', 'Tailwind'],
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const block = buildAntiHallucinationBlock(truth)
|
|
166
|
-
|
|
167
|
-
// Next.js should appear once (from framework), not duplicated from techStack
|
|
168
|
-
const matches = block.match(/Next\.js/g)
|
|
169
|
-
expect(matches?.length).toBe(1)
|
|
170
|
-
})
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
// =============================================================================
|
|
174
|
-
// Section Ordering
|
|
175
|
-
// =============================================================================
|
|
176
|
-
|
|
177
|
-
describe('Prompt Section Ordering (PRJ-301)', () => {
|
|
178
|
-
let builder: typeof promptBuilder
|
|
179
|
-
|
|
180
|
-
beforeEach(() => {
|
|
181
|
-
builder = promptBuilder
|
|
182
|
-
builder.resetContext()
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('should define correct section order constant', () => {
|
|
186
|
-
expect(PROMPT_SECTION_ORDER).toEqual([
|
|
187
|
-
'identity',
|
|
188
|
-
'environment',
|
|
189
|
-
'ground_truth',
|
|
190
|
-
'capabilities',
|
|
191
|
-
'constraints',
|
|
192
|
-
'task_context',
|
|
193
|
-
'task',
|
|
194
|
-
'output_schema',
|
|
195
|
-
'efficiency',
|
|
196
|
-
])
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
it('should place environment block before constraints', async () => {
|
|
200
|
-
const template = {
|
|
201
|
-
frontmatter: { description: 'Test', 'allowed-tools': ['Read'] },
|
|
202
|
-
content: '## Instructions\nDo the thing',
|
|
203
|
-
}
|
|
204
|
-
const context = { projectPath: '/test', files: ['a.js'] }
|
|
205
|
-
|
|
206
|
-
const prompt = await builder.build(template, context, {})
|
|
207
|
-
|
|
208
|
-
const envPos = prompt.indexOf('<env>')
|
|
209
|
-
const constraintsPos = prompt.indexOf('CONSTRAINTS')
|
|
210
|
-
expect(envPos).toBeGreaterThan(-1)
|
|
211
|
-
expect(constraintsPos).toBeGreaterThan(-1)
|
|
212
|
-
expect(envPos).toBeLessThan(constraintsPos)
|
|
213
|
-
})
|
|
214
|
-
|
|
215
|
-
it('should place constraints before task template content', async () => {
|
|
216
|
-
const template = {
|
|
217
|
-
frontmatter: { description: 'Test' },
|
|
218
|
-
content: '## UNIQUE_TEMPLATE_MARKER\nFollow these steps',
|
|
219
|
-
}
|
|
220
|
-
const context = { projectPath: '/test', files: ['a.js'] }
|
|
221
|
-
|
|
222
|
-
const prompt = await builder.build(template, context, {})
|
|
223
|
-
|
|
224
|
-
const constraintsPos = prompt.indexOf('CONSTRAINTS')
|
|
225
|
-
const templatePos = prompt.indexOf('UNIQUE_TEMPLATE_MARKER')
|
|
226
|
-
expect(constraintsPos).toBeGreaterThan(-1)
|
|
227
|
-
expect(templatePos).toBeGreaterThan(-1)
|
|
228
|
-
expect(constraintsPos).toBeLessThan(templatePos)
|
|
229
|
-
})
|
|
230
|
-
|
|
231
|
-
it('should place identity (TASK:) at the beginning', async () => {
|
|
232
|
-
const template = {
|
|
233
|
-
frontmatter: { description: 'My Task' },
|
|
234
|
-
content: '## Flow\nStep 1',
|
|
235
|
-
}
|
|
236
|
-
const context = { projectPath: '/test' }
|
|
237
|
-
|
|
238
|
-
const prompt = await builder.build(template, context, {})
|
|
239
|
-
|
|
240
|
-
const taskPos = prompt.indexOf('TASK: My Task')
|
|
241
|
-
expect(taskPos).toBeLessThan(50)
|
|
242
|
-
})
|
|
243
|
-
|
|
244
|
-
it('should place efficiency directive at the end', async () => {
|
|
245
|
-
const template = {
|
|
246
|
-
frontmatter: { description: 'Test' },
|
|
247
|
-
content: '## Flow\nStep 1',
|
|
248
|
-
}
|
|
249
|
-
const context = { projectPath: '/test' }
|
|
250
|
-
|
|
251
|
-
const prompt = await builder.build(template, context, {})
|
|
252
|
-
|
|
253
|
-
const efficiencyPos = prompt.indexOf('OUTPUT RULES')
|
|
254
|
-
const executePos = prompt.indexOf('EXECUTE:')
|
|
255
|
-
expect(efficiencyPos).toBeGreaterThan(-1)
|
|
256
|
-
expect(executePos).toBeGreaterThan(-1)
|
|
257
|
-
// Should be in the last ~300 chars of the prompt
|
|
258
|
-
expect(prompt.length - executePos).toBeLessThan(300)
|
|
259
|
-
})
|
|
260
|
-
})
|
|
261
|
-
|
|
262
|
-
// =============================================================================
|
|
263
|
-
// Token Efficiency Directive
|
|
264
|
-
// =============================================================================
|
|
265
|
-
|
|
266
|
-
describe('Token Efficiency Directive (PRJ-301)', () => {
|
|
267
|
-
let builder: typeof promptBuilder
|
|
268
|
-
|
|
269
|
-
beforeEach(() => {
|
|
270
|
-
builder = promptBuilder
|
|
271
|
-
builder.resetContext()
|
|
272
|
-
})
|
|
273
|
-
|
|
274
|
-
it('should include efficiency rules in every prompt', async () => {
|
|
275
|
-
const template = {
|
|
276
|
-
frontmatter: { description: 'Test' },
|
|
277
|
-
content: '## Flow\nStep 1',
|
|
278
|
-
}
|
|
279
|
-
const context = { projectPath: '/test' }
|
|
280
|
-
|
|
281
|
-
const prompt = await builder.build(template, context, {})
|
|
282
|
-
|
|
283
|
-
expect(prompt).toContain('OUTPUT RULES')
|
|
284
|
-
expect(prompt).toContain('Be concise')
|
|
285
|
-
expect(prompt).toContain('No preamble')
|
|
286
|
-
expect(prompt).toContain('No postamble')
|
|
287
|
-
expect(prompt).toContain('EXECUTE:')
|
|
288
|
-
})
|
|
289
|
-
|
|
290
|
-
it('should build efficiency directive as standalone method', () => {
|
|
291
|
-
const directive = builder.buildEfficiencyDirective()
|
|
292
|
-
|
|
293
|
-
expect(directive).toContain('Maximum 4 lines')
|
|
294
|
-
expect(directive).toContain('No preamble')
|
|
295
|
-
expect(directive).toContain('Prefer structured output')
|
|
296
|
-
expect(directive).toContain('EXECUTE:')
|
|
297
|
-
})
|
|
298
|
-
})
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Prompt Builder Tests
|
|
3
|
-
* Tests for optimized prompts with compressed rules
|
|
4
|
-
*
|
|
5
|
-
* OPTIMIZED: Tests updated to match compressed prompt structure
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { beforeEach, describe, expect, it } from 'bun:test'
|
|
9
|
-
import promptBuilder from '../../agentic/prompt-builder'
|
|
10
|
-
|
|
11
|
-
describe('PromptBuilder', () => {
|
|
12
|
-
let builder: typeof promptBuilder
|
|
13
|
-
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
builder = promptBuilder
|
|
16
|
-
builder.resetContext()
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
describe('Critical Rules (Compressed)', () => {
|
|
20
|
-
it('should include git safety rules', () => {
|
|
21
|
-
builder.setContext({ files: [], filteredSize: 0 })
|
|
22
|
-
const rules = builder.buildCriticalRules()
|
|
23
|
-
|
|
24
|
-
expect(rules).toContain('GIT SAFETY')
|
|
25
|
-
expect(rules).toContain('checkout')
|
|
26
|
-
expect(rules).toContain('reset')
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
it('should include read-first requirement', () => {
|
|
30
|
-
builder.setContext({ files: [], filteredSize: 0 })
|
|
31
|
-
const rules = builder.buildCriticalRules()
|
|
32
|
-
|
|
33
|
-
expect(rules).toContain('READ FIRST')
|
|
34
|
-
expect(rules).toContain('Read tool')
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
it('should include pattern matching requirement', () => {
|
|
38
|
-
builder.setContext({ files: [], filteredSize: 0 })
|
|
39
|
-
const rules = builder.buildCriticalRules()
|
|
40
|
-
|
|
41
|
-
expect(rules).toContain('MATCH PATTERNS')
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('should include no-hallucination rules', () => {
|
|
45
|
-
builder.setContext({ files: [], filteredSize: 0 })
|
|
46
|
-
const rules = builder.buildCriticalRules()
|
|
47
|
-
|
|
48
|
-
expect(rules).toContain('NO HALLUCINATIONS')
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('should show file count in context', () => {
|
|
52
|
-
builder.setContext({ files: ['a.js', 'b.js', 'c.js'] })
|
|
53
|
-
const rules = builder.buildCriticalRules()
|
|
54
|
-
|
|
55
|
-
expect(rules).toContain('3 files available')
|
|
56
|
-
})
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
describe('State Filtering', () => {
|
|
60
|
-
it('should preserve full content for critical files', () => {
|
|
61
|
-
const state = {
|
|
62
|
-
now: '# NOW\n\n**Test task**\n\nStarted: 2025-01-01',
|
|
63
|
-
next: '# NEXT\n\n## Priority Queue\n\n1. Task 1',
|
|
64
|
-
context: 'Project context information',
|
|
65
|
-
analysis: 'Stack: Node.js\nPatterns: ES6 modules',
|
|
66
|
-
metrics: 'Some metrics data',
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const filtered = builder.filterRelevantState(state)
|
|
70
|
-
|
|
71
|
-
expect(filtered).toContain('### now')
|
|
72
|
-
expect(filtered).toContain('Test task')
|
|
73
|
-
expect(filtered).toContain('### next')
|
|
74
|
-
expect(filtered).toContain('### context')
|
|
75
|
-
expect(filtered).toContain('### analysis')
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('should truncate large non-critical files', () => {
|
|
79
|
-
const largeContent = 'x'.repeat(2000)
|
|
80
|
-
const state = {
|
|
81
|
-
now: '# NOW\n\n**Task**',
|
|
82
|
-
largeFile: largeContent,
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const filtered = builder.filterRelevantState(state)
|
|
86
|
-
|
|
87
|
-
expect(filtered).toContain('### now')
|
|
88
|
-
expect(filtered).toContain('### largeFile')
|
|
89
|
-
expect(filtered).toContain('truncated')
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('should return null for empty state', () => {
|
|
93
|
-
const filtered = builder.filterRelevantState({})
|
|
94
|
-
expect(filtered).toBeNull()
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
describe('Context Filtering by Command Type', () => {
|
|
99
|
-
it('should include patterns for code commands', async () => {
|
|
100
|
-
const template = {
|
|
101
|
-
frontmatter: { description: 'Build feature', name: 'p:build' },
|
|
102
|
-
content: '## Flow\nBuild something',
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
const context = { projectPath: '/test', files: ['file1.js'] }
|
|
106
|
-
const state = { analysis: 'Stack: Node.js, React' }
|
|
107
|
-
|
|
108
|
-
const prompt = await builder.build(template, context, state)
|
|
109
|
-
|
|
110
|
-
expect(prompt).toContain('STACK')
|
|
111
|
-
expect(prompt).toContain('Node.js')
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
it('should NOT include patterns for non-code commands', async () => {
|
|
115
|
-
const template = {
|
|
116
|
-
frontmatter: { description: 'Show current task', name: 'p:now' },
|
|
117
|
-
content: '## Flow\nShow task',
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const context = { projectPath: '/test', files: ['file1.js'] }
|
|
121
|
-
const state = { analysis: 'Stack: Node.js, React' }
|
|
122
|
-
|
|
123
|
-
const prompt = await builder.build(template, context, state)
|
|
124
|
-
|
|
125
|
-
expect(prompt).not.toContain('## PATTERNS')
|
|
126
|
-
})
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
describe('Project Files Listing', () => {
|
|
130
|
-
it('should list available files when context has files', async () => {
|
|
131
|
-
const template = {
|
|
132
|
-
frontmatter: { description: 'Test command' },
|
|
133
|
-
content: '## Flow\nDo something',
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const context = {
|
|
137
|
-
projectPath: '/test',
|
|
138
|
-
files: ['src/file1.js', 'src/file2.js', 'tests/test1.js'],
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const state = {}
|
|
142
|
-
|
|
143
|
-
const prompt = await builder.build(template, context, state)
|
|
144
|
-
|
|
145
|
-
expect(prompt).toContain('## FILES:')
|
|
146
|
-
expect(prompt).toContain('3 available')
|
|
147
|
-
expect(prompt).toContain('file1.js')
|
|
148
|
-
expect(prompt).toContain('Read')
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
it('should show project path when no files listed', async () => {
|
|
152
|
-
const template = {
|
|
153
|
-
frontmatter: { description: 'Test command' },
|
|
154
|
-
content: '## Flow\nDo something',
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const context = { projectPath: '/test/project' }
|
|
158
|
-
const state = {}
|
|
159
|
-
|
|
160
|
-
const prompt = await builder.build(template, context, state)
|
|
161
|
-
|
|
162
|
-
expect(prompt).toContain('## PROJECT:')
|
|
163
|
-
expect(prompt).toContain('/test/project')
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
describe('Build Complete Prompt', () => {
|
|
168
|
-
it('should include all critical sections', async () => {
|
|
169
|
-
const template = {
|
|
170
|
-
frontmatter: {
|
|
171
|
-
description: 'Test command',
|
|
172
|
-
'allowed-tools': ['Read', 'Write'],
|
|
173
|
-
},
|
|
174
|
-
content: '## Flow\n1. Do step 1\n2. Do step 2',
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const context = {
|
|
178
|
-
projectPath: '/test',
|
|
179
|
-
params: { task: 'test task' },
|
|
180
|
-
files: ['file1.js'],
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
const state = { now: '# NOW\n\n**Current task**' }
|
|
184
|
-
|
|
185
|
-
const prompt = await builder.build(template, context, state)
|
|
186
|
-
|
|
187
|
-
expect(prompt).toContain('TASK:')
|
|
188
|
-
expect(prompt).toContain('TOOLS:')
|
|
189
|
-
expect(prompt).toContain('Flow')
|
|
190
|
-
expect(prompt).toContain('CONSTRAINTS (Read Before Acting)')
|
|
191
|
-
expect(prompt).toContain('## FILES:')
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
it('should be concise (under 2000 chars for simple prompt)', async () => {
|
|
195
|
-
const template = {
|
|
196
|
-
frontmatter: { description: 'Test', 'allowed-tools': ['Read'] },
|
|
197
|
-
content: '## Flow\n1. Test',
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const context = { projectPath: '/test', files: ['a.js'] }
|
|
201
|
-
const state = {}
|
|
202
|
-
|
|
203
|
-
const prompt = await builder.build(template, context, state)
|
|
204
|
-
|
|
205
|
-
expect(prompt.length).toBeLessThan(2000)
|
|
206
|
-
})
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
describe('Plan Mode (Compressed)', () => {
|
|
210
|
-
it('should include compact plan mode instructions', async () => {
|
|
211
|
-
const template = {
|
|
212
|
-
frontmatter: { description: 'Test' },
|
|
213
|
-
content: '## Flow\nTest',
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const context = { projectPath: '/test' }
|
|
217
|
-
const state = {}
|
|
218
|
-
const planInfo = { isPlanning: true, allowedTools: ['Read', 'Glob'] }
|
|
219
|
-
|
|
220
|
-
const prompt = await builder.build(template, context, state, null, null, null, null, planInfo)
|
|
221
|
-
|
|
222
|
-
expect(prompt).toContain('PLAN MODE')
|
|
223
|
-
expect(prompt).toContain('Read-only')
|
|
224
|
-
expect(prompt).toContain('Tools: Read, Glob')
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
it('should include approval required section', async () => {
|
|
228
|
-
const template = {
|
|
229
|
-
frontmatter: { description: 'Test' },
|
|
230
|
-
content: '## Flow\nTest',
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const context = { projectPath: '/test' }
|
|
234
|
-
const state = {}
|
|
235
|
-
const planInfo = { requiresApproval: true }
|
|
236
|
-
|
|
237
|
-
const prompt = await builder.build(template, context, state, null, null, null, null, planInfo)
|
|
238
|
-
|
|
239
|
-
expect(prompt).toContain('APPROVAL REQUIRED')
|
|
240
|
-
expect(prompt).toContain('confirmation')
|
|
241
|
-
})
|
|
242
|
-
})
|
|
243
|
-
})
|