prjct-cli 1.22.0 → 1.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +230 -0
- package/bin/prjct +30 -13
- package/dist/bin/prjct-core.mjs +1748 -0
- package/dist/bin/prjct.mjs +17 -36672
- package/dist/cli/linear.mjs +14 -0
- package/dist/daemon/entry.mjs +1429 -0
- package/dist/templates.json +1 -0
- package/package.json +4 -5
- package/bin/prjct.ts +0 -342
- package/core/__tests__/agentic/analysis-injection.test.ts +0 -377
- package/core/__tests__/agentic/cache-eviction.test.ts +0 -294
- package/core/__tests__/agentic/command-context.test.ts +0 -281
- package/core/__tests__/agentic/command-executor.test.ts +0 -659
- package/core/__tests__/agentic/domain-classifier.test.ts +0 -330
- package/core/__tests__/agentic/injection-validator.test.ts +0 -255
- package/core/__tests__/agentic/memory-system.test.ts +0 -281
- package/core/__tests__/agentic/plan-mode.test.ts +0 -386
- package/core/__tests__/agentic/prompt-assembly.test.ts +0 -298
- package/core/__tests__/agentic/prompt-builder.test.ts +0 -243
- package/core/__tests__/agentic/response-validator.test.ts +0 -263
- package/core/__tests__/agentic/semantic-matching.test.ts +0 -131
- package/core/__tests__/agentic/smart-context.test.ts +0 -372
- package/core/__tests__/agentic/tech-normalizer.test.ts +0 -136
- package/core/__tests__/agentic/token-budget.test.ts +0 -294
- package/core/__tests__/ai-tools/formatters.test.ts +0 -476
- package/core/__tests__/domain/bm25.test.ts +0 -225
- package/core/__tests__/domain/change-propagator.test.ts +0 -100
- package/core/__tests__/domain/fibonacci.test.ts +0 -113
- package/core/__tests__/domain/file-hasher.test.ts +0 -146
- package/core/__tests__/domain/file-ranker.test.ts +0 -169
- package/core/__tests__/domain/git-cochange.test.ts +0 -121
- package/core/__tests__/domain/import-graph.test.ts +0 -156
- package/core/__tests__/domain/velocity.test.ts +0 -623
- package/core/__tests__/infrastructure/performance-tracker.test.ts +0 -328
- package/core/__tests__/schemas/model.test.ts +0 -272
- package/core/__tests__/services/dependency-validator.test.ts +0 -175
- package/core/__tests__/services/hierarchical-agent-resolver.test.ts +0 -359
- package/core/__tests__/services/nested-context-resolver.test.ts +0 -443
- package/core/__tests__/services/project-index.test.ts +0 -355
- package/core/__tests__/services/staleness-checker.test.ts +0 -204
- package/core/__tests__/storage/analysis-storage.test.ts +0 -641
- package/core/__tests__/storage/archive-storage.test.ts +0 -455
- package/core/__tests__/storage/safe-reader.test.ts +0 -262
- package/core/__tests__/storage/sqlite-migration.test.ts +0 -1016
- package/core/__tests__/storage/state-storage-feedback.test.ts +0 -463
- package/core/__tests__/storage/state-storage-history.test.ts +0 -469
- package/core/__tests__/storage/storage-manager.test.ts +0 -383
- package/core/__tests__/storage/subtask-handoff.test.ts +0 -237
- package/core/__tests__/types/fs.test.ts +0 -125
- package/core/__tests__/utils/date-helper.test.ts +0 -449
- package/core/__tests__/utils/output.test.ts +0 -278
- package/core/__tests__/utils/preserve-sections.test.ts +0 -216
- package/core/__tests__/utils/project-commands.test.ts +0 -71
- package/core/__tests__/utils/retry.test.ts +0 -381
- package/core/__tests__/workflow/state-machine.test.ts +0 -216
- package/core/agentic/agent-router.ts +0 -150
- package/core/agentic/anti-hallucination.ts +0 -141
- package/core/agentic/chain-of-thought.ts +0 -234
- package/core/agentic/command-classifier.ts +0 -141
- package/core/agentic/command-context.ts +0 -168
- package/core/agentic/command-executor.ts +0 -471
- package/core/agentic/context-builder.ts +0 -285
- package/core/agentic/domain-classifier.ts +0 -525
- package/core/agentic/environment-block.ts +0 -102
- package/core/agentic/ground-truth.ts +0 -706
- package/core/agentic/index.ts +0 -193
- package/core/agentic/injection-validator.ts +0 -208
- package/core/agentic/loop-detector.ts +0 -451
- package/core/agentic/memory-system.ts +0 -1547
- package/core/agentic/orchestrator-executor.ts +0 -579
- package/core/agentic/plan-mode.ts +0 -525
- package/core/agentic/prompt-builder.ts +0 -1069
- package/core/agentic/response-validator.ts +0 -98
- package/core/agentic/services.ts +0 -167
- package/core/agentic/skill-loader.ts +0 -106
- package/core/agentic/smart-context.ts +0 -393
- package/core/agentic/tech-normalizer.ts +0 -167
- package/core/agentic/template-executor.ts +0 -272
- package/core/agentic/template-loader.ts +0 -109
- package/core/agentic/token-budget.ts +0 -226
- package/core/agentic/tool-registry.ts +0 -146
- package/core/agents/index.ts +0 -28
- package/core/agents/performance.ts +0 -429
- package/core/ai-tools/formatters.ts +0 -341
- package/core/ai-tools/generator.ts +0 -144
- package/core/ai-tools/index.ts +0 -15
- package/core/ai-tools/registry.ts +0 -201
- package/core/bus/bus.ts +0 -314
- package/core/bus/index.ts +0 -8
- package/core/cli/linear.ts +0 -500
- package/core/cli/lint-meta-commentary.ts +0 -177
- package/core/cli/start.ts +0 -386
- package/core/commands/analysis.ts +0 -1274
- package/core/commands/analytics.ts +0 -342
- package/core/commands/base.ts +0 -118
- package/core/commands/cleanup.ts +0 -157
- package/core/commands/command-data.ts +0 -463
- package/core/commands/commands.ts +0 -306
- package/core/commands/context.ts +0 -238
- package/core/commands/design.ts +0 -77
- package/core/commands/index.ts +0 -19
- package/core/commands/maintenance.ts +0 -77
- package/core/commands/performance.ts +0 -114
- package/core/commands/planning.ts +0 -662
- package/core/commands/register.ts +0 -127
- package/core/commands/registry.ts +0 -444
- package/core/commands/setup.ts +0 -280
- package/core/commands/shipping.ts +0 -267
- package/core/commands/snapshots.ts +0 -297
- package/core/commands/uninstall.ts +0 -542
- package/core/commands/velocity.ts +0 -149
- package/core/commands/workflow.ts +0 -505
- package/core/config/command-context.config.json +0 -66
- package/core/constants/index.ts +0 -379
- package/core/context/generator.ts +0 -368
- package/core/context-tools/files-tool.ts +0 -577
- package/core/context-tools/imports-tool.ts +0 -400
- package/core/context-tools/index.ts +0 -434
- package/core/context-tools/recent-tool.ts +0 -301
- package/core/context-tools/signatures-tool.ts +0 -495
- package/core/context-tools/summary-tool.ts +0 -301
- package/core/context-tools/token-counter.ts +0 -273
- package/core/context-tools/types.ts +0 -253
- package/core/domain/agent-generator.ts +0 -186
- package/core/domain/agent-loader.ts +0 -419
- package/core/domain/analyzer.ts +0 -387
- package/core/domain/architecture-generator.ts +0 -108
- package/core/domain/bm25.ts +0 -525
- package/core/domain/change-propagator.ts +0 -162
- package/core/domain/context-estimator.ts +0 -175
- package/core/domain/fibonacci.ts +0 -128
- package/core/domain/file-hasher.ts +0 -296
- package/core/domain/file-ranker.ts +0 -151
- package/core/domain/git-cochange.ts +0 -250
- package/core/domain/import-graph.ts +0 -315
- package/core/domain/snapshot-manager.ts +0 -415
- package/core/domain/task-stack.ts +0 -578
- package/core/domain/velocity.ts +0 -470
- package/core/errors.ts +0 -335
- package/core/events/events.ts +0 -85
- package/core/events/index.ts +0 -8
- package/core/index.ts +0 -481
- package/core/infrastructure/agent-detector.ts +0 -135
- package/core/infrastructure/ai-provider.ts +0 -578
- package/core/infrastructure/author-detector.ts +0 -133
- package/core/infrastructure/capability-installer.ts +0 -76
- package/core/infrastructure/claude-agent.ts +0 -297
- package/core/infrastructure/command-installer.ts +0 -752
- package/core/infrastructure/config-manager.ts +0 -364
- package/core/infrastructure/editors-config.ts +0 -172
- package/core/infrastructure/path-manager.ts +0 -571
- package/core/infrastructure/performance-tracker.ts +0 -326
- package/core/infrastructure/permission-manager.ts +0 -289
- package/core/infrastructure/setup.ts +0 -1061
- package/core/infrastructure/update-checker.ts +0 -246
- package/core/integrations/issue-tracker/enricher.ts +0 -271
- package/core/integrations/issue-tracker/index.ts +0 -8
- package/core/integrations/issue-tracker/manager.ts +0 -286
- package/core/integrations/issue-tracker/types.ts +0 -310
- package/core/integrations/jira/cache.ts +0 -57
- package/core/integrations/jira/client.ts +0 -688
- package/core/integrations/jira/index.ts +0 -23
- package/core/integrations/jira/service.ts +0 -244
- package/core/integrations/linear/cache.ts +0 -68
- package/core/integrations/linear/client.ts +0 -436
- package/core/integrations/linear/index.ts +0 -20
- package/core/integrations/linear/service.ts +0 -260
- package/core/integrations/linear/sync.ts +0 -314
- package/core/outcomes/analyzer.ts +0 -286
- package/core/outcomes/index.ts +0 -34
- package/core/outcomes/recorder.ts +0 -195
- package/core/plugin/builtin/webhook.ts +0 -148
- package/core/plugin/hooks.ts +0 -315
- package/core/plugin/index.ts +0 -50
- package/core/plugin/loader.ts +0 -354
- package/core/plugin/registry.ts +0 -326
- package/core/schemas/agents.ts +0 -27
- package/core/schemas/analysis.ts +0 -530
- package/core/schemas/classification.ts +0 -91
- package/core/schemas/command-context.ts +0 -29
- package/core/schemas/enriched-task.ts +0 -291
- package/core/schemas/ideas.ts +0 -114
- package/core/schemas/index.ts +0 -53
- package/core/schemas/issues.ts +0 -159
- package/core/schemas/llm-output.ts +0 -170
- package/core/schemas/metrics.ts +0 -143
- package/core/schemas/model.ts +0 -153
- package/core/schemas/outcomes.ts +0 -487
- package/core/schemas/performance.ts +0 -128
- package/core/schemas/permissions.ts +0 -180
- package/core/schemas/prd.ts +0 -450
- package/core/schemas/project.ts +0 -57
- package/core/schemas/roadmap.ts +0 -322
- package/core/schemas/schemas.ts +0 -38
- package/core/schemas/shipped.ts +0 -109
- package/core/schemas/state.ts +0 -284
- package/core/schemas/velocity.ts +0 -103
- package/core/server/index.ts +0 -21
- package/core/server/routes-extended.ts +0 -566
- package/core/server/routes.ts +0 -176
- package/core/server/server.ts +0 -149
- package/core/server/sse.ts +0 -192
- package/core/services/agent-generator.ts +0 -385
- package/core/services/agent-service.ts +0 -168
- package/core/services/breakdown-service.ts +0 -124
- package/core/services/context-generator.ts +0 -445
- package/core/services/context-selector.ts +0 -429
- package/core/services/dependency-validator.ts +0 -318
- package/core/services/diff-generator.ts +0 -313
- package/core/services/doctor-service.ts +0 -423
- package/core/services/file-categorizer.ts +0 -448
- package/core/services/file-scorer.ts +0 -270
- package/core/services/git-analyzer.ts +0 -293
- package/core/services/hierarchical-agent-resolver.ts +0 -236
- package/core/services/hooks-service.ts +0 -685
- package/core/services/index.ts +0 -46
- package/core/services/local-state-generator.ts +0 -158
- package/core/services/memory-service.ts +0 -181
- package/core/services/nested-context-resolver.ts +0 -842
- package/core/services/project-index.ts +0 -911
- package/core/services/project-service.ts +0 -155
- package/core/services/session-tracker.ts +0 -287
- package/core/services/skill-installer.ts +0 -447
- package/core/services/skill-lock.ts +0 -132
- package/core/services/skill-service.ts +0 -306
- package/core/services/stack-detector.ts +0 -229
- package/core/services/staleness-checker.ts +0 -327
- package/core/services/sync-service.ts +0 -1515
- package/core/services/sync-verifier.ts +0 -253
- package/core/services/watch-service.ts +0 -312
- package/core/session/compaction.ts +0 -248
- package/core/session/index.ts +0 -35
- package/core/session/log-migration.ts +0 -88
- package/core/session/metrics.ts +0 -323
- package/core/session/session-log-manager.ts +0 -307
- package/core/session/task-session-manager.ts +0 -404
- package/core/session/utils.ts +0 -51
- package/core/storage/analysis-storage.ts +0 -373
- package/core/storage/archive-storage.ts +0 -205
- package/core/storage/database.ts +0 -575
- package/core/storage/ideas-storage.ts +0 -298
- package/core/storage/index-storage.ts +0 -523
- package/core/storage/index.ts +0 -79
- package/core/storage/metrics-storage.ts +0 -321
- package/core/storage/migrate-json.ts +0 -720
- package/core/storage/queue-storage.ts +0 -336
- package/core/storage/safe-reader.ts +0 -105
- package/core/storage/shipped-storage.ts +0 -253
- package/core/storage/state-storage.ts +0 -1035
- package/core/storage/storage-manager.ts +0 -205
- package/core/storage/storage.ts +0 -177
- package/core/storage/velocity-storage.ts +0 -149
- package/core/sync/auth-config.ts +0 -138
- package/core/sync/index.ts +0 -31
- package/core/sync/oauth-handler.ts +0 -143
- package/core/sync/sync-client.ts +0 -251
- package/core/sync/sync-manager.ts +0 -327
- package/core/tsconfig.json +0 -22
- package/core/types/agentic.ts +0 -760
- package/core/types/agents.ts +0 -150
- package/core/types/bus.ts +0 -193
- package/core/types/citations.ts +0 -22
- package/core/types/commands.ts +0 -399
- package/core/types/config.ts +0 -92
- package/core/types/core.ts +0 -96
- package/core/types/diff.ts +0 -41
- package/core/types/domain.ts +0 -71
- package/core/types/errors.ts +0 -111
- package/core/types/events.ts +0 -42
- package/core/types/fs.ts +0 -72
- package/core/types/index.ts +0 -510
- package/core/types/infrastructure.ts +0 -210
- package/core/types/integrations.ts +0 -31
- package/core/types/jira.ts +0 -51
- package/core/types/logger.ts +0 -17
- package/core/types/memory.ts +0 -313
- package/core/types/outcomes.ts +0 -190
- package/core/types/output.ts +0 -47
- package/core/types/plugin.ts +0 -25
- package/core/types/project-sync.ts +0 -129
- package/core/types/provider.ts +0 -163
- package/core/types/server.ts +0 -71
- package/core/types/services.ts +0 -84
- package/core/types/session.ts +0 -135
- package/core/types/stack.ts +0 -19
- package/core/types/storage.ts +0 -318
- package/core/types/sync-verifier.ts +0 -33
- package/core/types/sync.ts +0 -121
- package/core/types/task.ts +0 -72
- package/core/types/template.ts +0 -24
- package/core/types/utils.ts +0 -92
- package/core/types/workflow.ts +0 -23
- package/core/utils/agent-stream.ts +0 -140
- package/core/utils/animations.ts +0 -251
- package/core/utils/branding.ts +0 -88
- package/core/utils/cache.ts +0 -187
- package/core/utils/citations.ts +0 -39
- package/core/utils/collection-filters.ts +0 -209
- package/core/utils/date-helper.ts +0 -176
- package/core/utils/error-messages.ts +0 -38
- package/core/utils/file-helper.ts +0 -277
- package/core/utils/fs-helpers.ts +0 -14
- package/core/utils/help.ts +0 -314
- package/core/utils/jsonl-helper.ts +0 -290
- package/core/utils/keychain.ts +0 -127
- package/core/utils/logger.ts +0 -77
- package/core/utils/markdown-builder.ts +0 -280
- package/core/utils/next-steps.ts +0 -95
- package/core/utils/output.ts +0 -403
- package/core/utils/preserve-sections.ts +0 -218
- package/core/utils/project-commands.ts +0 -126
- package/core/utils/project-credentials.ts +0 -143
- package/core/utils/provider-cache.ts +0 -49
- package/core/utils/retry.ts +0 -318
- package/core/utils/runtime.ts +0 -108
- package/core/utils/session-helper.ts +0 -278
- package/core/utils/subtask-table.ts +0 -227
- package/core/utils/version.ts +0 -128
- package/core/wizard/index.ts +0 -13
- package/core/wizard/onboarding.ts +0 -633
- package/core/workflow/index.ts +0 -7
- package/core/workflow/state-machine.ts +0 -198
- package/core/workflow/workflow-preferences.ts +0 -294
- package/dist/core/infrastructure/command-installer.js +0 -1141
- package/dist/core/infrastructure/editors-config.js +0 -177
- package/dist/core/infrastructure/setup.js +0 -2244
- package/dist/core/utils/version.js +0 -141
- package/templates/agentic/agent-routing.md +0 -45
- package/templates/agentic/agents/uxui.md +0 -63
- package/templates/agentic/checklist-routing.md +0 -98
- package/templates/agentic/orchestrator.md +0 -68
- package/templates/agentic/task-fragmentation.md +0 -89
- package/templates/agents/AGENTS.md +0 -68
- package/templates/analysis/analyze.md +0 -84
- package/templates/analysis/patterns.md +0 -60
- package/templates/antigravity/SKILL.md +0 -39
- package/templates/architect/discovery.md +0 -67
- package/templates/architect/phases.md +0 -59
- package/templates/checklists/architecture.md +0 -28
- package/templates/checklists/code-quality.md +0 -28
- package/templates/checklists/data.md +0 -33
- package/templates/checklists/documentation.md +0 -33
- package/templates/checklists/infrastructure.md +0 -33
- package/templates/checklists/performance.md +0 -33
- package/templates/checklists/security.md +0 -33
- package/templates/checklists/testing.md +0 -33
- package/templates/checklists/ux-ui.md +0 -37
- package/templates/commands/analyze.md +0 -56
- package/templates/commands/auth.md +0 -234
- package/templates/commands/bug.md +0 -163
- package/templates/commands/cleanup.md +0 -19
- package/templates/commands/dash.md +0 -99
- package/templates/commands/design.md +0 -15
- package/templates/commands/done.md +0 -291
- package/templates/commands/enrich.md +0 -174
- package/templates/commands/git.md +0 -295
- package/templates/commands/history.md +0 -389
- package/templates/commands/idea.md +0 -88
- package/templates/commands/impact.md +0 -864
- package/templates/commands/init.md +0 -54
- package/templates/commands/jira.md +0 -278
- package/templates/commands/linear.md +0 -288
- package/templates/commands/merge.md +0 -206
- package/templates/commands/next.md +0 -80
- package/templates/commands/p.md +0 -67
- package/templates/commands/p.toml +0 -37
- package/templates/commands/pause.md +0 -136
- package/templates/commands/plan.md +0 -696
- package/templates/commands/prd.md +0 -356
- package/templates/commands/resume.md +0 -171
- package/templates/commands/review.md +0 -276
- package/templates/commands/serve.md +0 -118
- package/templates/commands/setup.md +0 -91
- package/templates/commands/ship.md +0 -475
- package/templates/commands/skill.md +0 -259
- package/templates/commands/spec.md +0 -218
- package/templates/commands/status.md +0 -207
- package/templates/commands/sync.md +0 -104
- package/templates/commands/task.md +0 -312
- package/templates/commands/test.md +0 -93
- package/templates/commands/update.md +0 -63
- package/templates/commands/verify.md +0 -204
- package/templates/commands/workflow.md +0 -150
- package/templates/config/skill-mappings.json +0 -82
- package/templates/context/dashboard.md +0 -256
- package/templates/context/roadmap.md +0 -221
- package/templates/cursor/commands/bug.md +0 -8
- package/templates/cursor/commands/done.md +0 -4
- package/templates/cursor/commands/pause.md +0 -6
- package/templates/cursor/commands/resume.md +0 -4
- package/templates/cursor/commands/ship.md +0 -8
- package/templates/cursor/commands/sync.md +0 -4
- package/templates/cursor/commands/task.md +0 -8
- package/templates/cursor/p.md +0 -29
- package/templates/cursor/router.mdc +0 -28
- package/templates/design/api.md +0 -95
- package/templates/design/architecture.md +0 -77
- package/templates/design/component.md +0 -89
- package/templates/design/database.md +0 -78
- package/templates/design/flow.md +0 -94
- package/templates/global/ANTIGRAVITY.md +0 -254
- package/templates/global/CLAUDE.md +0 -497
- package/templates/global/CURSOR.mdc +0 -266
- package/templates/global/GEMINI.md +0 -293
- package/templates/global/STORAGE-SPEC.md +0 -391
- package/templates/global/WINDSURF.md +0 -266
- package/templates/global/modules/CLAUDE-commands.md +0 -70
- package/templates/global/modules/CLAUDE-core.md +0 -105
- package/templates/global/modules/CLAUDE-git.md +0 -50
- package/templates/global/modules/CLAUDE-intelligence.md +0 -92
- package/templates/global/modules/CLAUDE-storage.md +0 -50
- package/templates/global/modules/module-config.json +0 -36
- package/templates/mcp-config.json +0 -19
- package/templates/permissions/default.jsonc +0 -60
- package/templates/permissions/permissive.jsonc +0 -49
- package/templates/permissions/strict.jsonc +0 -58
- package/templates/planning-methodology.md +0 -195
- package/templates/skills/code-review.md +0 -47
- package/templates/skills/debug.md +0 -61
- package/templates/skills/refactor.md +0 -47
- package/templates/subagents/agent-base.md +0 -20
- package/templates/subagents/domain/backend.md +0 -109
- package/templates/subagents/domain/database.md +0 -121
- package/templates/subagents/domain/devops.md +0 -152
- package/templates/subagents/domain/frontend.md +0 -103
- package/templates/subagents/domain/testing.md +0 -169
- package/templates/subagents/pm-expert.md +0 -366
- package/templates/subagents/workflow/chief-architect.md +0 -657
- package/templates/subagents/workflow/prjct-planner.md +0 -159
- package/templates/subagents/workflow/prjct-shipper.md +0 -188
- package/templates/subagents/workflow/prjct-workflow.md +0 -98
- package/templates/tools/bash.txt +0 -22
- package/templates/tools/edit.txt +0 -18
- package/templates/tools/glob.txt +0 -19
- package/templates/tools/grep.txt +0 -21
- package/templates/tools/read.txt +0 -14
- package/templates/tools/task.txt +0 -20
- package/templates/tools/webfetch.txt +0 -16
- package/templates/tools/websearch.txt +0 -18
- package/templates/tools/write.txt +0 -17
- package/templates/windsurf/router.md +0 -28
- package/templates/windsurf/workflows/bug.md +0 -8
- package/templates/windsurf/workflows/done.md +0 -4
- package/templates/windsurf/workflows/pause.md +0 -4
- package/templates/windsurf/workflows/resume.md +0 -4
- package/templates/windsurf/workflows/ship.md +0 -8
- package/templates/windsurf/workflows/sync.md +0 -4
- package/templates/windsurf/workflows/task.md +0 -8
|
@@ -1,864 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
allowed-tools: [Read, Write, Bash, Glob, Grep, AskUserQuestion, Task]
|
|
3
|
-
description: 'Track feature outcomes and capture learnings'
|
|
4
|
-
timestamp-rule: 'GetTimestamp() for all timestamps'
|
|
5
|
-
architecture: 'Write-Through (JSON → MD → Events)'
|
|
6
|
-
storage-layer: true
|
|
7
|
-
source-of-truth: 'storage/outcomes.json'
|
|
8
|
-
claude-context: 'context/impact.md'
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# p. impact - Track Feature Outcomes
|
|
12
|
-
|
|
13
|
-
**Purpose**: Capture outcomes, compare actual vs estimated effort, and record learnings after shipping a feature.
|
|
14
|
-
|
|
15
|
-
## Context Variables
|
|
16
|
-
|
|
17
|
-
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
18
|
-
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
19
|
-
- `{featureId}`: Feature ID from arguments or most recent ship
|
|
20
|
-
- `{timestamp}`: Current timestamp (GetTimestamp())
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Usage
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
p. impact # Review most recently shipped feature
|
|
28
|
-
p. impact <feature-id> # Review specific feature
|
|
29
|
-
p. impact list # List features pending review
|
|
30
|
-
p. impact summary # Show aggregate metrics
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## Step 1: Validate Project
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
READ: .prjct/prjct.config.json
|
|
39
|
-
EXTRACT: projectId
|
|
40
|
-
|
|
41
|
-
IF file not found:
|
|
42
|
-
OUTPUT: "No prjct project. Run `p. init` first."
|
|
43
|
-
STOP
|
|
44
|
-
|
|
45
|
-
SET: globalPath = ~/.prjct-cli/projects/{projectId}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
---
|
|
49
|
-
|
|
50
|
-
## Step 2: Load Data
|
|
51
|
-
|
|
52
|
-
```
|
|
53
|
-
READ: {globalPath}/storage/shipped.json
|
|
54
|
-
READ: {globalPath}/storage/roadmap.json
|
|
55
|
-
READ: {globalPath}/storage/prds.json (if exists)
|
|
56
|
-
READ: {globalPath}/storage/outcomes.json (if exists)
|
|
57
|
-
|
|
58
|
-
IF outcomes.json does NOT exist:
|
|
59
|
-
CREATE default:
|
|
60
|
-
{
|
|
61
|
-
"outcomes": [],
|
|
62
|
-
"taskOutcomes": [],
|
|
63
|
-
"lastUpdated": "{timestamp}"
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
## Step 3: Route by Subcommand
|
|
70
|
-
|
|
71
|
-
### 3.1 Subcommand: list
|
|
72
|
-
|
|
73
|
-
Show features pending impact review.
|
|
74
|
-
|
|
75
|
-
```
|
|
76
|
-
SET: shippedFeatures = shipped.filter(s => s.version)
|
|
77
|
-
SET: reviewedFeatureIds = outcomes.outcomes.map(o => o.featureId)
|
|
78
|
-
SET: pendingReview = shippedFeatures.filter(s =>
|
|
79
|
-
!reviewedFeatureIds.includes(s.taskId || s.id)
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
IF pendingReview.length == 0:
|
|
83
|
-
OUTPUT: "All shipped features have been reviewed."
|
|
84
|
-
STOP
|
|
85
|
-
|
|
86
|
-
OUTPUT:
|
|
87
|
-
"""
|
|
88
|
-
## Features Pending Impact Review
|
|
89
|
-
|
|
90
|
-
| # | Feature | Version | Shipped | PRD |
|
|
91
|
-
|---|---------|---------|---------|-----|
|
|
92
|
-
{FOR EACH item in pendingReview:}
|
|
93
|
-
| {index + 1} | {item.name} | {item.version} | {item.shippedAt} | {item.prdId || 'N/A'} |
|
|
94
|
-
{END FOR}
|
|
95
|
-
|
|
96
|
-
Run `p. impact <feature-id>` to review a specific feature.
|
|
97
|
-
Or `p. impact` to review the most recent.
|
|
98
|
-
"""
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
### 3.2 Subcommand: summary
|
|
104
|
-
|
|
105
|
-
Show aggregate metrics from all outcomes.
|
|
106
|
-
|
|
107
|
-
```
|
|
108
|
-
IF outcomes.outcomes.length == 0:
|
|
109
|
-
OUTPUT: "No outcomes recorded yet. Ship features and run `p. impact` to track them."
|
|
110
|
-
STOP
|
|
111
|
-
|
|
112
|
-
# Calculate aggregates
|
|
113
|
-
SET: aggregates = aggregateOutcomes(outcomes.outcomes)
|
|
114
|
-
|
|
115
|
-
OUTPUT:
|
|
116
|
-
"""
|
|
117
|
-
## Impact Summary
|
|
118
|
-
|
|
119
|
-
### Overall Metrics
|
|
120
|
-
|
|
121
|
-
| Metric | Value |
|
|
122
|
-
|--------|-------|
|
|
123
|
-
| Features Reviewed | {aggregates.totalFeatures} |
|
|
124
|
-
| Estimation Accuracy | {aggregates.averageEstimationAccuracy}% |
|
|
125
|
-
| Success Rate | {aggregates.averageSuccessRate}% |
|
|
126
|
-
| Average ROI | {aggregates.averageROI} |
|
|
127
|
-
|
|
128
|
-
### Success Distribution
|
|
129
|
-
|
|
130
|
-
| Level | Count | Percentage |
|
|
131
|
-
|-------|-------|------------|
|
|
132
|
-
| Exceeded | {aggregates.bySuccessLevel.exceeded} | {pct_exceeded}% |
|
|
133
|
-
| Met | {aggregates.bySuccessLevel.met} | {pct_met}% |
|
|
134
|
-
| Partial | {aggregates.bySuccessLevel.partial} | {pct_partial}% |
|
|
135
|
-
| Failed | {aggregates.bySuccessLevel.failed} | {pct_failed}% |
|
|
136
|
-
|
|
137
|
-
### Common Variance Reasons
|
|
138
|
-
|
|
139
|
-
{FOR EACH pattern in aggregates.variancePatterns:}
|
|
140
|
-
- **{pattern.reason}**: {pattern.count} occurrences, avg {pattern.averageVariance}% variance
|
|
141
|
-
{END FOR}
|
|
142
|
-
|
|
143
|
-
### Top Learnings
|
|
144
|
-
|
|
145
|
-
{FOR EACH learning in aggregates.topLearnings.slice(0, 5):}
|
|
146
|
-
- {learning.insight} ({learning.frequency}x)
|
|
147
|
-
{END FOR}
|
|
148
|
-
|
|
149
|
-
---
|
|
150
|
-
|
|
151
|
-
Run `p. impact` to add more reviews.
|
|
152
|
-
"""
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
### 3.3 Default / Specific Feature
|
|
158
|
-
|
|
159
|
-
Review a specific feature or the most recently shipped.
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
IF featureId provided:
|
|
163
|
-
SET: targetFeature = shipped.find(s => s.taskId == featureId || s.id == featureId)
|
|
164
|
-
ELSE:
|
|
165
|
-
# Get most recently shipped feature without outcome
|
|
166
|
-
SET: reviewedIds = outcomes.outcomes.map(o => o.featureId)
|
|
167
|
-
SET: unreviewedShips = shipped.filter(s => !reviewedIds.includes(s.taskId || s.id))
|
|
168
|
-
|
|
169
|
-
IF unreviewedShips.length == 0:
|
|
170
|
-
OUTPUT: "All shipped features have been reviewed."
|
|
171
|
-
OUTPUT: "Run `p. impact list` to see reviewed features."
|
|
172
|
-
STOP
|
|
173
|
-
|
|
174
|
-
SET: targetFeature = unreviewedShips[0] # Most recent
|
|
175
|
-
|
|
176
|
-
IF NOT targetFeature:
|
|
177
|
-
OUTPUT: "Feature not found: {featureId}"
|
|
178
|
-
STOP
|
|
179
|
-
|
|
180
|
-
# Check if already reviewed
|
|
181
|
-
SET: existingOutcome = outcomes.outcomes.find(o => o.featureId == targetFeature.taskId)
|
|
182
|
-
IF existingOutcome:
|
|
183
|
-
OUTPUT: "Feature already reviewed on {existingOutcome.reviewedAt}"
|
|
184
|
-
|
|
185
|
-
USE AskUserQuestion:
|
|
186
|
-
question: "What would you like to do?"
|
|
187
|
-
options:
|
|
188
|
-
- label: "View existing review"
|
|
189
|
-
description: "Show the recorded outcome"
|
|
190
|
-
- label: "Update review"
|
|
191
|
-
description: "Modify the existing outcome"
|
|
192
|
-
- label: "Cancel"
|
|
193
|
-
description: "Exit"
|
|
194
|
-
|
|
195
|
-
IF "View existing review":
|
|
196
|
-
→ Show existing outcome
|
|
197
|
-
STOP
|
|
198
|
-
IF "Cancel":
|
|
199
|
-
STOP
|
|
200
|
-
# Else continue to update
|
|
201
|
-
|
|
202
|
-
# Load related data
|
|
203
|
-
SET: roadmapFeature = roadmap.features.find(f => f.id == targetFeature.taskId)
|
|
204
|
-
SET: prd = roadmapFeature?.prdId
|
|
205
|
-
? prds.prds.find(p => p.id == roadmapFeature.prdId)
|
|
206
|
-
: null
|
|
207
|
-
SET: isLegacy = roadmapFeature?.legacy || !prd
|
|
208
|
-
|
|
209
|
-
OUTPUT:
|
|
210
|
-
"""
|
|
211
|
-
## Impact Review: {targetFeature.name}
|
|
212
|
-
|
|
213
|
-
**Version:** {targetFeature.version}
|
|
214
|
-
**Shipped:** {targetFeature.shippedAt}
|
|
215
|
-
**Branch:** {targetFeature.branch}
|
|
216
|
-
**PRD:** {prd ? prd.title : 'None (legacy feature)'}
|
|
217
|
-
"""
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Step 4: Collect Effort Data
|
|
223
|
-
|
|
224
|
-
```
|
|
225
|
-
OUTPUT: "### Step 1: Effort Tracking"
|
|
226
|
-
|
|
227
|
-
# Get estimated hours
|
|
228
|
-
IF prd:
|
|
229
|
-
SET: estimatedHours = prd.estimation.estimatedHours
|
|
230
|
-
SET: estimateConfidence = prd.estimation.confidence
|
|
231
|
-
OUTPUT: "PRD Estimate: {estimatedHours}h ({estimateConfidence} confidence)"
|
|
232
|
-
ELSE IF roadmapFeature?.effortTracking?.estimated:
|
|
233
|
-
SET: estimatedHours = roadmapFeature.effortTracking.estimated.hours
|
|
234
|
-
OUTPUT: "Roadmap Estimate: {estimatedHours}h"
|
|
235
|
-
ELSE:
|
|
236
|
-
USE AskUserQuestion:
|
|
237
|
-
question: "What was the original estimate for this feature?"
|
|
238
|
-
options:
|
|
239
|
-
- label: "< 4 hours"
|
|
240
|
-
description: "XS task"
|
|
241
|
-
- label: "4-8 hours"
|
|
242
|
-
description: "S task"
|
|
243
|
-
- label: "8-24 hours"
|
|
244
|
-
description: "M task"
|
|
245
|
-
- label: "24-40 hours"
|
|
246
|
-
description: "L task"
|
|
247
|
-
- label: "40+ hours"
|
|
248
|
-
description: "XL task"
|
|
249
|
-
|
|
250
|
-
SET: estimatedHours = midpoint of selected range
|
|
251
|
-
|
|
252
|
-
# Get actual hours
|
|
253
|
-
USE AskUserQuestion:
|
|
254
|
-
question: "How many hours did this feature actually take?"
|
|
255
|
-
options:
|
|
256
|
-
- label: "About as estimated ({estimatedHours}h)"
|
|
257
|
-
description: "Within 10% of estimate"
|
|
258
|
-
- label: "Less than estimated"
|
|
259
|
-
description: "Took less time"
|
|
260
|
-
- label: "More than estimated"
|
|
261
|
-
description: "Took more time"
|
|
262
|
-
- label: "Enter specific hours"
|
|
263
|
-
description: "Provide exact number"
|
|
264
|
-
|
|
265
|
-
IF "Enter specific hours":
|
|
266
|
-
PROMPT for actual hours
|
|
267
|
-
ELSE IF "About as estimated":
|
|
268
|
-
SET: actualHours = estimatedHours
|
|
269
|
-
ELSE IF "Less than estimated":
|
|
270
|
-
USE AskUserQuestion:
|
|
271
|
-
question: "How much less?"
|
|
272
|
-
options:
|
|
273
|
-
- label: "10-25% less"
|
|
274
|
-
- label: "25-50% less"
|
|
275
|
-
- label: "50%+ less"
|
|
276
|
-
|
|
277
|
-
SET: actualHours based on selection
|
|
278
|
-
ELSE IF "More than estimated":
|
|
279
|
-
USE AskUserQuestion:
|
|
280
|
-
question: "How much more?"
|
|
281
|
-
options:
|
|
282
|
-
- label: "10-25% more"
|
|
283
|
-
- label: "25-50% more"
|
|
284
|
-
- label: "50-100% more"
|
|
285
|
-
- label: "100%+ more"
|
|
286
|
-
|
|
287
|
-
SET: actualHours based on selection
|
|
288
|
-
|
|
289
|
-
# Calculate variance
|
|
290
|
-
SET: variance = {
|
|
291
|
-
hours: actualHours - estimatedHours,
|
|
292
|
-
percentage: ((actualHours - estimatedHours) / estimatedHours) * 100
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
# If significant variance, ask why
|
|
296
|
-
IF abs(variance.percentage) > 20:
|
|
297
|
-
USE AskUserQuestion:
|
|
298
|
-
question: "What caused the {variance.percentage > 0 ? 'overrun' : 'savings'}?"
|
|
299
|
-
options:
|
|
300
|
-
- label: "Scope creep"
|
|
301
|
-
description: "Requirements expanded during development"
|
|
302
|
-
- label: "Underestimated complexity"
|
|
303
|
-
description: "Technical challenges were harder than expected"
|
|
304
|
-
- label: "Technical debt"
|
|
305
|
-
description: "Had to fix existing issues first"
|
|
306
|
-
- label: "External blockers"
|
|
307
|
-
description: "Waited on dependencies or approvals"
|
|
308
|
-
- label: "Learning curve"
|
|
309
|
-
description: "New technology or domain"
|
|
310
|
-
- label: "Requirements changed"
|
|
311
|
-
description: "Stakeholder changes mid-development"
|
|
312
|
-
- label: "Optimistic estimate"
|
|
313
|
-
description: "Original estimate was unrealistic"
|
|
314
|
-
|
|
315
|
-
SET: variance.reason = selected option
|
|
316
|
-
|
|
317
|
-
OUTPUT:
|
|
318
|
-
"""
|
|
319
|
-
**Effort:**
|
|
320
|
-
- Estimated: {estimatedHours}h
|
|
321
|
-
- Actual: {actualHours}h
|
|
322
|
-
- Variance: {variance.hours > 0 ? '+' : ''}{variance.hours}h ({variance.percentage.toFixed(1)}%)
|
|
323
|
-
{variance.reason ? '- Reason: ' + variance.reason : ''}
|
|
324
|
-
"""
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
## Step 5: Collect Success Metrics (if PRD exists)
|
|
330
|
-
|
|
331
|
-
```
|
|
332
|
-
IF prd AND prd.successCriteria:
|
|
333
|
-
OUTPUT: "### Step 2: Success Metrics"
|
|
334
|
-
|
|
335
|
-
SET: metricResults = []
|
|
336
|
-
SET: acResults = []
|
|
337
|
-
|
|
338
|
-
# Evaluate each metric
|
|
339
|
-
FOR EACH metric in prd.successCriteria.metrics:
|
|
340
|
-
USE AskUserQuestion:
|
|
341
|
-
question: "What was the actual value for '{metric.name}'?"
|
|
342
|
-
options:
|
|
343
|
-
- label: "Target met ({metric.target} {metric.unit})"
|
|
344
|
-
description: "Achieved or exceeded target"
|
|
345
|
-
- label: "Partially met"
|
|
346
|
-
description: "Some progress but below target"
|
|
347
|
-
- label: "Not measured"
|
|
348
|
-
description: "Unable to measure this metric"
|
|
349
|
-
- label: "Enter specific value"
|
|
350
|
-
description: "Provide exact measurement"
|
|
351
|
-
|
|
352
|
-
IF "Enter specific value":
|
|
353
|
-
PROMPT for actual value
|
|
354
|
-
ELSE IF "Target met":
|
|
355
|
-
SET: actual = metric.target
|
|
356
|
-
ELSE IF "Partially met":
|
|
357
|
-
SET: actual = metric.target * 0.7 # 70% of target
|
|
358
|
-
ELSE:
|
|
359
|
-
SET: actual = null
|
|
360
|
-
|
|
361
|
-
IF actual != null:
|
|
362
|
-
PUSH: metricResults ← {
|
|
363
|
-
name: metric.name,
|
|
364
|
-
baseline: metric.baseline,
|
|
365
|
-
target: metric.target,
|
|
366
|
-
actual: actual,
|
|
367
|
-
unit: metric.unit,
|
|
368
|
-
achieved: actual >= metric.target,
|
|
369
|
-
percentOfTarget: (actual / metric.target) * 100
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
# Evaluate acceptance criteria
|
|
373
|
-
FOR EACH ac in prd.successCriteria.acceptanceCriteria:
|
|
374
|
-
USE AskUserQuestion:
|
|
375
|
-
question: "Was this acceptance criteria met: '{ac}'?"
|
|
376
|
-
options:
|
|
377
|
-
- label: "Yes"
|
|
378
|
-
description: "Fully met"
|
|
379
|
-
- label: "Partially"
|
|
380
|
-
description: "Met with caveats"
|
|
381
|
-
- label: "No"
|
|
382
|
-
description: "Not met"
|
|
383
|
-
|
|
384
|
-
PUSH: acResults ← {
|
|
385
|
-
criteria: ac,
|
|
386
|
-
met: selected == "Yes",
|
|
387
|
-
notes: selected == "Partially" ? "Partially met" : null
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
# Calculate success score
|
|
391
|
-
SET: successScore = calculateSuccessScore(metricResults, acResults)
|
|
392
|
-
SET: overallSuccess = determineSuccessLevel(successScore)
|
|
393
|
-
|
|
394
|
-
OUTPUT:
|
|
395
|
-
"""
|
|
396
|
-
**Success Metrics:**
|
|
397
|
-
{FOR EACH result in metricResults:}
|
|
398
|
-
- {result.name}: {result.actual} / {result.target} {result.unit} ({result.achieved ? '✅' : '❌'})
|
|
399
|
-
{END FOR}
|
|
400
|
-
|
|
401
|
-
**Acceptance Criteria:** {acResults.filter(ac => ac.met).length}/{acResults.length} met
|
|
402
|
-
|
|
403
|
-
**Overall Success:** {overallSuccess} ({successScore}%)
|
|
404
|
-
"""
|
|
405
|
-
ELSE:
|
|
406
|
-
SET: successScore = null
|
|
407
|
-
SET: overallSuccess = null
|
|
408
|
-
OUTPUT: "### Step 2: Success Metrics (Skipped - no PRD)"
|
|
409
|
-
```
|
|
410
|
-
|
|
411
|
-
---
|
|
412
|
-
|
|
413
|
-
## Step 6: Collect Learnings
|
|
414
|
-
|
|
415
|
-
```
|
|
416
|
-
OUTPUT: "### Step 3: Learnings"
|
|
417
|
-
|
|
418
|
-
USE AskUserQuestion:
|
|
419
|
-
question: "What worked well on this feature?"
|
|
420
|
-
multiSelect: true
|
|
421
|
-
options:
|
|
422
|
-
- label: "Clear requirements"
|
|
423
|
-
description: "PRD/spec was well-defined"
|
|
424
|
-
- label: "Good estimation"
|
|
425
|
-
description: "Estimate was accurate"
|
|
426
|
-
- label: "Effective tooling"
|
|
427
|
-
description: "Tools/frameworks helped"
|
|
428
|
-
- label: "Strong testing"
|
|
429
|
-
description: "Tests caught issues early"
|
|
430
|
-
|
|
431
|
-
SET: whatWorked = selected options (allow custom input)
|
|
432
|
-
|
|
433
|
-
USE AskUserQuestion:
|
|
434
|
-
question: "What didn't work well?"
|
|
435
|
-
multiSelect: true
|
|
436
|
-
options:
|
|
437
|
-
- label: "Unclear requirements"
|
|
438
|
-
description: "Had to clarify multiple times"
|
|
439
|
-
- label: "Poor estimation"
|
|
440
|
-
description: "Estimate was way off"
|
|
441
|
-
- label: "Technical debt"
|
|
442
|
-
description: "Existing code slowed us down"
|
|
443
|
-
- label: "Missing tests"
|
|
444
|
-
description: "Found issues late"
|
|
445
|
-
|
|
446
|
-
SET: whatDidnt = selected options (allow custom input)
|
|
447
|
-
|
|
448
|
-
USE AskUserQuestion:
|
|
449
|
-
question: "Any surprises during development?"
|
|
450
|
-
options:
|
|
451
|
-
- label: "None"
|
|
452
|
-
description: "Everything went as expected"
|
|
453
|
-
- label: "Positive surprises"
|
|
454
|
-
description: "Something was easier than expected"
|
|
455
|
-
- label: "Negative surprises"
|
|
456
|
-
description: "Unexpected challenges"
|
|
457
|
-
- label: "Both"
|
|
458
|
-
description: "Had both good and bad surprises"
|
|
459
|
-
|
|
460
|
-
IF surprises:
|
|
461
|
-
PROMPT for surprise descriptions
|
|
462
|
-
|
|
463
|
-
SET: learnings = {
|
|
464
|
-
whatWorked: whatWorked,
|
|
465
|
-
whatDidnt: whatDidnt,
|
|
466
|
-
surprises: surprises,
|
|
467
|
-
recommendations: []
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
# Generate recommendations based on learnings
|
|
471
|
-
IF "Poor estimation" in whatDidnt:
|
|
472
|
-
PUSH: learnings.recommendations ← {
|
|
473
|
-
category: "estimation",
|
|
474
|
-
insight: "Estimation was inaccurate",
|
|
475
|
-
actionable: true,
|
|
476
|
-
action: "Add buffer for similar features, use historical data"
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
IF "Technical debt" in whatDidnt:
|
|
480
|
-
PUSH: learnings.recommendations ← {
|
|
481
|
-
category: "technical",
|
|
482
|
-
insight: "Technical debt slowed development",
|
|
483
|
-
actionable: true,
|
|
484
|
-
action: "Schedule tech debt cleanup before next major feature"
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
OUTPUT:
|
|
488
|
-
"""
|
|
489
|
-
**Learnings:**
|
|
490
|
-
- Worked: {whatWorked.join(', ')}
|
|
491
|
-
- Didn't work: {whatDidnt.join(', ')}
|
|
492
|
-
- Surprises: {surprises.join(', ') || 'None'}
|
|
493
|
-
"""
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
---
|
|
497
|
-
|
|
498
|
-
## Step 7: ROI Assessment
|
|
499
|
-
|
|
500
|
-
```
|
|
501
|
-
OUTPUT: "### Step 4: ROI Assessment"
|
|
502
|
-
|
|
503
|
-
USE AskUserQuestion:
|
|
504
|
-
question: "How much value did this feature deliver? (1-10)"
|
|
505
|
-
options:
|
|
506
|
-
- label: "1-3 (Low)"
|
|
507
|
-
description: "Minimal user/business impact"
|
|
508
|
-
- label: "4-6 (Medium)"
|
|
509
|
-
description: "Moderate impact"
|
|
510
|
-
- label: "7-8 (High)"
|
|
511
|
-
description: "Significant impact"
|
|
512
|
-
- label: "9-10 (Critical)"
|
|
513
|
-
description: "Essential, major impact"
|
|
514
|
-
|
|
515
|
-
SET: valueDelivered = midpoint of selected range
|
|
516
|
-
|
|
517
|
-
USE AskUserQuestion:
|
|
518
|
-
question: "Knowing what you know now, would you build this feature again?"
|
|
519
|
-
options:
|
|
520
|
-
- label: "Definitely"
|
|
521
|
-
description: "Absolutely worth it"
|
|
522
|
-
- label: "Probably"
|
|
523
|
-
description: "Worth it with some changes"
|
|
524
|
-
- label: "Maybe"
|
|
525
|
-
description: "Uncertain, would need to reconsider"
|
|
526
|
-
- label: "No"
|
|
527
|
-
description: "Would not build it again"
|
|
528
|
-
|
|
529
|
-
SET: worthIt = selected option
|
|
530
|
-
|
|
531
|
-
IF worthIt == "Maybe" OR worthIt == "No":
|
|
532
|
-
PROMPT: "Why?"
|
|
533
|
-
SET: worthItReason = response
|
|
534
|
-
|
|
535
|
-
# Calculate ROI score
|
|
536
|
-
SET: roiScore = (valueDelivered * 10) / actualHours
|
|
537
|
-
|
|
538
|
-
SET: roi = {
|
|
539
|
-
valueDelivered: valueDelivered,
|
|
540
|
-
userImpact: mapValueToImpact(valueDelivered),
|
|
541
|
-
businessImpact: mapValueToImpact(valueDelivered),
|
|
542
|
-
roiScore: roiScore,
|
|
543
|
-
worthIt: worthIt,
|
|
544
|
-
worthItReason: worthItReason
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
OUTPUT:
|
|
548
|
-
"""
|
|
549
|
-
**ROI:**
|
|
550
|
-
- Value Delivered: {valueDelivered}/10
|
|
551
|
-
- ROI Score: {roiScore.toFixed(2)} (value per hour)
|
|
552
|
-
- Worth It: {worthIt}
|
|
553
|
-
{worthItReason ? '- Reason: ' + worthItReason : ''}
|
|
554
|
-
"""
|
|
555
|
-
```
|
|
556
|
-
|
|
557
|
-
---
|
|
558
|
-
|
|
559
|
-
## Step 8: Overall Rating
|
|
560
|
-
|
|
561
|
-
```
|
|
562
|
-
USE AskUserQuestion:
|
|
563
|
-
question: "Overall, how would you rate this feature delivery? (1-5)"
|
|
564
|
-
options:
|
|
565
|
-
- label: "5 - Excellent"
|
|
566
|
-
description: "Exceeded expectations"
|
|
567
|
-
- label: "4 - Good"
|
|
568
|
-
description: "Met expectations"
|
|
569
|
-
- label: "3 - Okay"
|
|
570
|
-
description: "Room for improvement"
|
|
571
|
-
- label: "2 - Poor"
|
|
572
|
-
description: "Significant issues"
|
|
573
|
-
- label: "1 - Failed"
|
|
574
|
-
description: "Did not meet goals"
|
|
575
|
-
|
|
576
|
-
SET: rating = selected value
|
|
577
|
-
```
|
|
578
|
-
|
|
579
|
-
---
|
|
580
|
-
|
|
581
|
-
## Step 9: Save Outcome
|
|
582
|
-
|
|
583
|
-
```
|
|
584
|
-
SET: {timestamp} = GetTimestamp()
|
|
585
|
-
|
|
586
|
-
# Generate outcome ID
|
|
587
|
-
BASH: bun -e "console.log('out_feat_' + crypto.randomUUID().slice(0,8))" 2>/dev/null || node -e "console.log('out_feat_' + require('crypto').randomUUID().slice(0,8))"
|
|
588
|
-
SET: outcomeId = result
|
|
589
|
-
|
|
590
|
-
SET: newOutcome = {
|
|
591
|
-
id: outcomeId,
|
|
592
|
-
featureId: targetFeature.taskId || targetFeature.id,
|
|
593
|
-
featureName: targetFeature.name,
|
|
594
|
-
prdId: prd?.id || null,
|
|
595
|
-
version: targetFeature.version,
|
|
596
|
-
branch: targetFeature.branch,
|
|
597
|
-
prUrl: targetFeature.prUrl,
|
|
598
|
-
|
|
599
|
-
effort: {
|
|
600
|
-
estimated: {
|
|
601
|
-
hours: estimatedHours,
|
|
602
|
-
confidence: estimateConfidence || "medium",
|
|
603
|
-
source: prd ? "prd" : "manual"
|
|
604
|
-
},
|
|
605
|
-
actual: {
|
|
606
|
-
hours: actualHours,
|
|
607
|
-
commits: await getCommitCount(targetFeature.branch),
|
|
608
|
-
linesAdded: await getLinesAdded(targetFeature.branch),
|
|
609
|
-
linesRemoved: await getLinesRemoved(targetFeature.branch)
|
|
610
|
-
},
|
|
611
|
-
variance: variance
|
|
612
|
-
},
|
|
613
|
-
|
|
614
|
-
success: prd ? {
|
|
615
|
-
metrics: metricResults,
|
|
616
|
-
acceptanceCriteria: acResults,
|
|
617
|
-
overallSuccess: overallSuccess,
|
|
618
|
-
successScore: successScore
|
|
619
|
-
} : undefined,
|
|
620
|
-
|
|
621
|
-
learnings: learnings,
|
|
622
|
-
roi: roi,
|
|
623
|
-
rating: rating,
|
|
624
|
-
|
|
625
|
-
startedAt: roadmapFeature?.createdAt || targetFeature.shippedAt,
|
|
626
|
-
shippedAt: targetFeature.shippedAt,
|
|
627
|
-
reviewedAt: timestamp,
|
|
628
|
-
reviewedBy: "user",
|
|
629
|
-
legacy: isLegacy
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
# Update or add outcome
|
|
633
|
-
IF existingOutcome:
|
|
634
|
-
REPLACE existingOutcome with newOutcome in outcomes.outcomes
|
|
635
|
-
ELSE:
|
|
636
|
-
PUSH: outcomes.outcomes ← newOutcome
|
|
637
|
-
|
|
638
|
-
# Update aggregates
|
|
639
|
-
SET: outcomes.aggregates = aggregateOutcomes(outcomes.outcomes)
|
|
640
|
-
SET: outcomes.lastUpdated = timestamp
|
|
641
|
-
SET: outcomes.lastAggregated = timestamp
|
|
642
|
-
|
|
643
|
-
WRITE: {globalPath}/storage/outcomes.json
|
|
644
|
-
|
|
645
|
-
# Update PRD with outcomes (if exists)
|
|
646
|
-
IF prd:
|
|
647
|
-
SET: prd.outcomes = {
|
|
648
|
-
actualHours: actualHours,
|
|
649
|
-
metricsAchieved: metricResults,
|
|
650
|
-
learnings: learnings.whatWorked.concat(learnings.whatDidnt),
|
|
651
|
-
surprises: learnings.surprises,
|
|
652
|
-
wouldDoAgain: worthIt == "Definitely" || worthIt == "Probably",
|
|
653
|
-
rating: rating,
|
|
654
|
-
completedAt: timestamp
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
WRITE: {globalPath}/storage/prds.json
|
|
658
|
-
```
|
|
659
|
-
|
|
660
|
-
---
|
|
661
|
-
|
|
662
|
-
## Step 10: Generate Context
|
|
663
|
-
|
|
664
|
-
```
|
|
665
|
-
WRITE: {globalPath}/context/impact.md
|
|
666
|
-
|
|
667
|
-
"""
|
|
668
|
-
# Impact Report: {targetFeature.name}
|
|
669
|
-
|
|
670
|
-
**Reviewed:** {timestamp}
|
|
671
|
-
**Version:** {targetFeature.version}
|
|
672
|
-
|
|
673
|
-
---
|
|
674
|
-
|
|
675
|
-
## Summary
|
|
676
|
-
|
|
677
|
-
| Metric | Value |
|
|
678
|
-
|--------|-------|
|
|
679
|
-
| Estimated | {estimatedHours}h |
|
|
680
|
-
| Actual | {actualHours}h |
|
|
681
|
-
| Variance | {variance.percentage.toFixed(1)}% |
|
|
682
|
-
| Success | {overallSuccess || 'N/A'} |
|
|
683
|
-
| ROI Score | {roiScore.toFixed(2)} |
|
|
684
|
-
| Rating | {rating}/5 |
|
|
685
|
-
|
|
686
|
-
---
|
|
687
|
-
|
|
688
|
-
## Effort Analysis
|
|
689
|
-
|
|
690
|
-
**Estimated:** {estimatedHours}h ({estimateConfidence} confidence)
|
|
691
|
-
**Actual:** {actualHours}h
|
|
692
|
-
**Variance:** {variance.hours > 0 ? '+' : ''}{variance.hours}h ({variance.percentage.toFixed(1)}%)
|
|
693
|
-
|
|
694
|
-
{IF variance.reason:}
|
|
695
|
-
**Reason:** {variance.reason}
|
|
696
|
-
{variance.explanation || ''}
|
|
697
|
-
{END IF}
|
|
698
|
-
|
|
699
|
-
---
|
|
700
|
-
|
|
701
|
-
{IF success:}
|
|
702
|
-
## Success Metrics
|
|
703
|
-
|
|
704
|
-
| Metric | Target | Actual | Status |
|
|
705
|
-
|--------|--------|--------|--------|
|
|
706
|
-
{FOR EACH metric in metricResults:}
|
|
707
|
-
| {metric.name} | {metric.target} {metric.unit} | {metric.actual} {metric.unit} | {metric.achieved ? '✅' : '❌'} |
|
|
708
|
-
{END FOR}
|
|
709
|
-
|
|
710
|
-
### Acceptance Criteria
|
|
711
|
-
|
|
712
|
-
{FOR EACH ac in acResults:}
|
|
713
|
-
- [{ac.met ? 'x' : ' '}] {ac.criteria}
|
|
714
|
-
{END FOR}
|
|
715
|
-
|
|
716
|
-
**Overall:** {overallSuccess} ({successScore}%)
|
|
717
|
-
{END IF}
|
|
718
|
-
|
|
719
|
-
---
|
|
720
|
-
|
|
721
|
-
## Learnings
|
|
722
|
-
|
|
723
|
-
### What Worked
|
|
724
|
-
{FOR EACH item in learnings.whatWorked:}
|
|
725
|
-
- {item}
|
|
726
|
-
{END FOR}
|
|
727
|
-
|
|
728
|
-
### What Didn't Work
|
|
729
|
-
{FOR EACH item in learnings.whatDidnt:}
|
|
730
|
-
- {item}
|
|
731
|
-
{END FOR}
|
|
732
|
-
|
|
733
|
-
### Surprises
|
|
734
|
-
{FOR EACH item in learnings.surprises:}
|
|
735
|
-
- {item}
|
|
736
|
-
{END FOR}
|
|
737
|
-
|
|
738
|
-
### Recommendations
|
|
739
|
-
{FOR EACH rec in learnings.recommendations:}
|
|
740
|
-
- **{rec.category}**: {rec.insight}
|
|
741
|
-
- Action: {rec.action}
|
|
742
|
-
{END FOR}
|
|
743
|
-
|
|
744
|
-
---
|
|
745
|
-
|
|
746
|
-
## ROI Assessment
|
|
747
|
-
|
|
748
|
-
| Factor | Value |
|
|
749
|
-
|--------|-------|
|
|
750
|
-
| Value Delivered | {valueDelivered}/10 |
|
|
751
|
-
| User Impact | {roi.userImpact} |
|
|
752
|
-
| Business Impact | {roi.businessImpact} |
|
|
753
|
-
| ROI Score | {roiScore.toFixed(2)} |
|
|
754
|
-
| Worth Building | {worthIt} |
|
|
755
|
-
|
|
756
|
-
{IF worthItReason:}
|
|
757
|
-
**Note:** {worthItReason}
|
|
758
|
-
{END IF}
|
|
759
|
-
|
|
760
|
-
---
|
|
761
|
-
|
|
762
|
-
## Overall Rating: {rating}/5
|
|
763
|
-
|
|
764
|
-
{rating == 5 ? '⭐⭐⭐⭐⭐ Excellent' : ''}
|
|
765
|
-
{rating == 4 ? '⭐⭐⭐⭐ Good' : ''}
|
|
766
|
-
{rating == 3 ? '⭐⭐⭐ Okay' : ''}
|
|
767
|
-
{rating == 2 ? '⭐⭐ Poor' : ''}
|
|
768
|
-
{rating == 1 ? '⭐ Failed' : ''}
|
|
769
|
-
|
|
770
|
-
---
|
|
771
|
-
|
|
772
|
-
*Generated by prjct-cli | https://prjct.app*
|
|
773
|
-
"""
|
|
774
|
-
```
|
|
775
|
-
|
|
776
|
-
---
|
|
777
|
-
|
|
778
|
-
## Step 11: Log to Memory
|
|
779
|
-
|
|
780
|
-
```
|
|
781
|
-
APPEND to {globalPath}/memory/events.jsonl:
|
|
782
|
-
{"ts":"{timestamp}","action":"impact_recorded","outcomeId":"{outcomeId}","featureId":"{targetFeature.taskId}","rating":{rating},"roiScore":{roiScore},"variance":{variance.percentage}}
|
|
783
|
-
```
|
|
784
|
-
|
|
785
|
-
---
|
|
786
|
-
|
|
787
|
-
## Step 12: Output
|
|
788
|
-
|
|
789
|
-
```
|
|
790
|
-
OUTPUT:
|
|
791
|
-
"""
|
|
792
|
-
## Impact Recorded: {targetFeature.name}
|
|
793
|
-
|
|
794
|
-
| Metric | Value |
|
|
795
|
-
|--------|-------|
|
|
796
|
-
| Effort | {actualHours}h (est: {estimatedHours}h, {variance.percentage > 0 ? '+' : ''}{variance.percentage.toFixed(0)}%) |
|
|
797
|
-
| Success | {overallSuccess || 'N/A'} ({successScore || '-'}%) |
|
|
798
|
-
| ROI | {roiScore.toFixed(2)} |
|
|
799
|
-
| Rating | {rating}/5 |
|
|
800
|
-
| Worth It | {worthIt} |
|
|
801
|
-
|
|
802
|
-
### Key Learnings
|
|
803
|
-
{learnings.recommendations.length > 0 ?
|
|
804
|
-
learnings.recommendations.map(r => '- ' + r.insight).join('\n') :
|
|
805
|
-
'- No specific recommendations'
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
---
|
|
809
|
-
|
|
810
|
-
📄 Full report: `{globalPath}/context/impact.md`
|
|
811
|
-
|
|
812
|
-
Next: Run `p. impact summary` to see aggregate metrics
|
|
813
|
-
"""
|
|
814
|
-
```
|
|
815
|
-
|
|
816
|
-
---
|
|
817
|
-
|
|
818
|
-
## Helper Functions
|
|
819
|
-
|
|
820
|
-
### getCommitCount(branch)
|
|
821
|
-
```bash
|
|
822
|
-
git rev-list --count main..{branch} 2>/dev/null || echo "0"
|
|
823
|
-
```
|
|
824
|
-
|
|
825
|
-
### getLinesAdded(branch)
|
|
826
|
-
```bash
|
|
827
|
-
git diff --stat main...{branch} | tail -1 | awk '{print $4}' 2>/dev/null || echo "0"
|
|
828
|
-
```
|
|
829
|
-
|
|
830
|
-
### getLinesRemoved(branch)
|
|
831
|
-
```bash
|
|
832
|
-
git diff --stat main...{branch} | tail -1 | awk '{print $6}' 2>/dev/null || echo "0"
|
|
833
|
-
```
|
|
834
|
-
|
|
835
|
-
### mapValueToImpact(value)
|
|
836
|
-
```javascript
|
|
837
|
-
if (value >= 9) return 'critical'
|
|
838
|
-
if (value >= 7) return 'high'
|
|
839
|
-
if (value >= 4) return 'medium'
|
|
840
|
-
if (value >= 2) return 'low'
|
|
841
|
-
return 'none'
|
|
842
|
-
```
|
|
843
|
-
|
|
844
|
-
---
|
|
845
|
-
|
|
846
|
-
## Error Handling
|
|
847
|
-
|
|
848
|
-
| Error | Response |
|
|
849
|
-
|-------|----------|
|
|
850
|
-
| No project | "Run `p. init` first" |
|
|
851
|
-
| No shipped features | "No shipped features. Run `p. ship` first" |
|
|
852
|
-
| Feature not found | "Feature not found: {id}" |
|
|
853
|
-
| Already reviewed | Offer to view or update |
|
|
854
|
-
|
|
855
|
-
---
|
|
856
|
-
|
|
857
|
-
## Related Commands
|
|
858
|
-
|
|
859
|
-
| Command | Relationship |
|
|
860
|
-
|---------|--------------|
|
|
861
|
-
| `p. ship` | Creates shipped entry that impact reviews |
|
|
862
|
-
| `p. prd` | Provides estimates and success criteria |
|
|
863
|
-
| `p. dashboard` | Shows aggregate impact metrics |
|
|
864
|
-
| `p. plan` | Uses learnings to improve future estimates |
|