gsd-pi 2.78.0 → 2.78.1-dev.9d08d820b
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/README.md +59 -23
- package/dist/bundled-resource-path.d.ts +7 -0
- package/dist/bundled-resource-path.js +34 -2
- package/dist/claude-cli-check.js +104 -33
- package/dist/cli-policy.d.ts +13 -0
- package/dist/cli-policy.js +17 -0
- package/dist/cli.js +95 -55
- package/dist/headless-query.d.ts +22 -0
- package/dist/headless-query.js +43 -8
- package/dist/headless.d.ts +10 -0
- package/dist/headless.js +16 -1
- package/dist/loader.js +9 -13
- package/dist/onboarding.d.ts +10 -0
- package/dist/onboarding.js +2 -2
- package/dist/provider-migrations.d.ts +2 -2
- package/dist/provider-migrations.js +5 -2
- package/dist/resource-loader.d.ts +5 -2
- package/dist/resource-loader.js +30 -13
- package/dist/resources/.managed-resources-content-hash +1 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +128 -32
- package/dist/resources/extensions/gsd/auto/loop.js +23 -0
- package/dist/resources/extensions/gsd/auto/phases.js +5 -13
- package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -6
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +63 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
- package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +60 -13
- package/dist/resources/extensions/gsd/auto.js +14 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +100 -31
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +34 -8
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
- package/dist/resources/extensions/gsd/commands/catalog.js +69 -5
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
- package/dist/resources/extensions/gsd/commands-config.js +3 -2
- package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
- package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/forensics.js +10 -8
- package/dist/resources/extensions/gsd/git-service.js +12 -5
- package/dist/resources/extensions/gsd/gsd-db.js +11 -2
- package/dist/resources/extensions/gsd/guided-flow.js +25 -24
- package/dist/resources/extensions/gsd/home-dir.js +16 -0
- package/dist/resources/extensions/gsd/key-manager.js +2 -1
- package/dist/resources/extensions/gsd/memory-store.js +66 -31
- package/dist/resources/extensions/gsd/migrate/command.js +3 -2
- package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
- package/dist/resources/extensions/gsd/model-router.js +114 -9
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
- package/dist/resources/extensions/gsd/preferences-models.js +91 -15
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
- package/dist/resources/extensions/gsd/preferences.js +5 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
- package/dist/resources/extensions/gsd/state.js +42 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
- package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
- package/dist/resources/extensions/gsd/worktree-command.js +26 -46
- package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +4 -13
- package/dist/resources/extensions/gsd/worktree-root.js +124 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
- package/dist/resources/extensions/gsd/worktree.js +4 -115
- package/dist/resources/extensions/mcp-client/index.js +6 -3
- package/dist/resources/extensions/ollama/index.js +15 -2
- package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
- package/dist/resources/extensions/ollama/ollama-client.js +40 -4
- package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
- package/dist/resources/extensions/subagent/index.js +324 -178
- package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/dist/rtk-shared.d.ts +3 -0
- package/dist/rtk-shared.js +17 -0
- package/dist/rtk.d.ts +2 -5
- package/dist/rtk.js +3 -20
- package/dist/runtime-checks.d.ts +27 -0
- package/dist/runtime-checks.js +38 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
- package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
- package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
- package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/package.json +2 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/worktree-cli.d.ts +1 -0
- package/dist/worktree-cli.js +9 -3
- package/dist/worktree-status-banner.d.ts +1 -0
- package/dist/worktree-status-banner.js +132 -0
- package/package.json +1 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
- package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
- package/packages/mcp-server/dist/alias-telemetry.js +30 -0
- package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +74 -46
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
- package/packages/mcp-server/src/alias-telemetry.ts +30 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
- package/packages/mcp-server/src/workflow-tools.ts +93 -58
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +13 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
- package/packages/pi-ai/src/types.ts +13 -0
- package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +4 -0
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
- package/packages/pi-coding-agent/src/core/messages.ts +4 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
- package/src/resources/extensions/gsd/auto/loop.ts +24 -2
- package/src/resources/extensions/gsd/auto/phases.ts +6 -14
- package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
- package/src/resources/extensions/gsd/auto/session.ts +5 -6
- package/src/resources/extensions/gsd/auto/types.ts +1 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
- package/src/resources/extensions/gsd/auto-prompts.ts +60 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +82 -12
- package/src/resources/extensions/gsd/auto.ts +14 -4
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +108 -31
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +39 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +75 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +22 -1
- package/src/resources/extensions/gsd/commands-config.ts +3 -2
- package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
- package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
- package/src/resources/extensions/gsd/doctor-types.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +12 -7
- package/src/resources/extensions/gsd/git-service.ts +13 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -2
- package/src/resources/extensions/gsd/guided-flow.ts +27 -26
- package/src/resources/extensions/gsd/home-dir.ts +19 -0
- package/src/resources/extensions/gsd/journal.ts +4 -1
- package/src/resources/extensions/gsd/key-manager.ts +2 -1
- package/src/resources/extensions/gsd/memory-store.ts +81 -28
- package/src/resources/extensions/gsd/migrate/command.ts +3 -2
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
- package/src/resources/extensions/gsd/model-router.ts +172 -9
- package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
- package/src/resources/extensions/gsd/preferences-models.ts +101 -15
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
- package/src/resources/extensions/gsd/state.ts +42 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
- package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
- package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
- package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
- package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
- package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
- package/src/resources/extensions/gsd/worktree-command.ts +31 -44
- package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
- package/src/resources/extensions/gsd/worktree-resolver.ts +4 -14
- package/src/resources/extensions/gsd/worktree-root.ts +144 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
- package/src/resources/extensions/gsd/worktree.ts +8 -119
- package/src/resources/extensions/mcp-client/index.ts +6 -3
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
- package/src/resources/extensions/ollama/index.ts +16 -2
- package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
- package/src/resources/extensions/ollama/ollama-client.ts +41 -4
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
- package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
- package/src/resources/extensions/subagent/index.ts +165 -7
- package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
- package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_ssgManifest.js +0 -0
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
} from "./isolation.js";
|
|
37
37
|
import { registerWorker, updateWorker } from "./worker-registry.js";
|
|
38
38
|
import { loadEffectiveGSDPreferences } from "../gsd/preferences.js";
|
|
39
|
+
import { emitJournalEvent } from "../gsd/journal.js";
|
|
39
40
|
import { CmuxClient, shellEscape } from "../cmux/index.js";
|
|
40
41
|
|
|
41
42
|
const MAX_PARALLEL_TASKS = 8;
|
|
@@ -662,11 +663,13 @@ export default function (pi: ExtensionAPI) {
|
|
|
662
663
|
"Use chain mode to pipeline: scout finds context, planner designs, worker implements.",
|
|
663
664
|
].join(" "),
|
|
664
665
|
promptGuidelines: [
|
|
665
|
-
"
|
|
666
|
-
"
|
|
667
|
-
"
|
|
668
|
-
"
|
|
669
|
-
"
|
|
666
|
+
"Prefer subagent dispatch over inline work whenever a task is self-contained — recon, planning, review, refactor, test writing, security audit, doc writing. Each dispatch gets a fresh context window, so your main session stays focused on synthesis.",
|
|
667
|
+
"Before reading more than ~3 files to understand something, dispatch the scout agent and work from its compressed report instead.",
|
|
668
|
+
"Before any change touching ≥2 packages, the orchestration kernel, auto-mode, or a public API, dispatch the planner agent first. Plan first, then implement.",
|
|
669
|
+
"You MUST use parallel mode when ≥2 ready tasks are independent of each other's output. Do not serialize independent tasks manually — that wastes wall time and context.",
|
|
670
|
+
"Use chain mode for sequential pipelines where each step's output feeds the next: scout → planner → worker, or worker → reviewer → worker.",
|
|
671
|
+
"Before opening a PR or marking a slice complete, dispatch the reviewer agent (and security agent if the change touches auth, network, parsing, file IO, or shell exec).",
|
|
672
|
+
"Always check available agents with /subagent before choosing one — there are bundled specialists plus any project-scoped agents.",
|
|
670
673
|
],
|
|
671
674
|
parameters: SubagentParams,
|
|
672
675
|
|
|
@@ -709,6 +712,141 @@ export default function (pi: ExtensionAPI) {
|
|
|
709
712
|
};
|
|
710
713
|
}
|
|
711
714
|
|
|
715
|
+
// Dispatch telemetry — emit invoked once per dispatch and completed before each return.
|
|
716
|
+
// Fresh flowId per dispatch (subagent runs aren't currently plumbed with the parent
|
|
717
|
+
// auto-mode flowId; per-dispatch ids still let us measure frequency, batch size, mode).
|
|
718
|
+
const dispatchMode: "single" | "parallel" | "chain" = hasChain ? "chain" : hasTasks ? "parallel" : "single";
|
|
719
|
+
const dispatchAgents = hasChain
|
|
720
|
+
? params.chain!.map((s) => s.agent)
|
|
721
|
+
: hasTasks
|
|
722
|
+
? params.tasks!.map((t) => t.agent)
|
|
723
|
+
: params.agent
|
|
724
|
+
? [params.agent]
|
|
725
|
+
: [];
|
|
726
|
+
const dispatchTasks = hasChain
|
|
727
|
+
? params.chain!.map((s) => s.task)
|
|
728
|
+
: hasTasks
|
|
729
|
+
? params.tasks!.map((t) => t.task)
|
|
730
|
+
: params.task
|
|
731
|
+
? [params.task]
|
|
732
|
+
: [];
|
|
733
|
+
const dispatchId = crypto.randomUUID();
|
|
734
|
+
const dispatchStartMs = Date.now();
|
|
735
|
+
let finalResults: SingleResult[] = [];
|
|
736
|
+
let dispatchCompletedEmitted = false;
|
|
737
|
+
|
|
738
|
+
emitJournalEvent(ctx.cwd, {
|
|
739
|
+
ts: new Date().toISOString(),
|
|
740
|
+
flowId: dispatchId,
|
|
741
|
+
seq: 0,
|
|
742
|
+
eventType: "subagent-invoked",
|
|
743
|
+
data: {
|
|
744
|
+
dispatchId,
|
|
745
|
+
mode: dispatchMode,
|
|
746
|
+
agents: dispatchAgents,
|
|
747
|
+
batchSize: dispatchAgents.length,
|
|
748
|
+
unitType: getCurrentPhase() ?? null,
|
|
749
|
+
isolated: useIsolation,
|
|
750
|
+
},
|
|
751
|
+
});
|
|
752
|
+
|
|
753
|
+
const zeroUsage = (): UsageStats => ({
|
|
754
|
+
input: 0,
|
|
755
|
+
output: 0,
|
|
756
|
+
cacheRead: 0,
|
|
757
|
+
cacheWrite: 0,
|
|
758
|
+
cost: 0,
|
|
759
|
+
contextTokens: 0,
|
|
760
|
+
turns: 0,
|
|
761
|
+
});
|
|
762
|
+
const errorMessageFor = (err: unknown): string =>
|
|
763
|
+
err instanceof Error ? err.message : String(err || "subagent dispatch failed");
|
|
764
|
+
const makeFailureResult = (err: unknown, agent: string, task: string, step?: number): SingleResult => {
|
|
765
|
+
const message = errorMessageFor(err);
|
|
766
|
+
return {
|
|
767
|
+
agent,
|
|
768
|
+
agentSource: "unknown",
|
|
769
|
+
task,
|
|
770
|
+
exitCode: 1,
|
|
771
|
+
messages: [],
|
|
772
|
+
stderr: message,
|
|
773
|
+
usage: zeroUsage(),
|
|
774
|
+
stopReason: signal?.aborted ? "aborted" : "error",
|
|
775
|
+
errorMessage: message,
|
|
776
|
+
...(step !== undefined ? { step } : {}),
|
|
777
|
+
};
|
|
778
|
+
};
|
|
779
|
+
const synthesizeFailureResults = (err: unknown): SingleResult[] => {
|
|
780
|
+
if (finalResults.length > 0) {
|
|
781
|
+
let patchedRunning = false;
|
|
782
|
+
const patched = finalResults.map((result) => {
|
|
783
|
+
if (result.exitCode !== -1) return result;
|
|
784
|
+
patchedRunning = true;
|
|
785
|
+
const message = errorMessageFor(err);
|
|
786
|
+
return {
|
|
787
|
+
...result,
|
|
788
|
+
exitCode: 1,
|
|
789
|
+
stderr: result.stderr || message,
|
|
790
|
+
stopReason: signal?.aborted ? "aborted" : "error",
|
|
791
|
+
errorMessage: result.errorMessage || message,
|
|
792
|
+
usage: result.usage ?? zeroUsage(),
|
|
793
|
+
};
|
|
794
|
+
});
|
|
795
|
+
if (patchedRunning || patched.some((result) => result.exitCode !== 0)) return patched;
|
|
796
|
+
|
|
797
|
+
const nextIndex = finalResults.length < dispatchAgents.length ? finalResults.length : 0;
|
|
798
|
+
if (nextIndex > 0) {
|
|
799
|
+
return [
|
|
800
|
+
...finalResults,
|
|
801
|
+
makeFailureResult(
|
|
802
|
+
err,
|
|
803
|
+
dispatchAgents[nextIndex] ?? "unknown",
|
|
804
|
+
dispatchTasks[nextIndex] ?? "",
|
|
805
|
+
dispatchMode === "chain" ? nextIndex + 1 : undefined,
|
|
806
|
+
),
|
|
807
|
+
];
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
const agentsForFailure = dispatchAgents.length > 0 ? dispatchAgents : ["unknown"];
|
|
812
|
+
return agentsForFailure.map((agent, index) =>
|
|
813
|
+
makeFailureResult(
|
|
814
|
+
err,
|
|
815
|
+
agent,
|
|
816
|
+
dispatchTasks[index] ?? "",
|
|
817
|
+
dispatchMode === "chain" ? index + 1 : undefined,
|
|
818
|
+
),
|
|
819
|
+
);
|
|
820
|
+
};
|
|
821
|
+
const finishDispatch = (results: SingleResult[]): void => {
|
|
822
|
+
if (dispatchCompletedEmitted) return;
|
|
823
|
+
finalResults = results;
|
|
824
|
+
dispatchCompletedEmitted = true;
|
|
825
|
+
const successCount = results.filter((r) => r.exitCode === 0).length;
|
|
826
|
+
const failureCount = results.filter((r) => r.exitCode !== 0).length;
|
|
827
|
+
const totalCost = results.reduce((s, r) => s + (r.usage?.cost ?? 0), 0);
|
|
828
|
+
const totalInputTokens = results.reduce((s, r) => s + (r.usage?.input ?? 0), 0);
|
|
829
|
+
const totalOutputTokens = results.reduce((s, r) => s + (r.usage?.output ?? 0), 0);
|
|
830
|
+
emitJournalEvent(ctx.cwd, {
|
|
831
|
+
ts: new Date().toISOString(),
|
|
832
|
+
flowId: dispatchId,
|
|
833
|
+
seq: 1,
|
|
834
|
+
eventType: "subagent-completed",
|
|
835
|
+
data: {
|
|
836
|
+
dispatchId,
|
|
837
|
+
mode: dispatchMode,
|
|
838
|
+
agents: dispatchAgents,
|
|
839
|
+
successCount,
|
|
840
|
+
failureCount,
|
|
841
|
+
totalCost,
|
|
842
|
+
totalInputTokens,
|
|
843
|
+
totalOutputTokens,
|
|
844
|
+
wallTimeMs: Date.now() - dispatchStartMs,
|
|
845
|
+
},
|
|
846
|
+
});
|
|
847
|
+
};
|
|
848
|
+
|
|
849
|
+
try {
|
|
712
850
|
if ((agentScope === "project" || agentScope === "both") && confirmProjectAgents && ctx.hasUI) {
|
|
713
851
|
const requestedAgentNames = new Set<string>();
|
|
714
852
|
if (params.chain) for (const step of params.chain) requestedAgentNames.add(step.agent);
|
|
@@ -726,16 +864,19 @@ export default function (pi: ExtensionAPI) {
|
|
|
726
864
|
"Run project-local agents?",
|
|
727
865
|
`Agents: ${names}\nSource: ${dir}\n\nProject agents are repo-controlled. Only continue for trusted repositories.`,
|
|
728
866
|
);
|
|
729
|
-
if (!ok)
|
|
867
|
+
if (!ok) {
|
|
868
|
+
finishDispatch([]);
|
|
730
869
|
return {
|
|
731
870
|
content: [{ type: "text", text: "Canceled: project-local agents not approved." }],
|
|
732
871
|
details: makeDetails(hasChain ? "chain" : hasTasks ? "parallel" : "single")([]),
|
|
733
872
|
};
|
|
873
|
+
}
|
|
734
874
|
}
|
|
735
875
|
}
|
|
736
876
|
|
|
737
877
|
if (params.chain && params.chain.length > 0) {
|
|
738
878
|
const results: SingleResult[] = [];
|
|
879
|
+
finalResults = results;
|
|
739
880
|
let previousOutput = "";
|
|
740
881
|
|
|
741
882
|
for (let i = 0; i < params.chain.length; i++) {
|
|
@@ -775,6 +916,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
775
916
|
if (isError) {
|
|
776
917
|
const errorMsg =
|
|
777
918
|
result.errorMessage || result.stderr || getFinalOutput(result.messages) || "(no output)";
|
|
919
|
+
finishDispatch(results);
|
|
778
920
|
return {
|
|
779
921
|
content: [{ type: "text", text: `Chain stopped at step ${i + 1} (${step.agent}): ${errorMsg}` }],
|
|
780
922
|
details: makeDetails("chain")(results),
|
|
@@ -783,6 +925,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
783
925
|
}
|
|
784
926
|
previousOutput = getFinalOutput(result.messages);
|
|
785
927
|
}
|
|
928
|
+
finishDispatch(results);
|
|
786
929
|
return {
|
|
787
930
|
content: [{ type: "text", text: getFinalOutput(results[results.length - 1].messages) || "(no output)" }],
|
|
788
931
|
details: makeDetails("chain")(results),
|
|
@@ -790,7 +933,8 @@ export default function (pi: ExtensionAPI) {
|
|
|
790
933
|
}
|
|
791
934
|
|
|
792
935
|
if (params.tasks && params.tasks.length > 0) {
|
|
793
|
-
if (params.tasks.length > MAX_PARALLEL_TASKS)
|
|
936
|
+
if (params.tasks.length > MAX_PARALLEL_TASKS) {
|
|
937
|
+
finishDispatch([]);
|
|
794
938
|
return {
|
|
795
939
|
content: [
|
|
796
940
|
{
|
|
@@ -800,6 +944,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
800
944
|
],
|
|
801
945
|
details: makeDetails("parallel")([]),
|
|
802
946
|
};
|
|
947
|
+
}
|
|
803
948
|
|
|
804
949
|
// Track all results for streaming updates
|
|
805
950
|
const allResults: SingleResult[] = new Array(params.tasks.length);
|
|
@@ -816,6 +961,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
816
961
|
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, contextTokens: 0, turns: 0 },
|
|
817
962
|
};
|
|
818
963
|
}
|
|
964
|
+
finalResults = allResults;
|
|
819
965
|
|
|
820
966
|
const emitParallelUpdate = () => {
|
|
821
967
|
if (onUpdate) {
|
|
@@ -887,6 +1033,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
887
1033
|
emitParallelUpdate();
|
|
888
1034
|
return result;
|
|
889
1035
|
});
|
|
1036
|
+
finalResults = results;
|
|
890
1037
|
|
|
891
1038
|
const successCount = results.filter((r) => r.exitCode === 0).length;
|
|
892
1039
|
const summaries = results.map((r) => {
|
|
@@ -896,6 +1043,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
896
1043
|
: getFinalOutput(r.messages);
|
|
897
1044
|
return `[${r.agent}] ${r.exitCode === 0 ? "completed" : `failed (exit ${r.exitCode})`}: ${output || "(no output)"}`;
|
|
898
1045
|
});
|
|
1046
|
+
finishDispatch(results);
|
|
899
1047
|
return {
|
|
900
1048
|
content: [
|
|
901
1049
|
{
|
|
@@ -943,6 +1091,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
943
1091
|
onUpdate,
|
|
944
1092
|
makeDetails("single"),
|
|
945
1093
|
);
|
|
1094
|
+
finalResults = [result];
|
|
946
1095
|
|
|
947
1096
|
// Capture and merge delta if isolated
|
|
948
1097
|
if (isolation) {
|
|
@@ -956,6 +1105,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
956
1105
|
if (isError) {
|
|
957
1106
|
const errorMsg =
|
|
958
1107
|
result.errorMessage || result.stderr || getFinalOutput(result.messages) || "(no output)";
|
|
1108
|
+
finishDispatch([result]);
|
|
959
1109
|
return {
|
|
960
1110
|
content: [{ type: "text", text: `Agent ${result.stopReason || "failed"}: ${errorMsg}` }],
|
|
961
1111
|
details: makeDetails("single")([result]),
|
|
@@ -967,6 +1117,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
967
1117
|
if (mergeResult && !mergeResult.success) {
|
|
968
1118
|
outputText += `\n\n⚠ Patch merge failed: ${mergeResult.error || "unknown error"}`;
|
|
969
1119
|
}
|
|
1120
|
+
finishDispatch([result]);
|
|
970
1121
|
return {
|
|
971
1122
|
content: [{ type: "text", text: outputText }],
|
|
972
1123
|
details: makeDetails("single")([result]),
|
|
@@ -978,11 +1129,18 @@ export default function (pi: ExtensionAPI) {
|
|
|
978
1129
|
}
|
|
979
1130
|
}
|
|
980
1131
|
|
|
1132
|
+
finishDispatch([]);
|
|
981
1133
|
const available = agents.map((a) => `${a.name} (${a.source})`).join(", ") || "none";
|
|
982
1134
|
return {
|
|
983
1135
|
content: [{ type: "text", text: `Invalid parameters. Available agents: ${available}` }],
|
|
984
1136
|
details: makeDetails("single")([]),
|
|
985
1137
|
};
|
|
1138
|
+
} catch (err) {
|
|
1139
|
+
if (!dispatchCompletedEmitted) finalResults = synthesizeFailureResults(err);
|
|
1140
|
+
throw err;
|
|
1141
|
+
} finally {
|
|
1142
|
+
finishDispatch(finalResults);
|
|
1143
|
+
}
|
|
986
1144
|
},
|
|
987
1145
|
|
|
988
1146
|
renderCall(args, theme) {
|
|
@@ -19,8 +19,8 @@ Note: `~/.gsd/agent/extensions/` is reserved for bundled extensions synced from
|
|
|
19
19
|
3. **Commands** — Give users slash commands (`pi.registerCommand()`). Users type `/mycommand`.
|
|
20
20
|
|
|
21
21
|
**Non-negotiable rules:**
|
|
22
|
-
- Use `StringEnum` from `@
|
|
23
|
-
- Truncate tool output to 50KB / 2000 lines max (use `truncateHead`/`truncateTail` from `@
|
|
22
|
+
- Use `StringEnum` from `@gsd/pi-ai` for string enum params (NOT `Type.Union`/`Type.Literal` — breaks Google's API)
|
|
23
|
+
- Truncate tool output to 50KB / 2000 lines max (use `truncateHead`/`truncateTail` from `@gsd/pi-coding-agent`)
|
|
24
24
|
- Store stateful tool state in `details` for branching support
|
|
25
25
|
- Check `signal?.aborted` in long-running tool executions
|
|
26
26
|
- Use `pi.exec()` not `child_process` for shell commands
|
|
@@ -34,10 +34,10 @@ Note: `~/.gsd/agent/extensions/` is reserved for bundled extensions synced from
|
|
|
34
34
|
|
|
35
35
|
| Package | Purpose |
|
|
36
36
|
|---------|---------|
|
|
37
|
-
| `@
|
|
37
|
+
| `@gsd/pi-coding-agent` | `ExtensionAPI`, `ExtensionContext`, `Theme`, event types, tool utilities, `DynamicBorder`, `BorderedLoader`, `CustomEditor`, `highlightCode` |
|
|
38
38
|
| `@sinclair/typebox` | `Type.Object`, `Type.String`, `Type.Number`, `Type.Optional`, `Type.Boolean`, `Type.Array` |
|
|
39
|
-
| `@
|
|
40
|
-
| `@
|
|
39
|
+
| `@gsd/pi-ai` | `StringEnum` (required for string enums), `Type` re-export |
|
|
40
|
+
| `@gsd/pi-tui` | `Text`, `Box`, `Container`, `Spacer`, `Markdown`, `SelectList`, `Input`, `matchesKey`, `Key`, `truncateToWidth`, `visibleWidth` |
|
|
41
41
|
| Node.js built-ins | `node:fs`, `node:path`, `node:child_process`, etc. |
|
|
42
42
|
|
|
43
43
|
</essential_principles>
|
|
@@ -65,6 +65,9 @@ All domain knowledge in `references/`:
|
|
|
65
65
|
**Capabilities:** custom-tools.md, custom-commands.md, custom-ui.md, custom-rendering.md
|
|
66
66
|
**Patterns:** state-management.md, system-prompt-modification.md, compaction-session-control.md
|
|
67
67
|
**Infrastructure:** model-provider-management.md, remote-execution-overrides.md, packaging-distribution.md, mode-behavior.md
|
|
68
|
+
**Spec:** `docs/extension-sdk/manifest-spec.md` — manifest format, tiers, validation
|
|
69
|
+
**Testing:** `docs/extension-sdk/testing.md` — mock patterns, test conventions
|
|
70
|
+
**SDK:** `docs/extension-sdk/` — the authoritative GSD-2 extension guide
|
|
68
71
|
**Gotchas:** key-rules-gotchas.md
|
|
69
72
|
</reference_index>
|
|
70
73
|
|
|
@@ -78,6 +81,7 @@ All domain knowledge in `references/`:
|
|
|
78
81
|
|
|
79
82
|
<success_criteria>
|
|
80
83
|
Extension is complete when:
|
|
84
|
+
- `extension-manifest.json` exists with accurate `provides` listing all registered tools/commands/hooks/shortcuts
|
|
81
85
|
- TypeScript compiles without errors (jiti handles this at runtime)
|
|
82
86
|
- Extension loads on GSD startup or `/reload` without errors
|
|
83
87
|
- Tools appear in the LLM's system prompt and are callable
|
|
@@ -19,7 +19,7 @@ pi.registerCommand("deploy", {
|
|
|
19
19
|
Add tab-completion for command arguments:
|
|
20
20
|
|
|
21
21
|
```typescript
|
|
22
|
-
import type { AutocompleteItem } from "@
|
|
22
|
+
import type { AutocompleteItem } from "@gsd/pi-tui";
|
|
23
23
|
|
|
24
24
|
pi.registerCommand("deploy", {
|
|
25
25
|
description: "Deploy to an environment",
|
|
@@ -6,8 +6,8 @@ Custom rendering for tools and messages — control how they appear in the TUI.
|
|
|
6
6
|
Tools can provide `renderCall` (how the call looks) and `renderResult` (how the result looks):
|
|
7
7
|
|
|
8
8
|
```typescript
|
|
9
|
-
import { Text } from "@
|
|
10
|
-
import { keyHint } from "@
|
|
9
|
+
import { Text } from "@gsd/pi-tui";
|
|
10
|
+
import { keyHint } from "@gsd/pi-coding-agent";
|
|
11
11
|
|
|
12
12
|
pi.registerTool({
|
|
13
13
|
name: "my_tool",
|
|
@@ -54,7 +54,7 @@ If you omit `renderCall`/`renderResult`, the built-in renderer is used. Useful f
|
|
|
54
54
|
Key hint helpers for showing keybinding info in render output:
|
|
55
55
|
|
|
56
56
|
```typescript
|
|
57
|
-
import { keyHint, appKeyHint, editorKey, rawKeyHint } from "@
|
|
57
|
+
import { keyHint, appKeyHint, editorKey, rawKeyHint } from "@gsd/pi-coding-agent";
|
|
58
58
|
|
|
59
59
|
// Editor action hint (respects user keybinding config)
|
|
60
60
|
keyHint("expandTools", "to expand") // e.g., "Ctrl+O to expand"
|
|
@@ -69,7 +69,7 @@ rawKeyHint("Ctrl+O", "to expand")
|
|
|
69
69
|
Register a renderer for custom message types:
|
|
70
70
|
|
|
71
71
|
```typescript
|
|
72
|
-
import { Text } from "@
|
|
72
|
+
import { Text } from "@gsd/pi-tui";
|
|
73
73
|
|
|
74
74
|
pi.registerMessageRenderer("my-extension", (message, options, theme) => {
|
|
75
75
|
const { expanded } = options;
|
|
@@ -92,7 +92,7 @@ pi.sendMessage({
|
|
|
92
92
|
|
|
93
93
|
<syntax_highlighting>
|
|
94
94
|
```typescript
|
|
95
|
-
import { highlightCode, getLanguageFromPath } from "@
|
|
95
|
+
import { highlightCode, getLanguageFromPath } from "@gsd/pi-coding-agent";
|
|
96
96
|
|
|
97
97
|
const lang = getLanguageFromPath("/path/to/file.rs"); // "rust"
|
|
98
98
|
const highlighted = highlightCode(code, lang, theme);
|
|
@@ -5,7 +5,7 @@ Complete custom tools reference — registration, parameters, execution, output
|
|
|
5
5
|
<registration>
|
|
6
6
|
```typescript
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
8
|
-
import { StringEnum } from "@
|
|
8
|
+
import { StringEnum } from "@gsd/pi-ai";
|
|
9
9
|
|
|
10
10
|
pi.registerTool({
|
|
11
11
|
name: "my_tool", // Unique identifier (snake_case)
|
|
@@ -60,7 +60,7 @@ pi.registerTool({
|
|
|
60
60
|
**⚠️ MUST use `StringEnum` for string enum parameters:**
|
|
61
61
|
|
|
62
62
|
```typescript
|
|
63
|
-
import { StringEnum } from "@
|
|
63
|
+
import { StringEnum } from "@gsd/pi-ai";
|
|
64
64
|
|
|
65
65
|
// ✅ Correct — works with all providers including Google
|
|
66
66
|
action: StringEnum(["list", "add", "remove"] as const)
|
|
@@ -77,7 +77,7 @@ Tools MUST truncate output to avoid context overflow. Built-in limit: 50KB / 200
|
|
|
77
77
|
import {
|
|
78
78
|
truncateHead, truncateTail, formatSize,
|
|
79
79
|
DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES,
|
|
80
|
-
} from "@
|
|
80
|
+
} from "@gsd/pi-coding-agent";
|
|
81
81
|
|
|
82
82
|
async execute(toolCallId, params, signal, onUpdate, ctx) {
|
|
83
83
|
const output = await runCommand();
|
|
@@ -129,7 +129,7 @@ Use `pi.setActiveTools(names)` to enable/disable tools at runtime.
|
|
|
129
129
|
Register a tool with the same name as a built-in (`read`, `bash`, `edit`, `write`, `grep`, `find`, `ls`) to override it. **Must match exact result shape including `details` type.**
|
|
130
130
|
|
|
131
131
|
```typescript
|
|
132
|
-
import { createReadTool } from "@
|
|
132
|
+
import { createReadTool } from "@gsd/pi-coding-agent";
|
|
133
133
|
|
|
134
134
|
pi.registerTool({
|
|
135
135
|
name: "read",
|
|
@@ -277,7 +277,7 @@ bottom-left bottom-center bottom-right
|
|
|
277
277
|
Replace the main input editor permanently:
|
|
278
278
|
|
|
279
279
|
```typescript
|
|
280
|
-
import { CustomEditor } from "@
|
|
280
|
+
import { CustomEditor } from "@gsd/pi-coding-agent";
|
|
281
281
|
|
|
282
282
|
class VimEditor extends CustomEditor {
|
|
283
283
|
private mode: "normal" | "insert" = "insert";
|
|
@@ -307,7 +307,7 @@ ctx.ui.setEditorComponent(undefined); // Restore default
|
|
|
307
307
|
</custom_editor>
|
|
308
308
|
|
|
309
309
|
<built_in_components>
|
|
310
|
-
**From `@
|
|
310
|
+
**From `@gsd/pi-tui`:**
|
|
311
311
|
|
|
312
312
|
| Component | Constructor | Purpose |
|
|
313
313
|
|-----------|-------------|---------|
|
|
@@ -352,7 +352,7 @@ const settings = new SettingsList(items, 15, getSettingsListTheme(),
|
|
|
352
352
|
);
|
|
353
353
|
```
|
|
354
354
|
|
|
355
|
-
**From `@
|
|
355
|
+
**From `@gsd/pi-coding-agent`:**
|
|
356
356
|
|
|
357
357
|
| Component | Constructor | Purpose |
|
|
358
358
|
|-----------|-------------|---------|
|
|
@@ -363,7 +363,7 @@ const settings = new SettingsList(items, 15, getSettingsListTheme(),
|
|
|
363
363
|
|
|
364
364
|
<keyboard_input>
|
|
365
365
|
```typescript
|
|
366
|
-
import { matchesKey, Key } from "@
|
|
366
|
+
import { matchesKey, Key } from "@gsd/pi-tui";
|
|
367
367
|
|
|
368
368
|
handleInput(data: string) {
|
|
369
369
|
// Basic keys
|
|
@@ -403,7 +403,7 @@ handleInput(data: string) {
|
|
|
403
403
|
**Cardinal rule: each line from render() must not exceed `width` visible characters.**
|
|
404
404
|
|
|
405
405
|
```typescript
|
|
406
|
-
import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@
|
|
406
|
+
import { visibleWidth, truncateToWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
|
|
407
407
|
|
|
408
408
|
visibleWidth("\x1b[32mHello\x1b[0m"); // Returns 5 (ignores ANSI codes)
|
|
409
409
|
truncateToWidth("Very long text here", 10); // "Very lo..."
|
|
@@ -470,7 +470,7 @@ Always use theme from callback params, never import directly.
|
|
|
470
470
|
|
|
471
471
|
**Syntax highlighting:**
|
|
472
472
|
```typescript
|
|
473
|
-
import { highlightCode, getLanguageFromPath } from "@
|
|
473
|
+
import { highlightCode, getLanguageFromPath } from "@gsd/pi-coding-agent";
|
|
474
474
|
const lang = getLanguageFromPath("/file.rs"); // "rust"
|
|
475
475
|
const highlighted = highlightCode(code, lang, theme);
|
|
476
476
|
```
|
|
@@ -47,7 +47,7 @@ pi.on("before_agent_start", async (event, ctx) => {
|
|
|
47
47
|
|
|
48
48
|
**tool_call** — Fired before tool executes. Can block.
|
|
49
49
|
```typescript
|
|
50
|
-
import { isToolCallEventType } from "@
|
|
50
|
+
import { isToolCallEventType } from "@gsd/pi-coding-agent";
|
|
51
51
|
|
|
52
52
|
pi.on("tool_call", async (event, ctx) => {
|
|
53
53
|
if (isToolCallEventType("bash", event)) {
|
|
@@ -61,7 +61,7 @@ pi.on("tool_call", async (event, ctx) => {
|
|
|
61
61
|
|
|
62
62
|
**tool_result** — Fired after tool executes. Can modify result. Handlers chain like middleware.
|
|
63
63
|
```typescript
|
|
64
|
-
import { isToolResultEventType } from "@
|
|
64
|
+
import { isToolResultEventType } from "@gsd/pi-coding-agent";
|
|
65
65
|
|
|
66
66
|
pi.on("tool_result", async (event, ctx) => {
|
|
67
67
|
if (isToolResultEventType("bash", event)) {
|
|
@@ -105,7 +105,7 @@ pi.on("model_select", async (event, ctx) => {
|
|
|
105
105
|
Built-in type guards for tool events:
|
|
106
106
|
|
|
107
107
|
```typescript
|
|
108
|
-
import { isToolCallEventType, isToolResultEventType } from "@
|
|
108
|
+
import { isToolCallEventType, isToolResultEventType } from "@gsd/pi-coding-agent";
|
|
109
109
|
|
|
110
110
|
// Tool calls — narrows event.input type
|
|
111
111
|
if (isToolCallEventType("bash", event)) { /* event.input: { command, timeout? } */ }
|
|
@@ -39,7 +39,7 @@ If no `pi` manifest exists, auto-discovers:
|
|
|
39
39
|
</convention_directories>
|
|
40
40
|
|
|
41
41
|
<dependencies>
|
|
42
|
-
- List `@
|
|
42
|
+
- List `@gsd/pi-ai`, `@gsd/pi-coding-agent`, `@gsd/pi-tui`, `@sinclair/typebox` in `peerDependencies` with `"*"` — they're bundled by the runtime.
|
|
43
43
|
- Other npm deps go in `dependencies`. The runtime runs `npm install` on package installation.
|
|
44
44
|
</dependencies>
|
|
45
45
|
|
|
@@ -6,7 +6,7 @@ Remote execution via pluggable operations, spawnHook for bash, and tool override
|
|
|
6
6
|
Built-in tools support pluggable operations for SSH, containers, etc.:
|
|
7
7
|
|
|
8
8
|
```typescript
|
|
9
|
-
import { createReadTool, createBashTool, createWriteTool } from "@
|
|
9
|
+
import { createReadTool, createBashTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
10
10
|
|
|
11
11
|
// Create tool with custom remote operations
|
|
12
12
|
const remoteBash = createBashTool(cwd, {
|
|
@@ -37,7 +37,7 @@ const bashTool = createBashTool(cwd, {
|
|
|
37
37
|
Full SSH pattern with flag-based switching:
|
|
38
38
|
|
|
39
39
|
```typescript
|
|
40
|
-
import { createBashTool, type ExtensionAPI } from "@
|
|
40
|
+
import { createBashTool, type ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
41
41
|
|
|
42
42
|
export default function (pi: ExtensionAPI) {
|
|
43
43
|
pi.registerFlag("ssh", { description: "SSH target", type: "string" });
|
|
@@ -65,7 +65,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
65
65
|
Override built-in tools for logging/access control — omit renderCall/renderResult to keep built-in rendering:
|
|
66
66
|
|
|
67
67
|
```typescript
|
|
68
|
-
import { createReadTool } from "@
|
|
68
|
+
import { createReadTool } from "@gsd/pi-coding-agent";
|
|
69
69
|
import { Type } from "@sinclair/typebox";
|
|
70
70
|
|
|
71
71
|
pi.registerTool({
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* {{CAPABILITIES_LIST}}
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type { ExtensionAPI } from "@
|
|
8
|
+
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
9
9
|
import { Type } from "@sinclair/typebox";
|
|
10
|
-
import { StringEnum } from "@
|
|
10
|
+
import { StringEnum } from "@gsd/pi-ai";
|
|
11
11
|
|
|
12
12
|
export default function (pi: ExtensionAPI) {
|
|
13
13
|
// === Events ===
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* State is stored in tool result details for proper branching support.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { ExtensionAPI, ExtensionContext } from "@
|
|
7
|
+
import type { ExtensionAPI, ExtensionContext } from "@gsd/pi-coding-agent";
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
|
-
import { StringEnum } from "@
|
|
10
|
-
import { Text, truncateToWidth, matchesKey, Key } from "@
|
|
9
|
+
import { StringEnum } from "@gsd/pi-ai";
|
|
10
|
+
import { Text, truncateToWidth, matchesKey, Key } from "@gsd/pi-tui";
|
|
11
11
|
|
|
12
12
|
interface {{ItemType}} {
|
|
13
13
|
id: number;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// GSD-2 — Extension template import path validation
|
|
2
|
+
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
3
|
+
|
|
4
|
+
import { describe, it } from "node:test";
|
|
5
|
+
import assert from "node:assert/strict";
|
|
6
|
+
import { readFileSync, readdirSync, statSync } from "node:fs";
|
|
7
|
+
import { join, dirname, relative } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
|
|
10
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const skillRoot = join(__dirname, "..");
|
|
12
|
+
|
|
13
|
+
function walk(dir: string): string[] {
|
|
14
|
+
const out: string[] = [];
|
|
15
|
+
for (const entry of readdirSync(dir)) {
|
|
16
|
+
const full = join(dir, entry);
|
|
17
|
+
if (statSync(full).isDirectory()) {
|
|
18
|
+
out.push(...walk(full));
|
|
19
|
+
} else {
|
|
20
|
+
out.push(full);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe("extension templates use @gsd/* imports", () => {
|
|
27
|
+
const templates = ["extension-skeleton.ts", "stateful-tool-skeleton.ts"];
|
|
28
|
+
|
|
29
|
+
for (const template of templates) {
|
|
30
|
+
it(`${template} uses @gsd/pi-coding-agent (not @mariozechner)`, () => {
|
|
31
|
+
const content = readFileSync(join(__dirname, template), "utf-8");
|
|
32
|
+
assert.ok(content.includes("@gsd/pi-coding-agent"), `Expected @gsd/pi-coding-agent import in ${template}`);
|
|
33
|
+
assert.ok(!content.includes("@mariozechner/"), `Found stale @mariozechner/ import in ${template}`);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
it("extension-skeleton.ts uses @gsd/pi-ai for StringEnum", () => {
|
|
38
|
+
const content = readFileSync(join(__dirname, "extension-skeleton.ts"), "utf-8");
|
|
39
|
+
assert.ok(content.includes("@gsd/pi-ai"), "Expected @gsd/pi-ai import");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("stateful-tool-skeleton.ts uses @gsd/pi-tui", () => {
|
|
43
|
+
const content = readFileSync(join(__dirname, "stateful-tool-skeleton.ts"), "utf-8");
|
|
44
|
+
assert.ok(content.includes("@gsd/pi-tui"), "Expected @gsd/pi-tui import");
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("no @mariozechner/ references anywhere in create-gsd-extension/", () => {
|
|
48
|
+
const offenders: string[] = [];
|
|
49
|
+
for (const file of walk(skillRoot)) {
|
|
50
|
+
if (file.endsWith("templates.test.ts")) continue;
|
|
51
|
+
const content = readFileSync(file, "utf-8");
|
|
52
|
+
if (content.includes("@mariozechner/")) {
|
|
53
|
+
offenders.push(relative(skillRoot, file));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
assert.deepEqual(offenders, [], `Stale @mariozechner/ references found in: ${offenders.join(", ")}`);
|
|
57
|
+
});
|
|
58
|
+
});
|