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/domain/analyzer.ts
DELETED
|
@@ -1,387 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CodebaseAnalyzer - Provides helpers for project analysis
|
|
3
|
-
*
|
|
4
|
-
* 100% AGENTIC - No predetermined patterns or regex detection.
|
|
5
|
-
* Claude reads the codebase and decides what's relevant.
|
|
6
|
-
*
|
|
7
|
-
* This class only provides I/O helpers. All analysis logic
|
|
8
|
-
* is driven by Claude reading templates/analysis/analyze.md
|
|
9
|
-
*
|
|
10
|
-
* @version 0.6.0 - Fully agentic refactor
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { exec as execCallback } from 'node:child_process'
|
|
14
|
-
import fs from 'node:fs/promises'
|
|
15
|
-
import path from 'node:path'
|
|
16
|
-
import { promisify } from 'node:util'
|
|
17
|
-
import { isNotFoundError } from '../types/fs'
|
|
18
|
-
|
|
19
|
-
const exec = promisify(execCallback)
|
|
20
|
-
|
|
21
|
-
interface PackageJson {
|
|
22
|
-
name?: string
|
|
23
|
-
version?: string
|
|
24
|
-
dependencies?: Record<string, string>
|
|
25
|
-
devDependencies?: Record<string, string>
|
|
26
|
-
scripts?: Record<string, string>
|
|
27
|
-
[key: string]: unknown
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
interface ComposerJson {
|
|
31
|
-
name?: string
|
|
32
|
-
require?: Record<string, string>
|
|
33
|
-
'require-dev'?: Record<string, string>
|
|
34
|
-
[key: string]: unknown
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
interface GitStats {
|
|
38
|
-
totalCommits: number
|
|
39
|
-
contributors: number
|
|
40
|
-
age: string
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
interface FileExtensions {
|
|
44
|
-
[extension: string]: number
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
class CodebaseAnalyzer {
|
|
48
|
-
projectPath: string | null = null
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Initialize analyzer for a project
|
|
52
|
-
*/
|
|
53
|
-
init(projectPath: string = process.cwd()): void {
|
|
54
|
-
this.projectPath = projectPath
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Read package.json if it exists
|
|
59
|
-
*/
|
|
60
|
-
async readPackageJson(): Promise<PackageJson | null> {
|
|
61
|
-
try {
|
|
62
|
-
const packagePath = path.join(this.projectPath!, 'package.json')
|
|
63
|
-
const content = await fs.readFile(packagePath, 'utf-8')
|
|
64
|
-
return JSON.parse(content)
|
|
65
|
-
} catch (error) {
|
|
66
|
-
if (isNotFoundError(error) || error instanceof SyntaxError) {
|
|
67
|
-
return null
|
|
68
|
-
}
|
|
69
|
-
throw error
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Read Cargo.toml if it exists
|
|
75
|
-
*/
|
|
76
|
-
async readCargoToml(): Promise<string | null> {
|
|
77
|
-
try {
|
|
78
|
-
const cargoPath = path.join(this.projectPath!, 'Cargo.toml')
|
|
79
|
-
return await fs.readFile(cargoPath, 'utf-8')
|
|
80
|
-
} catch (error) {
|
|
81
|
-
if (isNotFoundError(error)) {
|
|
82
|
-
return null
|
|
83
|
-
}
|
|
84
|
-
throw error
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Read requirements.txt if it exists
|
|
90
|
-
*/
|
|
91
|
-
async readRequirements(): Promise<string | null> {
|
|
92
|
-
try {
|
|
93
|
-
const reqPath = path.join(this.projectPath!, 'requirements.txt')
|
|
94
|
-
return await fs.readFile(reqPath, 'utf-8')
|
|
95
|
-
} catch (error) {
|
|
96
|
-
if (isNotFoundError(error)) {
|
|
97
|
-
return null
|
|
98
|
-
}
|
|
99
|
-
throw error
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Read go.mod if it exists
|
|
105
|
-
*/
|
|
106
|
-
async readGoMod(): Promise<string | null> {
|
|
107
|
-
try {
|
|
108
|
-
const goModPath = path.join(this.projectPath!, 'go.mod')
|
|
109
|
-
return await fs.readFile(goModPath, 'utf-8')
|
|
110
|
-
} catch (error) {
|
|
111
|
-
if (isNotFoundError(error)) {
|
|
112
|
-
return null
|
|
113
|
-
}
|
|
114
|
-
throw error
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Read Gemfile if it exists (Ruby)
|
|
120
|
-
*/
|
|
121
|
-
async readGemfile(): Promise<string | null> {
|
|
122
|
-
try {
|
|
123
|
-
const gemfilePath = path.join(this.projectPath!, 'Gemfile')
|
|
124
|
-
return await fs.readFile(gemfilePath, 'utf-8')
|
|
125
|
-
} catch (error) {
|
|
126
|
-
if (isNotFoundError(error)) {
|
|
127
|
-
return null
|
|
128
|
-
}
|
|
129
|
-
throw error
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Read mix.exs if it exists (Elixir)
|
|
135
|
-
*/
|
|
136
|
-
async readMixExs(): Promise<string | null> {
|
|
137
|
-
try {
|
|
138
|
-
const mixPath = path.join(this.projectPath!, 'mix.exs')
|
|
139
|
-
return await fs.readFile(mixPath, 'utf-8')
|
|
140
|
-
} catch (error) {
|
|
141
|
-
if (isNotFoundError(error)) {
|
|
142
|
-
return null
|
|
143
|
-
}
|
|
144
|
-
throw error
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Read pom.xml if it exists (Java/Maven)
|
|
150
|
-
*/
|
|
151
|
-
async readPomXml(): Promise<string | null> {
|
|
152
|
-
try {
|
|
153
|
-
const pomPath = path.join(this.projectPath!, 'pom.xml')
|
|
154
|
-
return await fs.readFile(pomPath, 'utf-8')
|
|
155
|
-
} catch (error) {
|
|
156
|
-
if (isNotFoundError(error)) {
|
|
157
|
-
return null
|
|
158
|
-
}
|
|
159
|
-
throw error
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Read composer.json if it exists (PHP)
|
|
165
|
-
*/
|
|
166
|
-
async readComposerJson(): Promise<ComposerJson | null> {
|
|
167
|
-
try {
|
|
168
|
-
const composerPath = path.join(this.projectPath!, 'composer.json')
|
|
169
|
-
const content = await fs.readFile(composerPath, 'utf-8')
|
|
170
|
-
return JSON.parse(content)
|
|
171
|
-
} catch (error) {
|
|
172
|
-
if (isNotFoundError(error) || error instanceof SyntaxError) {
|
|
173
|
-
return null
|
|
174
|
-
}
|
|
175
|
-
throw error
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Read pyproject.toml if it exists (Python)
|
|
181
|
-
*/
|
|
182
|
-
async readPyprojectToml(): Promise<string | null> {
|
|
183
|
-
try {
|
|
184
|
-
const pyprojectPath = path.join(this.projectPath!, 'pyproject.toml')
|
|
185
|
-
return await fs.readFile(pyprojectPath, 'utf-8')
|
|
186
|
-
} catch (error) {
|
|
187
|
-
if (isNotFoundError(error)) {
|
|
188
|
-
return null
|
|
189
|
-
}
|
|
190
|
-
throw error
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
/**
|
|
195
|
-
* Get all file extensions in project with counts
|
|
196
|
-
* I/O PURO - Solo cuenta, no interpreta
|
|
197
|
-
*/
|
|
198
|
-
async getFileExtensions(): Promise<FileExtensions> {
|
|
199
|
-
try {
|
|
200
|
-
const { stdout } = await exec(
|
|
201
|
-
'find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',
|
|
202
|
-
{ cwd: this.projectPath! }
|
|
203
|
-
)
|
|
204
|
-
const extensions: FileExtensions = {}
|
|
205
|
-
stdout
|
|
206
|
-
.trim()
|
|
207
|
-
.split('\n')
|
|
208
|
-
.filter(Boolean)
|
|
209
|
-
.forEach((line) => {
|
|
210
|
-
const match = line.trim().match(/^\s*(\d+)\s+(\.\w+)$/)
|
|
211
|
-
if (match) {
|
|
212
|
-
extensions[match[2]] = parseInt(match[1], 10)
|
|
213
|
-
}
|
|
214
|
-
})
|
|
215
|
-
return extensions
|
|
216
|
-
} catch (_error) {
|
|
217
|
-
// exec errors (find command not available, etc.) - return empty
|
|
218
|
-
return {}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* List all config files in project root
|
|
224
|
-
* I/O PURO - Solo lista, no categoriza
|
|
225
|
-
*/
|
|
226
|
-
async listConfigFiles(): Promise<string[]> {
|
|
227
|
-
try {
|
|
228
|
-
const entries = await fs.readdir(this.projectPath!)
|
|
229
|
-
const configPatterns = [
|
|
230
|
-
/^package\.json$/,
|
|
231
|
-
/^Cargo\.toml$/,
|
|
232
|
-
/^go\.mod$/,
|
|
233
|
-
/^requirements\.txt$/,
|
|
234
|
-
/^Gemfile$/,
|
|
235
|
-
/^mix\.exs$/,
|
|
236
|
-
/^pom\.xml$/,
|
|
237
|
-
/^composer\.json$/,
|
|
238
|
-
/^pyproject\.toml$/,
|
|
239
|
-
/^tsconfig.*\.json$/,
|
|
240
|
-
/^\..*rc(\.json|\.js|\.cjs)?$/,
|
|
241
|
-
/^Dockerfile$/,
|
|
242
|
-
/^docker-compose.*\.ya?ml$/,
|
|
243
|
-
/^\.env.*$/,
|
|
244
|
-
]
|
|
245
|
-
return entries.filter((entry) => configPatterns.some((pattern) => pattern.test(entry)))
|
|
246
|
-
} catch (error) {
|
|
247
|
-
if (isNotFoundError(error)) {
|
|
248
|
-
return []
|
|
249
|
-
}
|
|
250
|
-
throw error
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* List all directories in project root
|
|
256
|
-
*/
|
|
257
|
-
async listDirectories(): Promise<string[]> {
|
|
258
|
-
try {
|
|
259
|
-
const entries = await fs.readdir(this.projectPath!, { withFileTypes: true })
|
|
260
|
-
return entries
|
|
261
|
-
.filter((entry) => entry.isDirectory())
|
|
262
|
-
.map((entry) => entry.name)
|
|
263
|
-
.filter((name) => !name.startsWith('.') && name !== 'node_modules')
|
|
264
|
-
} catch (error) {
|
|
265
|
-
if (isNotFoundError(error)) {
|
|
266
|
-
return []
|
|
267
|
-
}
|
|
268
|
-
throw error
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Get git log (last N commits)
|
|
274
|
-
*/
|
|
275
|
-
async getGitLog(limit: number = 50): Promise<string> {
|
|
276
|
-
try {
|
|
277
|
-
const { stdout } = await exec(`git log -n ${limit} --pretty=format:"%h|%an|%ar|%s"`, {
|
|
278
|
-
cwd: this.projectPath!,
|
|
279
|
-
})
|
|
280
|
-
return stdout
|
|
281
|
-
} catch (_error) {
|
|
282
|
-
// Git errors (not a repo, git not installed) - return empty
|
|
283
|
-
return ''
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Get git statistics
|
|
289
|
-
*/
|
|
290
|
-
async getGitStats(): Promise<GitStats> {
|
|
291
|
-
try {
|
|
292
|
-
const { stdout: totalCommits } = await exec('git rev-list --count HEAD', {
|
|
293
|
-
cwd: this.projectPath!,
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
const { stdout: contributors } = await exec('git log --format="%an" | sort -u | wc -l', {
|
|
297
|
-
cwd: this.projectPath!,
|
|
298
|
-
})
|
|
299
|
-
|
|
300
|
-
const { stdout: firstCommit } = await exec(
|
|
301
|
-
'git log --reverse --pretty=format:"%ar" | head -1',
|
|
302
|
-
{
|
|
303
|
-
cwd: this.projectPath!,
|
|
304
|
-
}
|
|
305
|
-
)
|
|
306
|
-
|
|
307
|
-
return {
|
|
308
|
-
totalCommits: parseInt(totalCommits.trim(), 10) || 0,
|
|
309
|
-
contributors: parseInt(contributors.trim(), 10) || 0,
|
|
310
|
-
age: firstCommit.trim() || 'unknown',
|
|
311
|
-
}
|
|
312
|
-
} catch (_error) {
|
|
313
|
-
// Git errors (not a repo, git not installed) - return defaults
|
|
314
|
-
return {
|
|
315
|
-
totalCommits: 0,
|
|
316
|
-
contributors: 0,
|
|
317
|
-
age: 'unknown',
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Count total files (excluding common ignore patterns)
|
|
324
|
-
*/
|
|
325
|
-
async countFiles(): Promise<number> {
|
|
326
|
-
try {
|
|
327
|
-
const { stdout } = await exec(
|
|
328
|
-
'find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',
|
|
329
|
-
{ cwd: this.projectPath! }
|
|
330
|
-
)
|
|
331
|
-
return parseInt(stdout.trim(), 10) || 0
|
|
332
|
-
} catch (_error) {
|
|
333
|
-
// exec errors (find command not available, etc.) - return 0
|
|
334
|
-
return 0
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Check if file exists
|
|
340
|
-
*/
|
|
341
|
-
async fileExists(filename: string): Promise<boolean> {
|
|
342
|
-
try {
|
|
343
|
-
await fs.access(path.join(this.projectPath!, filename))
|
|
344
|
-
return true
|
|
345
|
-
} catch (error) {
|
|
346
|
-
if (isNotFoundError(error)) {
|
|
347
|
-
return false
|
|
348
|
-
}
|
|
349
|
-
throw error
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/**
|
|
354
|
-
* Read any file in the project
|
|
355
|
-
*/
|
|
356
|
-
async readFile(relativePath: string): Promise<string | null> {
|
|
357
|
-
try {
|
|
358
|
-
const fullPath = path.join(this.projectPath!, relativePath)
|
|
359
|
-
return await fs.readFile(fullPath, 'utf-8')
|
|
360
|
-
} catch (error) {
|
|
361
|
-
if (isNotFoundError(error)) {
|
|
362
|
-
return null
|
|
363
|
-
}
|
|
364
|
-
throw error
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* Find files matching a pattern
|
|
370
|
-
*/
|
|
371
|
-
async findFiles(pattern: string): Promise<string[]> {
|
|
372
|
-
try {
|
|
373
|
-
const { stdout } = await exec(
|
|
374
|
-
`find . -type f -name "${pattern}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,
|
|
375
|
-
{ cwd: this.projectPath! }
|
|
376
|
-
)
|
|
377
|
-
return stdout.trim().split('\n').filter(Boolean)
|
|
378
|
-
} catch (_error) {
|
|
379
|
-
// exec errors (find command not available, etc.) - return empty
|
|
380
|
-
return []
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
const analyzer = new CodebaseAnalyzer()
|
|
386
|
-
export default analyzer
|
|
387
|
-
export { CodebaseAnalyzer }
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Architecture Generator - Coordinates architecture generation
|
|
3
|
-
* AGENTIC: Claude generates content via templates/architect/*.md
|
|
4
|
-
* This file only provides structure - real content from Claude
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import fs from 'node:fs/promises'
|
|
8
|
-
import path from 'node:path'
|
|
9
|
-
|
|
10
|
-
interface ArchitectureContext {
|
|
11
|
-
[key: string]: unknown
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface Architecture {
|
|
15
|
-
id: string
|
|
16
|
-
idea: string
|
|
17
|
-
createdAt: string
|
|
18
|
-
phases: Record<string, unknown>
|
|
19
|
-
_agenticNote: string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
class ArchitectureGenerator {
|
|
23
|
-
defaultPhases: string[]
|
|
24
|
-
|
|
25
|
-
constructor() {
|
|
26
|
-
// AGENTIC: Phases determined by Claude via templates/architect/phases.md
|
|
27
|
-
this.defaultPhases = [
|
|
28
|
-
'discovery',
|
|
29
|
-
'user-flows',
|
|
30
|
-
'domain-modeling',
|
|
31
|
-
'api-design',
|
|
32
|
-
'architecture',
|
|
33
|
-
'data-design',
|
|
34
|
-
'tech-stack',
|
|
35
|
-
'roadmap',
|
|
36
|
-
]
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Generate architecture skeleton
|
|
41
|
-
* AGENTIC: Claude fills in content using templates
|
|
42
|
-
*/
|
|
43
|
-
async generateArchitecture(
|
|
44
|
-
idea: string,
|
|
45
|
-
_context: ArchitectureContext = {}
|
|
46
|
-
): Promise<Architecture> {
|
|
47
|
-
// Return skeleton - Claude generates actual content via templates
|
|
48
|
-
return {
|
|
49
|
-
id: `arch-${Date.now()}`,
|
|
50
|
-
idea,
|
|
51
|
-
createdAt: new Date().toISOString(),
|
|
52
|
-
phases: {},
|
|
53
|
-
// AGENTIC: Claude populates phases using templates/architect/*.md
|
|
54
|
-
_agenticNote:
|
|
55
|
-
'Use templates/architect/phases.md to determine needed phases, then templates/architect/discovery.md etc for content',
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Get template path for a phase
|
|
61
|
-
*/
|
|
62
|
-
getPhaseTemplate(phase: string): string | null {
|
|
63
|
-
const templateMap: Record<string, string> = {
|
|
64
|
-
discovery: 'templates/architect/discovery.md',
|
|
65
|
-
'user-flows': 'templates/design/flow.md',
|
|
66
|
-
'domain-modeling': 'templates/design/database.md',
|
|
67
|
-
'api-design': 'templates/design/api.md',
|
|
68
|
-
architecture: 'templates/design/architecture.md',
|
|
69
|
-
'data-design': 'templates/design/database.md',
|
|
70
|
-
'tech-stack': 'templates/design/architecture.md',
|
|
71
|
-
roadmap: 'templates/commands/feature.md',
|
|
72
|
-
}
|
|
73
|
-
return templateMap[phase] || null
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Save architecture to files
|
|
78
|
-
* AGENTIC: Format determined by Claude based on content
|
|
79
|
-
*/
|
|
80
|
-
async saveArchitecture(architecture: Architecture, projectPath: string): Promise<string> {
|
|
81
|
-
const archPath = path.join(projectPath, 'planning', 'architectures', architecture.id)
|
|
82
|
-
await fs.mkdir(archPath, { recursive: true })
|
|
83
|
-
|
|
84
|
-
// Save summary
|
|
85
|
-
await fs.writeFile(path.join(archPath, 'summary.json'), JSON.stringify(architecture, null, 2))
|
|
86
|
-
|
|
87
|
-
// AGENTIC: Claude generates and saves phase files directly
|
|
88
|
-
return archPath
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* SQL type mapping utility
|
|
93
|
-
*/
|
|
94
|
-
sqlType(type: string): string {
|
|
95
|
-
const typeMap: Record<string, string> = {
|
|
96
|
-
uuid: 'UUID',
|
|
97
|
-
string: 'VARCHAR(255)',
|
|
98
|
-
text: 'TEXT',
|
|
99
|
-
int: 'INTEGER',
|
|
100
|
-
timestamp: 'TIMESTAMP',
|
|
101
|
-
boolean: 'BOOLEAN',
|
|
102
|
-
json: 'JSONB',
|
|
103
|
-
}
|
|
104
|
-
return typeMap[type] || 'TEXT'
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export default ArchitectureGenerator
|