@pugi/cli 0.1.0-beta.98 → 1.0.0-alpha.1
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/LICENSE +1 -1
- package/README.md +11 -191
- package/bin/pugi +8 -0
- package/package.json +15 -71
- package/postinstall.mjs +31 -0
- package/CHANGELOG.md +0 -132
- package/THIRD_PARTY_NOTICES.md +0 -40
- package/assets/pugi-mascot.ansi +0 -16
- package/assets/pugi-prozr2-mascot.ansi +0 -9
- package/bin/run.js +0 -34
- package/dist/commands/deploy.js +0 -439
- package/dist/commands/flatten.js +0 -191
- package/dist/commands/jobs-watch.js +0 -201
- package/dist/commands/jobs.js +0 -260
- package/dist/commands/retro.js +0 -210
- package/dist/commands/smoke.js +0 -133
- package/dist/core/agent-progress/cleanup.js +0 -134
- package/dist/core/agent-progress/schema.js +0 -144
- package/dist/core/agent-progress/writer.js +0 -101
- package/dist/core/agents/adaptive-router.js +0 -330
- package/dist/core/agents/loader.js +0 -104
- package/dist/core/agents/query-decomposer.js +0 -297
- package/dist/core/agents/registry.js +0 -69
- package/dist/core/approvals/shortcut-resolver.js +0 -98
- package/dist/core/artifact-chain/dispatcher.js +0 -148
- package/dist/core/artifact-chain/exporter.js +0 -164
- package/dist/core/artifact-chain/state.js +0 -243
- package/dist/core/artifact-chain/steps.js +0 -169
- package/dist/core/ask-user/question.js +0 -92
- package/dist/core/audit/audit-trail.js +0 -275
- package/dist/core/auth/ensure-authenticated.js +0 -129
- package/dist/core/auth/env-provider.js +0 -238
- package/dist/core/auto-open-browser.js +0 -128
- package/dist/core/auto-update/channels.js +0 -122
- package/dist/core/auto-update/checker.js +0 -241
- package/dist/core/auto-update/state.js +0 -235
- package/dist/core/bare-mode/index.js +0 -107
- package/dist/core/bash/redirect.js +0 -281
- package/dist/core/bash-classifier.js +0 -1397
- package/dist/core/checkpoint/resumer.js +0 -149
- package/dist/core/checkpoint/rewinder.js +0 -291
- package/dist/core/checkpoints/shadow-git.js +0 -670
- package/dist/core/citations/parser.js +0 -109
- package/dist/core/classifier/yolo-classifier.js +0 -88
- package/dist/core/clipboard.js +0 -70
- package/dist/core/codegraph/decision-store.js +0 -248
- package/dist/core/codegraph/detect-repo.js +0 -459
- package/dist/core/codegraph/install.js +0 -134
- package/dist/core/codegraph/offer-hook.js +0 -220
- package/dist/core/compact/auto-trigger.js +0 -96
- package/dist/core/compact/buffer-rewriter.js +0 -115
- package/dist/core/compact/summarizer.js +0 -208
- package/dist/core/compact/token-counter.js +0 -108
- package/dist/core/consensus/anvil-fanout.js +0 -276
- package/dist/core/consensus/diff-capture.js +0 -491
- package/dist/core/consensus/rubric.js +0 -233
- package/dist/core/context/builder.js +0 -114
- package/dist/core/context/compaction-events.js +0 -99
- package/dist/core/context/compaction.js +0 -602
- package/dist/core/context/index.js +0 -28
- package/dist/core/context/invariants.js +0 -250
- package/dist/core/context/markdown-loader.js +0 -288
- package/dist/core/context/markdown-traverse.js +0 -255
- package/dist/core/context/pugiignore.js +0 -316
- package/dist/core/context/repo-skeleton.js +0 -533
- package/dist/core/context/tool-eviction.js +0 -55
- package/dist/core/context/watcher.js +0 -342
- package/dist/core/context/working-set.js +0 -165
- package/dist/core/coordinator/agent-tools.js +0 -77
- package/dist/core/coordinator/agent-toolset.js +0 -65
- package/dist/core/coordinator/fsm.js +0 -73
- package/dist/core/coordinator/mode-fsm.js +0 -70
- package/dist/core/cost/rate-card.js +0 -129
- package/dist/core/cost/tracker.js +0 -221
- package/dist/core/credentials.js +0 -355
- package/dist/core/cron/scheduler.js +0 -138
- package/dist/core/denial-tracking/index.js +0 -8
- package/dist/core/denial-tracking/state.js +0 -264
- package/dist/core/diagnostics/probe-runner.js +0 -93
- package/dist/core/diagnostics/probes/api.js +0 -46
- package/dist/core/diagnostics/probes/auth.js +0 -93
- package/dist/core/diagnostics/probes/bare-mode.js +0 -42
- package/dist/core/diagnostics/probes/cli-version.js +0 -127
- package/dist/core/diagnostics/probes/config.js +0 -72
- package/dist/core/diagnostics/probes/denial-tracking.js +0 -57
- package/dist/core/diagnostics/probes/disk.js +0 -81
- package/dist/core/diagnostics/probes/engine-live.js +0 -46
- package/dist/core/diagnostics/probes/git.js +0 -65
- package/dist/core/diagnostics/probes/hooks.js +0 -118
- package/dist/core/diagnostics/probes/mcp.js +0 -75
- package/dist/core/diagnostics/probes/node.js +0 -59
- package/dist/core/diagnostics/probes/pnpm.js +0 -36
- package/dist/core/diagnostics/probes/pugi-md.js +0 -89
- package/dist/core/diagnostics/probes/sandbox.js +0 -72
- package/dist/core/diagnostics/probes/session.js +0 -74
- package/dist/core/diagnostics/probes/status-snapshot.js +0 -488
- package/dist/core/diagnostics/probes/workspace.js +0 -63
- package/dist/core/diagnostics/types.js +0 -70
- package/dist/core/dispatch/cache-cleanup.js +0 -197
- package/dist/core/dispatch/cache-handoff.js +0 -295
- package/dist/core/edits/apply-patch-layer-e.js +0 -189
- package/dist/core/edits/dispatch.js +0 -511
- package/dist/core/edits/format-detector.js +0 -260
- package/dist/core/edits/format-matrix.js +0 -26
- package/dist/core/edits/fuzzy-ladder.js +0 -650
- package/dist/core/edits/index.js +0 -19
- package/dist/core/edits/journal.js +0 -199
- package/dist/core/edits/layer-a-apply.js +0 -217
- package/dist/core/edits/layer-a-fuzzy-apply.js +0 -198
- package/dist/core/edits/layer-b-apply.js +0 -211
- package/dist/core/edits/layer-c-apply.js +0 -160
- package/dist/core/edits/layer-d-ast.js +0 -572
- package/dist/core/edits/marker-parser.js +0 -401
- package/dist/core/edits/security-gate.js +0 -223
- package/dist/core/edits/verify-hook.js +0 -273
- package/dist/core/edits/worktree.js +0 -322
- package/dist/core/engine/adapter-runner.js +0 -8
- package/dist/core/engine/anvil-client.js +0 -344
- package/dist/core/engine/auto-compact.js +0 -179
- package/dist/core/engine/budgets.js +0 -192
- package/dist/core/engine/context-prefix.js +0 -155
- package/dist/core/engine/index.js +0 -12
- package/dist/core/engine/intensity.js +0 -163
- package/dist/core/engine/intent.js +0 -260
- package/dist/core/engine/native-pugi.js +0 -1616
- package/dist/core/engine/noop.js +0 -27
- package/dist/core/engine/prompts.js +0 -236
- package/dist/core/engine/strip-internal-fields.js +0 -124
- package/dist/core/engine/tool-bridge.js +0 -2173
- package/dist/core/engine/verification-patterns.js +0 -195
- package/dist/core/evaluation/golden-dataset.js +0 -293
- package/dist/core/feedback/queue.js +0 -177
- package/dist/core/feedback/submitter.js +0 -145
- package/dist/core/file-cache.js +0 -141
- package/dist/core/flatten/flatten-repo.js +0 -439
- package/dist/core/format/osc8-link.js +0 -28
- package/dist/core/hook-chains.js +0 -392
- package/dist/core/hooks/citation-verify-hook.js +0 -138
- package/dist/core/hooks/citation-verify.js +0 -112
- package/dist/core/hooks/events.js +0 -46
- package/dist/core/hooks/index.js +0 -15
- package/dist/core/hooks/registry.js +0 -216
- package/dist/core/hooks/runner.js +0 -236
- package/dist/core/hooks/v2/event-emitter.js +0 -115
- package/dist/core/hooks/v2/executor.js +0 -282
- package/dist/core/hooks/v2/index.js +0 -25
- package/dist/core/hooks/v2/lifecycle.js +0 -104
- package/dist/core/hooks/v2/loader.js +0 -216
- package/dist/core/hooks/v2/matcher.js +0 -125
- package/dist/core/hooks/v2/trust.js +0 -143
- package/dist/core/hooks/v2/types.js +0 -86
- package/dist/core/hooks/worktree-events.js +0 -158
- package/dist/core/hooks.js +0 -415
- package/dist/core/image/renderer.js +0 -71
- package/dist/core/index-store.js +0 -260
- package/dist/core/init/detector.js +0 -582
- package/dist/core/init/template-renderer.js +0 -242
- package/dist/core/jobs/registry.js +0 -462
- package/dist/core/ledger/results-tsv.js +0 -142
- package/dist/core/log-discipline/stdout-redirect.js +0 -51
- package/dist/core/lsp/cache.js +0 -105
- package/dist/core/lsp/client.js +0 -1229
- package/dist/core/lsp/language-detect.js +0 -66
- package/dist/core/lsp/post-edit-diagnostics.js +0 -171
- package/dist/core/lsp/server-detect.js +0 -173
- package/dist/core/lsp/symbol-cache.js +0 -162
- package/dist/core/lsp/symbol-tools.js +0 -664
- package/dist/core/mcp/client.js +0 -385
- package/dist/core/mcp/http-server.js +0 -553
- package/dist/core/mcp/orchestrator-config.js +0 -192
- package/dist/core/mcp/orchestrator-tools.js +0 -806
- package/dist/core/mcp/permission.js +0 -190
- package/dist/core/mcp/registry.js +0 -193
- package/dist/core/mcp/server-tools.js +0 -219
- package/dist/core/mcp/server.js +0 -397
- package/dist/core/mcp/trust.js +0 -91
- package/dist/core/memory/dual-write.js +0 -416
- package/dist/core/memory/passive-extract.js +0 -130
- package/dist/core/memory/phase1-kinds.js +0 -20
- package/dist/core/memory/secret-scanner.js +0 -304
- package/dist/core/memory-sync/queue.js +0 -170
- package/dist/core/metrics/extract.js +0 -113
- package/dist/core/modes/roo-modes.js +0 -68
- package/dist/core/onboarding/ensure-initialized.js +0 -133
- package/dist/core/onboarding/marker.js +0 -111
- package/dist/core/onboarding/telemetry-state.js +0 -108
- package/dist/core/output-style/presets.js +0 -176
- package/dist/core/output-style/state.js +0 -185
- package/dist/core/path-security.js +0 -345
- package/dist/core/permission.js +0 -369
- package/dist/core/permissions/auto-classifier.js +0 -124
- package/dist/core/permissions/bash-parser.js +0 -371
- package/dist/core/permissions/circuit-breaker.js +0 -83
- package/dist/core/permissions/constrained-edit.js +0 -91
- package/dist/core/permissions/gate.js +0 -278
- package/dist/core/permissions/index.js +0 -20
- package/dist/core/permissions/mode.js +0 -174
- package/dist/core/permissions/network-egress.js +0 -137
- package/dist/core/permissions/state.js +0 -241
- package/dist/core/permissions/tool-class.js +0 -107
- package/dist/core/plan-mode/ui-state.js +0 -51
- package/dist/core/plans/plan-artifact.js +0 -721
- package/dist/core/policy-limits/etag-store.js +0 -122
- package/dist/core/prd-check/parser.js +0 -215
- package/dist/core/prd-check/reporter.js +0 -127
- package/dist/core/prd-check/session-review.js +0 -557
- package/dist/core/prd-check/verifiers.js +0 -223
- package/dist/core/prompt-cache/client-cache.js +0 -99
- package/dist/core/prompts/assembly.js +0 -29
- package/dist/core/prompts/registry.js +0 -364
- package/dist/core/pugi-gitignore.js +0 -52
- package/dist/core/pugi-md/cc-compat-rules.js +0 -735
- package/dist/core/pugi-md/context-injector.js +0 -76
- package/dist/core/pugi-md/walk-up.js +0 -207
- package/dist/core/python/uv-installer.js +0 -270
- package/dist/core/python/uv-resolver.js +0 -83
- package/dist/core/rate-limit/narrator.js +0 -146
- package/dist/core/recipes/cli-types.js +0 -20
- package/dist/core/recipes/loader.js +0 -103
- package/dist/core/recipes/runner.js +0 -345
- package/dist/core/recipes/schema.js +0 -587
- package/dist/core/release-notes/parser.js +0 -241
- package/dist/core/release-notes/state.js +0 -116
- package/dist/core/repl/ask.js +0 -512
- package/dist/core/repl/cancellation.js +0 -98
- package/dist/core/repl/cap-warning.js +0 -91
- package/dist/core/repl/clipboard-read.js +0 -174
- package/dist/core/repl/dispatch-fsm.js +0 -220
- package/dist/core/repl/engine-bridge.js +0 -303
- package/dist/core/repl/history-search.js +0 -175
- package/dist/core/repl/history.js +0 -182
- package/dist/core/repl/kill-ring.js +0 -138
- package/dist/core/repl/model-pricing.js +0 -135
- package/dist/core/repl/privacy-banner.js +0 -71
- package/dist/core/repl/session.js +0 -4962
- package/dist/core/repl/slash-commands.js +0 -747
- package/dist/core/repl/store/index.js +0 -12
- package/dist/core/repl/store/jsonl-log.js +0 -321
- package/dist/core/repl/store/lockfile.js +0 -155
- package/dist/core/repl/store/session-store.js +0 -821
- package/dist/core/repl/store/types.js +0 -44
- package/dist/core/repl/store/uuid-v7.js +0 -68
- package/dist/core/repl/tool-route.js +0 -382
- package/dist/core/repl/workspace-context.js +0 -206
- package/dist/core/repo-map/build.js +0 -125
- package/dist/core/repo-map/cache.js +0 -185
- package/dist/core/repo-map/extractor.js +0 -254
- package/dist/core/repo-map/formatter.js +0 -145
- package/dist/core/repo-map/page-rank.js +0 -105
- package/dist/core/repo-map/scanner.js +0 -211
- package/dist/core/retro/git-collector.js +0 -251
- package/dist/core/retro/health-card.js +0 -25
- package/dist/core/retro/metrics.js +0 -342
- package/dist/core/retro/narrative.js +0 -249
- package/dist/core/retro/plane-collector.js +0 -274
- package/dist/core/retro/pr-issue-link.js +0 -65
- package/dist/core/retro/types.js +0 -16
- package/dist/core/retry-budget/budget.js +0 -284
- package/dist/core/retry-budget/index.js +0 -5
- package/dist/core/retry-budget/retry-cap.js +0 -74
- package/dist/core/routing/lead-worker.js +0 -43
- package/dist/core/routing/pre-flight-estimator.js +0 -108
- package/dist/core/runs/run-tree.js +0 -103
- package/dist/core/sandboxing/adapter.js +0 -29
- package/dist/core/sandboxing/index.js +0 -49
- package/dist/core/sandboxing/none.js +0 -19
- package/dist/core/sandboxing/seatbelt.js +0 -183
- package/dist/core/security/injection-scanner.js +0 -367
- package/dist/core/security/output-filter.js +0 -418
- package/dist/core/session/env-file.js +0 -105
- package/dist/core/session/section-budgets.js +0 -140
- package/dist/core/session.js +0 -377
- package/dist/core/settings.js +0 -400
- package/dist/core/share/formatter.js +0 -271
- package/dist/core/share/redactor.js +0 -221
- package/dist/core/share/uploader.js +0 -267
- package/dist/core/skills/defaults.js +0 -457
- package/dist/core/skills/loader.js +0 -454
- package/dist/core/skills/sources.js +0 -480
- package/dist/core/skills/trust.js +0 -172
- package/dist/core/smoke/headless-driver.js +0 -174
- package/dist/core/smoke/orchestrator.js +0 -194
- package/dist/core/smoke/runner.js +0 -238
- package/dist/core/smoke/scenario-parser.js +0 -316
- package/dist/core/statusline.js +0 -99
- package/dist/core/subagents/dispatcher-real.js +0 -600
- package/dist/core/subagents/dispatcher.js +0 -352
- package/dist/core/subagents/index.js +0 -39
- package/dist/core/subagents/isolation-matrix.js +0 -213
- package/dist/core/subagents/spawn.js +0 -101
- package/dist/core/telemetry/emitter.js +0 -229
- package/dist/core/telemetry/queue.js +0 -251
- package/dist/core/theme/context.js +0 -91
- package/dist/core/theme/presets.js +0 -228
- package/dist/core/theme/state.js +0 -181
- package/dist/core/todos/invariant.js +0 -10
- package/dist/core/todos/state.js +0 -177
- package/dist/core/tool-schema/compressor.js +0 -89
- package/dist/core/transport/version-interceptor.js +0 -166
- package/dist/core/trust.js +0 -109
- package/dist/core/tui/thinking-block.js +0 -64
- package/dist/core/vim/keymap.js +0 -288
- package/dist/core/vim/state.js +0 -92
- package/dist/core/watch-markers/marker-watcher.js +0 -133
- package/dist/core/worktree/include-parser.js +0 -249
- package/dist/core/worktree-manager/cleanup.js +0 -123
- package/dist/core/worktree-manager/manager.js +0 -303
- package/dist/index.js +0 -44
- package/dist/runtime/bootstrap.js +0 -190
- package/dist/runtime/cli.js +0 -8121
- package/dist/runtime/commands/agents.js +0 -385
- package/dist/runtime/commands/budget.js +0 -192
- package/dist/runtime/commands/cancel.js +0 -231
- package/dist/runtime/commands/chain.js +0 -489
- package/dist/runtime/commands/codegraph-status.js +0 -227
- package/dist/runtime/commands/compact.js +0 -297
- package/dist/runtime/commands/config.js +0 -595
- package/dist/runtime/commands/cost.js +0 -199
- package/dist/runtime/commands/delegate.js +0 -312
- package/dist/runtime/commands/dispatch.js +0 -126
- package/dist/runtime/commands/doctor.js +0 -579
- package/dist/runtime/commands/feedback.js +0 -184
- package/dist/runtime/commands/hooks.js +0 -187
- package/dist/runtime/commands/init.js +0 -254
- package/dist/runtime/commands/lsp.js +0 -368
- package/dist/runtime/commands/mcp.js +0 -935
- package/dist/runtime/commands/memory.js +0 -582
- package/dist/runtime/commands/model.js +0 -237
- package/dist/runtime/commands/onboarding.js +0 -275
- package/dist/runtime/commands/patch.js +0 -128
- package/dist/runtime/commands/permissions.js +0 -112
- package/dist/runtime/commands/plan.js +0 -143
- package/dist/runtime/commands/prd-check.js +0 -285
- package/dist/runtime/commands/privacy.js +0 -107
- package/dist/runtime/commands/recipe.js +0 -325
- package/dist/runtime/commands/redo-blob-store.js +0 -92
- package/dist/runtime/commands/redo.js +0 -361
- package/dist/runtime/commands/release-notes.js +0 -229
- package/dist/runtime/commands/repo-map.js +0 -95
- package/dist/runtime/commands/report.js +0 -299
- package/dist/runtime/commands/resume.js +0 -118
- package/dist/runtime/commands/review-consensus.js +0 -414
- package/dist/runtime/commands/rewind.js +0 -333
- package/dist/runtime/commands/roster.js +0 -117
- package/dist/runtime/commands/sessions.js +0 -163
- package/dist/runtime/commands/share.js +0 -316
- package/dist/runtime/commands/skills.js +0 -401
- package/dist/runtime/commands/status.js +0 -186
- package/dist/runtime/commands/stickers.js +0 -82
- package/dist/runtime/commands/style.js +0 -194
- package/dist/runtime/commands/theme.js +0 -196
- package/dist/runtime/commands/undo.js +0 -361
- package/dist/runtime/commands/update.js +0 -289
- package/dist/runtime/commands/vim.js +0 -140
- package/dist/runtime/commands/worktree.js +0 -177
- package/dist/runtime/commands/worktrees.js +0 -155
- package/dist/runtime/deprecation-warning.js +0 -69
- package/dist/runtime/engine-exit-code.js +0 -50
- package/dist/runtime/headless-repl.js +0 -195
- package/dist/runtime/headless.js +0 -548
- package/dist/runtime/load-hooks-or-exit.js +0 -71
- package/dist/runtime/plan-decompose.js +0 -531
- package/dist/runtime/sigint-guard.js +0 -272
- package/dist/runtime/stream-renderer.js +0 -195
- package/dist/runtime/update-check.js +0 -294
- package/dist/runtime/version.js +0 -65
- package/dist/runtime/worktree-bootstrap.js +0 -579
- package/dist/skills/bundled/batch.js +0 -617
- package/dist/skills/bundled/index.js +0 -45
- package/dist/skills/bundled/loop.js +0 -358
- package/dist/skills/bundled/remember.js +0 -383
- package/dist/skills/bundled/simplify.js +0 -289
- package/dist/skills/bundled/skillify.js +0 -373
- package/dist/skills/bundled/stuck.js +0 -558
- package/dist/skills/bundled/verify.js +0 -439
- package/dist/testing/vcr.js +0 -486
- package/dist/tools/agent-tool.js +0 -229
- package/dist/tools/apply-patch.js +0 -556
- package/dist/tools/ask-user-question.js +0 -337
- package/dist/tools/ask-user.js +0 -115
- package/dist/tools/bash.js +0 -1238
- package/dist/tools/brief.js +0 -224
- package/dist/tools/cron.js +0 -433
- package/dist/tools/enter-worktree.js +0 -250
- package/dist/tools/exit-worktree.js +0 -147
- package/dist/tools/file-tools.js +0 -553
- package/dist/tools/http-request.js +0 -336
- package/dist/tools/lsp-tools.js +0 -565
- package/dist/tools/mcp-tool.js +0 -260
- package/dist/tools/multi-edit.js +0 -361
- package/dist/tools/powershell.js +0 -268
- package/dist/tools/registry.js +0 -166
- package/dist/tools/server-tools.js +0 -892
- package/dist/tools/skill-tool.js +0 -96
- package/dist/tools/sleep.js +0 -99
- package/dist/tools/synthetic-output.js +0 -133
- package/dist/tools/tasks.js +0 -208
- package/dist/tools/todo-write.js +0 -184
- package/dist/tools/verify-plan-execution.js +0 -295
- package/dist/tools/web-fetch-injection-scanner.js +0 -207
- package/dist/tools/web-fetch.js +0 -720
- package/dist/tools/web-search.js +0 -458
- package/dist/tui/agent-progress-card.js +0 -111
- package/dist/tui/agent-tree-pane.js +0 -9
- package/dist/tui/agent-tree.js +0 -87
- package/dist/tui/ask-cli.js +0 -52
- package/dist/tui/ask-modal.js +0 -211
- package/dist/tui/ask-user-question-chips.js +0 -315
- package/dist/tui/ask-user-question-prompt.js +0 -203
- package/dist/tui/compact-banner.js +0 -81
- package/dist/tui/conversation-pane.js +0 -164
- package/dist/tui/cost-table.js +0 -111
- package/dist/tui/device-flow.js +0 -142
- package/dist/tui/doctor-table.js +0 -46
- package/dist/tui/feedback-prompt.js +0 -156
- package/dist/tui/input-box.js +0 -732
- package/dist/tui/login-picker.js +0 -69
- package/dist/tui/markdown-render.js +0 -266
- package/dist/tui/multi-file-diff-approval.js +0 -375
- package/dist/tui/onboarding-wizard.js +0 -240
- package/dist/tui/permissions-picker.js +0 -86
- package/dist/tui/render.js +0 -160
- package/dist/tui/repl-render.js +0 -770
- package/dist/tui/repl-splash-art.js +0 -64
- package/dist/tui/repl-splash-mascot.js +0 -154
- package/dist/tui/repl-splash.js +0 -117
- package/dist/tui/repl.js +0 -378
- package/dist/tui/slash-palette.js +0 -106
- package/dist/tui/splash-data.js +0 -61
- package/dist/tui/splash.js +0 -31
- package/dist/tui/status-bar.js +0 -209
- package/dist/tui/status-table.js +0 -7
- package/dist/tui/stickers-art.js +0 -136
- package/dist/tui/style-table.js +0 -28
- package/dist/tui/theme-table.js +0 -29
- package/dist/tui/thinking-spinner.js +0 -123
- package/dist/tui/tool-stream-pane.js +0 -140
- package/dist/tui/update-banner.js +0 -33
- package/dist/tui/vim-input.js +0 -267
- package/dist/tui/welcome-banner.js +0 -107
- package/dist/tui/welcome-data.js +0 -293
- package/dist/tui/workspace-context.js +0 -105
- package/docs/examples/codegraph.mcp.json +0 -10
- package/test/scenarios/codegen-create-file.scenario.txt +0 -13
- package/test/scenarios/compact-force.scenario.txt +0 -12
- package/test/scenarios/identity.scenario.txt +0 -11
- package/test/scenarios/persona-handoff.scenario.txt +0 -12
- package/test/scenarios/walkback.scenario.txt +0 -12
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ETag-cached policy limits store .
|
|
3
|
-
*
|
|
4
|
-
* Enterprise customers expose a `policyLimits` document at a stable URL
|
|
5
|
-
* (tool allowlist, network egress rules, per-tenant token caps, secret
|
|
6
|
-
* patterns, etc.). Re-fetching this document на every engine call
|
|
7
|
-
* burns latency и bandwidth даже когда content has not changed.
|
|
8
|
-
* CC's pattern (per audit memo): cache by ETag и conditional-GET via
|
|
9
|
-
* `If-None-Match` header. Server returns 304 — Pugi keeps using the
|
|
10
|
-
* cached document.
|
|
11
|
-
*
|
|
12
|
-
* This module is the pure cache layer. Caller supplies a transport
|
|
13
|
-
* function (mockable) that performs the actual HTTP request и returns
|
|
14
|
-
* `{ status, etag, body }`. We handle:
|
|
15
|
-
*
|
|
16
|
-
* - Initial fetch (200 → cache body + etag)
|
|
17
|
-
* - Conditional refresh (304 → reuse cached)
|
|
18
|
-
* - Forced refresh (skip If-None-Match)
|
|
19
|
-
* - TTL fallback (refresh после maxAgeSec even на 304-friendly URL)
|
|
20
|
-
* - Stale-while-revalidate semantics — return cached immediately,
|
|
21
|
-
* refresh in background, never block caller
|
|
22
|
-
*
|
|
23
|
-
* Pure-ish: state lives в the store instance, no globals.
|
|
24
|
-
*/
|
|
25
|
-
const DEFAULT_MAX_AGE_SEC = 600;
|
|
26
|
-
export class PolicyLimitsStore {
|
|
27
|
-
options;
|
|
28
|
-
cached = null;
|
|
29
|
-
inFlight = null;
|
|
30
|
-
maxAgeMs;
|
|
31
|
-
constructor(options) {
|
|
32
|
-
this.options = options;
|
|
33
|
-
const sec = options.maxAgeSec ?? DEFAULT_MAX_AGE_SEC;
|
|
34
|
-
if (sec < 0)
|
|
35
|
-
throw new RangeError(`maxAgeSec must be >= 0, got ${sec}`);
|
|
36
|
-
this.maxAgeMs = sec * 1000;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Return the current policy doc, refreshing когда the cache is empty
|
|
40
|
-
* or TTL expired. Concurrent calls share a single in-flight fetch.
|
|
41
|
-
*/
|
|
42
|
-
async get() {
|
|
43
|
-
if (this.cached && !this.isExpired(this.cached)) {
|
|
44
|
-
return this.cached.body;
|
|
45
|
-
}
|
|
46
|
-
return (await this.refreshInternal()).body;
|
|
47
|
-
}
|
|
48
|
-
/** Force a network refresh, bypassing ETag и TTL. */
|
|
49
|
-
async forceRefresh() {
|
|
50
|
-
this.cached = null;
|
|
51
|
-
return (await this.refreshInternal()).body;
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Stale-while-revalidate: return cached body immediately когда present,
|
|
55
|
-
* fire a background refresh без awaiting. First call (no cache) still
|
|
56
|
-
* blocks для initial fetch.
|
|
57
|
-
*/
|
|
58
|
-
async getStaleWhileRevalidate() {
|
|
59
|
-
if (this.cached) {
|
|
60
|
-
if (this.isExpired(this.cached) && !this.inFlight) {
|
|
61
|
-
// Fire-and-forget refresh — ignore rejection (next get() retries)
|
|
62
|
-
void this.refreshInternal().catch(() => { });
|
|
63
|
-
}
|
|
64
|
-
return this.cached.body;
|
|
65
|
-
}
|
|
66
|
-
return (await this.refreshInternal()).body;
|
|
67
|
-
}
|
|
68
|
-
/** Peek the cached entry without triggering a refresh. */
|
|
69
|
-
peek() {
|
|
70
|
-
return this.cached;
|
|
71
|
-
}
|
|
72
|
-
/** Drop the cache. Next get() will hit the transport unconditionally. */
|
|
73
|
-
invalidate() {
|
|
74
|
-
this.cached = null;
|
|
75
|
-
}
|
|
76
|
-
isExpired(entry) {
|
|
77
|
-
if (this.maxAgeMs === 0)
|
|
78
|
-
return false;
|
|
79
|
-
return Date.now() - entry.cachedAt > this.maxAgeMs;
|
|
80
|
-
}
|
|
81
|
-
async refreshInternal() {
|
|
82
|
-
if (this.inFlight)
|
|
83
|
-
return this.inFlight;
|
|
84
|
-
this.inFlight = this.doFetch();
|
|
85
|
-
try {
|
|
86
|
-
return await this.inFlight;
|
|
87
|
-
}
|
|
88
|
-
finally {
|
|
89
|
-
this.inFlight = null;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
async doFetch() {
|
|
93
|
-
const ifNoneMatch = this.cached?.etag ?? null;
|
|
94
|
-
const response = await this.options.transport({ ifNoneMatch });
|
|
95
|
-
if (response.status === 304) {
|
|
96
|
-
if (!this.cached) {
|
|
97
|
-
throw new Error('transport returned 304 без cached entry — server bug or initial-fetch race');
|
|
98
|
-
}
|
|
99
|
-
// Refresh cachedAt so TTL window slides forward
|
|
100
|
-
const refreshed = {
|
|
101
|
-
etag: this.cached.etag,
|
|
102
|
-
body: this.cached.body,
|
|
103
|
-
cachedAt: Date.now(),
|
|
104
|
-
};
|
|
105
|
-
this.cached = refreshed;
|
|
106
|
-
this.options.onRefresh?.(refreshed);
|
|
107
|
-
return refreshed;
|
|
108
|
-
}
|
|
109
|
-
if (response.status !== 200 || response.body === undefined) {
|
|
110
|
-
throw new Error(`transport returned unexpected response: status=${response.status}`);
|
|
111
|
-
}
|
|
112
|
-
const entry = {
|
|
113
|
-
etag: response.etag ?? '',
|
|
114
|
-
body: response.body,
|
|
115
|
-
cachedAt: Date.now(),
|
|
116
|
-
};
|
|
117
|
-
this.cached = entry;
|
|
118
|
-
this.options.onRefresh?.(entry);
|
|
119
|
-
return entry;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=etag-store.js.map
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRD parser — Pugi (`/prd-check`).
|
|
3
|
-
*
|
|
4
|
-
* Reads a markdown PRD file and extracts the acceptance-criteria
|
|
5
|
-
* section into a list of verifiable criteria. The parser is
|
|
6
|
-
* intentionally narrow: it owns ONE function, accepts raw markdown
|
|
7
|
-
* source as a string (no fs I/O), and returns a structured list the
|
|
8
|
-
* verifier module can fan out over.
|
|
9
|
-
*
|
|
10
|
-
* Why two phases (parse → verify) instead of a single pass:
|
|
11
|
-
*
|
|
12
|
-
* - keeps the parser deterministic + fast (pure string in, JSON
|
|
13
|
-
* out — trivial to unit-test without touching the filesystem)
|
|
14
|
-
*
|
|
15
|
-
* - lets the reporter render the criterion list even when every
|
|
16
|
-
* verifier fails, so operators see WHAT failed before WHY
|
|
17
|
-
*
|
|
18
|
-
* - mirrors the L17 doctor split: `probe-runner` runs a set of
|
|
19
|
-
* probe descriptors → identical contract here, just for PRD
|
|
20
|
-
* acceptance items instead of environment probes
|
|
21
|
-
*
|
|
22
|
-
* Heading recognition is tolerant by design: PRD authors use both
|
|
23
|
-
* `## Acceptance Criteria` and `## Success Criteria`, sometimes with
|
|
24
|
-
* a trailing colon, sometimes inside an h3. We accept any h2/h3
|
|
25
|
-
* matching either label (case-insensitive). The first matching
|
|
26
|
-
* section wins; subsequent matches are ignored so a PRD with both
|
|
27
|
-
* sections does not double-count items.
|
|
28
|
-
*
|
|
29
|
-
* Item recognition supports two shapes documented in the wave-6
|
|
30
|
-
* spec:
|
|
31
|
-
*
|
|
32
|
-
* 1. numbered lists `1. <text>` / `1) <text>`
|
|
33
|
-
* 2. markdown checklists `- [ ] <text>` / `- [x] <text>`
|
|
34
|
-
*
|
|
35
|
-
* Either shape may include inline mentions the verifier extracts:
|
|
36
|
-
* file paths (`apps/foo/bar.ts`), test specs (`*.spec.ts`),
|
|
37
|
-
* route declarations (`GET /api/x`), CLI commands (`pugi prd-check`),
|
|
38
|
-
* and doc references (`docs/foo.md`). The parser captures these
|
|
39
|
-
* verbatim into `mentions` so the verifier module can fan checks
|
|
40
|
-
* without re-tokenising the prose.
|
|
41
|
-
*/
|
|
42
|
-
const ACCEPTANCE_HEADING_RE = /^(#{2,3})\s+(acceptance criteria|success criteria|deliverables)\b\s*:?\s*$/i;
|
|
43
|
-
const ANY_HEADING_RE = /^(#{1,6})\s+\S/;
|
|
44
|
-
const TITLE_HEADING_RE = /^#\s+(.+?)\s*$/;
|
|
45
|
-
const NUMBERED_ITEM_RE = /^(\s*)(\d+)[\.)]\s+(.+?)\s*$/;
|
|
46
|
-
const CHECKLIST_ITEM_RE = /^(\s*)-\s+\[([ xX])\]\s+(.+?)\s*$/;
|
|
47
|
-
/**
|
|
48
|
-
* Public entry: parse a markdown PRD source into `ParsedPrd`. Pure
|
|
49
|
-
* function — no filesystem, no logging. The CLI handler is
|
|
50
|
-
* responsible for reading the file and forwarding the contents.
|
|
51
|
-
*/
|
|
52
|
-
export function parsePrd(source) {
|
|
53
|
-
const lines = source.split(/\r?\n/);
|
|
54
|
-
const title = extractTitle(lines);
|
|
55
|
-
const range = findAcceptanceRange(lines);
|
|
56
|
-
if (!range) {
|
|
57
|
-
return { title, hasAcceptanceSection: false, criteria: [] };
|
|
58
|
-
}
|
|
59
|
-
const sectionLines = lines.slice(range.start, range.end);
|
|
60
|
-
const criteria = extractCriteria(sectionLines);
|
|
61
|
-
return { title, hasAcceptanceSection: true, criteria };
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Extract verifiable mentions from a criterion text. Exported for
|
|
65
|
-
* the verifier spec so tests can drive mention classification
|
|
66
|
-
* without running the full parser.
|
|
67
|
-
*/
|
|
68
|
-
export function extractMentions(text) {
|
|
69
|
-
const mentions = [];
|
|
70
|
-
const seen = new Set();
|
|
71
|
-
const push = (key, mention) => {
|
|
72
|
-
if (seen.has(key))
|
|
73
|
-
return;
|
|
74
|
-
seen.add(key);
|
|
75
|
-
mentions.push(mention);
|
|
76
|
-
};
|
|
77
|
-
// 1) Routes — `GET /api/path`, `POST /foo`, etc. Recognised
|
|
78
|
-
// BEFORE file paths because the trailing `/` could otherwise
|
|
79
|
-
// be mis-classified.
|
|
80
|
-
const routeRe = /\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(\/[A-Za-z0-9_./:\-]+)/g;
|
|
81
|
-
for (const match of text.matchAll(routeRe)) {
|
|
82
|
-
const method = match[1].toUpperCase();
|
|
83
|
-
const path = match[2];
|
|
84
|
-
push(`route:${method} ${path}`, { kind: 'route', method, path });
|
|
85
|
-
}
|
|
86
|
-
// 2) Backtick-wrapped tokens — most reliable signal. The parser
|
|
87
|
-
// inspects each token and decides whether it is a path, a test
|
|
88
|
-
// spec, a CLI command, or a route.
|
|
89
|
-
const backtickRe = /`([^`\n]+)`/g;
|
|
90
|
-
for (const match of text.matchAll(backtickRe)) {
|
|
91
|
-
const raw = match[1].trim();
|
|
92
|
-
classifyToken(raw, push);
|
|
93
|
-
}
|
|
94
|
-
// 3) Bare paths with at least one slash + an extension. Authors
|
|
95
|
-
// sometimes forget the backticks; we still surface the file
|
|
96
|
-
// so the verifier can attempt the check.
|
|
97
|
-
const barePathRe = /(?<![A-Za-z0-9])((?:[a-zA-Z0-9_.\-]+\/)+[a-zA-Z0-9_.\-]+\.[a-zA-Z0-9]{1,6})/g;
|
|
98
|
-
for (const match of text.matchAll(barePathRe)) {
|
|
99
|
-
const path = match[1];
|
|
100
|
-
classifyPath(path, push);
|
|
101
|
-
}
|
|
102
|
-
return mentions;
|
|
103
|
-
}
|
|
104
|
-
function classifyToken(raw, push) {
|
|
105
|
-
const trimmed = raw.replace(/[,;.]+$/u, '').trim();
|
|
106
|
-
if (trimmed.length === 0)
|
|
107
|
-
return;
|
|
108
|
-
// Route shape inside backticks (`GET /api/x`).
|
|
109
|
-
const routeMatch = trimmed.match(/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(\/[A-Za-z0-9_./:\-]+)$/u);
|
|
110
|
-
if (routeMatch) {
|
|
111
|
-
const method = routeMatch[1].toUpperCase();
|
|
112
|
-
const path = routeMatch[2];
|
|
113
|
-
push(`route:${method} ${path}`, { kind: 'route', method, path });
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
// Pugi command — `pugi <name>` or `/<name>`. Slash form covers
|
|
117
|
-
// REPL slash commands; pugi form covers shell commands.
|
|
118
|
-
const pugiCmdMatch = trimmed.match(/^pugi\s+([a-z][a-z0-9-]*)(?:\s+.*)?$/u);
|
|
119
|
-
if (pugiCmdMatch) {
|
|
120
|
-
const name = pugiCmdMatch[1];
|
|
121
|
-
push(`command:${name}`, { kind: 'command', name });
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const slashCmdMatch = trimmed.match(/^\/([a-z][a-z0-9-]*)$/u);
|
|
125
|
-
if (slashCmdMatch) {
|
|
126
|
-
const name = slashCmdMatch[1];
|
|
127
|
-
push(`command:${name}`, { kind: 'command', name });
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
// Path shape — must contain at least one `/` AND an extension.
|
|
131
|
-
if (trimmed.includes('/') && /\.[a-zA-Z0-9]{1,6}$/.test(trimmed)) {
|
|
132
|
-
classifyPath(trimmed, push);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
function classifyPath(path, push) {
|
|
136
|
-
if (/\.spec\.[a-z]+$|\.test\.[a-z]+$/u.test(path)) {
|
|
137
|
-
push(`test:${path}`, { kind: 'test', path });
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
if (/^docs?\//u.test(path) || /\.md$/u.test(path)) {
|
|
141
|
-
push(`doc:${path}`, { kind: 'doc', path });
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
push(`file:${path}`, { kind: 'file', path });
|
|
145
|
-
}
|
|
146
|
-
function extractTitle(lines) {
|
|
147
|
-
for (const line of lines) {
|
|
148
|
-
const match = line.match(TITLE_HEADING_RE);
|
|
149
|
-
if (match) {
|
|
150
|
-
return match[1].trim();
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return null;
|
|
154
|
-
}
|
|
155
|
-
function findAcceptanceRange(lines) {
|
|
156
|
-
let startIdx = -1;
|
|
157
|
-
let startHeadingLevel = 0;
|
|
158
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
159
|
-
const line = lines[i];
|
|
160
|
-
const match = line.match(ACCEPTANCE_HEADING_RE);
|
|
161
|
-
if (match) {
|
|
162
|
-
startIdx = i + 1;
|
|
163
|
-
startHeadingLevel = match[1].length;
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (startIdx === -1)
|
|
168
|
-
return null;
|
|
169
|
-
let endIdx = lines.length;
|
|
170
|
-
for (let i = startIdx; i < lines.length; i += 1) {
|
|
171
|
-
const line = lines[i];
|
|
172
|
-
const headingMatch = line.match(ANY_HEADING_RE);
|
|
173
|
-
if (!headingMatch)
|
|
174
|
-
continue;
|
|
175
|
-
const level = headingMatch[1].length;
|
|
176
|
-
if (level <= startHeadingLevel) {
|
|
177
|
-
endIdx = i;
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
return { start: startIdx, end: endIdx };
|
|
182
|
-
}
|
|
183
|
-
function extractCriteria(sectionLines) {
|
|
184
|
-
const out = [];
|
|
185
|
-
let index = 0;
|
|
186
|
-
for (const line of sectionLines) {
|
|
187
|
-
const checklistMatch = line.match(CHECKLIST_ITEM_RE);
|
|
188
|
-
if (checklistMatch) {
|
|
189
|
-
index += 1;
|
|
190
|
-
const marker = checklistMatch[2].toLowerCase();
|
|
191
|
-
const text = checklistMatch[3];
|
|
192
|
-
out.push({
|
|
193
|
-
index,
|
|
194
|
-
text,
|
|
195
|
-
preChecked: marker === 'x',
|
|
196
|
-
mentions: extractMentions(text),
|
|
197
|
-
});
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
const numberedMatch = line.match(NUMBERED_ITEM_RE);
|
|
201
|
-
if (numberedMatch) {
|
|
202
|
-
index += 1;
|
|
203
|
-
const text = numberedMatch[3];
|
|
204
|
-
out.push({
|
|
205
|
-
index,
|
|
206
|
-
text,
|
|
207
|
-
preChecked: false,
|
|
208
|
-
mentions: extractMentions(text),
|
|
209
|
-
});
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return out;
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=parser.js.map
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRD-check reporter — Pugi (`/prd-check`).
|
|
3
|
-
*
|
|
4
|
-
* Turns a list of `VerifiedCriterion` into either a plain-text
|
|
5
|
-
* table (matches the L17 doctor renderer layout for visual
|
|
6
|
-
* consistency) OR a structured JSON envelope for scripted callers.
|
|
7
|
-
*
|
|
8
|
-
* The reporter is intentionally render-only — it does not perform
|
|
9
|
-
* any verification work. The verifier module decides PASS / FAIL /
|
|
10
|
-
* SKIPPED; the reporter only formats those verdicts. This keeps
|
|
11
|
-
* the JSON envelope deterministic + diff-friendly between runs.
|
|
12
|
-
*
|
|
13
|
-
* Exit-code policy:
|
|
14
|
-
*
|
|
15
|
-
* - `healthy` -> every criterion PASS or SKIPPED. exit 0.
|
|
16
|
-
* - `failing` -> at least one FAIL. exit 1.
|
|
17
|
-
* - `unparsed` -> the PRD had no acceptance section. exit 2
|
|
18
|
-
* (operator authored a stub but never filled it
|
|
19
|
-
* in — distinct signal from "criteria don't
|
|
20
|
-
* verify yet" so CI can route differently).
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* Build the JSON envelope. Pure transform — no fs, no clock. The
|
|
24
|
-
* CLI handler wraps this in the writeOutput sink.
|
|
25
|
-
*/
|
|
26
|
-
export function buildEnvelope(input) {
|
|
27
|
-
const counts = {
|
|
28
|
-
pass: 0,
|
|
29
|
-
fail: 0,
|
|
30
|
-
skipped: 0,
|
|
31
|
-
};
|
|
32
|
-
for (const v of input.verified) {
|
|
33
|
-
counts[v.status] += 1;
|
|
34
|
-
}
|
|
35
|
-
const overall = computeOverall(input.hasAcceptanceSection, counts);
|
|
36
|
-
return {
|
|
37
|
-
command: 'prd-check',
|
|
38
|
-
prdPath: input.prdPath,
|
|
39
|
-
title: input.title,
|
|
40
|
-
overall,
|
|
41
|
-
counts,
|
|
42
|
-
criteria: input.verified.map((v) => ({
|
|
43
|
-
index: v.criterion.index,
|
|
44
|
-
text: v.criterion.text,
|
|
45
|
-
status: v.status,
|
|
46
|
-
results: v.results.map((r) => ({
|
|
47
|
-
kind: r.mention.kind,
|
|
48
|
-
target: mentionTarget(r.mention),
|
|
49
|
-
status: r.status,
|
|
50
|
-
evidence: r.evidence,
|
|
51
|
-
})),
|
|
52
|
-
})),
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
/** Exit code for the resolved overall verdict. */
|
|
56
|
-
export function exitCodeFor(overall) {
|
|
57
|
-
switch (overall) {
|
|
58
|
-
case 'healthy':
|
|
59
|
-
return 0;
|
|
60
|
-
case 'failing':
|
|
61
|
-
return 1;
|
|
62
|
-
case 'unparsed':
|
|
63
|
-
return 2;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Plain-text renderer. Mirrors the L17 doctor table for visual
|
|
68
|
-
* consistency — 4 columns: # / STATUS / CRITERION / EVIDENCE. The
|
|
69
|
-
* criterion column is truncated to 60 chars so narrow terminals
|
|
70
|
-
* stay readable; the full text lives in the JSON envelope for
|
|
71
|
-
* scripted callers that want every byte.
|
|
72
|
-
*/
|
|
73
|
-
export function renderTable(envelope) {
|
|
74
|
-
const lines = [];
|
|
75
|
-
const titlePart = envelope.title ? ` — ${envelope.title}` : '';
|
|
76
|
-
lines.push(`Pugi PRD-check${titlePart}`);
|
|
77
|
-
lines.push('='.repeat(50));
|
|
78
|
-
lines.push(`Source: ${envelope.prdPath}`);
|
|
79
|
-
lines.push('');
|
|
80
|
-
if (envelope.overall === 'unparsed') {
|
|
81
|
-
lines.push('No acceptance-criteria section found in PRD.');
|
|
82
|
-
lines.push('');
|
|
83
|
-
lines.push('Expected one of:');
|
|
84
|
-
lines.push(' ## Acceptance Criteria');
|
|
85
|
-
lines.push(' ## Success Criteria');
|
|
86
|
-
lines.push(' ## Deliverables');
|
|
87
|
-
return lines.join('\n');
|
|
88
|
-
}
|
|
89
|
-
if (envelope.criteria.length === 0) {
|
|
90
|
-
lines.push('Acceptance section present but contains 0 items.');
|
|
91
|
-
return lines.join('\n');
|
|
92
|
-
}
|
|
93
|
-
for (const c of envelope.criteria) {
|
|
94
|
-
const status = c.status.toUpperCase().padEnd(7, ' ');
|
|
95
|
-
const truncated = c.text.length > 60 ? `${c.text.slice(0, 57)}...` : c.text;
|
|
96
|
-
lines.push(`#${String(c.index).padStart(2, ' ')} ${status} ${truncated}`);
|
|
97
|
-
for (const r of c.results) {
|
|
98
|
-
const subStatus = r.status.toUpperCase().padEnd(7, ' ');
|
|
99
|
-
lines.push(` ${subStatus} ${r.evidence}`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
lines.push('');
|
|
103
|
-
const { pass, fail, skipped } = envelope.counts;
|
|
104
|
-
const summary = envelope.overall === 'healthy' ? 'HEALTHY' : envelope.overall === 'failing' ? 'FAILING' : 'UNPARSED';
|
|
105
|
-
lines.push(`${fail} fail · ${pass} pass · ${skipped} skipped. Overall: ${summary}`);
|
|
106
|
-
return lines.join('\n');
|
|
107
|
-
}
|
|
108
|
-
function computeOverall(hasAcceptanceSection, counts) {
|
|
109
|
-
if (!hasAcceptanceSection)
|
|
110
|
-
return 'unparsed';
|
|
111
|
-
if (counts.fail > 0)
|
|
112
|
-
return 'failing';
|
|
113
|
-
return 'healthy';
|
|
114
|
-
}
|
|
115
|
-
function mentionTarget(mention) {
|
|
116
|
-
switch (mention.kind) {
|
|
117
|
-
case 'file':
|
|
118
|
-
case 'test':
|
|
119
|
-
case 'doc':
|
|
120
|
-
return mention.path;
|
|
121
|
-
case 'command':
|
|
122
|
-
return mention.name;
|
|
123
|
-
case 'route':
|
|
124
|
-
return `${mention.method} ${mention.path}`;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
//# sourceMappingURL=reporter.js.map
|