@pugi/cli 0.1.0-beta.99 → 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 -195
- 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
package/dist/tui/welcome-data.js
DELETED
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pure data layer for the `<WelcomeBanner />` component (CEO P0 #2,
|
|
3
|
-
*). Lives in its own module so it can be unit-tested without
|
|
4
|
-
* rendering Ink, and so the banner component itself contains zero IO.
|
|
5
|
-
*
|
|
6
|
-
* The banner is the 2-column boxed greeting that replaces the
|
|
7
|
-
* wave-3 `<ReplSplash />` on the bare REPL boot path. It mirrors
|
|
8
|
-
* the upstream tool's boot layout:
|
|
9
|
-
*
|
|
10
|
-
* ╭────── Pugi v0.1.0-beta.46 ──────╮
|
|
11
|
-
* │ │ Tips for getting started
|
|
12
|
-
* │ Welcome back operator! │ Run /init to create PUGI.md...
|
|
13
|
-
* │ │ ───────────
|
|
14
|
-
* │ ▗ ▗ ▖ ▖ │ What's new
|
|
15
|
-
* │ ▘▘ ▝▝ │ * 0.1.0-beta.26 — RAG ...
|
|
16
|
-
* │ Sonnet 4.6 (1M context) · Founder
|
|
17
|
-
* │ operator@gmail.com · pugi-io Org
|
|
18
|
-
* │ <workspace>
|
|
19
|
-
* ╰──────────────────────────────────╯
|
|
20
|
-
*
|
|
21
|
-
* Data sources, in priority order:
|
|
22
|
-
*
|
|
23
|
-
* - Account email + tenant + plan: JWT principal decoded from the
|
|
24
|
-
* active credential. Falls back to anonymous label when no
|
|
25
|
-
* credential is on disk (operator boots `pugi` before login).
|
|
26
|
-
* - Greeting first-name: best-effort split of the local part of the
|
|
27
|
-
* email. Falls back к "operator" when unauthenticated.
|
|
28
|
-
* - Model: env override `PUGI_ENGINE_MODEL_CODE`, then the operator's
|
|
29
|
-
* workspace settings `defaultModel`, then "Sonnet 4.6 (1M context)"
|
|
30
|
-
* as the locked default.
|
|
31
|
-
* - Cwd: absolute path of `process.cwd()` — banner left column shows
|
|
32
|
-
* the full path so the operator confirms они are в the right repo.
|
|
33
|
-
* - What's new: top 3 release-note titles from `apps/pugi-cli/CHANGELOG.md`
|
|
34
|
-
* newer than `~/.pugi/.last-seen-version`. Falls back к the top 3
|
|
35
|
-
* overall when last-seen marker is missing. Each entry is a one-line
|
|
36
|
-
* headline ("0.1.0-beta.26 — RAG consumer middleware") trimmed
|
|
37
|
-
* к 60 chars so the right column does not wrap on a 100-col terminal.
|
|
38
|
-
*
|
|
39
|
-
* Every resolver swallows its IO error and returns the documented
|
|
40
|
-
* fallback so a partial environment (missing CHANGELOG, malformed JWT,
|
|
41
|
-
* unreadable settings) never blocks the banner.
|
|
42
|
-
*/
|
|
43
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
44
|
-
import { homedir } from 'node:os';
|
|
45
|
-
import { dirname, resolve as resolvePath } from 'node:path';
|
|
46
|
-
import { fileURLToPath } from 'node:url';
|
|
47
|
-
import { DEFAULT_API_URL, normalizeApiUrl, readCredentialsFile, resolveActiveCredential, } from '../core/credentials.js';
|
|
48
|
-
import { parseChangelog } from '../core/release-notes/parser.js';
|
|
49
|
-
function decodeJwtPayload(token) {
|
|
50
|
-
try {
|
|
51
|
-
const parts = token.split('.');
|
|
52
|
-
if (parts.length < 2)
|
|
53
|
-
return null;
|
|
54
|
-
const payload = parts[1];
|
|
55
|
-
if (!payload)
|
|
56
|
-
return null;
|
|
57
|
-
const padded = payload
|
|
58
|
-
.replace(/-/g, '+')
|
|
59
|
-
.replace(/_/g, '/')
|
|
60
|
-
.padEnd(payload.length + ((4 - (payload.length % 4)) % 4), '=');
|
|
61
|
-
const json = Buffer.from(padded, 'base64').toString('utf8');
|
|
62
|
-
const obj = JSON.parse(json);
|
|
63
|
-
if (!obj || typeof obj !== 'object')
|
|
64
|
-
return null;
|
|
65
|
-
return {
|
|
66
|
-
...(typeof obj.sub === 'string' && { sub: obj.sub }),
|
|
67
|
-
...(typeof obj.email === 'string' && { email: obj.email }),
|
|
68
|
-
...(typeof obj.customerId === 'string' && { customerId: obj.customerId }),
|
|
69
|
-
...(typeof obj.plan === 'string' && { plan: obj.plan }),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/* ------------------------------------------------------------------ */
|
|
77
|
-
/* Resolvers */
|
|
78
|
-
/* ------------------------------------------------------------------ */
|
|
79
|
-
/**
|
|
80
|
-
* Derive a greeting first-name from an email's local part. The split
|
|
81
|
-
* is intentionally aggressive: dot-separated, hyphen-separated, and
|
|
82
|
-
* digit-stripped so `operator@gmail.com` resolves к "operator" instead
|
|
83
|
-
* of "operator". Title-cases the first segment. Falls back к
|
|
84
|
-
* "operator" when no email is available.
|
|
85
|
-
*
|
|
86
|
-
* Export so the spec can lock the heuristic against edge cases (numeric
|
|
87
|
-
* local part, plus-tag aliases, single-letter local part).
|
|
88
|
-
*/
|
|
89
|
-
export function deriveGreetingName(email) {
|
|
90
|
-
if (!email || typeof email !== 'string')
|
|
91
|
-
return 'operator';
|
|
92
|
-
const at = email.indexOf('@');
|
|
93
|
-
if (at <= 0)
|
|
94
|
-
return 'operator';
|
|
95
|
-
const local = email.slice(0, at);
|
|
96
|
-
// Strip plus-tag aliases (`name+tag@host` → `name`).
|
|
97
|
-
const noTag = local.split('+')[0] ?? local;
|
|
98
|
-
// First dot / hyphen / underscore segment wins; this is the
|
|
99
|
-
// colloquial "given name" surface for the vast majority of work
|
|
100
|
-
// emails ("first.last@..." / "first-last@...").
|
|
101
|
-
const firstSegment = noTag.split(/[._-]/)[0] ?? noTag;
|
|
102
|
-
// Strip trailing digits some signup flows append (`yurii2@`) so the
|
|
103
|
-
// greeting reads as a name, not a username.
|
|
104
|
-
const stripped = firstSegment.replace(/[0-9]+$/u, '');
|
|
105
|
-
if (stripped.length === 0)
|
|
106
|
-
return 'operator';
|
|
107
|
-
return stripped.charAt(0).toUpperCase() + stripped.slice(1);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Resolve the model display string. Priority:
|
|
111
|
-
*
|
|
112
|
-
* 1. `PUGI_ENGINE_MODEL_CODE` env override (operator-set in shell).
|
|
113
|
-
* 2. `.pugi/settings.json` → `defaultModel` field (per-workspace).
|
|
114
|
-
* 3. Locked default `"Sonnet 4.6 (1M context)"`.
|
|
115
|
-
*
|
|
116
|
-
* Returns the value verbatim — the banner is responsible for trimming
|
|
117
|
-
* if the string is too long for the column.
|
|
118
|
-
*/
|
|
119
|
-
export function resolveModelDisplay(env, settingsOverride) {
|
|
120
|
-
const envModel = env.PUGI_ENGINE_MODEL_CODE;
|
|
121
|
-
if (typeof envModel === 'string' && envModel.length > 0)
|
|
122
|
-
return envModel;
|
|
123
|
-
const settingsModel = settingsOverride?.defaultModel;
|
|
124
|
-
if (typeof settingsModel === 'string' && settingsModel.length > 0) {
|
|
125
|
-
return settingsModel;
|
|
126
|
-
}
|
|
127
|
-
return 'Sonnet 4.6 (1M context)';
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Locate the bundled CHANGELOG.md. The CLI ships к
|
|
131
|
-
* `node_modules/@pugi/cli/dist/tui/welcome-data.js` so the changelog
|
|
132
|
-
* lives at `node_modules/@pugi/cli/CHANGELOG.md` — two directory hops
|
|
133
|
-
* up from this file. In a local pnpm dev checkout the structure is the
|
|
134
|
-
* same (`src/tui/` ⇒ `../../CHANGELOG.md`) because tsx re-resolves the
|
|
135
|
-
* same relative tree.
|
|
136
|
-
*/
|
|
137
|
-
function defaultChangelogPath() {
|
|
138
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
139
|
-
return resolvePath(here, '..', '..', 'CHANGELOG.md');
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Read top-3 "what's new" headlines from the CLI CHANGELOG.md. Each
|
|
143
|
-
* headline is `<version> — <first non-empty section body line>` trimmed
|
|
144
|
-
* к 60 chars so the right column does not wrap on a 100-col terminal.
|
|
145
|
-
* Returns an empty array when the file is missing / unparseable.
|
|
146
|
-
*
|
|
147
|
-
* The body-line heuristic walks к the first non-empty, non-section-
|
|
148
|
-
* header line below the version header. For Keep-a-Changelog entries
|
|
149
|
-
* the second line is usually `### Added` / `### Fixed`; we skip those
|
|
150
|
-
* headers и land on the first bullet, which is the operator-visible
|
|
151
|
-
* one-liner ("- L30 `pugi theme` ...").
|
|
152
|
-
*/
|
|
153
|
-
export function readWhatsNew(changelogPath) {
|
|
154
|
-
const path = changelogPath ?? defaultChangelogPath();
|
|
155
|
-
try {
|
|
156
|
-
if (!existsSync(path))
|
|
157
|
-
return [];
|
|
158
|
-
const raw = readFileSync(path, 'utf8');
|
|
159
|
-
if (!raw || raw.length === 0)
|
|
160
|
-
return [];
|
|
161
|
-
const sections = parseChangelog(raw);
|
|
162
|
-
const headlines = [];
|
|
163
|
-
for (const section of sections) {
|
|
164
|
-
if (headlines.length >= 3)
|
|
165
|
-
break;
|
|
166
|
-
// Skip the "[Unreleased]" / "[Unreleased] - YYYY-MM-DD" section —
|
|
167
|
-
// the banner is meant к surface SHIPPED notes only. The parser
|
|
168
|
-
// captures Unreleased identically к а tagged version, so we
|
|
169
|
-
// filter here.
|
|
170
|
-
if (/^unreleased$/i.test(section.version))
|
|
171
|
-
continue;
|
|
172
|
-
const firstBullet = pickFirstBullet(section.body);
|
|
173
|
-
if (!firstBullet)
|
|
174
|
-
continue;
|
|
175
|
-
const headline = `${section.version} — ${firstBullet}`;
|
|
176
|
-
headlines.push(truncate(headline, 60));
|
|
177
|
-
}
|
|
178
|
-
return headlines;
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
return [];
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Pull the first bullet text out of a Keep-a-Changelog section body.
|
|
186
|
-
* Skips `### <subsection>` headers, blank lines, и non-bullet prose
|
|
187
|
-
* (release-note footers like "### Notes"). Returns undefined when no
|
|
188
|
-
* bullet is present.
|
|
189
|
-
*
|
|
190
|
-
* Body lines arrive verbatim from the parser; bullets follow the
|
|
191
|
-
* `- ` / `* ` Markdown convention. We strip the leading bullet glyph
|
|
192
|
-
* + the first whitespace run so the rendered string is the bullet
|
|
193
|
-
* content only.
|
|
194
|
-
*/
|
|
195
|
-
function pickFirstBullet(body) {
|
|
196
|
-
const lines = body.split('\n');
|
|
197
|
-
for (const line of lines) {
|
|
198
|
-
const trimmed = line.trim();
|
|
199
|
-
if (trimmed.length === 0)
|
|
200
|
-
continue;
|
|
201
|
-
if (trimmed.startsWith('### '))
|
|
202
|
-
continue;
|
|
203
|
-
if (trimmed.startsWith('- ') || trimmed.startsWith('* ')) {
|
|
204
|
-
// Strip leading bullet glyph + ws and collapse internal MD ticks.
|
|
205
|
-
return trimmed
|
|
206
|
-
.slice(2)
|
|
207
|
-
.replace(/`/g, '')
|
|
208
|
-
.replace(/\*\*/g, '')
|
|
209
|
-
.trim();
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return undefined;
|
|
213
|
-
}
|
|
214
|
-
function truncate(text, max) {
|
|
215
|
-
if (text.length <= max)
|
|
216
|
-
return text;
|
|
217
|
-
// Reserve 1 char for the ellipsis so we land on EXACTLY `max`
|
|
218
|
-
// visible chars including the dot. Single Unicode ellipsis would be
|
|
219
|
-
// narrower but some terminals render it as а full-width glyph in
|
|
220
|
-
// CJK locales — ASCII three-dot stays predictable.
|
|
221
|
-
return `${text.slice(0, max - 1).trimEnd()}…`;
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Resolve the active credential and decode the JWT principal. Returns
|
|
225
|
-
* the email / tenant / plan triple when authenticated, null fields when
|
|
226
|
-
* anonymous. Encapsulates the credential + JWT IO so the spec can drive
|
|
227
|
-
* the resolver via an env override.
|
|
228
|
-
*/
|
|
229
|
-
function resolvePrincipal(env, home) {
|
|
230
|
-
const credential = resolveActiveCredential(env, home);
|
|
231
|
-
if (!credential) {
|
|
232
|
-
const file = readCredentialsFile(home);
|
|
233
|
-
return {
|
|
234
|
-
apiUrl: normalizeApiUrl(env.PUGI_API_URL ?? file.activeApiUrl ?? DEFAULT_API_URL),
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
const principal = decodeJwtPayload(credential.apiKey);
|
|
238
|
-
return {
|
|
239
|
-
apiUrl: credential.apiUrl,
|
|
240
|
-
...(principal?.email && { email: principal.email }),
|
|
241
|
-
...(principal?.customerId && { tenant: principal.customerId }),
|
|
242
|
-
...(principal?.plan && { plan: principal.plan }),
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* Best-effort read of `.pugi/settings.json`. Returns null when the file
|
|
247
|
-
* is missing / unreadable / malformed so the model resolver can fall
|
|
248
|
-
* back to the env override + locked default.
|
|
249
|
-
*/
|
|
250
|
-
function readSettingsBlob(cwd) {
|
|
251
|
-
try {
|
|
252
|
-
const path = resolvePath(cwd, '.pugi', 'settings.json');
|
|
253
|
-
if (!existsSync(path))
|
|
254
|
-
return null;
|
|
255
|
-
const raw = readFileSync(path, 'utf8');
|
|
256
|
-
if (!raw || raw.length === 0)
|
|
257
|
-
return null;
|
|
258
|
-
const obj = JSON.parse(raw);
|
|
259
|
-
if (typeof obj?.defaultModel === 'string') {
|
|
260
|
-
return { defaultModel: obj.defaultModel };
|
|
261
|
-
}
|
|
262
|
-
return {};
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
return null;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
/* ------------------------------------------------------------------ */
|
|
269
|
-
/* Entry point */
|
|
270
|
-
/* ------------------------------------------------------------------ */
|
|
271
|
-
export function collectWelcomeData(input) {
|
|
272
|
-
const env = input.env ?? process.env;
|
|
273
|
-
const home = input.home ?? homedir();
|
|
274
|
-
const cwd = input.cwd ?? process.cwd();
|
|
275
|
-
const principal = resolvePrincipal(env, home);
|
|
276
|
-
const settings = input.settingsOverride !== undefined
|
|
277
|
-
? input.settingsOverride
|
|
278
|
-
: readSettingsBlob(cwd);
|
|
279
|
-
const greetingName = deriveGreetingName(principal.email);
|
|
280
|
-
const model = resolveModelDisplay(env, settings);
|
|
281
|
-
const whatsNew = readWhatsNew(input.changelogPath);
|
|
282
|
-
return {
|
|
283
|
-
greetingName,
|
|
284
|
-
...(principal.email && { email: principal.email }),
|
|
285
|
-
...(principal.tenant && { tenant: principal.tenant }),
|
|
286
|
-
...(principal.plan && { plan: principal.plan }),
|
|
287
|
-
model,
|
|
288
|
-
cwd,
|
|
289
|
-
cliVersion: input.cliVersion,
|
|
290
|
-
whatsNew,
|
|
291
|
-
};
|
|
292
|
-
}
|
|
293
|
-
//# sourceMappingURL=welcome-data.js.map
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace-context badges for the REPL bottom status bar (
|
|
3
|
-
* wave 3). Mirrors the Gemini CLI pattern where the operator sees
|
|
4
|
-
* `N GEMINI.md · N MCP · N skills · N% quota` at a glance.
|
|
5
|
-
*
|
|
6
|
-
* Pure-IO helpers: each function reads disk once, swallows every error
|
|
7
|
-
* (a missing directory is the common case for a fresh workspace), and
|
|
8
|
-
* returns a count. The REPL host calls these at mount, caches the
|
|
9
|
-
* result in component state, and passes them to `<StatusBar />`. We
|
|
10
|
-
* intentionally do NOT refresh on every keystroke — a brand-new
|
|
11
|
-
* PUGI.md does not appear mid-session often enough to warrant a
|
|
12
|
-
* watcher.
|
|
13
|
-
*/
|
|
14
|
-
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
15
|
-
import { homedir } from 'node:os';
|
|
16
|
-
import { join, resolve } from 'node:path';
|
|
17
|
-
/**
|
|
18
|
-
* Count PUGI.md files in the workspace root. We do NOT walk
|
|
19
|
-
* subdirectories — a deep grep would burn IO on every REPL boot and
|
|
20
|
-
* the convention is one root file. Mirrors how Gemini CLI counts
|
|
21
|
-
* `GEMINI.md` at the project root only.
|
|
22
|
-
*/
|
|
23
|
-
export function countPugiMdFiles(cwd) {
|
|
24
|
-
try {
|
|
25
|
-
const entries = readdirSync(cwd, { withFileTypes: true });
|
|
26
|
-
let count = 0;
|
|
27
|
-
for (const entry of entries) {
|
|
28
|
-
if (!entry.isFile())
|
|
29
|
-
continue;
|
|
30
|
-
// Case-insensitive so PUGI.md, Pugi.md, pugi.md all count.
|
|
31
|
-
if (entry.name.toLowerCase() === 'pugi.md')
|
|
32
|
-
count += 1;
|
|
33
|
-
}
|
|
34
|
-
return count;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return 0;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Count MCP servers wired into `.pugi/mcp.json` at the workspace root.
|
|
42
|
-
* Reads the file, parses JSON, returns the `servers` array length when
|
|
43
|
-
* present. Returns 0 on any failure (file missing, malformed JSON,
|
|
44
|
-
* wrong shape) — the status bar treats 0 and "error" the same.
|
|
45
|
-
*/
|
|
46
|
-
export function countMcpServers(cwd) {
|
|
47
|
-
const path = join(cwd, '.pugi', 'mcp.json');
|
|
48
|
-
if (!existsSync(path))
|
|
49
|
-
return 0;
|
|
50
|
-
try {
|
|
51
|
-
const raw = readFileSync(path, 'utf8');
|
|
52
|
-
const parsed = JSON.parse(raw);
|
|
53
|
-
if (parsed && typeof parsed === 'object') {
|
|
54
|
-
const servers = parsed.servers;
|
|
55
|
-
if (Array.isArray(servers))
|
|
56
|
-
return servers.length;
|
|
57
|
-
// Also support the `{ "<name>": { ... } }` map shape used by
|
|
58
|
-
// the Anthropic / the upstream tool mcp config convention.
|
|
59
|
-
const entries = Object.keys(parsed);
|
|
60
|
-
return entries.length;
|
|
61
|
-
}
|
|
62
|
-
return 0;
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return 0;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Count installed skills across the project-local + user-global
|
|
70
|
-
* directories: `.pugi/skills/` (per-workspace) + `~/.pugi/skills/`
|
|
71
|
-
* (per-machine). Each immediate subdirectory counts as one skill;
|
|
72
|
-
* matches the `skill-creator` convention.
|
|
73
|
-
*/
|
|
74
|
-
export function countSkills(cwd, home = homedir()) {
|
|
75
|
-
const projectDir = resolve(cwd, '.pugi', 'skills');
|
|
76
|
-
const userDir = resolve(home, '.pugi', 'skills');
|
|
77
|
-
return countSubdirs(projectDir) + countSubdirs(userDir);
|
|
78
|
-
}
|
|
79
|
-
function countSubdirs(dir) {
|
|
80
|
-
try {
|
|
81
|
-
if (!existsSync(dir))
|
|
82
|
-
return 0;
|
|
83
|
-
const stat = statSync(dir);
|
|
84
|
-
if (!stat.isDirectory())
|
|
85
|
-
return 0;
|
|
86
|
-
const entries = readdirSync(dir, { withFileTypes: true });
|
|
87
|
-
let count = 0;
|
|
88
|
-
for (const entry of entries) {
|
|
89
|
-
if (entry.isDirectory())
|
|
90
|
-
count += 1;
|
|
91
|
-
}
|
|
92
|
-
return count;
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
return 0;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
export function collectWorkspaceContext(cwd, home = homedir()) {
|
|
99
|
-
return {
|
|
100
|
-
pugiMdCount: countPugiMdFiles(cwd),
|
|
101
|
-
mcpServerCount: countMcpServers(cwd),
|
|
102
|
-
skillCount: countSkills(cwd, home),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
//# sourceMappingURL=workspace-context.js.map
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# scenario: codegen-create-file
|
|
2
|
-
# title: Pugi actually writes a file (not just describes it)
|
|
3
|
-
|
|
4
|
-
# Anti-regression for task #265 — Pugi must call Write, not describe what
|
|
5
|
-
# it would write. The headless stub responder parses
|
|
6
|
-
# "create FILE with content 'TEXT'" and runs the real fs write so the
|
|
7
|
-
# scenario validates the wiring end-to-end. When Phase 2 lands the live
|
|
8
|
-
# engine path the same scenario carries over verbatim.
|
|
9
|
-
|
|
10
|
-
> "create hello.txt with content 'hello world'"
|
|
11
|
-
EXPECT: tool-call kind=Write file=hello.txt
|
|
12
|
-
EXPECT: persona-turn contains "wrote hello.txt"
|
|
13
|
-
EXPECT_FILE: hello.txt exists with content "hello world"
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# scenario: compact-force
|
|
2
|
-
# title: /compact --force is acknowledged
|
|
3
|
-
|
|
4
|
-
# Phase 1: the stub responder echoes the directive verbatim — Phase 2
|
|
5
|
-
# wires the slash command through to the live compaction loop. Until
|
|
6
|
-
# then this scenario protects the contract between scenario authoring
|
|
7
|
-
# and the harness envelope shape. The scenario covers envelope routing,
|
|
8
|
-
# not anti-name-chant, so the persona is free to identify itself on the
|
|
9
|
-
# initial turn.
|
|
10
|
-
|
|
11
|
-
> "/compact --force"
|
|
12
|
-
EXPECT: persona-turn contains "/compact"
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# scenario: identity
|
|
2
|
-
# title: Pugi self-identifies on the very first turn
|
|
3
|
-
|
|
4
|
-
# CEO directive feedback_live_console_test_every_publish: every published
|
|
5
|
-
# beta must still answer "ты кто?" with the Pugi persona on turn 1. This
|
|
6
|
-
# is the single most-asked dialog in CEO dogfood and the regression that
|
|
7
|
-
# has bitten us most often. The intro fires once per session, so the
|
|
8
|
-
# initial envelope is expected to include the brand name verbatim.
|
|
9
|
-
|
|
10
|
-
> "ты кто?"
|
|
11
|
-
EXPECT: persona-turn contains "Pugi" OR "Пуджи"
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# scenario: persona-handoff
|
|
2
|
-
# title: Pugi hands off to Hiroshi when the operator asks for dev work
|
|
3
|
-
|
|
4
|
-
# Phase 1: the headless stub currently echoes input via the Pugi persona
|
|
5
|
-
# (real dispatch routing wires in Phase 2). The scenario is authored
|
|
6
|
-
# against the Phase 2 contract — for now it documents the intent and
|
|
7
|
-
# the harness keeps it as a soft EXPECT so the corpus stays loadable.
|
|
8
|
-
# The positive EXPECT already covers the brand name on turn 1, so no
|
|
9
|
-
# anti-name-chant assertion is needed here.
|
|
10
|
-
|
|
11
|
-
> "Hiroshi, please review the authentication module"
|
|
12
|
-
EXPECT: persona-turn contains "Pugi" OR "Hiroshi" OR "Хироси"
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# scenario: walkback
|
|
2
|
-
# title: Esc-Esc walkback / rewind directive recognized
|
|
3
|
-
|
|
4
|
-
# CEO parity ask: the operator must be able to walk back the last turn.
|
|
5
|
-
# Phase 1 ships the harness contract — the live walkback wiring lands
|
|
6
|
-
# later. The scenario asserts the stub responder acknowledges the
|
|
7
|
-
# directive verbatim so the contract holds while the real implementation
|
|
8
|
-
# lands behind it. Envelope-shape only, not anti-name-chant — the persona
|
|
9
|
-
# is free to identify itself on the initial turn.
|
|
10
|
-
|
|
11
|
-
> "/rewind 1"
|
|
12
|
-
EXPECT: persona-turn contains "/rewind"
|