@pugi/cli 0.1.0-beta.8 → 0.1.0-beta.87
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 +96 -0
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/assets/pugi-prozr2-mascot.ansi +9 -0
- package/bin/run.js +33 -1
- package/dist/commands/deploy.js +40 -40
- package/dist/commands/flatten.js +191 -0
- package/dist/commands/jobs-watch.js +201 -0
- package/dist/commands/jobs.js +42 -27
- package/dist/commands/smoke.js +133 -0
- package/dist/core/agent-progress/cleanup.js +134 -0
- package/dist/core/agent-progress/schema.js +144 -0
- package/dist/core/agent-progress/writer.js +101 -0
- package/dist/core/agents/adaptive-router.js +330 -0
- package/dist/core/agents/query-decomposer.js +297 -0
- package/dist/core/agents/registry.js +2 -2
- package/dist/core/approvals/shortcut-resolver.js +98 -0
- package/dist/core/artifact-chain/dispatcher.js +148 -0
- package/dist/core/artifact-chain/exporter.js +164 -0
- package/dist/core/artifact-chain/state.js +243 -0
- package/dist/core/artifact-chain/steps.js +169 -0
- package/dist/core/ask-user/question.js +92 -0
- package/dist/core/audit/audit-trail.js +275 -0
- package/dist/core/auth/ensure-authenticated.js +129 -0
- package/dist/core/auth/env-provider.js +238 -0
- package/dist/core/auto-open-browser.js +4 -4
- package/dist/core/auto-update/channels.js +122 -0
- package/dist/core/auto-update/checker.js +241 -0
- package/dist/core/auto-update/state.js +235 -0
- package/dist/core/bare-mode/index.js +107 -0
- package/dist/core/bash/redirect.js +281 -0
- package/dist/core/bash-classifier.js +436 -40
- package/dist/core/checkpoint/resumer.js +149 -0
- package/dist/core/checkpoint/rewinder.js +291 -0
- package/dist/core/checkpoints/shadow-git.js +670 -0
- package/dist/core/citations/parser.js +109 -0
- package/dist/core/classifier/yolo-classifier.js +88 -0
- package/dist/core/codegraph/decision-store.js +248 -0
- package/dist/core/codegraph/detect-repo.js +459 -0
- package/dist/core/codegraph/install.js +134 -0
- package/dist/core/codegraph/offer-hook.js +220 -0
- package/dist/core/compact/auto-trigger.js +96 -0
- package/dist/core/compact/buffer-rewriter.js +115 -0
- package/dist/core/compact/summarizer.js +208 -0
- package/dist/core/compact/token-counter.js +108 -0
- package/dist/core/consensus/anvil-fanout.js +25 -25
- package/dist/core/consensus/diff-capture.js +121 -12
- package/dist/core/consensus/rubric.js +21 -21
- package/dist/core/context/builder.js +6 -6
- package/dist/core/context/compaction-events.js +8 -8
- package/dist/core/context/compaction.js +31 -31
- package/dist/core/context/index.js +15 -8
- package/dist/core/context/invariants.js +51 -51
- package/dist/core/context/markdown-loader.js +28 -10
- package/dist/core/context/markdown-traverse.js +255 -0
- package/dist/core/context/pugiignore.js +41 -41
- package/dist/core/context/repo-skeleton.js +37 -37
- package/dist/core/context/tool-eviction.js +55 -0
- package/dist/core/context/watcher.js +32 -32
- package/dist/core/context/working-set.js +23 -23
- package/dist/core/coordinator/agent-tools.js +77 -0
- package/dist/core/coordinator/agent-toolset.js +65 -0
- package/dist/core/coordinator/fsm.js +73 -0
- package/dist/core/coordinator/mode-fsm.js +70 -0
- package/dist/core/cost/rate-card.js +129 -0
- package/dist/core/cost/tracker.js +221 -0
- package/dist/core/credentials.js +12 -12
- package/dist/core/cron/scheduler.js +138 -0
- package/dist/core/denial-tracking/index.js +8 -0
- package/dist/core/denial-tracking/state.js +264 -0
- package/dist/core/diagnostics/probe-runner.js +93 -0
- package/dist/core/diagnostics/probes/api.js +46 -0
- package/dist/core/diagnostics/probes/auth.js +93 -0
- package/dist/core/diagnostics/probes/bare-mode.js +42 -0
- package/dist/core/diagnostics/probes/cli-version.js +127 -0
- package/dist/core/diagnostics/probes/config.js +72 -0
- package/dist/core/diagnostics/probes/denial-tracking.js +57 -0
- package/dist/core/diagnostics/probes/disk.js +81 -0
- package/dist/core/diagnostics/probes/engine-live.js +46 -0
- package/dist/core/diagnostics/probes/git.js +65 -0
- package/dist/core/diagnostics/probes/hooks.js +118 -0
- package/dist/core/diagnostics/probes/mcp.js +75 -0
- package/dist/core/diagnostics/probes/node.js +59 -0
- package/dist/core/diagnostics/probes/pnpm.js +36 -0
- package/dist/core/diagnostics/probes/pugi-md.js +89 -0
- package/dist/core/diagnostics/probes/sandbox.js +40 -0
- package/dist/core/diagnostics/probes/session.js +74 -0
- package/dist/core/diagnostics/probes/status-snapshot.js +488 -0
- package/dist/core/diagnostics/probes/workspace.js +63 -0
- package/dist/core/diagnostics/types.js +70 -0
- package/dist/core/dispatch/cache-cleanup.js +197 -0
- package/dist/core/dispatch/cache-handoff.js +295 -0
- package/dist/core/edits/apply-patch-layer-e.js +189 -0
- package/dist/core/edits/dispatch.js +293 -7
- package/dist/core/edits/format-matrix.js +26 -0
- package/dist/core/edits/fuzzy-ladder.js +650 -0
- package/dist/core/edits/index.js +3 -1
- package/dist/core/edits/journal.js +199 -0
- package/dist/core/edits/layer-a-apply.js +15 -15
- package/dist/core/edits/layer-a-fuzzy-apply.js +198 -0
- package/dist/core/edits/layer-b-apply.js +9 -9
- package/dist/core/edits/layer-c-apply.js +6 -6
- package/dist/core/edits/layer-d-ast.js +557 -14
- package/dist/core/edits/marker-parser.js +12 -12
- package/dist/core/edits/security-gate.js +27 -27
- package/dist/core/edits/verify-hook.js +273 -0
- package/dist/core/edits/worktree.js +322 -0
- package/dist/core/engine/anvil-client.js +140 -26
- package/dist/core/engine/auto-compact.js +179 -0
- package/dist/core/engine/budgets.js +186 -0
- package/dist/core/engine/context-prefix.js +155 -0
- package/dist/core/engine/index.js +1 -1
- package/dist/core/engine/intensity.js +158 -0
- package/dist/core/engine/intent.js +260 -0
- package/dist/core/engine/native-pugi.js +1295 -227
- package/dist/core/engine/prompts.js +134 -16
- package/dist/core/engine/strip-internal-fields.js +124 -0
- package/dist/core/engine/tool-bridge.js +1295 -59
- package/dist/core/evaluation/golden-dataset.js +293 -0
- package/dist/core/feedback/queue.js +177 -0
- package/dist/core/feedback/submitter.js +145 -0
- package/dist/core/file-cache.js +113 -1
- package/dist/core/flatten/flatten-repo.js +439 -0
- package/dist/core/format/osc8-link.js +28 -0
- package/dist/core/hook-chains.js +392 -0
- package/dist/core/hooks/citation-verify-hook.js +138 -0
- package/dist/core/hooks/citation-verify.js +112 -0
- package/dist/core/hooks/events.js +44 -0
- package/dist/core/hooks/index.js +15 -0
- package/dist/core/hooks/registry.js +213 -0
- package/dist/core/hooks/runner.js +236 -0
- package/dist/core/hooks/v2/event-emitter.js +115 -0
- package/dist/core/hooks/v2/executor.js +282 -0
- package/dist/core/hooks/v2/index.js +25 -0
- package/dist/core/hooks/v2/lifecycle.js +104 -0
- package/dist/core/hooks/v2/loader.js +216 -0
- package/dist/core/hooks/v2/matcher.js +125 -0
- package/dist/core/hooks/v2/trust.js +143 -0
- package/dist/core/hooks/v2/types.js +86 -0
- package/dist/core/image/renderer.js +71 -0
- package/dist/core/init/detector.js +582 -0
- package/dist/core/init/template-renderer.js +242 -0
- package/dist/core/jobs/registry.js +18 -18
- package/dist/core/ledger/results-tsv.js +142 -0
- package/dist/core/log-discipline/stdout-redirect.js +51 -0
- package/dist/core/lsp/cache.js +105 -0
- package/dist/core/lsp/client.js +776 -0
- package/dist/core/lsp/language-detect.js +66 -0
- package/dist/core/lsp/post-edit-diagnostics.js +171 -0
- package/dist/core/lsp/symbol-tools.js +372 -0
- package/dist/core/mcp/client.js +97 -28
- package/dist/core/mcp/http-server.js +553 -0
- package/dist/core/mcp/orchestrator-tools.js +662 -0
- package/dist/core/mcp/permission.js +190 -0
- package/dist/core/mcp/registry.js +39 -17
- package/dist/core/mcp/server-tools.js +219 -0
- package/dist/core/mcp/server.js +397 -0
- package/dist/core/mcp/trust.js +10 -10
- package/dist/core/memory/dual-write.js +416 -0
- package/dist/core/memory/passive-extract.js +130 -0
- package/dist/core/memory/phase1-kinds.js +20 -0
- package/dist/core/memory/secret-scanner.js +304 -0
- package/dist/core/memory-sync/queue.js +170 -0
- package/dist/core/metrics/extract.js +113 -0
- package/dist/core/modes/roo-modes.js +68 -0
- package/dist/core/onboarding/ensure-initialized.js +133 -0
- package/dist/core/onboarding/marker.js +111 -0
- package/dist/core/onboarding/telemetry-state.js +108 -0
- package/dist/core/output-style/presets.js +176 -0
- package/dist/core/output-style/state.js +185 -0
- package/dist/core/path-security.js +287 -5
- package/dist/core/permission.js +82 -22
- package/dist/core/permissions/auto-classifier.js +124 -0
- package/dist/core/permissions/bash-parser.js +371 -0
- package/dist/core/permissions/circuit-breaker.js +83 -0
- package/dist/core/permissions/constrained-edit.js +91 -0
- package/dist/core/permissions/gate.js +278 -0
- package/dist/core/permissions/index.js +20 -0
- package/dist/core/permissions/mode.js +174 -0
- package/dist/core/permissions/network-egress.js +137 -0
- package/dist/core/permissions/state.js +241 -0
- package/dist/core/permissions/tool-class.js +93 -0
- package/dist/core/plan-mode/ui-state.js +51 -0
- package/dist/core/plans/plan-artifact.js +721 -0
- package/dist/core/policy-limits/etag-store.js +122 -0
- package/dist/core/prd-check/parser.js +215 -0
- package/dist/core/prd-check/reporter.js +127 -0
- package/dist/core/prd-check/session-review.js +557 -0
- package/dist/core/prd-check/verifiers.js +223 -0
- package/dist/core/prompt-cache/client-cache.js +99 -0
- package/dist/core/prompts/assembly.js +29 -0
- package/dist/core/prompts/registry.js +364 -0
- package/dist/core/pugi-md/cc-compat-rules.js +735 -0
- package/dist/core/pugi-md/context-injector.js +76 -0
- package/dist/core/pugi-md/walk-up.js +207 -0
- package/dist/core/python/uv-installer.js +270 -0
- package/dist/core/python/uv-resolver.js +83 -0
- package/dist/core/rate-limit/narrator.js +146 -0
- package/dist/core/recipes/cli-types.js +20 -0
- package/dist/core/recipes/loader.js +103 -0
- package/dist/core/recipes/runner.js +345 -0
- package/dist/core/recipes/schema.js +587 -0
- package/dist/core/release-notes/parser.js +241 -0
- package/dist/core/release-notes/state.js +116 -0
- package/dist/core/repl/ask.js +37 -37
- package/dist/core/repl/cancellation.js +26 -26
- package/dist/core/repl/cap-warning.js +4 -4
- package/dist/core/repl/clipboard-read.js +11 -11
- package/dist/core/repl/dispatch-fsm.js +12 -12
- package/dist/core/repl/history-search.js +15 -15
- package/dist/core/repl/history.js +28 -18
- package/dist/core/repl/kill-ring.js +5 -5
- package/dist/core/repl/model-pricing.js +135 -0
- package/dist/core/repl/privacy-banner.js +22 -22
- package/dist/core/repl/session.js +2157 -214
- package/dist/core/repl/slash-commands.js +533 -40
- package/dist/core/repl/store/index.js +1 -1
- package/dist/core/repl/store/jsonl-log.js +22 -22
- package/dist/core/repl/store/lockfile.js +10 -10
- package/dist/core/repl/store/session-store.js +136 -107
- package/dist/core/repl/store/types.js +15 -15
- package/dist/core/repl/store/uuid-v7.js +12 -12
- package/dist/core/repl/workspace-context.js +43 -21
- package/dist/core/repo-map/build.js +125 -0
- package/dist/core/repo-map/cache.js +185 -0
- package/dist/core/repo-map/extractor.js +254 -0
- package/dist/core/repo-map/formatter.js +145 -0
- package/dist/core/repo-map/page-rank.js +105 -0
- package/dist/core/repo-map/scanner.js +211 -0
- package/dist/core/retry-budget/budget.js +284 -0
- package/dist/core/retry-budget/index.js +5 -0
- package/dist/core/retry-budget/retry-cap.js +74 -0
- package/dist/core/routing/lead-worker.js +43 -0
- package/dist/core/routing/pre-flight-estimator.js +108 -0
- package/dist/core/runs/run-tree.js +103 -0
- package/dist/core/security/injection-scanner.js +367 -0
- package/dist/core/security/output-filter.js +418 -0
- package/dist/core/session/env-file.js +105 -0
- package/dist/core/session/section-budgets.js +140 -0
- package/dist/core/session.js +92 -0
- package/dist/core/settings.js +286 -5
- package/dist/core/share/formatter.js +271 -0
- package/dist/core/share/redactor.js +221 -0
- package/dist/core/share/uploader.js +267 -0
- package/dist/core/skills/defaults.js +457 -0
- package/dist/core/skills/loader.js +22 -22
- package/dist/core/skills/sources.js +27 -27
- package/dist/core/smoke/headless-driver.js +174 -0
- package/dist/core/smoke/orchestrator.js +194 -0
- package/dist/core/smoke/runner.js +238 -0
- package/dist/core/smoke/scenario-parser.js +316 -0
- package/dist/core/statusline.js +99 -0
- package/dist/core/subagents/dispatcher-real.js +600 -0
- package/dist/core/subagents/dispatcher.js +132 -43
- package/dist/core/subagents/index.js +19 -6
- package/dist/core/subagents/isolation-matrix.js +213 -0
- package/dist/core/subagents/spawn.js +19 -4
- package/dist/core/telemetry/emitter.js +229 -0
- package/dist/core/telemetry/queue.js +251 -0
- package/dist/core/theme/context.js +91 -0
- package/dist/core/theme/presets.js +228 -0
- package/dist/core/theme/state.js +181 -0
- package/dist/core/todos/invariant.js +10 -0
- package/dist/core/todos/state.js +177 -0
- package/dist/core/tool-schema/compressor.js +89 -0
- package/dist/core/transport/version-interceptor.js +166 -0
- package/dist/core/trust.js +2 -2
- package/dist/core/tui/thinking-block.js +64 -0
- package/dist/core/vim/keymap.js +288 -0
- package/dist/core/vim/state.js +92 -0
- package/dist/core/watch-markers/marker-watcher.js +133 -0
- package/dist/core/worktree-manager/cleanup.js +123 -0
- package/dist/core/worktree-manager/manager.js +303 -0
- package/dist/index.js +28 -0
- package/dist/runtime/bootstrap.js +190 -0
- package/dist/runtime/cli.js +4151 -489
- package/dist/runtime/commands/agents.js +30 -30
- package/dist/runtime/commands/budget.js +5 -5
- package/dist/runtime/commands/cancel.js +231 -0
- package/dist/runtime/commands/chain.js +489 -0
- package/dist/runtime/commands/codegraph-status.js +227 -0
- package/dist/runtime/commands/compact.js +297 -0
- package/dist/runtime/commands/config.js +32 -32
- package/dist/runtime/commands/cost.js +199 -0
- package/dist/runtime/commands/delegate.js +244 -13
- package/dist/runtime/commands/dispatch.js +126 -0
- package/dist/runtime/commands/doctor.js +579 -0
- package/dist/runtime/commands/feedback.js +184 -0
- package/dist/runtime/commands/hooks.js +184 -0
- package/dist/runtime/commands/init.js +254 -0
- package/dist/runtime/commands/lsp.js +368 -0
- package/dist/runtime/commands/mcp.js +879 -0
- package/dist/runtime/commands/memory.js +582 -0
- package/dist/runtime/commands/model.js +237 -0
- package/dist/runtime/commands/onboarding.js +275 -0
- package/dist/runtime/commands/patch.js +128 -0
- package/dist/runtime/commands/permissions.js +112 -0
- package/dist/runtime/commands/plan.js +143 -0
- package/dist/runtime/commands/prd-check.js +285 -0
- package/dist/runtime/commands/privacy.js +17 -17
- package/dist/runtime/commands/recipe.js +325 -0
- package/dist/runtime/commands/redo-blob-store.js +92 -0
- package/dist/runtime/commands/redo.js +361 -0
- package/dist/runtime/commands/release-notes.js +229 -0
- package/dist/runtime/commands/repo-map.js +95 -0
- package/dist/runtime/commands/report.js +299 -0
- package/dist/runtime/commands/resume.js +118 -0
- package/dist/runtime/commands/review-consensus.js +68 -53
- package/dist/runtime/commands/rewind.js +333 -0
- package/dist/runtime/commands/roster.js +14 -14
- package/dist/runtime/commands/sessions.js +163 -0
- package/dist/runtime/commands/share.js +316 -0
- package/dist/runtime/commands/skills.js +31 -31
- package/dist/runtime/commands/status.js +186 -0
- package/dist/runtime/commands/stickers.js +82 -0
- package/dist/runtime/commands/style.js +194 -0
- package/dist/runtime/commands/theme.js +196 -0
- package/dist/runtime/commands/undo.js +54 -22
- package/dist/runtime/commands/update.js +289 -0
- package/dist/runtime/commands/vim.js +140 -0
- package/dist/runtime/commands/worktree.js +177 -0
- package/dist/runtime/commands/worktrees.js +155 -0
- package/dist/runtime/headless-repl.js +195 -0
- package/dist/runtime/headless.js +543 -0
- package/dist/runtime/load-hooks-or-exit.js +71 -0
- package/dist/runtime/plan-decompose.js +531 -0
- package/dist/runtime/update-check.js +28 -28
- package/dist/runtime/version.js +65 -0
- package/dist/skills/bundled/batch.js +617 -0
- package/dist/skills/bundled/index.js +45 -0
- package/dist/skills/bundled/loop.js +358 -0
- package/dist/skills/bundled/remember.js +383 -0
- package/dist/skills/bundled/simplify.js +289 -0
- package/dist/skills/bundled/skillify.js +373 -0
- package/dist/skills/bundled/stuck.js +558 -0
- package/dist/skills/bundled/verify.js +439 -0
- package/dist/testing/vcr.js +486 -0
- package/dist/tools/agent-tool.js +229 -0
- package/dist/tools/apply-patch.js +556 -0
- package/dist/tools/ask-user-question.js +222 -0
- package/dist/tools/ask-user.js +115 -0
- package/dist/tools/bash.js +623 -45
- package/dist/tools/brief.js +224 -0
- package/dist/tools/enter-worktree.js +250 -0
- package/dist/tools/exit-worktree.js +147 -0
- package/dist/tools/file-tools.js +161 -44
- package/dist/tools/lsp-tools.js +189 -0
- package/dist/tools/mcp-tool.js +260 -0
- package/dist/tools/multi-edit.js +361 -0
- package/dist/tools/powershell.js +268 -0
- package/dist/tools/registry.js +85 -0
- package/dist/tools/skill-tool.js +96 -0
- package/dist/tools/sleep.js +99 -0
- package/dist/tools/synthetic-output.js +133 -0
- package/dist/tools/tasks.js +208 -0
- package/dist/tools/todo-write.js +184 -0
- package/dist/tools/verify-plan-execution.js +295 -0
- package/dist/tools/web-fetch-injection-scanner.js +207 -0
- package/dist/tools/web-fetch.js +195 -10
- package/dist/tools/web-search.js +458 -0
- package/dist/tui/agent-progress-card.js +111 -0
- package/dist/tui/agent-tree.js +11 -1
- package/dist/tui/ask-modal.js +14 -14
- package/dist/tui/ask-user-question-prompt.js +203 -0
- package/dist/tui/compact-banner.js +81 -0
- package/dist/tui/conversation-pane.js +85 -11
- package/dist/tui/cost-table.js +111 -0
- package/dist/tui/device-flow.js +2 -2
- package/dist/tui/doctor-table.js +46 -0
- package/dist/tui/feedback-prompt.js +156 -0
- package/dist/tui/input-box.js +247 -32
- package/dist/tui/login-picker.js +3 -3
- package/dist/tui/markdown-render.js +6 -6
- package/dist/tui/onboarding-wizard.js +240 -0
- package/dist/tui/permissions-picker.js +86 -0
- package/dist/tui/render.js +35 -0
- package/dist/tui/repl-render.js +332 -54
- package/dist/tui/repl-splash-art.js +16 -16
- package/dist/tui/repl-splash-mascot.js +48 -24
- package/dist/tui/repl-splash.js +22 -22
- package/dist/tui/repl.js +124 -44
- package/dist/tui/slash-palette.js +6 -6
- package/dist/tui/splash.js +2 -2
- package/dist/tui/status-bar.js +109 -31
- package/dist/tui/status-table.js +7 -0
- package/dist/tui/stickers-art.js +136 -0
- package/dist/tui/style-table.js +28 -0
- package/dist/tui/theme-table.js +29 -0
- package/dist/tui/thinking-spinner.js +123 -0
- package/dist/tui/tool-stream-pane.js +53 -4
- package/dist/tui/update-banner.js +27 -2
- package/dist/tui/vim-input.js +267 -0
- package/dist/tui/welcome-banner.js +107 -0
- package/dist/tui/welcome-data.js +293 -0
- package/dist/tui/workspace-context.js +2 -2
- package/docs/examples/codegraph.mcp.json +10 -0
- package/package.json +23 -6
- package/test/scenarios/codegen-create-file.scenario.txt +13 -0
- package/test/scenarios/compact-force.scenario.txt +11 -0
- package/test/scenarios/identity.scenario.txt +11 -0
- package/test/scenarios/persona-handoff.scenario.txt +11 -0
- package/test/scenarios/walkback.scenario.txt +12 -0
- package/dist/core/engine/compaction-hook.js +0 -154
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD criterion verifiers — Pugi (`/prd-check`).
|
|
3
|
+
*
|
|
4
|
+
* Given a `ParsedCriterion` from `parser.ts`, run a set of built-in
|
|
5
|
+
* checks against the repository workspace and return a
|
|
6
|
+
* `VerifiedCriterion` with a per-criterion verdict + per-mention
|
|
7
|
+
* evidence trail. The module owns the file-system + grep surface
|
|
8
|
+
* the parser deliberately avoided.
|
|
9
|
+
*
|
|
10
|
+
* Verdict semantics (mirror the doctor probe contract so the
|
|
11
|
+
* reporter can render both with the same column layout):
|
|
12
|
+
*
|
|
13
|
+
* - PASS : at least one mention verified AND every attempted
|
|
14
|
+
* verifier passed
|
|
15
|
+
* - FAIL : at least one verifier failed (missing file, empty
|
|
16
|
+
* doc, command not in registry, etc.)
|
|
17
|
+
* - SKIPPED : no verifiable mentions in the criterion. The
|
|
18
|
+
* criterion is preserved in the report so the
|
|
19
|
+
* operator sees it, but it does not gate the verdict.
|
|
20
|
+
*
|
|
21
|
+
* Each `MentionResult` carries an evidence string the reporter
|
|
22
|
+
* shows next to the criterion. For PASS we render the resolved
|
|
23
|
+
* absolute path or matched line; for FAIL we render the missing
|
|
24
|
+
* artifact identifier so the operator can fix it directly.
|
|
25
|
+
*
|
|
26
|
+
* The verifier deps are injected (existsSync, readFileSync, …) so
|
|
27
|
+
* the spec can drive every branch without touching the real disk.
|
|
28
|
+
* The default-bound variant `runDefaultVerifiers` plugs the real
|
|
29
|
+
* Node fs helpers in for the CLI handler.
|
|
30
|
+
*/
|
|
31
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
32
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
33
|
+
/**
|
|
34
|
+
* Top-level verify-one-criterion entry. Walks the mention list,
|
|
35
|
+
* dispatches each to the right verifier, then computes the
|
|
36
|
+
* roll-up. Pure with respect to `deps` — no globals touched.
|
|
37
|
+
*/
|
|
38
|
+
export function verifyCriterion(criterion, deps) {
|
|
39
|
+
if (criterion.mentions.length === 0) {
|
|
40
|
+
return {
|
|
41
|
+
criterion,
|
|
42
|
+
status: 'skipped',
|
|
43
|
+
results: [],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const results = [];
|
|
47
|
+
for (const mention of criterion.mentions) {
|
|
48
|
+
results.push(verifyMention(mention, deps));
|
|
49
|
+
}
|
|
50
|
+
const status = rollUp(results);
|
|
51
|
+
return { criterion, status, results };
|
|
52
|
+
}
|
|
53
|
+
/** Verify a whole PRD's worth of criteria. */
|
|
54
|
+
export function verifyAll(criteria, deps) {
|
|
55
|
+
return criteria.map((c) => verifyCriterion(c, deps));
|
|
56
|
+
}
|
|
57
|
+
function verifyMention(mention, deps) {
|
|
58
|
+
switch (mention.kind) {
|
|
59
|
+
case 'file':
|
|
60
|
+
return verifyFile(mention, deps);
|
|
61
|
+
case 'test':
|
|
62
|
+
return verifyTest(mention, deps);
|
|
63
|
+
case 'doc':
|
|
64
|
+
return verifyDoc(mention, deps);
|
|
65
|
+
case 'command':
|
|
66
|
+
return verifyCommand(mention, deps);
|
|
67
|
+
case 'route':
|
|
68
|
+
return verifyRoute(mention, deps);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function verifyFile(mention, deps) {
|
|
72
|
+
const absolute = deps.resolveWorkspacePath(mention.path);
|
|
73
|
+
if (deps.existsSync(absolute)) {
|
|
74
|
+
return {
|
|
75
|
+
mention,
|
|
76
|
+
status: 'pass',
|
|
77
|
+
evidence: `file present (${mention.path})`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
mention,
|
|
82
|
+
status: 'fail',
|
|
83
|
+
evidence: `file missing (${mention.path})`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function verifyTest(mention, deps) {
|
|
87
|
+
const absolute = deps.resolveWorkspacePath(mention.path);
|
|
88
|
+
if (!deps.existsSync(absolute)) {
|
|
89
|
+
return {
|
|
90
|
+
mention,
|
|
91
|
+
status: 'fail',
|
|
92
|
+
evidence: `spec missing (${mention.path})`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
let body;
|
|
96
|
+
try {
|
|
97
|
+
body = deps.readFileSync(absolute);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
101
|
+
return {
|
|
102
|
+
mention,
|
|
103
|
+
status: 'fail',
|
|
104
|
+
evidence: `spec unreadable: ${message}`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Count `test(`, `it(`, and `describe(...).it(` blocks. The
|
|
108
|
+
// matcher is permissive — any of the three counts because the
|
|
109
|
+
// PRD only cares whether the spec asserts anything at all.
|
|
110
|
+
const matches = body.match(/\b(it|test)\s*\(/g);
|
|
111
|
+
if (!matches || matches.length === 0) {
|
|
112
|
+
return {
|
|
113
|
+
mention,
|
|
114
|
+
status: 'fail',
|
|
115
|
+
evidence: `spec present but has 0 test()/it() blocks`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
mention,
|
|
120
|
+
status: 'pass',
|
|
121
|
+
evidence: `spec present with ${matches.length} block(s)`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function verifyDoc(mention, deps) {
|
|
125
|
+
const absolute = deps.resolveWorkspacePath(mention.path);
|
|
126
|
+
if (!deps.existsSync(absolute)) {
|
|
127
|
+
return {
|
|
128
|
+
mention,
|
|
129
|
+
status: 'fail',
|
|
130
|
+
evidence: `doc missing (${mention.path})`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
let body;
|
|
134
|
+
try {
|
|
135
|
+
body = deps.readFileSync(absolute);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
139
|
+
return {
|
|
140
|
+
mention,
|
|
141
|
+
status: 'fail',
|
|
142
|
+
evidence: `doc unreadable: ${message}`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const trimmed = body.trim();
|
|
146
|
+
if (trimmed.length < 100) {
|
|
147
|
+
return {
|
|
148
|
+
mention,
|
|
149
|
+
status: 'fail',
|
|
150
|
+
evidence: `doc present but too short (${trimmed.length} chars, < 100)`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
mention,
|
|
155
|
+
status: 'pass',
|
|
156
|
+
evidence: `doc present (${trimmed.length} chars)`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function verifyCommand(mention, deps) {
|
|
160
|
+
if (deps.isKnownCommand(mention.name)) {
|
|
161
|
+
return {
|
|
162
|
+
mention,
|
|
163
|
+
status: 'pass',
|
|
164
|
+
evidence: `command \`${mention.name}\` registered`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
mention,
|
|
169
|
+
status: 'fail',
|
|
170
|
+
evidence: `command \`${mention.name}\` not found in CLI registry`,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function verifyRoute(mention, deps) {
|
|
174
|
+
if (deps.hasRoute(mention.method, mention.path)) {
|
|
175
|
+
return {
|
|
176
|
+
mention,
|
|
177
|
+
status: 'pass',
|
|
178
|
+
evidence: `route ${mention.method} ${mention.path} registered`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
mention,
|
|
183
|
+
status: 'fail',
|
|
184
|
+
evidence: `route ${mention.method} ${mention.path} not found`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function rollUp(results) {
|
|
188
|
+
if (results.length === 0)
|
|
189
|
+
return 'skipped';
|
|
190
|
+
const anyFail = results.some((r) => r.status === 'fail');
|
|
191
|
+
if (anyFail)
|
|
192
|
+
return 'fail';
|
|
193
|
+
const anyPass = results.some((r) => r.status === 'pass');
|
|
194
|
+
return anyPass ? 'pass' : 'skipped';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Default verifier deps bound to real fs + a CLI-command predicate
|
|
198
|
+
* + a grep-based route locator. The CLI handler passes the
|
|
199
|
+
* workspace root + the known-command list at call time.
|
|
200
|
+
*/
|
|
201
|
+
export function createDefaultDeps(options) {
|
|
202
|
+
return {
|
|
203
|
+
resolveWorkspacePath: (relative) => {
|
|
204
|
+
if (isAbsolute(relative))
|
|
205
|
+
return relative;
|
|
206
|
+
return resolve(options.workspaceRoot, relative);
|
|
207
|
+
},
|
|
208
|
+
existsSync: (path) => existsSync(path),
|
|
209
|
+
readFileSync: (path) => readFileSync(path, 'utf8'),
|
|
210
|
+
isKnownCommand: (name) => options.knownCommands.has(name),
|
|
211
|
+
hasRoute: () => {
|
|
212
|
+
// Best-effort default: the wave-6 PRD says the route verifier
|
|
213
|
+
// is "best-effort grep of controllers". Since the workspace
|
|
214
|
+
// layout varies per repo, the CLI handler injects a project
|
|
215
|
+
// -aware implementation when one is available; the default
|
|
216
|
+
// stays conservative and reports `fail` so the reporter
|
|
217
|
+
// surfaces the missing-verifier signal instead of silently
|
|
218
|
+
// passing.
|
|
219
|
+
return false;
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=verifiers.js.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side prompt cache .
|
|
3
|
+
*
|
|
4
|
+
* Wraps `lru-cache` (isaacs, MIT, used by npm itself) for in-memory
|
|
5
|
+
* LRU with TTL. Cached entries survive the entire process lifetime
|
|
6
|
+
* but are intentionally NOT persisted к disk — that's a follow-up
|
|
7
|
+
* (see PUGI_CLIENT_PROMPT_CACHE_PERSIST in the spec).
|
|
8
|
+
*
|
|
9
|
+
* Anthropic's server-side prompt cache uses a 5-minute TTL. We mirror
|
|
10
|
+
* that default here so a repeated turn within a single user session
|
|
11
|
+
* benefits even when the server cache expired (e.g. across a brief
|
|
12
|
+
* network drop or a model retry to a different upstream replica).
|
|
13
|
+
*
|
|
14
|
+
* Pure wrapper — no I/O, no globals. Caller hashes the prompt itself
|
|
15
|
+
* (this keeps the cache key implementation orthogonal to whichever
|
|
16
|
+
* digest algorithm the engine prefers). The key must already include
|
|
17
|
+
* the model slug + system prompt + dialog tail digest.
|
|
18
|
+
*/
|
|
19
|
+
import { LRUCache } from 'lru-cache';
|
|
20
|
+
const DEFAULT_MAX_ENTRIES = 256;
|
|
21
|
+
const DEFAULT_TTL_MS = 5 * 60 * 1000;
|
|
22
|
+
export class ClientPromptCache {
|
|
23
|
+
store;
|
|
24
|
+
hits = 0;
|
|
25
|
+
misses = 0;
|
|
26
|
+
tokensSaved = 0;
|
|
27
|
+
constructor(options = {}) {
|
|
28
|
+
const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
29
|
+
const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
|
|
30
|
+
if (maxEntries < 1) {
|
|
31
|
+
throw new RangeError(`maxEntries must be >= 1, got ${maxEntries}`);
|
|
32
|
+
}
|
|
33
|
+
if (ttlMs <= 0) {
|
|
34
|
+
throw new RangeError(`ttlMs must be > 0, got ${ttlMs}`);
|
|
35
|
+
}
|
|
36
|
+
this.store = new LRUCache({
|
|
37
|
+
max: maxEntries,
|
|
38
|
+
ttl: ttlMs,
|
|
39
|
+
// updateAgeOnGet=false: a cache hit does NOT refresh the TTL —
|
|
40
|
+
// we want stale-after-5min semantics matching Anthropic's server
|
|
41
|
+
// cache, not "as long as someone keeps asking, keep it forever".
|
|
42
|
+
updateAgeOnGet: false,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Look up an entry. Returns null on miss or на TTL expiry.
|
|
47
|
+
* Increments hit/miss counters as a side effect.
|
|
48
|
+
*/
|
|
49
|
+
tryGet(key) {
|
|
50
|
+
const entry = this.store.get(key);
|
|
51
|
+
if (entry === undefined) {
|
|
52
|
+
this.misses += 1;
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
this.hits += 1;
|
|
56
|
+
this.tokensSaved += entry.avoidedInputTokens + entry.outputTokens;
|
|
57
|
+
return entry;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Store a response для future hits. Overwrites prior entry at the
|
|
61
|
+
* same key, resetting its TTL.
|
|
62
|
+
*/
|
|
63
|
+
set(key, entry) {
|
|
64
|
+
this.store.set(key, entry);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Drop a single key. No-op if absent. Returns true when removed.
|
|
68
|
+
*/
|
|
69
|
+
invalidate(key) {
|
|
70
|
+
return this.store.delete(key);
|
|
71
|
+
}
|
|
72
|
+
/** Clear all entries и reset hit/miss/tokensSaved counters. */
|
|
73
|
+
clear() {
|
|
74
|
+
this.store.clear();
|
|
75
|
+
this.hits = 0;
|
|
76
|
+
this.misses = 0;
|
|
77
|
+
this.tokensSaved = 0;
|
|
78
|
+
}
|
|
79
|
+
/** Snapshot of cache stats — caller-safe read. */
|
|
80
|
+
stats() {
|
|
81
|
+
return {
|
|
82
|
+
hits: this.hits,
|
|
83
|
+
misses: this.misses,
|
|
84
|
+
size: this.store.size,
|
|
85
|
+
tokensSaved: this.tokensSaved,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Hit rate в [0, 1]. Returns 0 when no lookups have happened yet
|
|
90
|
+
* (instead of NaN), so callers can render without guard.
|
|
91
|
+
*/
|
|
92
|
+
hitRate() {
|
|
93
|
+
const total = this.hits + this.misses;
|
|
94
|
+
if (total === 0)
|
|
95
|
+
return 0;
|
|
96
|
+
return this.hits / total;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=client-cache.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const SECTION_SEPARATOR = '\n\n---\n\n';
|
|
2
|
+
export function registerModule(registry, mod) {
|
|
3
|
+
registry.set(mod.key, mod);
|
|
4
|
+
}
|
|
5
|
+
export function assemblePrompt(modules, context) {
|
|
6
|
+
const registry = new Map();
|
|
7
|
+
for (const mod of modules) {
|
|
8
|
+
registerModule(registry, mod);
|
|
9
|
+
}
|
|
10
|
+
const orderedModules = [...registry.values()].sort((a, b) => b.priority - a.priority);
|
|
11
|
+
const producedSections = [];
|
|
12
|
+
const sections = [];
|
|
13
|
+
const skipped = [];
|
|
14
|
+
for (const mod of orderedModules) {
|
|
15
|
+
const produced = mod.produce(context);
|
|
16
|
+
if (produced === null || produced.length === 0) {
|
|
17
|
+
skipped.push(mod.key);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
producedSections.push(produced);
|
|
21
|
+
sections.push({ key: mod.key, size: produced.length });
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
text: producedSections.join(SECTION_SEPARATOR),
|
|
25
|
+
sections,
|
|
26
|
+
skipped,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=assembly.js.map
|