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
package/core/schemas/analysis.ts
DELETED
|
@@ -1,530 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Analysis Schema
|
|
3
|
-
*
|
|
4
|
-
* Defines the structure for analysis.json - repository analysis.
|
|
5
|
-
* Supports a 3-state lifecycle: DRAFT → VERIFIED → SEALED (PRJ-263).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import fs from 'node:fs/promises'
|
|
9
|
-
import path from 'node:path'
|
|
10
|
-
import { z } from 'zod'
|
|
11
|
-
import { isNotFoundError } from '../types/fs'
|
|
12
|
-
import { ModelMetadataSchema } from './model'
|
|
13
|
-
|
|
14
|
-
// =============================================================================
|
|
15
|
-
// Zod Schemas - Source of Truth
|
|
16
|
-
// =============================================================================
|
|
17
|
-
|
|
18
|
-
export const AnalysisStatusSchema = z.enum(['draft', 'verified', 'sealed'])
|
|
19
|
-
|
|
20
|
-
export const CodePatternSchema = z.object({
|
|
21
|
-
name: z.string(),
|
|
22
|
-
description: z.string(),
|
|
23
|
-
location: z.string().optional(),
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
export const AntiPatternSchema = z.object({
|
|
27
|
-
issue: z.string(),
|
|
28
|
-
file: z.string(),
|
|
29
|
-
suggestion: z.string(),
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
export const AnalysisItemSchema = z.object({
|
|
33
|
-
projectId: z.string(),
|
|
34
|
-
languages: z.array(z.string()),
|
|
35
|
-
frameworks: z.array(z.string()),
|
|
36
|
-
packageManager: z.string().optional(),
|
|
37
|
-
sourceDir: z.string().optional(),
|
|
38
|
-
testDir: z.string().optional(),
|
|
39
|
-
configFiles: z.array(z.string()),
|
|
40
|
-
fileCount: z.number(),
|
|
41
|
-
patterns: z.array(CodePatternSchema),
|
|
42
|
-
antiPatterns: z.array(AntiPatternSchema),
|
|
43
|
-
analyzedAt: z.string(), // ISO8601
|
|
44
|
-
/** Which AI model was used for this analysis (PRJ-265) */
|
|
45
|
-
modelMetadata: ModelMetadataSchema.optional(),
|
|
46
|
-
|
|
47
|
-
// Sealable analysis fields (PRJ-263)
|
|
48
|
-
/** Lifecycle status: draft (regenerable), verified (confirmed correct), sealed (locked) */
|
|
49
|
-
status: AnalysisStatusSchema.default('draft'),
|
|
50
|
-
/** Git commit hash at the time of analysis */
|
|
51
|
-
commitHash: z.string().optional(),
|
|
52
|
-
/** SHA-256 signature of analysis content + commit hash */
|
|
53
|
-
signature: z.string().optional(),
|
|
54
|
-
/** When the analysis was sealed */
|
|
55
|
-
sealedAt: z.string().optional(), // ISO8601
|
|
56
|
-
/** When the analysis was verified */
|
|
57
|
-
verifiedAt: z.string().optional(), // ISO8601
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
// =============================================================================
|
|
61
|
-
// Inferred Types - Backward Compatible
|
|
62
|
-
// =============================================================================
|
|
63
|
-
|
|
64
|
-
export type AnalysisStatus = z.infer<typeof AnalysisStatusSchema>
|
|
65
|
-
export type CodePattern = z.infer<typeof CodePatternSchema>
|
|
66
|
-
export type AntiPattern = z.infer<typeof AntiPatternSchema>
|
|
67
|
-
/** Use z.input so optional fields with defaults (like status) remain optional in creation */
|
|
68
|
-
export type AnalysisSchema = z.input<typeof AnalysisItemSchema>
|
|
69
|
-
|
|
70
|
-
// =============================================================================
|
|
71
|
-
// Validation Helpers
|
|
72
|
-
// =============================================================================
|
|
73
|
-
|
|
74
|
-
/** Parse and validate analysis.json content */
|
|
75
|
-
export const parseAnalysis = (data: unknown): z.infer<typeof AnalysisItemSchema> =>
|
|
76
|
-
AnalysisItemSchema.parse(data)
|
|
77
|
-
export const safeParseAnalysis = (data: unknown) => AnalysisItemSchema.safeParse(data)
|
|
78
|
-
|
|
79
|
-
// =============================================================================
|
|
80
|
-
// Defaults
|
|
81
|
-
// =============================================================================
|
|
82
|
-
|
|
83
|
-
export const DEFAULT_ANALYSIS: Omit<AnalysisSchema, 'projectId'> = {
|
|
84
|
-
languages: [],
|
|
85
|
-
frameworks: [],
|
|
86
|
-
configFiles: [],
|
|
87
|
-
fileCount: 0,
|
|
88
|
-
patterns: [],
|
|
89
|
-
antiPatterns: [],
|
|
90
|
-
analyzedAt: new Date().toISOString(),
|
|
91
|
-
status: 'draft',
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// =============================================================================
|
|
95
|
-
// Semantic Verification (PRJ-270)
|
|
96
|
-
// =============================================================================
|
|
97
|
-
|
|
98
|
-
export interface SemanticCheckResult {
|
|
99
|
-
name: string
|
|
100
|
-
passed: boolean
|
|
101
|
-
output?: string
|
|
102
|
-
error?: string
|
|
103
|
-
durationMs: number
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export interface SemanticVerificationReport {
|
|
107
|
-
passed: boolean
|
|
108
|
-
checks: SemanticCheckResult[]
|
|
109
|
-
totalMs: number
|
|
110
|
-
failedCount: number
|
|
111
|
-
passedCount: number
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
interface PackageJson {
|
|
115
|
-
dependencies?: Record<string, string>
|
|
116
|
-
devDependencies?: Record<string, string>
|
|
117
|
-
[key: string]: unknown
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Language to file extension mapping
|
|
122
|
-
*/
|
|
123
|
-
const LANGUAGE_EXTENSIONS: Record<string, string[]> = {
|
|
124
|
-
TypeScript: ['.ts', '.tsx', '.mts', '.cts'],
|
|
125
|
-
JavaScript: ['.js', '.jsx', '.mjs', '.cjs'],
|
|
126
|
-
Python: ['.py', '.pyw'],
|
|
127
|
-
Java: ['.java'],
|
|
128
|
-
Go: ['.go'],
|
|
129
|
-
Rust: ['.rs'],
|
|
130
|
-
Ruby: ['.rb'],
|
|
131
|
-
PHP: ['.php'],
|
|
132
|
-
Swift: ['.swift'],
|
|
133
|
-
Kotlin: ['.kt', '.kts'],
|
|
134
|
-
'C++': ['.cpp', '.cc', '.cxx', '.hpp', '.h'],
|
|
135
|
-
C: ['.c', '.h'],
|
|
136
|
-
'C#': ['.cs'],
|
|
137
|
-
Elixir: ['.ex', '.exs'],
|
|
138
|
-
Scala: ['.scala'],
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Verify frameworks exist in package.json dependencies
|
|
143
|
-
*/
|
|
144
|
-
export async function verifyFrameworks(
|
|
145
|
-
analysis: AnalysisSchema,
|
|
146
|
-
projectPath: string
|
|
147
|
-
): Promise<SemanticCheckResult> {
|
|
148
|
-
const start = Date.now()
|
|
149
|
-
|
|
150
|
-
if (analysis.frameworks.length === 0) {
|
|
151
|
-
return {
|
|
152
|
-
name: 'Framework verification',
|
|
153
|
-
passed: true,
|
|
154
|
-
output: 'No frameworks declared (skipped)',
|
|
155
|
-
durationMs: Date.now() - start,
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
try {
|
|
160
|
-
const packagePath = path.join(projectPath, 'package.json')
|
|
161
|
-
const content = await fs.readFile(packagePath, 'utf-8')
|
|
162
|
-
const pkg: PackageJson = JSON.parse(content)
|
|
163
|
-
|
|
164
|
-
const allDeps = {
|
|
165
|
-
...pkg.dependencies,
|
|
166
|
-
...pkg.devDependencies,
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const missing: string[] = []
|
|
170
|
-
const found: string[] = []
|
|
171
|
-
|
|
172
|
-
for (const framework of analysis.frameworks) {
|
|
173
|
-
// Check if framework name (or lowercase variant) exists in dependencies
|
|
174
|
-
const frameworkLower = framework.toLowerCase()
|
|
175
|
-
const exists = Object.keys(allDeps).some((dep) => dep.toLowerCase().includes(frameworkLower))
|
|
176
|
-
|
|
177
|
-
if (exists) {
|
|
178
|
-
found.push(framework)
|
|
179
|
-
} else {
|
|
180
|
-
missing.push(framework)
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (missing.length === 0) {
|
|
185
|
-
return {
|
|
186
|
-
name: 'Framework verification',
|
|
187
|
-
passed: true,
|
|
188
|
-
output: `${found.length} framework(s) verified in dependencies`,
|
|
189
|
-
durationMs: Date.now() - start,
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return {
|
|
194
|
-
name: 'Framework verification',
|
|
195
|
-
passed: false,
|
|
196
|
-
error: `Frameworks not found in dependencies: ${missing.join(', ')}`,
|
|
197
|
-
durationMs: Date.now() - start,
|
|
198
|
-
}
|
|
199
|
-
} catch (error) {
|
|
200
|
-
if (isNotFoundError(error)) {
|
|
201
|
-
return {
|
|
202
|
-
name: 'Framework verification',
|
|
203
|
-
passed: false,
|
|
204
|
-
error: 'package.json not found (cannot verify frameworks)',
|
|
205
|
-
durationMs: Date.now() - start,
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return {
|
|
210
|
-
name: 'Framework verification',
|
|
211
|
-
passed: false,
|
|
212
|
-
error: `Failed to read package.json: ${error instanceof Error ? error.message : 'unknown error'}`,
|
|
213
|
-
durationMs: Date.now() - start,
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Verify languages match actual file extensions in the project
|
|
220
|
-
*/
|
|
221
|
-
export async function verifyLanguages(
|
|
222
|
-
analysis: AnalysisSchema,
|
|
223
|
-
projectPath: string
|
|
224
|
-
): Promise<SemanticCheckResult> {
|
|
225
|
-
const start = Date.now()
|
|
226
|
-
|
|
227
|
-
if (analysis.languages.length === 0) {
|
|
228
|
-
return {
|
|
229
|
-
name: 'Language verification',
|
|
230
|
-
passed: true,
|
|
231
|
-
output: 'No languages declared (skipped)',
|
|
232
|
-
durationMs: Date.now() - start,
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
try {
|
|
237
|
-
// Get list of all file extensions in the project
|
|
238
|
-
const extensions = await getProjectExtensions(projectPath)
|
|
239
|
-
const foundExtensions = new Set(extensions)
|
|
240
|
-
|
|
241
|
-
const verified: string[] = []
|
|
242
|
-
const notFound: string[] = []
|
|
243
|
-
|
|
244
|
-
for (const language of analysis.languages) {
|
|
245
|
-
const expectedExts = LANGUAGE_EXTENSIONS[language]
|
|
246
|
-
if (!expectedExts) {
|
|
247
|
-
// Unknown language mapping - skip validation
|
|
248
|
-
continue
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
const hasMatchingFiles = expectedExts.some((ext) => foundExtensions.has(ext))
|
|
252
|
-
if (hasMatchingFiles) {
|
|
253
|
-
verified.push(language)
|
|
254
|
-
} else {
|
|
255
|
-
notFound.push(language)
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
if (notFound.length === 0) {
|
|
260
|
-
return {
|
|
261
|
-
name: 'Language verification',
|
|
262
|
-
passed: true,
|
|
263
|
-
output: `${verified.length} language(s) verified with matching files`,
|
|
264
|
-
durationMs: Date.now() - start,
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
return {
|
|
269
|
-
name: 'Language verification',
|
|
270
|
-
passed: false,
|
|
271
|
-
error: `Languages without matching files: ${notFound.join(', ')}`,
|
|
272
|
-
durationMs: Date.now() - start,
|
|
273
|
-
}
|
|
274
|
-
} catch (error) {
|
|
275
|
-
return {
|
|
276
|
-
name: 'Language verification',
|
|
277
|
-
passed: false,
|
|
278
|
-
error: `Failed to scan project files: ${error instanceof Error ? error.message : 'unknown error'}`,
|
|
279
|
-
durationMs: Date.now() - start,
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Verify pattern locations reference real files
|
|
286
|
-
*/
|
|
287
|
-
export async function verifyPatternLocations(
|
|
288
|
-
analysis: AnalysisSchema,
|
|
289
|
-
projectPath: string
|
|
290
|
-
): Promise<SemanticCheckResult> {
|
|
291
|
-
const start = Date.now()
|
|
292
|
-
|
|
293
|
-
const patternsWithLocations = analysis.patterns.filter((p) => p.location)
|
|
294
|
-
|
|
295
|
-
if (patternsWithLocations.length === 0) {
|
|
296
|
-
return {
|
|
297
|
-
name: 'Pattern location verification',
|
|
298
|
-
passed: true,
|
|
299
|
-
output: 'No pattern locations specified (skipped)',
|
|
300
|
-
durationMs: Date.now() - start,
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
const missing: string[] = []
|
|
305
|
-
const verified: string[] = []
|
|
306
|
-
|
|
307
|
-
for (const pattern of patternsWithLocations) {
|
|
308
|
-
const location = pattern.location!
|
|
309
|
-
const filePath = path.join(projectPath, location)
|
|
310
|
-
|
|
311
|
-
try {
|
|
312
|
-
await fs.access(filePath)
|
|
313
|
-
verified.push(location)
|
|
314
|
-
} catch {
|
|
315
|
-
missing.push(`${pattern.name} (${location})`)
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
if (missing.length === 0) {
|
|
320
|
-
return {
|
|
321
|
-
name: 'Pattern location verification',
|
|
322
|
-
passed: true,
|
|
323
|
-
output: `${verified.length} pattern location(s) verified`,
|
|
324
|
-
durationMs: Date.now() - start,
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
return {
|
|
329
|
-
name: 'Pattern location verification',
|
|
330
|
-
passed: false,
|
|
331
|
-
error: `Pattern locations not found: ${missing.join(', ')}`,
|
|
332
|
-
durationMs: Date.now() - start,
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* Verify file count accuracy (within 10% tolerance)
|
|
338
|
-
*/
|
|
339
|
-
export async function verifyFileCount(
|
|
340
|
-
analysis: AnalysisSchema,
|
|
341
|
-
projectPath: string
|
|
342
|
-
): Promise<SemanticCheckResult> {
|
|
343
|
-
const start = Date.now()
|
|
344
|
-
|
|
345
|
-
try {
|
|
346
|
-
const actualCount = await countProjectFiles(projectPath)
|
|
347
|
-
const declared = analysis.fileCount
|
|
348
|
-
const tolerance = 0.1 // 10% tolerance
|
|
349
|
-
const diff = Math.abs(actualCount - declared)
|
|
350
|
-
const allowedDiff = declared * tolerance
|
|
351
|
-
|
|
352
|
-
if (diff <= allowedDiff) {
|
|
353
|
-
return {
|
|
354
|
-
name: 'File count verification',
|
|
355
|
-
passed: true,
|
|
356
|
-
output: `File count accurate (declared: ${declared}, actual: ${actualCount})`,
|
|
357
|
-
durationMs: Date.now() - start,
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return {
|
|
362
|
-
name: 'File count verification',
|
|
363
|
-
passed: false,
|
|
364
|
-
error: `File count mismatch: declared ${declared}, actual ${actualCount} (diff: ${diff})`,
|
|
365
|
-
durationMs: Date.now() - start,
|
|
366
|
-
}
|
|
367
|
-
} catch (error) {
|
|
368
|
-
return {
|
|
369
|
-
name: 'File count verification',
|
|
370
|
-
passed: false,
|
|
371
|
-
error: `Failed to count files: ${error instanceof Error ? error.message : 'unknown error'}`,
|
|
372
|
-
durationMs: Date.now() - start,
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Verify anti-pattern files exist
|
|
379
|
-
*/
|
|
380
|
-
export async function verifyAntiPatternFiles(
|
|
381
|
-
analysis: AnalysisSchema,
|
|
382
|
-
projectPath: string
|
|
383
|
-
): Promise<SemanticCheckResult> {
|
|
384
|
-
const start = Date.now()
|
|
385
|
-
|
|
386
|
-
if (analysis.antiPatterns.length === 0) {
|
|
387
|
-
return {
|
|
388
|
-
name: 'Anti-pattern file verification',
|
|
389
|
-
passed: true,
|
|
390
|
-
output: 'No anti-patterns declared (skipped)',
|
|
391
|
-
durationMs: Date.now() - start,
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const missing: string[] = []
|
|
396
|
-
const verified: string[] = []
|
|
397
|
-
|
|
398
|
-
for (const antiPattern of analysis.antiPatterns) {
|
|
399
|
-
const filePath = path.join(projectPath, antiPattern.file)
|
|
400
|
-
|
|
401
|
-
try {
|
|
402
|
-
await fs.access(filePath)
|
|
403
|
-
verified.push(antiPattern.file)
|
|
404
|
-
} catch {
|
|
405
|
-
missing.push(`${antiPattern.issue} (${antiPattern.file})`)
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
if (missing.length === 0) {
|
|
410
|
-
return {
|
|
411
|
-
name: 'Anti-pattern file verification',
|
|
412
|
-
passed: true,
|
|
413
|
-
output: `${verified.length} anti-pattern file(s) verified`,
|
|
414
|
-
durationMs: Date.now() - start,
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
return {
|
|
419
|
-
name: 'Anti-pattern file verification',
|
|
420
|
-
passed: false,
|
|
421
|
-
error: `Anti-pattern files not found: ${missing.join(', ')}`,
|
|
422
|
-
durationMs: Date.now() - start,
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
/**
|
|
427
|
-
* Run all semantic verification checks
|
|
428
|
-
*/
|
|
429
|
-
export async function semanticVerify(
|
|
430
|
-
analysis: AnalysisSchema,
|
|
431
|
-
projectPath: string
|
|
432
|
-
): Promise<SemanticVerificationReport> {
|
|
433
|
-
const totalStart = Date.now()
|
|
434
|
-
|
|
435
|
-
const checks = await Promise.all([
|
|
436
|
-
verifyFrameworks(analysis, projectPath),
|
|
437
|
-
verifyLanguages(analysis, projectPath),
|
|
438
|
-
verifyPatternLocations(analysis, projectPath),
|
|
439
|
-
verifyFileCount(analysis, projectPath),
|
|
440
|
-
verifyAntiPatternFiles(analysis, projectPath),
|
|
441
|
-
])
|
|
442
|
-
|
|
443
|
-
const failedCount = checks.filter((c) => !c.passed).length
|
|
444
|
-
const passedCount = checks.filter((c) => c.passed).length
|
|
445
|
-
|
|
446
|
-
return {
|
|
447
|
-
passed: failedCount === 0,
|
|
448
|
-
checks,
|
|
449
|
-
totalMs: Date.now() - totalStart,
|
|
450
|
-
failedCount,
|
|
451
|
-
passedCount,
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
// =============================================================================
|
|
456
|
-
// Helper Functions
|
|
457
|
-
// =============================================================================
|
|
458
|
-
|
|
459
|
-
/**
|
|
460
|
-
* Get all file extensions in a project (excluding common ignore patterns)
|
|
461
|
-
*/
|
|
462
|
-
async function getProjectExtensions(projectPath: string): Promise<string[]> {
|
|
463
|
-
const extensions = new Set<string>()
|
|
464
|
-
const ignorePatterns = [/node_modules/, /\.git/, /dist/, /build/, /\.next/, /\.turbo/, /coverage/]
|
|
465
|
-
|
|
466
|
-
async function scanDir(dir: string): Promise<void> {
|
|
467
|
-
try {
|
|
468
|
-
const entries = await fs.readdir(dir, { withFileTypes: true })
|
|
469
|
-
|
|
470
|
-
for (const entry of entries) {
|
|
471
|
-
const fullPath = path.join(dir, entry.name)
|
|
472
|
-
const relativePath = path.relative(projectPath, fullPath)
|
|
473
|
-
|
|
474
|
-
// Skip ignored patterns
|
|
475
|
-
if (ignorePatterns.some((pattern) => pattern.test(relativePath))) {
|
|
476
|
-
continue
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
if (entry.isDirectory()) {
|
|
480
|
-
await scanDir(fullPath)
|
|
481
|
-
} else if (entry.isFile()) {
|
|
482
|
-
const ext = path.extname(entry.name)
|
|
483
|
-
if (ext) {
|
|
484
|
-
extensions.add(ext)
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
} catch {
|
|
489
|
-
// Silently skip directories we can't read
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
await scanDir(projectPath)
|
|
494
|
-
return Array.from(extensions)
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
/**
|
|
498
|
-
* Count total files in a project (excluding common ignore patterns)
|
|
499
|
-
*/
|
|
500
|
-
async function countProjectFiles(projectPath: string): Promise<number> {
|
|
501
|
-
let count = 0
|
|
502
|
-
const ignorePatterns = [/node_modules/, /\.git/, /dist/, /build/, /\.next/, /\.turbo/, /coverage/]
|
|
503
|
-
|
|
504
|
-
async function scanDir(dir: string): Promise<void> {
|
|
505
|
-
try {
|
|
506
|
-
const entries = await fs.readdir(dir, { withFileTypes: true })
|
|
507
|
-
|
|
508
|
-
for (const entry of entries) {
|
|
509
|
-
const fullPath = path.join(dir, entry.name)
|
|
510
|
-
const relativePath = path.relative(projectPath, fullPath)
|
|
511
|
-
|
|
512
|
-
// Skip ignored patterns
|
|
513
|
-
if (ignorePatterns.some((pattern) => pattern.test(relativePath))) {
|
|
514
|
-
continue
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
if (entry.isDirectory()) {
|
|
518
|
-
await scanDir(fullPath)
|
|
519
|
-
} else if (entry.isFile()) {
|
|
520
|
-
count++
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
} catch {
|
|
524
|
-
// Silently skip directories we can't read
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
await scanDir(projectPath)
|
|
529
|
-
return count
|
|
530
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Task Classification Schema
|
|
3
|
-
*
|
|
4
|
-
* Defines the structure for LLM-based domain classification results.
|
|
5
|
-
* Replaces hardcoded keyword lists with structured classification output.
|
|
6
|
-
*
|
|
7
|
-
* @see PRJ-299
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { z } from 'zod'
|
|
11
|
-
|
|
12
|
-
// =============================================================================
|
|
13
|
-
// Classification Schemas
|
|
14
|
-
// =============================================================================
|
|
15
|
-
|
|
16
|
-
export const ClassificationDomainSchema = z.enum([
|
|
17
|
-
'frontend',
|
|
18
|
-
'backend',
|
|
19
|
-
'database',
|
|
20
|
-
'devops',
|
|
21
|
-
'testing',
|
|
22
|
-
'docs',
|
|
23
|
-
'uxui',
|
|
24
|
-
'general',
|
|
25
|
-
])
|
|
26
|
-
|
|
27
|
-
export const TaskClassificationSchema = z.object({
|
|
28
|
-
/** Primary domain for this task */
|
|
29
|
-
primaryDomain: ClassificationDomainSchema,
|
|
30
|
-
/** Secondary domains that are also relevant */
|
|
31
|
-
secondaryDomains: z.array(ClassificationDomainSchema),
|
|
32
|
-
/** Confidence in the classification (0-1) */
|
|
33
|
-
confidence: z.number().min(0).max(1),
|
|
34
|
-
/** Glob patterns for relevant files */
|
|
35
|
-
filePatterns: z.array(z.string()),
|
|
36
|
-
/** Agent names that should handle this task */
|
|
37
|
-
relevantAgents: z.array(z.string()),
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
export const ClassificationCacheEntrySchema = z.object({
|
|
41
|
-
/** The classification result */
|
|
42
|
-
classification: TaskClassificationSchema,
|
|
43
|
-
/** When this was classified */
|
|
44
|
-
classifiedAt: z.string(),
|
|
45
|
-
/** How this was classified */
|
|
46
|
-
source: z.enum(['cache', 'history', 'llm', 'heuristic']),
|
|
47
|
-
/** Hash of the task description for cache lookup */
|
|
48
|
-
descriptionHash: z.string(),
|
|
49
|
-
/** Project ID this classification belongs to */
|
|
50
|
-
projectId: z.string(),
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
export const ClassificationCacheSchema = z.object({
|
|
54
|
-
/** Cached classifications keyed by descriptionHash */
|
|
55
|
-
entries: z.record(z.string(), ClassificationCacheEntrySchema),
|
|
56
|
-
/** Confirmed patterns from successful task completions */
|
|
57
|
-
confirmedPatterns: z.array(
|
|
58
|
-
z.object({
|
|
59
|
-
descriptionHash: z.string(),
|
|
60
|
-
classification: TaskClassificationSchema,
|
|
61
|
-
confirmedAt: z.string(),
|
|
62
|
-
taskDescription: z.string(),
|
|
63
|
-
})
|
|
64
|
-
),
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
// =============================================================================
|
|
68
|
-
// Inferred Types
|
|
69
|
-
// =============================================================================
|
|
70
|
-
|
|
71
|
-
export type ClassificationDomain = z.infer<typeof ClassificationDomainSchema>
|
|
72
|
-
export type TaskClassification = z.infer<typeof TaskClassificationSchema>
|
|
73
|
-
export type ClassificationCacheEntry = z.infer<typeof ClassificationCacheEntrySchema>
|
|
74
|
-
export type ClassificationCache = z.infer<typeof ClassificationCacheSchema>
|
|
75
|
-
|
|
76
|
-
// =============================================================================
|
|
77
|
-
// Defaults
|
|
78
|
-
// =============================================================================
|
|
79
|
-
|
|
80
|
-
export const DEFAULT_CLASSIFICATION_CACHE: ClassificationCache = {
|
|
81
|
-
entries: {},
|
|
82
|
-
confirmedPatterns: [],
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export const GENERAL_CLASSIFICATION: TaskClassification = {
|
|
86
|
-
primaryDomain: 'general',
|
|
87
|
-
secondaryDomains: [],
|
|
88
|
-
confidence: 0.3,
|
|
89
|
-
filePatterns: ['**/*.ts', '**/*.js'],
|
|
90
|
-
relevantAgents: [],
|
|
91
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Command Context Schema
|
|
3
|
-
*
|
|
4
|
-
* Zod schemas for command-context.config.json.
|
|
5
|
-
* Controls which context sections (agents, patterns, checklists, modules)
|
|
6
|
-
* get injected into prompts for each command.
|
|
7
|
-
*
|
|
8
|
-
* @see PRJ-298
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { z } from 'zod'
|
|
12
|
-
|
|
13
|
-
export const CommandContextEntrySchema = z.object({
|
|
14
|
-
agents: z.boolean(),
|
|
15
|
-
patterns: z.boolean(),
|
|
16
|
-
checklist: z.boolean(),
|
|
17
|
-
modules: z.array(z.string()),
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
export const CommandContextConfigSchema = z.object({
|
|
21
|
-
version: z.string(),
|
|
22
|
-
description: z.string().optional(),
|
|
23
|
-
commands: z.record(z.string(), CommandContextEntrySchema).refine((commands) => '*' in commands, {
|
|
24
|
-
message: 'Config must include a "*" wildcard entry for unknown commands',
|
|
25
|
-
}),
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
export type CommandContextEntry = z.infer<typeof CommandContextEntrySchema>
|
|
29
|
-
export type CommandContextConfig = z.infer<typeof CommandContextConfigSchema>
|