@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,211 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Repo-map scanner — .
|
|
3
|
-
*
|
|
4
|
-
* Walks the workspace via `fs.readdirSync` (sync, depth-first), filters
|
|
5
|
-
* to a recognised set of source-language extensions, and applies the
|
|
6
|
-
* shared `PugiIgnore` matcher so the same exclusion rules used by the
|
|
7
|
-
* three-tier context skeleton also gate the repo-map.
|
|
8
|
-
*
|
|
9
|
-
* Why a stand-alone scanner (vs. reusing the skeleton walker):
|
|
10
|
-
*
|
|
11
|
-
* 1. The skeleton walker emits a flat `IndexArtifact[]` of every
|
|
12
|
-
* ignore-respecting file (markdown, configs, schemas, etc.) for
|
|
13
|
-
* the working-set heuristic. The repo-map ONLY needs source
|
|
14
|
-
* files — markdown headings and JSON keys are not "definitions"
|
|
15
|
-
* in the L28 sense. Filtering downstream is cheap, but the
|
|
16
|
-
* scanner gets to short-circuit on extension before stat'ing
|
|
17
|
-
* the file, which matters for monorepos with thousands of
|
|
18
|
-
* non-source artefacts (lockfiles, schemas, fixtures).
|
|
19
|
-
*
|
|
20
|
-
* 2. We need mtime + size per file so `cache.ts` can invalidate
|
|
21
|
-
* stale entries without re-parsing. The skeleton walker
|
|
22
|
-
* surfaces only paths.
|
|
23
|
-
*
|
|
24
|
-
* 3. The L28 contract caps the walk at `MAX_SRC_FILES` (5000) and
|
|
25
|
-
* individual files at `MAX_FILE_BYTES` (200 KiB). When the cap
|
|
26
|
-
* trips the scanner returns a `{ skipped: 'too-large' }`
|
|
27
|
-
* verdict rather than partial data — the consumer must decide
|
|
28
|
-
* whether to fall back to a no-op map or surface a hint к the
|
|
29
|
-
* operator. Surfacing partial data would silently bias the
|
|
30
|
-
* injected summary toward whichever subtree the walker happened
|
|
31
|
-
* to traverse first.
|
|
32
|
-
*
|
|
33
|
-
* The output is sorted (POSIX path string compare) so two runs over
|
|
34
|
-
* the same workspace produce byte-identical `repo-map.json` caches —
|
|
35
|
-
* `cache.ts` relies on stable ordering for its hash-free freshness
|
|
36
|
-
* check. POSIX-style separators are used in `relPath` regardless of
|
|
37
|
-
* platform so the cache file stays portable.
|
|
38
|
-
*
|
|
39
|
-
* Pure module surface: no logging, no network. Errors during readdir
|
|
40
|
-
* on a single subtree (permission denied, symlink loop) are swallowed
|
|
41
|
-
* and the walker continues — repo-map is a best-effort context
|
|
42
|
-
* enrichment, never a gate.
|
|
43
|
-
*/
|
|
44
|
-
import { readdirSync, statSync } from 'node:fs';
|
|
45
|
-
import { join, posix, relative, resolve, sep } from 'node:path';
|
|
46
|
-
/**
|
|
47
|
-
* Hard ceiling on total source files surfaced by a single scan. The
|
|
48
|
-
* engine context budget is the binding constraint — a 5K-file repo
|
|
49
|
-
* already overflows the 2K-token injection cap so going higher buys
|
|
50
|
-
* nothing but walker latency. Repos above the cap fall back к the
|
|
51
|
-
* `{ skipped: 'too-large' }` verdict.
|
|
52
|
-
*/
|
|
53
|
-
export const MAX_SRC_FILES = 5000;
|
|
54
|
-
/**
|
|
55
|
-
* Per-file size cap. Files larger than this are skipped — they are
|
|
56
|
-
* almost always generated (compiled JS, vendored libs, encoded blobs)
|
|
57
|
-
* and add noise without signal. The 200 KiB threshold mirrors the
|
|
58
|
-
* skeleton walker's own `MAX_FILE_BYTES` so the two scans agree
|
|
59
|
-
* on "what counts as a source file".
|
|
60
|
-
*/
|
|
61
|
-
export const MAX_FILE_BYTES = 200 * 1024;
|
|
62
|
-
/**
|
|
63
|
-
* Source-language extensions the extractor knows how to parse. Adding
|
|
64
|
-
* a language here without a matching extractor branch is a silent
|
|
65
|
-
* no-op (the file shows up в the scan but extracts zero symbols);
|
|
66
|
-
* the spec asserts the symmetry so a future PR cannot drift the two
|
|
67
|
-
* lists out of sync.
|
|
68
|
-
*/
|
|
69
|
-
export const SUPPORTED_EXTENSIONS = Object.freeze([
|
|
70
|
-
'.ts',
|
|
71
|
-
'.tsx',
|
|
72
|
-
'.js',
|
|
73
|
-
'.jsx',
|
|
74
|
-
'.mjs',
|
|
75
|
-
'.cjs',
|
|
76
|
-
'.md',
|
|
77
|
-
'.mdx',
|
|
78
|
-
]);
|
|
79
|
-
const defaultReaddir = (path) => readdirSync(path, { withFileTypes: true });
|
|
80
|
-
const defaultStat = (path) => {
|
|
81
|
-
const s = statSync(path);
|
|
82
|
-
return { size: s.size, mtimeMs: s.mtimeMs };
|
|
83
|
-
};
|
|
84
|
-
/**
|
|
85
|
-
* Walk the workspace once and return every source file the extractor
|
|
86
|
-
* is willing to parse. The function is deliberately synchronous —
|
|
87
|
-
* the underlying walks are CPU-bound, не I/O-bound, and the sync
|
|
88
|
-
* call avoids the promise overhead that dominates for thousands of
|
|
89
|
-
* small files. The L28 engine boot path runs this on a Node `setImmediate`
|
|
90
|
-
* so the main thread is not blocked.
|
|
91
|
-
*/
|
|
92
|
-
export function scanRepoForMap(options) {
|
|
93
|
-
const root = resolve(options.root);
|
|
94
|
-
const readdir = options.readdir ?? defaultReaddir;
|
|
95
|
-
const stat = options.stat ?? defaultStat;
|
|
96
|
-
const maxFiles = options.maxFiles ?? MAX_SRC_FILES;
|
|
97
|
-
const maxFileBytes = options.maxFileBytes ?? MAX_FILE_BYTES;
|
|
98
|
-
const ignore = options.ignore;
|
|
99
|
-
const files = [];
|
|
100
|
-
let walked = 0;
|
|
101
|
-
let skippedLarge = 0;
|
|
102
|
-
let skippedIgnored = 0;
|
|
103
|
-
let tooLarge = false;
|
|
104
|
-
/**
|
|
105
|
-
* Depth-first recursion. We push dirs into a manual stack instead of
|
|
106
|
-
* recursing in JS because deep monorepos (Nx with 100+ packages)
|
|
107
|
-
* have approached the v8 default stack limit on Windows runners
|
|
108
|
-
* before; an explicit stack is one less thing to debug.
|
|
109
|
-
*/
|
|
110
|
-
const stack = [root];
|
|
111
|
-
while (stack.length > 0) {
|
|
112
|
-
const dir = stack.pop();
|
|
113
|
-
let entries;
|
|
114
|
-
try {
|
|
115
|
-
entries = readdir(dir);
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
// Permission denied / symlink loop / mid-flight delete — keep
|
|
119
|
-
// walking. Repo-map is best-effort context, never a gate.
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
for (const entry of entries) {
|
|
123
|
-
const abs = join(dir, entry.name);
|
|
124
|
-
const isDir = entry.isDirectory();
|
|
125
|
-
if (ignore.isIgnored(abs, isDir)) {
|
|
126
|
-
skippedIgnored += 1;
|
|
127
|
-
continue;
|
|
128
|
-
}
|
|
129
|
-
if (isDir) {
|
|
130
|
-
stack.push(abs);
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
if (!entry.isFile()) {
|
|
134
|
-
// Symlinks, sockets, FIFOs etc. Skip silently — they are not
|
|
135
|
-
// source code and stat'ing them can throw on broken links.
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
walked += 1;
|
|
139
|
-
const ext = extOf(entry.name);
|
|
140
|
-
if (!SUPPORTED_EXTENSIONS.includes(ext)) {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
let statResult;
|
|
144
|
-
try {
|
|
145
|
-
statResult = stat(abs);
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
// File vanished between readdir and stat — skip.
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (statResult.size > maxFileBytes) {
|
|
152
|
-
skippedLarge += 1;
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
// Workspace-relative POSIX path. `relative` returns the host
|
|
156
|
-
// separator on Windows; normalise to forward slashes so the
|
|
157
|
-
// cache file is portable.
|
|
158
|
-
const rel = relative(root, abs).split(sep).join(posix.sep);
|
|
159
|
-
files.push({
|
|
160
|
-
relPath: rel,
|
|
161
|
-
absPath: abs,
|
|
162
|
-
ext,
|
|
163
|
-
sizeBytes: statResult.size,
|
|
164
|
-
mtimeMs: statResult.mtimeMs,
|
|
165
|
-
});
|
|
166
|
-
if (files.length > maxFiles) {
|
|
167
|
-
tooLarge = true;
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (tooLarge)
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
if (tooLarge) {
|
|
175
|
-
return {
|
|
176
|
-
ok: false,
|
|
177
|
-
root,
|
|
178
|
-
skipped: {
|
|
179
|
-
reason: 'too-large',
|
|
180
|
-
walked,
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
// Sort by POSIX path for stable cache output. Two runs over the
|
|
185
|
-
// same workspace yield byte-identical JSON so the cache hash check
|
|
186
|
-
// is a simple `mtime + size` per entry without a content digest.
|
|
187
|
-
files.sort((a, b) => (a.relPath < b.relPath ? -1 : a.relPath > b.relPath ? 1 : 0));
|
|
188
|
-
return {
|
|
189
|
-
ok: true,
|
|
190
|
-
root,
|
|
191
|
-
files,
|
|
192
|
-
stats: {
|
|
193
|
-
walked,
|
|
194
|
-
kept: files.length,
|
|
195
|
-
skippedLarge,
|
|
196
|
-
skippedIgnored,
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Lowercase extension including the leading dot, or '' when the
|
|
202
|
-
* filename has no extension. Mirrors `node:path.extname` semantics —
|
|
203
|
-
* inlined so the scanner has zero per-iteration call overhead.
|
|
204
|
-
*/
|
|
205
|
-
function extOf(name) {
|
|
206
|
-
const dot = name.lastIndexOf('.');
|
|
207
|
-
if (dot < 0 || dot === 0)
|
|
208
|
-
return '';
|
|
209
|
-
return name.slice(dot).toLowerCase();
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=scanner.js.map
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git collector for `pugi retro`.
|
|
3
|
-
*
|
|
4
|
-
* Mines a window of git history into RawCommit[] using `git log
|
|
5
|
-
* --numstat --no-renames` plus a few discrete `git` calls for branch
|
|
6
|
-
* + base + user identity. All git invocations go through child_process
|
|
7
|
-
* (execFile) so we never shell-expand operator-controlled values.
|
|
8
|
-
*
|
|
9
|
-
* The collector is intentionally tolerant of a "no git" workspace —
|
|
10
|
-
* `pugi retro` should not crash on a fresh `pugi init` scratch dir.
|
|
11
|
-
* `collectGitContext` returns an empty harvest with `hasGit: false`
|
|
12
|
-
* so the renderer can emit a friendly empty-state.
|
|
13
|
-
*/
|
|
14
|
-
import { execFile } from 'node:child_process';
|
|
15
|
-
import { existsSync } from 'node:fs';
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
import { promisify } from 'node:util';
|
|
18
|
-
const execFileAsync = promisify(execFile);
|
|
19
|
-
const GIT_LOG_FORMAT = '%H%x01%an%x01%ae%x01%aI%x01%at%x01%s%x01%b';
|
|
20
|
-
const RECORD_SEP = '\x02';
|
|
21
|
-
const FIELD_SEP = '\x01';
|
|
22
|
-
/** Files counted as tests (used both for stats split + commit-type
|
|
23
|
-
* classification when the author forgets a conventional prefix). */
|
|
24
|
-
const TEST_FILE_RE = /(^|\/)(test|tests|spec|__tests__)\//i;
|
|
25
|
-
const TEST_FILE_SUFFIX_RE = /\.(spec|test)\.(ts|tsx|js|jsx|mjs|cjs)$/i;
|
|
26
|
-
function isTestFile(path) {
|
|
27
|
-
if (TEST_FILE_RE.test(path))
|
|
28
|
-
return true;
|
|
29
|
-
if (TEST_FILE_SUFFIX_RE.test(path))
|
|
30
|
-
return true;
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
/** Format a Date as `YYYY-MM-DDTHH:mm:ss` in LOCAL time (no `Z` suffix).
|
|
34
|
-
* Spec: git log `--since` parses local-time strings when no Z is given.
|
|
35
|
-
*/
|
|
36
|
-
export function formatLocalDateTime(d) {
|
|
37
|
-
const pad = (n) => n.toString().padStart(2, '0');
|
|
38
|
-
const y = d.getFullYear();
|
|
39
|
-
const mo = pad(d.getMonth() + 1);
|
|
40
|
-
const da = pad(d.getDate());
|
|
41
|
-
const h = pad(d.getHours());
|
|
42
|
-
const mi = pad(d.getMinutes());
|
|
43
|
-
const s = pad(d.getSeconds());
|
|
44
|
-
return `${y}-${mo}-${da}T${h}:${mi}:${s}`;
|
|
45
|
-
}
|
|
46
|
-
/** Detect whether the cwd lives inside a git working tree.
|
|
47
|
-
* Cheap probe: checks for a `.git` dir/file, then falls back to the
|
|
48
|
-
* actual `git rev-parse --is-inside-work-tree` for worktrees / submodules.
|
|
49
|
-
*/
|
|
50
|
-
export async function isGitWorkspace(cwd) {
|
|
51
|
-
if (existsSync(join(cwd, '.git')))
|
|
52
|
-
return true;
|
|
53
|
-
try {
|
|
54
|
-
const { stdout } = await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], { cwd });
|
|
55
|
-
return stdout.trim() === 'true';
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/** Resolve `origin/HEAD` symbolic ref → short name (e.g. `main`).
|
|
62
|
-
* Falls back to `main` if the remote ref is not set (common in fresh
|
|
63
|
-
* scratch repos with no remote).
|
|
64
|
-
*/
|
|
65
|
-
export async function detectBaseBranch(cwd) {
|
|
66
|
-
try {
|
|
67
|
-
const { stdout } = await execFileAsync('git', ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], { cwd });
|
|
68
|
-
const ref = stdout.trim();
|
|
69
|
-
if (!ref)
|
|
70
|
-
return 'main';
|
|
71
|
-
const idx = ref.lastIndexOf('/');
|
|
72
|
-
return idx === -1 ? ref : ref.slice(idx + 1);
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return 'main';
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
export async function detectCurrentBranch(cwd) {
|
|
79
|
-
try {
|
|
80
|
-
const { stdout } = await execFileAsync('git', ['branch', '--show-current'], { cwd });
|
|
81
|
-
const branch = stdout.trim();
|
|
82
|
-
return branch || 'HEAD';
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
return 'HEAD';
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
export async function detectUserIdentity(cwd) {
|
|
89
|
-
const name = await readGitConfig(cwd, 'user.name');
|
|
90
|
-
const email = await readGitConfig(cwd, 'user.email');
|
|
91
|
-
return { name: name || 'You', email: email || '' };
|
|
92
|
-
}
|
|
93
|
-
async function readGitConfig(cwd, key) {
|
|
94
|
-
try {
|
|
95
|
-
const { stdout } = await execFileAsync('git', ['config', '--get', key], { cwd });
|
|
96
|
-
return stdout.trim();
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
return '';
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/** Parse the multi-line `git log --numstat` output into RawCommit[].
|
|
103
|
-
*
|
|
104
|
-
* Format laid out as: `<header>\n<numstat lines>\n` per record,
|
|
105
|
-
* records separated by RECORD_SEP. The header has 7 fields joined by
|
|
106
|
-
* FIELD_SEP: sha, name, email, iso-date, epoch, subject, body. Each
|
|
107
|
-
* numstat line is `<ins>\t<del>\t<path>`; binary diffs surface as
|
|
108
|
-
* `-\t-\t<path>` and contribute 0/0 to the stats roll-up.
|
|
109
|
-
*/
|
|
110
|
-
export function parseGitLog(raw) {
|
|
111
|
-
const records = raw.split(RECORD_SEP).map((r) => r.trim()).filter(Boolean);
|
|
112
|
-
const commits = [];
|
|
113
|
-
for (const record of records) {
|
|
114
|
-
const lines = record.split('\n');
|
|
115
|
-
const headerLine = lines[0];
|
|
116
|
-
if (!headerLine)
|
|
117
|
-
continue;
|
|
118
|
-
const headerFields = headerLine.split(FIELD_SEP);
|
|
119
|
-
if (headerFields.length < 7)
|
|
120
|
-
continue;
|
|
121
|
-
const sha = headerFields[0] ?? '';
|
|
122
|
-
const author = headerFields[1] ?? '';
|
|
123
|
-
const authorEmail = headerFields[2] ?? '';
|
|
124
|
-
const timestamp = headerFields[3] ?? '';
|
|
125
|
-
const epochRaw = headerFields[4] ?? '0';
|
|
126
|
-
const subject = headerFields[5] ?? '';
|
|
127
|
-
const body = headerFields[6] ?? '';
|
|
128
|
-
const epochSeconds = Number.parseInt(epochRaw, 10);
|
|
129
|
-
if (!sha || !Number.isFinite(epochSeconds))
|
|
130
|
-
continue;
|
|
131
|
-
const files = [];
|
|
132
|
-
let insertions = 0;
|
|
133
|
-
let deletions = 0;
|
|
134
|
-
let testInsertions = 0;
|
|
135
|
-
let testDeletions = 0;
|
|
136
|
-
for (let i = 1; i < lines.length; i += 1) {
|
|
137
|
-
const line = lines[i];
|
|
138
|
-
if (!line)
|
|
139
|
-
continue;
|
|
140
|
-
const parts = line.split('\t');
|
|
141
|
-
if (parts.length < 3)
|
|
142
|
-
continue;
|
|
143
|
-
const insRaw = parts[0] ?? '0';
|
|
144
|
-
const delRaw = parts[1] ?? '0';
|
|
145
|
-
const path = parts[2] ?? '';
|
|
146
|
-
if (!path)
|
|
147
|
-
continue;
|
|
148
|
-
const ins = insRaw === '-' ? 0 : Number.parseInt(insRaw, 10) || 0;
|
|
149
|
-
const del = delRaw === '-' ? 0 : Number.parseInt(delRaw, 10) || 0;
|
|
150
|
-
files.push(path);
|
|
151
|
-
insertions += ins;
|
|
152
|
-
deletions += del;
|
|
153
|
-
if (isTestFile(path)) {
|
|
154
|
-
testInsertions += ins;
|
|
155
|
-
testDeletions += del;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
commits.push({
|
|
159
|
-
sha,
|
|
160
|
-
author,
|
|
161
|
-
authorEmail,
|
|
162
|
-
timestamp,
|
|
163
|
-
epochSeconds,
|
|
164
|
-
subject,
|
|
165
|
-
body,
|
|
166
|
-
files,
|
|
167
|
-
stats: { insertions, deletions, testInsertions, testDeletions },
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
return commits;
|
|
171
|
-
}
|
|
172
|
-
/** Run `git log` for the given window. The format string packs every
|
|
173
|
-
* field we need into one stream so we only spawn git once. Records
|
|
174
|
-
* are separated by RECORD_SEP and fields by FIELD_SEP (both control
|
|
175
|
-
* characters that cannot appear inside commit text), so the parser
|
|
176
|
-
* never confuses subject text containing tabs/newlines for delimiters.
|
|
177
|
-
*/
|
|
178
|
-
async function runGitLog(cwd, window) {
|
|
179
|
-
const since = formatLocalDateTime(window.since);
|
|
180
|
-
const until = formatLocalDateTime(window.until);
|
|
181
|
-
const args = [
|
|
182
|
-
'log',
|
|
183
|
-
`--since=${since}`,
|
|
184
|
-
`--until=${until}`,
|
|
185
|
-
'--no-renames',
|
|
186
|
-
'--numstat',
|
|
187
|
-
`--pretty=format:${RECORD_SEP}${GIT_LOG_FORMAT}`,
|
|
188
|
-
'HEAD',
|
|
189
|
-
];
|
|
190
|
-
try {
|
|
191
|
-
const { stdout } = await execFileAsync('git', args, {
|
|
192
|
-
cwd,
|
|
193
|
-
maxBuffer: 64 * 1024 * 1024,
|
|
194
|
-
});
|
|
195
|
-
return stdout;
|
|
196
|
-
}
|
|
197
|
-
catch {
|
|
198
|
-
return '';
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/** Count commits between the merge-base of <base>...HEAD and HEAD —
|
|
202
|
-
* i.e. how many commits the current branch has added over the base.
|
|
203
|
-
* Returns 0 when the branch is base or the base ref is unknown.
|
|
204
|
-
*/
|
|
205
|
-
export async function countCommitsAheadOfBase(cwd, base, since) {
|
|
206
|
-
try {
|
|
207
|
-
const { stdout } = await execFileAsync('git', [
|
|
208
|
-
'rev-list',
|
|
209
|
-
'--count',
|
|
210
|
-
`${base}..HEAD`,
|
|
211
|
-
`--since=${formatLocalDateTime(since)}`,
|
|
212
|
-
], { cwd });
|
|
213
|
-
const n = Number.parseInt(stdout.trim(), 10);
|
|
214
|
-
return Number.isFinite(n) ? n : 0;
|
|
215
|
-
}
|
|
216
|
-
catch {
|
|
217
|
-
return 0;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
export async function collectGitContext(options) {
|
|
221
|
-
const { cwd, window } = options;
|
|
222
|
-
const hasGit = await isGitWorkspace(cwd);
|
|
223
|
-
if (!hasGit) {
|
|
224
|
-
return {
|
|
225
|
-
hasGit: false,
|
|
226
|
-
cwd,
|
|
227
|
-
currentBranch: '',
|
|
228
|
-
baseBranch: '',
|
|
229
|
-
userName: '',
|
|
230
|
-
userEmail: '',
|
|
231
|
-
commits: [],
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
const [currentBranch, baseBranch, identity, rawLog] = await Promise.all([
|
|
235
|
-
detectCurrentBranch(cwd),
|
|
236
|
-
detectBaseBranch(cwd),
|
|
237
|
-
detectUserIdentity(cwd),
|
|
238
|
-
runGitLog(cwd, window),
|
|
239
|
-
]);
|
|
240
|
-
const commits = parseGitLog(rawLog);
|
|
241
|
-
return {
|
|
242
|
-
hasGit: true,
|
|
243
|
-
cwd,
|
|
244
|
-
currentBranch,
|
|
245
|
-
baseBranch,
|
|
246
|
-
userName: identity.name,
|
|
247
|
-
userEmail: identity.email,
|
|
248
|
-
commits,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
//# sourceMappingURL=git-collector.js.map
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace health card — Plane module oversize detection.
|
|
3
|
-
*
|
|
4
|
-
* Background (recall Pugi incident 2026-05-30): the Plane web UI
|
|
5
|
-
* tripped a React error boundary when an admin-api module accumulated
|
|
6
|
-
* ~200 issues. The actual REST API still returned 200, but the frontend
|
|
7
|
-
* choked. The fix was to keep modules at or below 60 issues and split larger ones.
|
|
8
|
-
*
|
|
9
|
-
* The health card surfaces a P1 warning when a module exceeds the
|
|
10
|
-
* recommended cap so the operator can split it before the next sprint.
|
|
11
|
-
*/
|
|
12
|
-
/** Recommended max issues per Plane module. The retro card surfaces
|
|
13
|
-
* any module exceeding this so the operator can split it. */
|
|
14
|
-
export const OVERSIZED_MODULE_THRESHOLD = 60;
|
|
15
|
-
export function computeHealthCard(modules) {
|
|
16
|
-
const oversized = modules
|
|
17
|
-
.filter((m) => m.issueCount > OVERSIZED_MODULE_THRESHOLD)
|
|
18
|
-
.sort((a, b) => b.issueCount - a.issueCount);
|
|
19
|
-
return {
|
|
20
|
-
totalModules: modules.length,
|
|
21
|
-
oversized,
|
|
22
|
-
oversizedThreshold: OVERSIZED_MODULE_THRESHOLD,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=health-card.js.map
|