gsd-pi 2.28.0 → 2.29.0-dev.2ccf3fb
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 +34 -4
- package/dist/cli.js +20 -21
- package/dist/extension-discovery.d.ts +16 -0
- package/dist/extension-discovery.js +66 -0
- package/dist/headless-answers.d.ts +51 -0
- package/dist/headless-answers.js +224 -0
- package/dist/headless-context.d.ts +18 -0
- package/dist/headless-context.js +44 -0
- package/dist/headless-events.d.ts +28 -0
- package/dist/headless-events.js +59 -0
- package/dist/headless-query.d.ts +4 -0
- package/dist/headless-query.js +22 -4
- package/dist/headless-ui.d.ts +23 -0
- package/dist/headless-ui.js +103 -0
- package/dist/headless.d.ts +2 -0
- package/dist/headless.js +61 -183
- package/dist/help-text.js +4 -0
- package/dist/loader.js +18 -59
- package/dist/onboarding.js +8 -7
- package/dist/remote-questions-config.js +8 -3
- package/dist/resource-loader.d.ts +1 -6
- package/dist/resource-loader.js +125 -96
- package/dist/resources/extensions/ask-user-questions.ts +3 -2
- package/dist/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
- package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +400 -0
- package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
- package/dist/resources/extensions/bg-shell/index.ts +17 -1561
- package/dist/resources/extensions/bg-shell/overlay.ts +4 -0
- package/dist/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/dist/resources/extensions/bg-shell/utilities.ts +4 -16
- package/dist/resources/extensions/browser-tools/capture.ts +34 -2
- package/dist/resources/extensions/browser-tools/lifecycle.ts +5 -5
- package/dist/resources/extensions/browser-tools/settle.ts +1 -1
- package/dist/resources/extensions/browser-tools/state.ts +5 -5
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
- package/dist/resources/extensions/browser-tools/tools/assertions.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/device.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/extract.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/navigation.ts +6 -6
- package/dist/resources/extensions/browser-tools/tools/network-mock.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/pages.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
- package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +1 -1
- package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +1 -1
- package/dist/resources/extensions/browser-tools/utils.ts +5 -5
- package/dist/resources/extensions/get-secrets-from-user.ts +1 -1
- package/dist/resources/extensions/google-search/index.ts +21 -8
- package/dist/resources/extensions/gsd/activity-log.ts +2 -1
- package/dist/resources/extensions/gsd/atomic-write.ts +35 -0
- package/dist/resources/extensions/gsd/auto/session.ts +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.ts +264 -62
- package/dist/resources/extensions/gsd/auto-idempotency.ts +150 -0
- package/dist/resources/extensions/gsd/auto-post-unit.ts +594 -0
- package/dist/resources/extensions/gsd/auto-prompts.ts +116 -22
- package/dist/resources/extensions/gsd/auto-recovery.ts +36 -31
- package/dist/resources/extensions/gsd/auto-start.ts +500 -0
- package/dist/resources/extensions/gsd/auto-stuck-detection.ts +220 -0
- package/dist/resources/extensions/gsd/auto-timers.ts +223 -0
- package/dist/resources/extensions/gsd/auto-unit-closeout.ts +3 -1
- package/dist/resources/extensions/gsd/auto-verification.ts +229 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.ts +29 -37
- package/dist/resources/extensions/gsd/auto-worktree.ts +83 -67
- package/dist/resources/extensions/gsd/auto.ts +375 -1890
- package/dist/resources/extensions/gsd/commands-config.ts +102 -0
- package/dist/resources/extensions/gsd/commands-handlers.ts +394 -0
- package/dist/resources/extensions/gsd/commands-inspect.ts +90 -0
- package/dist/resources/extensions/gsd/commands-logs.ts +536 -0
- package/dist/resources/extensions/gsd/commands-maintenance.ts +206 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +790 -0
- package/dist/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/dist/resources/extensions/gsd/commands.ts +417 -1495
- package/dist/resources/extensions/gsd/constants.ts +21 -0
- package/dist/resources/extensions/gsd/context-budget.ts +25 -2
- package/dist/resources/extensions/gsd/crash-recovery.ts +3 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.ts +15 -5
- package/dist/resources/extensions/gsd/db-writer.ts +21 -2
- package/dist/resources/extensions/gsd/detection.ts +469 -0
- package/dist/resources/extensions/gsd/diff-context.ts +2 -1
- package/dist/resources/extensions/gsd/dispatch-guard.ts +4 -0
- package/dist/resources/extensions/gsd/doctor-checks.ts +564 -0
- package/dist/resources/extensions/gsd/doctor-format.ts +78 -0
- package/dist/resources/extensions/gsd/doctor-types.ts +72 -0
- package/dist/resources/extensions/gsd/doctor.ts +64 -701
- package/dist/resources/extensions/gsd/errors.ts +0 -2
- package/dist/resources/extensions/gsd/export-html.ts +367 -11
- package/dist/resources/extensions/gsd/export.ts +31 -5
- package/dist/resources/extensions/gsd/files.ts +8 -126
- package/dist/resources/extensions/gsd/forensics.ts +2 -12
- package/dist/resources/extensions/gsd/git-constants.ts +11 -0
- package/dist/resources/extensions/gsd/git-service.ts +13 -9
- package/dist/resources/extensions/gsd/gsd-db.ts +26 -6
- package/dist/resources/extensions/gsd/guided-flow-queue.ts +451 -0
- package/dist/resources/extensions/gsd/guided-flow.ts +231 -514
- package/dist/resources/extensions/gsd/history.ts +2 -20
- package/dist/resources/extensions/gsd/index.ts +208 -46
- package/dist/resources/extensions/gsd/init-wizard.ts +615 -0
- package/dist/resources/extensions/gsd/json-persistence.ts +67 -0
- package/dist/resources/extensions/gsd/jsonl-utils.ts +21 -0
- package/dist/resources/extensions/gsd/key-manager.ts +995 -0
- package/dist/resources/extensions/gsd/metrics.ts +49 -36
- package/dist/resources/extensions/gsd/migrate/command.ts +1 -1
- package/dist/resources/extensions/gsd/migrate/parsers.ts +10 -95
- package/dist/resources/extensions/gsd/milestone-actions.ts +126 -0
- package/dist/resources/extensions/gsd/milestone-ids.ts +95 -0
- package/dist/resources/extensions/gsd/native-git-bridge.ts +5 -10
- package/dist/resources/extensions/gsd/parallel-eligibility.ts +3 -3
- package/dist/resources/extensions/gsd/paths.ts +1 -11
- package/dist/resources/extensions/gsd/plugin-importer.ts +3 -2
- package/dist/resources/extensions/gsd/preferences-models.ts +323 -0
- package/dist/resources/extensions/gsd/preferences-skills.ts +169 -0
- package/dist/resources/extensions/gsd/preferences-types.ts +223 -0
- package/dist/resources/extensions/gsd/preferences-validation.ts +597 -0
- package/dist/resources/extensions/gsd/preferences.ts +219 -1305
- package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +213 -0
- package/dist/resources/extensions/gsd/prompt-compressor.ts +508 -0
- package/dist/resources/extensions/gsd/prompt-loader.ts +4 -2
- package/dist/resources/extensions/gsd/prompt-ordering.ts +200 -0
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -2
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +2 -4
- package/dist/resources/extensions/gsd/prompts/discuss.md +13 -5
- package/dist/resources/extensions/gsd/prompts/execute-task.md +0 -1
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +0 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +0 -1
- package/dist/resources/extensions/gsd/prompts/queue.md +30 -0
- package/dist/resources/extensions/gsd/prompts/quick-task.md +0 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +0 -1
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +0 -1
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/dist/resources/extensions/gsd/provider-error-pause.ts +59 -10
- package/dist/resources/extensions/gsd/queue-order.ts +11 -12
- package/dist/resources/extensions/gsd/queue-reorder-ui.ts +15 -2
- package/dist/resources/extensions/gsd/quick.ts +18 -15
- package/dist/resources/extensions/gsd/reports.ts +1 -7
- package/dist/resources/extensions/gsd/routing-history.ts +13 -17
- package/dist/resources/extensions/gsd/safe-fs.ts +47 -0
- package/dist/resources/extensions/gsd/semantic-chunker.ts +336 -0
- package/dist/resources/extensions/gsd/session-forensics.ts +8 -23
- package/dist/resources/extensions/gsd/session-lock.ts +284 -0
- package/dist/resources/extensions/gsd/session-status-io.ts +23 -41
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +38 -1
- package/dist/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +35 -6
- package/dist/resources/extensions/gsd/state.ts +54 -2
- package/dist/resources/extensions/gsd/structured-data-formatter.ts +144 -0
- package/dist/resources/extensions/gsd/summary-distiller.ts +258 -0
- package/dist/resources/extensions/gsd/tests/activity-log.test.ts +213 -0
- package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +107 -0
- package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +197 -0
- package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +33 -39
- package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +108 -2
- package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +257 -0
- package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/dist/resources/extensions/gsd/tests/context-budget.test.ts +69 -0
- package/dist/resources/extensions/gsd/tests/detection.test.ts +398 -0
- package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +12 -24
- package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +118 -94
- package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +126 -0
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +7 -3
- package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +75 -0
- package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +17 -55
- package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +375 -0
- package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
- package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +340 -0
- package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +24 -82
- package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +197 -0
- package/dist/resources/extensions/gsd/tests/key-manager.test.ts +414 -0
- package/dist/resources/extensions/gsd/tests/metrics.test.ts +173 -305
- package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +59 -1
- package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +18 -61
- package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +17 -8
- package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +276 -0
- package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +401 -0
- package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +23 -47
- package/dist/resources/extensions/gsd/tests/preferences.test.ts +284 -0
- package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +314 -0
- package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +529 -0
- package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
- package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +338 -0
- package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
- package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +1 -1
- package/dist/resources/extensions/gsd/tests/remote-status.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +43 -60
- package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +426 -0
- package/dist/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
- package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +8 -5
- package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +365 -0
- package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +323 -0
- package/dist/resources/extensions/gsd/tests/token-counter.test.ts +129 -0
- package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +1272 -0
- package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +164 -0
- package/dist/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +69 -73
- package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +222 -0
- package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +251 -8
- package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +2 -2
- package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
- package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +24 -61
- package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +5 -2
- package/dist/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
- package/dist/resources/extensions/gsd/token-counter.ts +20 -0
- package/dist/resources/extensions/gsd/triage-ui.ts +1 -1
- package/dist/resources/extensions/gsd/types.ts +5 -1
- package/dist/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/dist/resources/extensions/gsd/validate-directory.ts +164 -0
- package/dist/resources/extensions/gsd/verification-evidence.ts +9 -4
- package/dist/resources/extensions/gsd/verification-gate.ts +83 -7
- package/dist/resources/extensions/gsd/visualizer-data.ts +1 -1
- package/dist/resources/extensions/gsd/visualizer-overlay.ts +5 -2
- package/dist/resources/extensions/gsd/visualizer-views.ts +2 -3
- package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/dist/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/dist/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/dist/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/dist/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/dist/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/dist/resources/extensions/gsd/worktree-command.ts +4 -51
- package/dist/resources/extensions/gsd/worktree-manager.ts +7 -9
- package/dist/resources/extensions/gsd/worktree.ts +41 -1
- package/dist/resources/extensions/mcp-client/index.ts +459 -0
- package/dist/resources/extensions/remote-questions/discord-adapter.ts +9 -20
- package/dist/resources/extensions/remote-questions/http-client.ts +76 -0
- package/dist/resources/extensions/remote-questions/manager.ts +6 -24
- package/dist/resources/extensions/remote-questions/mod.ts +16 -0
- package/dist/resources/extensions/remote-questions/notify.ts +90 -0
- package/dist/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/dist/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/dist/resources/extensions/remote-questions/store.ts +5 -1
- package/dist/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/dist/resources/extensions/remote-questions/types.ts +29 -3
- package/dist/resources/extensions/search-the-web/native-search.ts +7 -0
- package/dist/resources/extensions/search-the-web/provider.ts +15 -3
- package/dist/resources/extensions/search-the-web/tool-llm-context.ts +1 -13
- package/dist/resources/extensions/search-the-web/tool-search.ts +1 -13
- package/dist/resources/extensions/shared/format-utils.ts +53 -0
- package/dist/resources/extensions/shared/frontmatter.ts +117 -0
- package/dist/resources/extensions/shared/mod.ts +33 -0
- package/dist/resources/extensions/shared/sanitize.ts +19 -0
- package/dist/resources/extensions/slash-commands/create-extension.ts +1 -1
- package/dist/resources/extensions/slash-commands/create-slash-command.ts +1 -1
- package/dist/resources/extensions/subagent/index.ts +1 -2
- package/dist/resources/extensions/ttsr/index.ts +5 -0
- package/dist/resources/extensions/ttsr/rule-loader.ts +4 -51
- package/dist/resources/extensions/universal-config/discovery.ts +37 -15
- package/dist/resources/extensions/voice/index.ts +1 -1
- package/dist/resources/skills/accessibility/SKILL.md +522 -0
- package/dist/resources/skills/accessibility/references/WCAG.md +162 -0
- package/dist/resources/skills/agent-browser/SKILL.md +517 -0
- package/dist/resources/skills/agent-browser/references/authentication.md +202 -0
- package/dist/resources/skills/agent-browser/references/commands.md +263 -0
- package/dist/resources/skills/agent-browser/references/profiling.md +120 -0
- package/dist/resources/skills/agent-browser/references/proxy-support.md +194 -0
- package/dist/resources/skills/agent-browser/references/session-management.md +193 -0
- package/dist/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/dist/resources/skills/agent-browser/references/video-recording.md +173 -0
- package/dist/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/dist/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/dist/resources/skills/agent-browser/templates/form-automation.sh +62 -0
- package/dist/resources/skills/best-practices/SKILL.md +583 -0
- package/dist/resources/skills/code-optimizer/SKILL.md +160 -0
- package/dist/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
- package/dist/resources/skills/code-optimizer/references/build-compilation.md +90 -0
- package/dist/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
- package/dist/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
- package/dist/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
- package/dist/resources/skills/code-optimizer/references/config-infra.md +71 -0
- package/dist/resources/skills/code-optimizer/references/data-structures.md +80 -0
- package/dist/resources/skills/code-optimizer/references/database-queries.md +76 -0
- package/dist/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
- package/dist/resources/skills/code-optimizer/references/error-resilience.md +80 -0
- package/dist/resources/skills/code-optimizer/references/io-network.md +89 -0
- package/dist/resources/skills/code-optimizer/references/logging-observability.md +64 -0
- package/dist/resources/skills/code-optimizer/references/memory-resources.md +66 -0
- package/dist/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
- package/dist/resources/skills/code-optimizer/references/security-performance.md +68 -0
- package/dist/resources/skills/core-web-vitals/SKILL.md +441 -0
- package/dist/resources/skills/core-web-vitals/references/LCP.md +208 -0
- package/dist/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/dist/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/dist/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/dist/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/dist/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/dist/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/dist/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/dist/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/dist/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/dist/resources/skills/create-skill/SKILL.md +184 -0
- package/dist/resources/skills/create-skill/references/api-security.md +226 -0
- package/dist/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/dist/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/dist/resources/skills/create-skill/references/core-principles.md +437 -0
- package/dist/resources/skills/create-skill/references/executable-code.md +175 -0
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/dist/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/dist/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/dist/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/dist/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/dist/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/dist/resources/skills/create-skill/references/using-templates.md +112 -0
- package/dist/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/dist/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/dist/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/dist/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/dist/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/dist/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/dist/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/dist/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/dist/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/dist/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/dist/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
- package/dist/resources/skills/make-interfaces-feel-better/animations.md +379 -0
- package/dist/resources/skills/make-interfaces-feel-better/performance.md +88 -0
- package/dist/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
- package/dist/resources/skills/make-interfaces-feel-better/typography.md +123 -0
- package/dist/resources/skills/react-best-practices/README.md +123 -0
- package/dist/resources/skills/react-best-practices/SKILL.md +136 -0
- package/dist/resources/skills/react-best-practices/metadata.json +15 -0
- package/dist/resources/skills/react-best-practices/rules/_sections.md +46 -0
- package/dist/resources/skills/react-best-practices/rules/_template.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
- package/dist/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/dist/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/resources/skills/userinterface-wiki/SKILL.md +253 -0
- package/dist/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
- package/dist/resources/skills/userinterface-wiki/rules/_template.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
- package/dist/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
- package/dist/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
- package/dist/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
- package/dist/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
- package/dist/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
- package/dist/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
- package/dist/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
- package/dist/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
- package/dist/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
- package/dist/resources/skills/web-design-guidelines/SKILL.md +39 -0
- package/dist/resources/skills/web-quality-audit/SKILL.md +170 -0
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
- package/package.json +22 -8
- package/packages/native/dist/native.d.ts +2 -0
- package/packages/native/dist/native.js +19 -5
- package/packages/native/package.json +28 -0
- package/packages/native/src/native.ts +23 -9
- package/packages/pi-agent-core/package.json +6 -0
- package/packages/pi-ai/dist/models.generated.d.ts +43 -11
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +34 -26
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +3 -2
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +14 -4
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/oauth.d.ts +1 -0
- package/packages/pi-ai/oauth.js +1 -0
- package/packages/pi-ai/package.json +2 -2
- package/packages/pi-ai/src/models.generated.ts +42 -34
- package/packages/pi-ai/src/providers/anthropic.ts +3 -2
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +15 -4
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +2 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +2 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +3 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/utils.js +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/constants.d.ts +29 -0
- package/packages/pi-coding-agent/dist/core/constants.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/constants.js +44 -0
- package/packages/pi-coding-agent/dist/core/constants.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +14 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/index.js +30 -4
- package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +13 -5
- package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +14 -0
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js +12 -4
- package/packages/pi-coding-agent/dist/core/resolve-config-value.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +49 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.js +25 -2
- package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +22 -5
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.js +2 -2
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline-edit.js +4 -4
- package/packages/pi-coding-agent/dist/core/tools/hashline-edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/hashline.test.js +8 -8
- package/packages/pi-coding-agent/dist/core/tools/hashline.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.d.ts +1 -0
- package/packages/pi-coding-agent/dist/core/tools/path-utils.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.js +1 -1
- package/packages/pi-coding-agent/dist/core/tools/path-utils.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/truncate.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/truncate.js +2 -1
- package/packages/pi-coding-agent/dist/core/tools/truncate.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts +9 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +47 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +4 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +12 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.js +25 -3
- package/packages/pi-coding-agent/dist/resources/extensions/memory/pipeline.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -5
- package/packages/pi-coding-agent/scripts/copy-assets.cjs +39 -8
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.ts +2 -1
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -2
- package/packages/pi-coding-agent/src/core/compaction/utils.ts +2 -2
- package/packages/pi-coding-agent/src/core/constants.ts +59 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +14 -1
- package/packages/pi-coding-agent/src/core/lsp/index.ts +31 -5
- package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +13 -5
- package/packages/pi-coding-agent/src/core/model-resolver.ts +14 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +58 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.ts +14 -4
- package/packages/pi-coding-agent/src/core/session-manager.ts +29 -6
- package/packages/pi-coding-agent/src/core/settings-manager.ts +33 -5
- package/packages/pi-coding-agent/src/core/system-prompt.ts +11 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.ts +2 -2
- package/packages/pi-coding-agent/src/core/tools/find.ts +2 -1
- package/packages/pi-coding-agent/src/core/tools/hashline-edit.ts +4 -4
- package/packages/pi-coding-agent/src/core/tools/hashline.test.ts +8 -8
- package/packages/pi-coding-agent/src/core/tools/hashline.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/index.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/path-utils.ts +1 -1
- package/packages/pi-coding-agent/src/core/tools/truncate.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +49 -5
- package/packages/pi-coding-agent/src/modes/interactive/components/index.ts +1 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/login-dialog.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +26 -0
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +11 -2
- package/packages/pi-coding-agent/src/resources/extensions/memory/pipeline.ts +23 -3
- package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +149 -0
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.js +94 -0
- package/packages/pi-tui/dist/__tests__/fuzzy.test.js.map +1 -0
- package/packages/pi-tui/dist/autocomplete.d.ts +8 -1
- package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
- package/packages/pi-tui/dist/autocomplete.js +20 -2
- package/packages/pi-tui/dist/autocomplete.js.map +1 -1
- package/packages/pi-tui/package.json +8 -2
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +186 -0
- package/packages/pi-tui/src/__tests__/fuzzy.test.ts +112 -0
- package/packages/pi-tui/src/autocomplete.ts +26 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/ask-user-questions.ts +3 -2
- package/src/resources/extensions/bg-shell/bg-shell-command.ts +219 -0
- package/src/resources/extensions/bg-shell/bg-shell-lifecycle.ts +400 -0
- package/src/resources/extensions/bg-shell/bg-shell-tool.ts +985 -0
- package/src/resources/extensions/bg-shell/index.ts +17 -1561
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/bg-shell/process-manager.ts +13 -0
- package/src/resources/extensions/bg-shell/utilities.ts +4 -16
- package/src/resources/extensions/browser-tools/capture.ts +34 -2
- package/src/resources/extensions/browser-tools/lifecycle.ts +5 -5
- package/src/resources/extensions/browser-tools/settle.ts +1 -1
- package/src/resources/extensions/browser-tools/state.ts +5 -5
- package/src/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +1 -1
- package/src/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +3 -3
- package/src/resources/extensions/browser-tools/tools/assertions.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/device.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/extract.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/navigation.ts +6 -6
- package/src/resources/extensions/browser-tools/tools/network-mock.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/pages.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +28 -10
- package/src/resources/extensions/browser-tools/tools/state-persistence.ts +1 -1
- package/src/resources/extensions/browser-tools/tools/visual-diff.ts +1 -1
- package/src/resources/extensions/browser-tools/utils.ts +5 -5
- package/src/resources/extensions/get-secrets-from-user.ts +1 -1
- package/src/resources/extensions/google-search/index.ts +21 -8
- package/src/resources/extensions/gsd/activity-log.ts +2 -1
- package/src/resources/extensions/gsd/atomic-write.ts +35 -0
- package/src/resources/extensions/gsd/auto/session.ts +12 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +264 -62
- package/src/resources/extensions/gsd/auto-idempotency.ts +150 -0
- package/src/resources/extensions/gsd/auto-post-unit.ts +594 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +116 -22
- package/src/resources/extensions/gsd/auto-recovery.ts +36 -31
- package/src/resources/extensions/gsd/auto-start.ts +500 -0
- package/src/resources/extensions/gsd/auto-stuck-detection.ts +220 -0
- package/src/resources/extensions/gsd/auto-timers.ts +223 -0
- package/src/resources/extensions/gsd/auto-unit-closeout.ts +3 -1
- package/src/resources/extensions/gsd/auto-verification.ts +229 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +29 -37
- package/src/resources/extensions/gsd/auto-worktree.ts +83 -67
- package/src/resources/extensions/gsd/auto.ts +375 -1890
- package/src/resources/extensions/gsd/commands-config.ts +102 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +394 -0
- package/src/resources/extensions/gsd/commands-inspect.ts +90 -0
- package/src/resources/extensions/gsd/commands-logs.ts +536 -0
- package/src/resources/extensions/gsd/commands-maintenance.ts +206 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +790 -0
- package/src/resources/extensions/gsd/commands-workflow-templates.ts +544 -0
- package/src/resources/extensions/gsd/commands.ts +417 -1495
- package/src/resources/extensions/gsd/constants.ts +21 -0
- package/src/resources/extensions/gsd/context-budget.ts +25 -2
- package/src/resources/extensions/gsd/crash-recovery.ts +3 -4
- package/src/resources/extensions/gsd/dashboard-overlay.ts +15 -5
- package/src/resources/extensions/gsd/db-writer.ts +21 -2
- package/src/resources/extensions/gsd/detection.ts +469 -0
- package/src/resources/extensions/gsd/diff-context.ts +2 -1
- package/src/resources/extensions/gsd/dispatch-guard.ts +4 -0
- package/src/resources/extensions/gsd/doctor-checks.ts +564 -0
- package/src/resources/extensions/gsd/doctor-format.ts +78 -0
- package/src/resources/extensions/gsd/doctor-types.ts +72 -0
- package/src/resources/extensions/gsd/doctor.ts +64 -701
- package/src/resources/extensions/gsd/errors.ts +0 -2
- package/src/resources/extensions/gsd/export-html.ts +367 -11
- package/src/resources/extensions/gsd/export.ts +31 -5
- package/src/resources/extensions/gsd/files.ts +8 -126
- package/src/resources/extensions/gsd/forensics.ts +2 -12
- package/src/resources/extensions/gsd/git-constants.ts +11 -0
- package/src/resources/extensions/gsd/git-service.ts +13 -9
- package/src/resources/extensions/gsd/gsd-db.ts +26 -6
- package/src/resources/extensions/gsd/guided-flow-queue.ts +451 -0
- package/src/resources/extensions/gsd/guided-flow.ts +231 -514
- package/src/resources/extensions/gsd/history.ts +2 -20
- package/src/resources/extensions/gsd/index.ts +208 -46
- package/src/resources/extensions/gsd/init-wizard.ts +615 -0
- package/src/resources/extensions/gsd/json-persistence.ts +67 -0
- package/src/resources/extensions/gsd/jsonl-utils.ts +21 -0
- package/src/resources/extensions/gsd/key-manager.ts +995 -0
- package/src/resources/extensions/gsd/metrics.ts +49 -36
- package/src/resources/extensions/gsd/migrate/command.ts +1 -1
- package/src/resources/extensions/gsd/migrate/parsers.ts +10 -95
- package/src/resources/extensions/gsd/milestone-actions.ts +126 -0
- package/src/resources/extensions/gsd/milestone-ids.ts +95 -0
- package/src/resources/extensions/gsd/native-git-bridge.ts +5 -10
- package/src/resources/extensions/gsd/parallel-eligibility.ts +3 -3
- package/src/resources/extensions/gsd/paths.ts +1 -11
- package/src/resources/extensions/gsd/plugin-importer.ts +3 -2
- package/src/resources/extensions/gsd/preferences-models.ts +323 -0
- package/src/resources/extensions/gsd/preferences-skills.ts +169 -0
- package/src/resources/extensions/gsd/preferences-types.ts +223 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +597 -0
- package/src/resources/extensions/gsd/preferences.ts +219 -1305
- package/src/resources/extensions/gsd/prompt-cache-optimizer.ts +213 -0
- package/src/resources/extensions/gsd/prompt-compressor.ts +508 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +4 -2
- package/src/resources/extensions/gsd/prompt-ordering.ts +200 -0
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -2
- package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +2 -4
- package/src/resources/extensions/gsd/prompts/discuss.md +13 -5
- package/src/resources/extensions/gsd/prompts/execute-task.md +0 -1
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +0 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +0 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +0 -1
- package/src/resources/extensions/gsd/prompts/queue.md +30 -0
- package/src/resources/extensions/gsd/prompts/quick-task.md +0 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +0 -1
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +0 -1
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/workflow-start.md +28 -0
- package/src/resources/extensions/gsd/provider-error-pause.ts +59 -10
- package/src/resources/extensions/gsd/queue-order.ts +11 -12
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +15 -2
- package/src/resources/extensions/gsd/quick.ts +18 -15
- package/src/resources/extensions/gsd/reports.ts +1 -7
- package/src/resources/extensions/gsd/routing-history.ts +13 -17
- package/src/resources/extensions/gsd/safe-fs.ts +47 -0
- package/src/resources/extensions/gsd/semantic-chunker.ts +336 -0
- package/src/resources/extensions/gsd/session-forensics.ts +8 -23
- package/src/resources/extensions/gsd/session-lock.ts +284 -0
- package/src/resources/extensions/gsd/session-status-io.ts +23 -41
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +38 -1
- package/src/resources/extensions/gsd/skills/gsd-headless/references/answer-injection.md +35 -6
- package/src/resources/extensions/gsd/state.ts +54 -2
- package/src/resources/extensions/gsd/structured-data-formatter.ts +144 -0
- package/src/resources/extensions/gsd/summary-distiller.ts +258 -0
- package/src/resources/extensions/gsd/tests/activity-log.test.ts +213 -0
- package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +107 -0
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +33 -39
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +108 -2
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +257 -0
- package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +241 -0
- package/src/resources/extensions/gsd/tests/context-budget.test.ts +69 -0
- package/src/resources/extensions/gsd/tests/detection.test.ts +398 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +12 -24
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +118 -94
- package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +126 -0
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -3
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +17 -55
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/extension-selector-separator.test.ts +144 -0
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +340 -0
- package/src/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +24 -82
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +414 -0
- package/src/resources/extensions/gsd/tests/metrics.test.ts +173 -305
- package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +59 -1
- package/src/resources/extensions/gsd/tests/next-milestone-id.test.ts +18 -61
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +17 -8
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +276 -0
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +401 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +23 -47
- package/src/resources/extensions/gsd/tests/preferences.test.ts +284 -0
- package/src/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +314 -0
- package/src/resources/extensions/gsd/tests/prompt-compressor.test.ts +529 -0
- package/src/resources/extensions/gsd/tests/prompt-ordering.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +338 -0
- package/src/resources/extensions/gsd/tests/reassess-detection.test.ts +154 -0
- package/src/resources/extensions/gsd/tests/remote-questions.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/remote-status.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +43 -60
- package/src/resources/extensions/gsd/tests/semantic-chunker.test.ts +426 -0
- package/src/resources/extensions/gsd/tests/session-lock.test.ts +315 -0
- package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -0
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +8 -5
- package/src/resources/extensions/gsd/tests/structured-data-formatter.test.ts +365 -0
- package/src/resources/extensions/gsd/tests/summary-distiller.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/token-counter.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +1272 -0
- package/src/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +8 -1
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +69 -73
- package/src/resources/extensions/gsd/tests/validate-directory.test.ts +222 -0
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +26 -24
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +251 -8
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +173 -0
- package/src/resources/extensions/gsd/tests/workspace-index.test.ts +24 -61
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/write-gate.test.ts +132 -43
- package/src/resources/extensions/gsd/token-counter.ts +20 -0
- package/src/resources/extensions/gsd/triage-ui.ts +1 -1
- package/src/resources/extensions/gsd/types.ts +5 -1
- package/src/resources/extensions/gsd/unit-runtime.ts +16 -13
- package/src/resources/extensions/gsd/validate-directory.ts +164 -0
- package/src/resources/extensions/gsd/verification-evidence.ts +9 -4
- package/src/resources/extensions/gsd/verification-gate.ts +83 -7
- package/src/resources/extensions/gsd/visualizer-data.ts +1 -1
- package/src/resources/extensions/gsd/visualizer-overlay.ts +5 -2
- package/src/resources/extensions/gsd/visualizer-views.ts +2 -3
- package/src/resources/extensions/gsd/workflow-templates/bugfix.md +87 -0
- package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +74 -0
- package/src/resources/extensions/gsd/workflow-templates/full-project.md +41 -0
- package/src/resources/extensions/gsd/workflow-templates/hotfix.md +45 -0
- package/src/resources/extensions/gsd/workflow-templates/refactor.md +83 -0
- package/src/resources/extensions/gsd/workflow-templates/registry.json +85 -0
- package/src/resources/extensions/gsd/workflow-templates/security-audit.md +73 -0
- package/src/resources/extensions/gsd/workflow-templates/small-feature.md +81 -0
- package/src/resources/extensions/gsd/workflow-templates/spike.md +69 -0
- package/src/resources/extensions/gsd/workflow-templates.ts +241 -0
- package/src/resources/extensions/gsd/worktree-command.ts +4 -51
- package/src/resources/extensions/gsd/worktree-manager.ts +7 -9
- package/src/resources/extensions/gsd/worktree.ts +41 -1
- package/src/resources/extensions/mcp-client/index.ts +459 -0
- package/src/resources/extensions/remote-questions/discord-adapter.ts +9 -20
- package/src/resources/extensions/remote-questions/http-client.ts +76 -0
- package/src/resources/extensions/remote-questions/manager.ts +6 -24
- package/src/resources/extensions/remote-questions/mod.ts +16 -0
- package/src/resources/extensions/remote-questions/notify.ts +90 -0
- package/src/resources/extensions/remote-questions/remote-command.ts +1 -1
- package/src/resources/extensions/remote-questions/slack-adapter.ts +11 -18
- package/src/resources/extensions/remote-questions/store.ts +5 -1
- package/src/resources/extensions/remote-questions/telegram-adapter.ts +8 -20
- package/src/resources/extensions/remote-questions/types.ts +29 -3
- package/src/resources/extensions/search-the-web/native-search.ts +7 -0
- package/src/resources/extensions/search-the-web/provider.ts +15 -3
- package/src/resources/extensions/search-the-web/tool-llm-context.ts +1 -13
- package/src/resources/extensions/search-the-web/tool-search.ts +1 -13
- package/src/resources/extensions/shared/format-utils.ts +53 -0
- package/src/resources/extensions/shared/frontmatter.ts +117 -0
- package/src/resources/extensions/shared/mod.ts +33 -0
- package/src/resources/extensions/shared/sanitize.ts +19 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +1 -1
- package/src/resources/extensions/slash-commands/create-slash-command.ts +1 -1
- package/src/resources/extensions/subagent/index.ts +1 -2
- package/src/resources/extensions/ttsr/index.ts +5 -0
- package/src/resources/extensions/ttsr/rule-loader.ts +4 -51
- package/src/resources/extensions/universal-config/discovery.ts +37 -15
- package/src/resources/extensions/voice/index.ts +1 -1
- package/src/resources/skills/accessibility/SKILL.md +522 -0
- package/src/resources/skills/accessibility/references/WCAG.md +162 -0
- package/src/resources/skills/agent-browser/SKILL.md +517 -0
- package/src/resources/skills/agent-browser/references/authentication.md +202 -0
- package/src/resources/skills/agent-browser/references/commands.md +263 -0
- package/src/resources/skills/agent-browser/references/profiling.md +120 -0
- package/src/resources/skills/agent-browser/references/proxy-support.md +194 -0
- package/src/resources/skills/agent-browser/references/session-management.md +193 -0
- package/src/resources/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/src/resources/skills/agent-browser/references/video-recording.md +173 -0
- package/src/resources/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/src/resources/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/src/resources/skills/agent-browser/templates/form-automation.sh +62 -0
- package/src/resources/skills/best-practices/SKILL.md +583 -0
- package/src/resources/skills/code-optimizer/SKILL.md +160 -0
- package/src/resources/skills/code-optimizer/references/algorithmic-complexity.md +66 -0
- package/src/resources/skills/code-optimizer/references/build-compilation.md +90 -0
- package/src/resources/skills/code-optimizer/references/bundle-dependencies.md +82 -0
- package/src/resources/skills/code-optimizer/references/caching-memoization.md +76 -0
- package/src/resources/skills/code-optimizer/references/concurrency-async.md +80 -0
- package/src/resources/skills/code-optimizer/references/config-infra.md +71 -0
- package/src/resources/skills/code-optimizer/references/data-structures.md +80 -0
- package/src/resources/skills/code-optimizer/references/database-queries.md +76 -0
- package/src/resources/skills/code-optimizer/references/dead-code-redundancy.md +84 -0
- package/src/resources/skills/code-optimizer/references/error-resilience.md +80 -0
- package/src/resources/skills/code-optimizer/references/io-network.md +89 -0
- package/src/resources/skills/code-optimizer/references/logging-observability.md +64 -0
- package/src/resources/skills/code-optimizer/references/memory-resources.md +66 -0
- package/src/resources/skills/code-optimizer/references/rendering-ui.md +90 -0
- package/src/resources/skills/code-optimizer/references/security-performance.md +68 -0
- package/src/resources/skills/core-web-vitals/SKILL.md +441 -0
- package/src/resources/skills/core-web-vitals/references/LCP.md +208 -0
- package/src/resources/skills/create-gsd-extension/SKILL.md +87 -0
- package/src/resources/skills/create-gsd-extension/references/compaction-session-control.md +77 -0
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +139 -0
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +108 -0
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +183 -0
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +490 -0
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +126 -0
- package/src/resources/skills/create-gsd-extension/references/extension-lifecycle.md +64 -0
- package/src/resources/skills/create-gsd-extension/references/extensionapi-reference.md +75 -0
- package/src/resources/skills/create-gsd-extension/references/extensioncontext-reference.md +53 -0
- package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +36 -0
- package/src/resources/skills/create-gsd-extension/references/mode-behavior.md +32 -0
- package/src/resources/skills/create-gsd-extension/references/model-provider-management.md +89 -0
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +55 -0
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +90 -0
- package/src/resources/skills/create-gsd-extension/references/state-management.md +70 -0
- package/src/resources/skills/create-gsd-extension/references/system-prompt-modification.md +52 -0
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +51 -0
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +143 -0
- package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +57 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +156 -0
- package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +74 -0
- package/src/resources/skills/create-skill/SKILL.md +184 -0
- package/src/resources/skills/create-skill/references/api-security.md +226 -0
- package/src/resources/skills/create-skill/references/be-clear-and-direct.md +531 -0
- package/src/resources/skills/create-skill/references/common-patterns.md +595 -0
- package/src/resources/skills/create-skill/references/core-principles.md +437 -0
- package/src/resources/skills/create-skill/references/executable-code.md +175 -0
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +68 -0
- package/src/resources/skills/create-skill/references/iteration-and-testing.md +474 -0
- package/src/resources/skills/create-skill/references/recommended-structure.md +168 -0
- package/src/resources/skills/create-skill/references/skill-structure.md +372 -0
- package/src/resources/skills/create-skill/references/use-xml-tags.md +466 -0
- package/src/resources/skills/create-skill/references/using-scripts.md +113 -0
- package/src/resources/skills/create-skill/references/using-templates.md +112 -0
- package/src/resources/skills/create-skill/references/workflows-and-validation.md +510 -0
- package/src/resources/skills/create-skill/templates/router-skill.md +73 -0
- package/src/resources/skills/create-skill/templates/simple-skill.md +33 -0
- package/src/resources/skills/create-skill/workflows/add-reference.md +96 -0
- package/src/resources/skills/create-skill/workflows/add-script.md +93 -0
- package/src/resources/skills/create-skill/workflows/add-template.md +74 -0
- package/src/resources/skills/create-skill/workflows/add-workflow.md +120 -0
- package/src/resources/skills/create-skill/workflows/audit-skill.md +148 -0
- package/src/resources/skills/create-skill/workflows/create-new-skill.md +196 -0
- package/src/resources/skills/create-skill/workflows/get-guidance.md +121 -0
- package/src/resources/skills/create-skill/workflows/upgrade-to-router.md +161 -0
- package/src/resources/skills/create-skill/workflows/verify-skill.md +204 -0
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +122 -0
- package/src/resources/skills/make-interfaces-feel-better/animations.md +379 -0
- package/src/resources/skills/make-interfaces-feel-better/performance.md +88 -0
- package/src/resources/skills/make-interfaces-feel-better/surfaces.md +247 -0
- package/src/resources/skills/make-interfaces-feel-better/typography.md +123 -0
- package/src/resources/skills/react-best-practices/README.md +123 -0
- package/src/resources/skills/react-best-practices/SKILL.md +136 -0
- package/src/resources/skills/react-best-practices/metadata.json +15 -0
- package/src/resources/skills/react-best-practices/rules/_sections.md +46 -0
- package/src/resources/skills/react-best-practices/rules/_template.md +28 -0
- package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +42 -0
- package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
- package/src/resources/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/src/resources/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/src/resources/skills/react-best-practices/rules/async-dependencies.md +51 -0
- package/src/resources/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/src/resources/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/src/resources/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/src/resources/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/src/resources/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/src/resources/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +96 -0
- package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/src/resources/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +65 -0
- package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/src/resources/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/src/resources/skills/userinterface-wiki/SKILL.md +253 -0
- package/src/resources/skills/userinterface-wiki/rules/_sections.md +66 -0
- package/src/resources/skills/userinterface-wiki/rules/_template.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +19 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +13 -0
- package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +48 -0
- package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +26 -0
- package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +34 -0
- package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +26 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +41 -0
- package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +19 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +34 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +13 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +22 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +27 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +24 -0
- package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +18 -0
- package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +15 -0
- package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +17 -0
- package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +21 -0
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +16 -0
- package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +50 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +32 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +45 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +37 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +45 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +33 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +41 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +38 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +31 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +28 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +43 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +36 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +49 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +40 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +35 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +30 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +25 -0
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +23 -0
- package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +29 -0
- package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +32 -0
- package/src/resources/skills/web-design-guidelines/SKILL.md +39 -0
- package/src/resources/skills/web-quality-audit/SKILL.md +170 -0
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +91 -0
- package/dist/resources/extensions/gsd/complexity.ts +0 -237
- package/dist/resources/extensions/gsd/github-client.ts +0 -235
- package/dist/resources/extensions/gsd/tests/activity-log-prune.test.ts +0 -297
- package/dist/resources/extensions/gsd/tests/activity-log-save.test.ts +0 -127
- package/dist/resources/extensions/gsd/tests/agent-end-provider-error.test.ts +0 -110
- package/dist/resources/extensions/gsd/tests/auto-draft-pause.test.ts +0 -115
- package/dist/resources/extensions/gsd/tests/complexity-routing.test.ts +0 -294
- package/dist/resources/extensions/gsd/tests/metrics-io.test.ts +0 -176
- package/dist/resources/extensions/gsd/tests/network-error-fallback.test.ts +0 -104
- package/dist/resources/extensions/gsd/tests/preferences-git.test.ts +0 -120
- package/dist/resources/extensions/gsd/tests/preferences-hooks.test.ts +0 -226
- package/dist/resources/extensions/gsd/tests/preferences-mode.test.ts +0 -110
- package/dist/resources/extensions/gsd/tests/preferences-models.test.ts +0 -207
- package/dist/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +0 -183
- package/dist/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +0 -168
- package/dist/resources/extensions/mcporter/index.ts +0 -512
- package/dist/resources/extensions/shared/progress-widget.ts +0 -282
- package/dist/resources/extensions/shared/thinking-widget.ts +0 -107
- package/src/resources/extensions/gsd/complexity.ts +0 -237
- package/src/resources/extensions/gsd/github-client.ts +0 -235
- package/src/resources/extensions/gsd/tests/activity-log-prune.test.ts +0 -297
- package/src/resources/extensions/gsd/tests/activity-log-save.test.ts +0 -127
- package/src/resources/extensions/gsd/tests/agent-end-provider-error.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/auto-draft-pause.test.ts +0 -115
- package/src/resources/extensions/gsd/tests/complexity-routing.test.ts +0 -294
- package/src/resources/extensions/gsd/tests/metrics-io.test.ts +0 -176
- package/src/resources/extensions/gsd/tests/network-error-fallback.test.ts +0 -104
- package/src/resources/extensions/gsd/tests/preferences-git.test.ts +0 -120
- package/src/resources/extensions/gsd/tests/preferences-hooks.test.ts +0 -226
- package/src/resources/extensions/gsd/tests/preferences-mode.test.ts +0 -110
- package/src/resources/extensions/gsd/tests/preferences-models.test.ts +0 -207
- package/src/resources/extensions/gsd/tests/preferences-schema-validation.test.ts +0 -183
- package/src/resources/extensions/gsd/tests/preferences-wizard-fields.test.ts +0 -168
- package/src/resources/extensions/mcporter/index.ts +0 -512
- package/src/resources/extensions/shared/progress-widget.ts +0 -282
- package/src/resources/extensions/shared/thinking-widget.ts +0 -107
|
@@ -0,0 +1,1272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Optimization Benchmark -- measures actual savings from all modules
|
|
3
|
+
* using realistic GSD prompt content.
|
|
4
|
+
*
|
|
5
|
+
* This test validates that the optimization suite achieves its documented
|
|
6
|
+
* savings targets and reports precise metrics.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
formatDecisionsCompact,
|
|
14
|
+
formatRequirementsCompact,
|
|
15
|
+
measureSavings,
|
|
16
|
+
} from "../structured-data-formatter.js";
|
|
17
|
+
import { compressPrompt, compressToTarget } from "../prompt-compressor.js";
|
|
18
|
+
import { chunkByRelevance } from "../semantic-chunker.js";
|
|
19
|
+
import { distillSummaries } from "../summary-distiller.js";
|
|
20
|
+
import {
|
|
21
|
+
optimizeForCaching,
|
|
22
|
+
section,
|
|
23
|
+
estimateCacheSavings,
|
|
24
|
+
} from "../prompt-cache-optimizer.js";
|
|
25
|
+
import {
|
|
26
|
+
estimateTokensForProvider,
|
|
27
|
+
getCharsPerToken,
|
|
28
|
+
} from "../token-counter.js";
|
|
29
|
+
import { computeBudgets } from "../context-budget.js";
|
|
30
|
+
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Fixture: Decisions (8 entries with 200-400 chars each)
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
function buildDecisions() {
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
id: "D001",
|
|
39
|
+
when_context: "M001/S01",
|
|
40
|
+
scope: "architecture",
|
|
41
|
+
decision:
|
|
42
|
+
"Select a database engine for artifact storage that supports embedded operation without requiring a separate server process, while providing ACID guarantees and WAL mode for concurrent reads during background indexing operations",
|
|
43
|
+
choice:
|
|
44
|
+
"SQLite with WAL mode enabled and PRAGMA journal_mode=WAL; connection pool size of 1 writer + 4 readers to prevent lock contention while maximizing read throughput",
|
|
45
|
+
rationale:
|
|
46
|
+
"Eliminates external dependency on PostgreSQL or MySQL server, reducing deployment complexity. SQLite WAL mode provides concurrent read access during writes, which is critical for background indexing while the user interacts with the system",
|
|
47
|
+
revisable: "no",
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: "D002",
|
|
51
|
+
when_context: "M001/S02",
|
|
52
|
+
scope: "testing",
|
|
53
|
+
decision:
|
|
54
|
+
"Establish the testing framework and assertion library for all unit and integration tests across the project, ensuring compatibility with TypeScript and ESM module resolution",
|
|
55
|
+
choice:
|
|
56
|
+
"Use node:test as the primary test runner with node:assert/strict for assertions; avoid Jest due to ESM compatibility issues and excessive configuration overhead for TypeScript projects",
|
|
57
|
+
rationale:
|
|
58
|
+
"Built-in Node.js test runner requires zero external dependencies, supports TypeScript via --experimental-strip-types, and produces TAP output compatible with CI systems. This reduces package install time by ~15 seconds",
|
|
59
|
+
revisable: "yes",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "D003",
|
|
63
|
+
when_context: "M001/S03",
|
|
64
|
+
scope: "observability",
|
|
65
|
+
decision:
|
|
66
|
+
"Define the observability strategy for tracking token usage, cache hit rates, and prompt compression efficiency across all provider integrations in the dispatch pipeline",
|
|
67
|
+
choice:
|
|
68
|
+
"Structured JSON logging with JSONL format to stderr; metrics collected in-memory with periodic flush to SQLite metrics table; no external APM dependency required for core functionality",
|
|
69
|
+
rationale:
|
|
70
|
+
"JSONL format enables easy parsing by external tools (jq, Datadog agent) without coupling the core system to any specific observability vendor. In-memory accumulation prevents I/O bottlenecks during rapid dispatch cycles",
|
|
71
|
+
revisable: "yes",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "D004",
|
|
75
|
+
when_context: "M001/S04",
|
|
76
|
+
scope: "security",
|
|
77
|
+
decision:
|
|
78
|
+
"Implement access control for environment variable injection into executor prompts, preventing accidental exposure of secrets like API keys, database credentials, and signing tokens",
|
|
79
|
+
choice:
|
|
80
|
+
"Allowlist-based environment variable filter with pattern matching; only variables matching GSD_*, NODE_ENV, and explicitly configured patterns are passed to executor prompts; all others are redacted",
|
|
81
|
+
rationale:
|
|
82
|
+
"Allowlist approach is safer than denylist because new environment variables are blocked by default. Pattern matching allows project-specific overrides via preferences without modifying core code",
|
|
83
|
+
revisable: "no",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "D005",
|
|
87
|
+
when_context: "M002/S01",
|
|
88
|
+
scope: "performance",
|
|
89
|
+
decision:
|
|
90
|
+
"Optimize prompt assembly latency for the dispatch pipeline to ensure sub-100ms total preparation time including context gathering, compression, and template rendering",
|
|
91
|
+
choice:
|
|
92
|
+
"Lazy evaluation with memoized context sections; compress only when content exceeds budget threshold; cache compiled templates in memory across dispatch cycles within the same session",
|
|
93
|
+
rationale:
|
|
94
|
+
"Profiling showed that eager compression of all sections added 40ms overhead even when total content was within budget. Lazy evaluation skips unnecessary work in the common case where context fits without compression",
|
|
95
|
+
revisable: "yes",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: "D006",
|
|
99
|
+
when_context: "M002/S02",
|
|
100
|
+
scope: "architecture",
|
|
101
|
+
decision:
|
|
102
|
+
"Design the plugin system architecture to support third-party extensions for custom skill definitions, prompt templates, and model routing rules without modifying core GSD code",
|
|
103
|
+
choice:
|
|
104
|
+
"File-based plugin discovery with JSON manifest validation; plugins loaded from .gsd/plugins/ directory with sandboxed execution context; no dynamic require() or eval() permitted",
|
|
105
|
+
rationale:
|
|
106
|
+
"File-based discovery avoids npm registry dependency for plugin distribution. Sandboxed execution prevents plugins from modifying core state or accessing the file system outside their declared scope",
|
|
107
|
+
revisable: "yes",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "D007",
|
|
111
|
+
when_context: "M002/S03",
|
|
112
|
+
scope: "testing",
|
|
113
|
+
decision:
|
|
114
|
+
"Establish integration test patterns for verifying end-to-end dispatch flows including context gathering, prompt assembly, provider API calls, and response processing",
|
|
115
|
+
choice:
|
|
116
|
+
"Recorded HTTP fixtures with deterministic replay; test harness intercepts provider API calls and returns pre-recorded responses; fixture files stored alongside test files in tests/fixtures/ directory",
|
|
117
|
+
rationale:
|
|
118
|
+
"Recorded fixtures eliminate flaky tests caused by network issues or API rate limits. Deterministic replay ensures tests produce identical results across environments and CI runs",
|
|
119
|
+
revisable: "yes",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: "D008",
|
|
123
|
+
when_context: "M002/S04",
|
|
124
|
+
scope: "observability",
|
|
125
|
+
decision:
|
|
126
|
+
"Implement cost tracking and projection for token usage across multiple providers, enabling budget alerts and automated throttling when spending approaches configured limits",
|
|
127
|
+
choice:
|
|
128
|
+
"Per-request cost calculation using model cost table with provider-specific pricing; rolling 24-hour window for budget tracking; configurable alert thresholds at 50%, 75%, and 90% of daily budget",
|
|
129
|
+
rationale:
|
|
130
|
+
"Rolling window prevents budget resets at midnight from causing spending spikes. Per-request calculation ensures accurate cost attribution even when switching between models mid-session",
|
|
131
|
+
revisable: "no",
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Fixture: Requirements (6 entries with 300-500 chars each)
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
|
|
140
|
+
function buildRequirements() {
|
|
141
|
+
return [
|
|
142
|
+
{
|
|
143
|
+
id: "R001",
|
|
144
|
+
class: "non-functional",
|
|
145
|
+
status: "active",
|
|
146
|
+
description:
|
|
147
|
+
"Response latency for prompt assembly must remain below 100ms at the 99th percentile under normal operating conditions with up to 200K tokens of context window utilization",
|
|
148
|
+
why: "Users experience noticeable delay when prompt assembly exceeds 100ms, compounding with network latency to the provider API. Sub-100ms assembly ensures total round-trip time stays under 2 seconds for interactive workflows",
|
|
149
|
+
primary_owner: "S01",
|
|
150
|
+
validation:
|
|
151
|
+
"Benchmark test measures P99 assembly latency across 1000 iterations with realistic context sizes. Alert triggers if P99 exceeds 80ms to provide early warning before the 100ms threshold is breached",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: "R002",
|
|
155
|
+
class: "functional",
|
|
156
|
+
status: "active",
|
|
157
|
+
description:
|
|
158
|
+
"Token optimization pipeline must achieve at least 30% character savings on structured data (decisions, requirements) when using compact format versus standard markdown table format",
|
|
159
|
+
why: "Context window capacity is the primary constraint for complex multi-task dispatches. A 30% savings on structured data frees approximately 15K characters for additional code context or dependency summaries",
|
|
160
|
+
primary_owner: "S02",
|
|
161
|
+
validation:
|
|
162
|
+
"End-to-end benchmark test with realistic decision and requirement fixtures validates savings percentage. Test fails if any optimization module falls below its documented savings target",
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "R003",
|
|
166
|
+
class: "constraint",
|
|
167
|
+
status: "active",
|
|
168
|
+
description:
|
|
169
|
+
"All prompt compression transformations must be deterministic: identical input must always produce identical output regardless of execution environment, timing, or system state",
|
|
170
|
+
why: "Non-deterministic compression would break prompt caching strategies that rely on prefix stability. Anthropic cache hits require exact prefix matches, so any variation in compressed output wastes cache credits",
|
|
171
|
+
primary_owner: "S03",
|
|
172
|
+
validation:
|
|
173
|
+
"Property-based test generates 500 random inputs and verifies that compressing each input twice produces byte-identical output. Additional test verifies cross-platform consistency",
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: "R004",
|
|
177
|
+
class: "non-functional",
|
|
178
|
+
status: "active",
|
|
179
|
+
description:
|
|
180
|
+
"Semantic chunking must select relevant code sections with at least 80% precision: selected chunks should contain query-relevant content, and the total selected content should be less than 60% of the original",
|
|
181
|
+
why: "Including irrelevant code sections wastes context budget and can confuse the executor model with unrelated implementation details. Precision above 80% ensures the context is focused and actionable",
|
|
182
|
+
primary_owner: "S04",
|
|
183
|
+
validation:
|
|
184
|
+
"Benchmark test with annotated code fixtures measures precision and recall of chunk selection. Query terms are chosen to target specific functions, and chunk scores are validated against expected relevance ordering",
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: "R005",
|
|
188
|
+
class: "functional",
|
|
189
|
+
status: "active",
|
|
190
|
+
description:
|
|
191
|
+
"Summary distillation must preserve all structured metadata fields (provides, requires, key_files, key_decisions) while achieving at least 40% size reduction from full SUMMARY.md content",
|
|
192
|
+
why: "Dependency summaries are injected into every task dispatch prompt. Reducing their size by 40% while preserving structured fields saves approximately 3-5K characters per dispatch across 3-4 dependency summaries",
|
|
193
|
+
primary_owner: "S05",
|
|
194
|
+
validation:
|
|
195
|
+
"Benchmark test creates realistic SUMMARY.md fixtures with full YAML frontmatter and prose sections. Distilled output is verified to contain all structured fields and meet the 40% savings target",
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: "R006",
|
|
199
|
+
class: "non-functional",
|
|
200
|
+
status: "active",
|
|
201
|
+
description:
|
|
202
|
+
"Cache optimization must achieve at least 60% cacheable prefix ratio by correctly classifying prompt sections as static, semi-static, or dynamic and ordering them for maximum cache hit potential",
|
|
203
|
+
why: "Anthropic charges 90% less for cached tokens. A 60% cacheable prefix with 90% cache discount yields approximately 54% cost savings on input tokens, which dominate the total cost for long-context prompts",
|
|
204
|
+
primary_owner: "S01",
|
|
205
|
+
validation:
|
|
206
|
+
"Benchmark test constructs a realistic prompt with system instructions, templates, slice context, and task-specific content. Cache optimizer output is verified to have cacheable prefix above 60% threshold",
|
|
207
|
+
},
|
|
208
|
+
];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// Fixture: Markdown table format for decisions (baseline)
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
|
|
215
|
+
function formatDecisionsAsMarkdownTable(
|
|
216
|
+
decisions: ReturnType<typeof buildDecisions>,
|
|
217
|
+
): string {
|
|
218
|
+
// Simulate a padded markdown table (typical of human-authored or tool-generated tables)
|
|
219
|
+
const lines: string[] = [
|
|
220
|
+
"# Decisions Register",
|
|
221
|
+
"",
|
|
222
|
+
"<!-- Append-only. Never edit or remove existing rows. -->",
|
|
223
|
+
"",
|
|
224
|
+
"| # | When Context | Scope | Decision | Choice | Rationale | Revisable? |",
|
|
225
|
+
"|--------|----------------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|",
|
|
226
|
+
];
|
|
227
|
+
for (const d of decisions) {
|
|
228
|
+
lines.push(
|
|
229
|
+
`| ${d.id.padEnd(6)} | ${d.when_context.padEnd(14)} | ${d.scope.padEnd(15)} | ${d.decision.padEnd(160)} | ${d.choice.padEnd(160)} | ${d.rationale.padEnd(160)} | ${d.revisable.padEnd(10)} |`,
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
return lines.join("\n");
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Fixture: Markdown format for requirements (baseline)
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
|
|
239
|
+
function formatRequirementsAsMarkdown(
|
|
240
|
+
requirements: ReturnType<typeof buildRequirements>,
|
|
241
|
+
): string {
|
|
242
|
+
const lines: string[] = ["# Requirements", "", "## Active", ""];
|
|
243
|
+
for (const r of requirements) {
|
|
244
|
+
lines.push(`### ${r.id} -- ${r.description}`);
|
|
245
|
+
lines.push("");
|
|
246
|
+
lines.push(`- Class: ${r.class}`);
|
|
247
|
+
lines.push(`- Status: ${r.status}`);
|
|
248
|
+
lines.push(`- Why it matters: ${r.why}`);
|
|
249
|
+
lines.push(`- Primary owning slice: ${r.primary_owner}`);
|
|
250
|
+
lines.push(`- Validation: ${r.validation}`);
|
|
251
|
+
lines.push("");
|
|
252
|
+
}
|
|
253
|
+
return lines.join("\n");
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// Fixture: Realistic TypeScript code file (200+ lines, 8+ functions)
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
|
|
260
|
+
const SAMPLE_CODE = `import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
261
|
+
import { join, resolve, dirname } from "node:path";
|
|
262
|
+
import { createHash } from "node:crypto";
|
|
263
|
+
|
|
264
|
+
// ---- Types ----
|
|
265
|
+
|
|
266
|
+
interface Config {
|
|
267
|
+
basePath: string;
|
|
268
|
+
maxRetries: number;
|
|
269
|
+
timeout: number;
|
|
270
|
+
logLevel: "debug" | "info" | "warn" | "error";
|
|
271
|
+
database: {
|
|
272
|
+
host: string;
|
|
273
|
+
port: number;
|
|
274
|
+
name: string;
|
|
275
|
+
poolSize: number;
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
interface User {
|
|
280
|
+
id: string;
|
|
281
|
+
email: string;
|
|
282
|
+
role: "admin" | "editor" | "viewer";
|
|
283
|
+
createdAt: Date;
|
|
284
|
+
lastLogin: Date | null;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
interface AuthToken {
|
|
288
|
+
token: string;
|
|
289
|
+
userId: string;
|
|
290
|
+
expiresAt: Date;
|
|
291
|
+
scopes: string[];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
interface LogEntry {
|
|
295
|
+
timestamp: Date;
|
|
296
|
+
level: string;
|
|
297
|
+
message: string;
|
|
298
|
+
context: Record<string, unknown>;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
interface DatabaseConnection {
|
|
302
|
+
query(sql: string, params?: unknown[]): Promise<unknown[]>;
|
|
303
|
+
execute(sql: string, params?: unknown[]): Promise<{ affectedRows: number }>;
|
|
304
|
+
close(): Promise<void>;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// ---- Config Module ----
|
|
308
|
+
|
|
309
|
+
export function loadConfig(path: string): Config {
|
|
310
|
+
if (!existsSync(path)) {
|
|
311
|
+
throw new Error(\`Config file not found: \${path}\`);
|
|
312
|
+
}
|
|
313
|
+
const raw = readFileSync(path, "utf-8");
|
|
314
|
+
const parsed = JSON.parse(raw);
|
|
315
|
+
return validateConfig(parsed);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export function validateConfig(config: unknown): Config {
|
|
319
|
+
if (typeof config !== "object" || config === null) {
|
|
320
|
+
throw new Error("Config must be a non-null object");
|
|
321
|
+
}
|
|
322
|
+
const c = config as Record<string, unknown>;
|
|
323
|
+
if (typeof c.basePath !== "string" || !c.basePath) {
|
|
324
|
+
throw new Error("Config.basePath must be a non-empty string");
|
|
325
|
+
}
|
|
326
|
+
if (typeof c.maxRetries !== "number" || c.maxRetries < 0) {
|
|
327
|
+
throw new Error("Config.maxRetries must be a non-negative number");
|
|
328
|
+
}
|
|
329
|
+
if (typeof c.timeout !== "number" || c.timeout <= 0) {
|
|
330
|
+
throw new Error("Config.timeout must be a positive number");
|
|
331
|
+
}
|
|
332
|
+
return c as unknown as Config;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export function mergeConfigs(base: Config, overrides: Partial<Config>): Config {
|
|
336
|
+
return {
|
|
337
|
+
...base,
|
|
338
|
+
...overrides,
|
|
339
|
+
database: {
|
|
340
|
+
...base.database,
|
|
341
|
+
...(overrides.database ?? {}),
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ---- Database Module ----
|
|
347
|
+
|
|
348
|
+
export async function connectDatabase(config: Config): Promise<DatabaseConnection> {
|
|
349
|
+
const db = config.database;
|
|
350
|
+
const connectionString = \`\${db.host}:\${db.port}/\${db.name}\`;
|
|
351
|
+
let connected = false;
|
|
352
|
+
let attempts = 0;
|
|
353
|
+
|
|
354
|
+
while (!connected && attempts < config.maxRetries) {
|
|
355
|
+
try {
|
|
356
|
+
attempts++;
|
|
357
|
+
// Simulated connection logic
|
|
358
|
+
connected = true;
|
|
359
|
+
} catch (err) {
|
|
360
|
+
if (attempts >= config.maxRetries) {
|
|
361
|
+
throw new Error(\`Failed to connect to \${connectionString} after \${attempts} attempts\`);
|
|
362
|
+
}
|
|
363
|
+
await new Promise((resolve) => setTimeout(resolve, 1000 * attempts));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return {
|
|
368
|
+
async query(sql: string, params?: unknown[]): Promise<unknown[]> {
|
|
369
|
+
return [];
|
|
370
|
+
},
|
|
371
|
+
async execute(sql: string, params?: unknown[]): Promise<{ affectedRows: number }> {
|
|
372
|
+
return { affectedRows: 0 };
|
|
373
|
+
},
|
|
374
|
+
async close(): Promise<void> {
|
|
375
|
+
connected = false;
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
export async function runMigrations(db: DatabaseConnection, migrationsDir: string): Promise<number> {
|
|
381
|
+
const files = existsSync(migrationsDir) ? [] : [];
|
|
382
|
+
let applied = 0;
|
|
383
|
+
for (const file of files) {
|
|
384
|
+
const sql = readFileSync(join(migrationsDir, file), "utf-8");
|
|
385
|
+
await db.execute(sql);
|
|
386
|
+
applied++;
|
|
387
|
+
}
|
|
388
|
+
return applied;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// ---- Auth Module ----
|
|
392
|
+
|
|
393
|
+
export function hashPassword(password: string, salt: string): string {
|
|
394
|
+
return createHash("sha256")
|
|
395
|
+
.update(password + salt)
|
|
396
|
+
.digest("hex");
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export function generateAuthToken(user: User, scopes: string[]): AuthToken {
|
|
400
|
+
const token = createHash("sha256")
|
|
401
|
+
.update(user.id + Date.now().toString() + Math.random().toString())
|
|
402
|
+
.digest("hex");
|
|
403
|
+
|
|
404
|
+
return {
|
|
405
|
+
token,
|
|
406
|
+
userId: user.id,
|
|
407
|
+
expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
|
|
408
|
+
scopes,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export function validateAuthToken(token: AuthToken): boolean {
|
|
413
|
+
if (!token.token || token.token.length < 32) return false;
|
|
414
|
+
if (new Date() > token.expiresAt) return false;
|
|
415
|
+
if (!token.scopes || token.scopes.length === 0) return false;
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export function checkPermission(user: User, requiredRole: string): boolean {
|
|
420
|
+
const roleHierarchy: Record<string, number> = {
|
|
421
|
+
viewer: 1,
|
|
422
|
+
editor: 2,
|
|
423
|
+
admin: 3,
|
|
424
|
+
};
|
|
425
|
+
const userLevel = roleHierarchy[user.role] ?? 0;
|
|
426
|
+
const requiredLevel = roleHierarchy[requiredRole] ?? 999;
|
|
427
|
+
return userLevel >= requiredLevel;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// ---- Logging Module ----
|
|
431
|
+
|
|
432
|
+
export function createLogger(config: Config) {
|
|
433
|
+
const levels: Record<string, number> = {
|
|
434
|
+
debug: 0,
|
|
435
|
+
info: 1,
|
|
436
|
+
warn: 2,
|
|
437
|
+
error: 3,
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
const minLevel = levels[config.logLevel] ?? 1;
|
|
441
|
+
|
|
442
|
+
return {
|
|
443
|
+
log(level: string, message: string, context: Record<string, unknown> = {}): void {
|
|
444
|
+
if ((levels[level] ?? 0) < minLevel) return;
|
|
445
|
+
const entry: LogEntry = {
|
|
446
|
+
timestamp: new Date(),
|
|
447
|
+
level,
|
|
448
|
+
message,
|
|
449
|
+
context,
|
|
450
|
+
};
|
|
451
|
+
console.error(JSON.stringify(entry));
|
|
452
|
+
},
|
|
453
|
+
debug(message: string, context?: Record<string, unknown>): void {
|
|
454
|
+
this.log("debug", message, context);
|
|
455
|
+
},
|
|
456
|
+
info(message: string, context?: Record<string, unknown>): void {
|
|
457
|
+
this.log("info", message, context);
|
|
458
|
+
},
|
|
459
|
+
warn(message: string, context?: Record<string, unknown>): void {
|
|
460
|
+
this.log("warn", message, context);
|
|
461
|
+
},
|
|
462
|
+
error(message: string, context?: Record<string, unknown>): void {
|
|
463
|
+
this.log("error", message, context);
|
|
464
|
+
},
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// ---- Formatting Module ----
|
|
469
|
+
|
|
470
|
+
export function formatBytes(bytes: number): string {
|
|
471
|
+
if (bytes < 1024) return bytes + " B";
|
|
472
|
+
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB";
|
|
473
|
+
if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(1) + " MB";
|
|
474
|
+
return (bytes / (1024 * 1024 * 1024)).toFixed(1) + " GB";
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export function formatDuration(ms: number): string {
|
|
478
|
+
if (ms < 1000) return ms + "ms";
|
|
479
|
+
if (ms < 60_000) return (ms / 1000).toFixed(1) + "s";
|
|
480
|
+
const minutes = Math.floor(ms / 60_000);
|
|
481
|
+
const seconds = Math.floor((ms % 60_000) / 1000);
|
|
482
|
+
return minutes + "m " + seconds + "s";
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export function truncateString(str: string, maxLen: number): string {
|
|
486
|
+
if (str.length <= maxLen) return str;
|
|
487
|
+
return str.slice(0, maxLen - 3) + "...";
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// ---- Parsing Module ----
|
|
491
|
+
|
|
492
|
+
export function parseKeyValuePairs(input: string): Map<string, string> {
|
|
493
|
+
const result = new Map<string, string>();
|
|
494
|
+
const lines = input.split("\\n");
|
|
495
|
+
for (const line of lines) {
|
|
496
|
+
const idx = line.indexOf(":");
|
|
497
|
+
if (idx > 0) {
|
|
498
|
+
const key = line.slice(0, idx).trim();
|
|
499
|
+
const value = line.slice(idx + 1).trim();
|
|
500
|
+
if (key && value) {
|
|
501
|
+
result.set(key, value);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return result;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
export function parseCSVLine(line: string): string[] {
|
|
509
|
+
const fields: string[] = [];
|
|
510
|
+
let current = "";
|
|
511
|
+
let inQuotes = false;
|
|
512
|
+
for (const char of line) {
|
|
513
|
+
if (char === '"') {
|
|
514
|
+
inQuotes = !inQuotes;
|
|
515
|
+
} else if (char === "," && !inQuotes) {
|
|
516
|
+
fields.push(current.trim());
|
|
517
|
+
current = "";
|
|
518
|
+
} else {
|
|
519
|
+
current += char;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
fields.push(current.trim());
|
|
523
|
+
return fields;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// ---- Utility Module ----
|
|
527
|
+
|
|
528
|
+
export function deepClone<T>(obj: T): T {
|
|
529
|
+
return JSON.parse(JSON.stringify(obj));
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
export function debounce<T extends (...args: unknown[]) => void>(
|
|
533
|
+
fn: T,
|
|
534
|
+
delayMs: number,
|
|
535
|
+
): (...args: Parameters<T>) => void {
|
|
536
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
537
|
+
return (...args: Parameters<T>) => {
|
|
538
|
+
if (timer) clearTimeout(timer);
|
|
539
|
+
timer = setTimeout(() => fn(...args), delayMs);
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
export function retry<T>(
|
|
544
|
+
fn: () => Promise<T>,
|
|
545
|
+
maxAttempts: number,
|
|
546
|
+
delayMs: number,
|
|
547
|
+
): Promise<T> {
|
|
548
|
+
return new Promise((resolve, reject) => {
|
|
549
|
+
let attempts = 0;
|
|
550
|
+
const attempt = async () => {
|
|
551
|
+
try {
|
|
552
|
+
attempts++;
|
|
553
|
+
const result = await fn();
|
|
554
|
+
resolve(result);
|
|
555
|
+
} catch (err) {
|
|
556
|
+
if (attempts >= maxAttempts) {
|
|
557
|
+
reject(err);
|
|
558
|
+
} else {
|
|
559
|
+
setTimeout(attempt, delayMs);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
attempt();
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
export function groupBy<T>(items: T[], keyFn: (item: T) => string): Map<string, T[]> {
|
|
568
|
+
const groups = new Map<string, T[]>();
|
|
569
|
+
for (const item of items) {
|
|
570
|
+
const key = keyFn(item);
|
|
571
|
+
const group = groups.get(key) ?? [];
|
|
572
|
+
group.push(item);
|
|
573
|
+
groups.set(key, group);
|
|
574
|
+
}
|
|
575
|
+
return groups;
|
|
576
|
+
}
|
|
577
|
+
`;
|
|
578
|
+
|
|
579
|
+
// ---------------------------------------------------------------------------
|
|
580
|
+
// Fixture: Realistic SUMMARY.md contents (4 entries, 800-1200 chars each)
|
|
581
|
+
// ---------------------------------------------------------------------------
|
|
582
|
+
|
|
583
|
+
function buildSummaries(): string[] {
|
|
584
|
+
return [
|
|
585
|
+
`---
|
|
586
|
+
id: S01
|
|
587
|
+
provides:
|
|
588
|
+
- database-schema
|
|
589
|
+
- migration-engine
|
|
590
|
+
- connection-pool
|
|
591
|
+
requires: []
|
|
592
|
+
key_files:
|
|
593
|
+
- src/db/schema.ts
|
|
594
|
+
- src/db/migrations/001-init.sql
|
|
595
|
+
- src/db/connection.ts
|
|
596
|
+
- src/db/pool.ts
|
|
597
|
+
key_decisions:
|
|
598
|
+
- D001
|
|
599
|
+
- D004
|
|
600
|
+
patterns_established:
|
|
601
|
+
- WAL-mode for all SQLite connections
|
|
602
|
+
- Migration files numbered sequentially
|
|
603
|
+
- Connection pool with 1 writer + N readers
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
# S01: Database Foundation
|
|
607
|
+
|
|
608
|
+
This slice establishes the core database infrastructure used by all subsequent slices.
|
|
609
|
+
The SQLite database uses WAL mode for concurrent read access during background operations.
|
|
610
|
+
|
|
611
|
+
## Implementation Details
|
|
612
|
+
|
|
613
|
+
The schema defines tables for artifacts (decisions, requirements, tasks), metrics,
|
|
614
|
+
and session state. Each table includes created_at and updated_at timestamps with
|
|
615
|
+
automatic trigger-based updates.
|
|
616
|
+
|
|
617
|
+
The migration engine supports forward-only migrations with checksum verification
|
|
618
|
+
to detect tampering. Each migration runs in a transaction with automatic rollback
|
|
619
|
+
on failure.
|
|
620
|
+
|
|
621
|
+
## Testing Approach
|
|
622
|
+
|
|
623
|
+
Integration tests use an in-memory SQLite database to avoid filesystem side effects.
|
|
624
|
+
Each test creates a fresh database, applies all migrations, and verifies the schema
|
|
625
|
+
matches expected structure.
|
|
626
|
+
|
|
627
|
+
## Performance Characteristics
|
|
628
|
+
|
|
629
|
+
Schema initialization takes approximately 5ms on modern hardware. Query latency
|
|
630
|
+
for typical operations (insert, select by ID, range scan) is under 1ms. The WAL
|
|
631
|
+
checkpoint runs automatically every 1000 pages or when the connection closes.`,
|
|
632
|
+
|
|
633
|
+
`---
|
|
634
|
+
id: S02
|
|
635
|
+
provides:
|
|
636
|
+
- prompt-compressor
|
|
637
|
+
- token-counter
|
|
638
|
+
- context-budget
|
|
639
|
+
requires:
|
|
640
|
+
- database-schema
|
|
641
|
+
key_files:
|
|
642
|
+
- src/extensions/gsd/prompt-compressor.ts
|
|
643
|
+
- src/extensions/gsd/token-counter.ts
|
|
644
|
+
- src/extensions/gsd/context-budget.ts
|
|
645
|
+
- src/extensions/gsd/structured-data-formatter.ts
|
|
646
|
+
key_decisions:
|
|
647
|
+
- D002
|
|
648
|
+
- D003
|
|
649
|
+
- D005
|
|
650
|
+
patterns_established:
|
|
651
|
+
- Deterministic compression with no LLM calls
|
|
652
|
+
- Three compression levels (light/moderate/aggressive)
|
|
653
|
+
- Provider-aware token estimation
|
|
654
|
+
---
|
|
655
|
+
|
|
656
|
+
# S02: Token Optimization Pipeline
|
|
657
|
+
|
|
658
|
+
This slice implements the complete token optimization pipeline that reduces prompt
|
|
659
|
+
size while preserving semantic content. All transformations are deterministic and
|
|
660
|
+
require no external API calls.
|
|
661
|
+
|
|
662
|
+
## Compression Strategy
|
|
663
|
+
|
|
664
|
+
The pipeline applies transformations in order of increasing aggressiveness:
|
|
665
|
+
light (whitespace normalization, comment removal), moderate (phrase abbreviation,
|
|
666
|
+
boilerplate removal), and aggressive (emphasis removal, line truncation).
|
|
667
|
+
|
|
668
|
+
Code blocks and markdown headings are preserved by default to maintain structural
|
|
669
|
+
readability for the LLM executor.
|
|
670
|
+
|
|
671
|
+
## Budget Allocation
|
|
672
|
+
|
|
673
|
+
Context budgets are computed proportionally from the executor model's context window.
|
|
674
|
+
Summaries receive 15%, inline context receives 40%, and verification sections receive
|
|
675
|
+
10%. The remaining 35% is reserved for the model's response generation.
|
|
676
|
+
|
|
677
|
+
## Token Counting
|
|
678
|
+
|
|
679
|
+
Token counts are estimated using provider-specific chars-per-token ratios:
|
|
680
|
+
Anthropic at 3.5, OpenAI at 4.0, Google at 4.0. When tiktoken is available,
|
|
681
|
+
exact counts replace estimates for OpenAI-compatible models.`,
|
|
682
|
+
|
|
683
|
+
`---
|
|
684
|
+
id: S03
|
|
685
|
+
provides:
|
|
686
|
+
- semantic-chunker
|
|
687
|
+
- summary-distiller
|
|
688
|
+
- cache-optimizer
|
|
689
|
+
requires:
|
|
690
|
+
- prompt-compressor
|
|
691
|
+
- token-counter
|
|
692
|
+
key_files:
|
|
693
|
+
- src/extensions/gsd/semantic-chunker.ts
|
|
694
|
+
- src/extensions/gsd/summary-distiller.ts
|
|
695
|
+
- src/extensions/gsd/prompt-cache-optimizer.ts
|
|
696
|
+
key_decisions:
|
|
697
|
+
- D006
|
|
698
|
+
- D007
|
|
699
|
+
patterns_established:
|
|
700
|
+
- TF-IDF scoring for content relevance
|
|
701
|
+
- Progressive field dropping for budget compliance
|
|
702
|
+
- Static-first section ordering for cache efficiency
|
|
703
|
+
---
|
|
704
|
+
|
|
705
|
+
# S03: Advanced Context Selection
|
|
706
|
+
|
|
707
|
+
This slice builds on the token optimization pipeline to provide intelligent content
|
|
708
|
+
selection and cache-aware prompt assembly. It includes semantic chunking for code
|
|
709
|
+
files, summary distillation for dependency context, and cache-optimized section ordering.
|
|
710
|
+
|
|
711
|
+
## Semantic Chunking
|
|
712
|
+
|
|
713
|
+
The chunker splits code files at semantic boundaries (function/class/interface
|
|
714
|
+
declarations) and scores each chunk against the task query using TF-IDF relevance.
|
|
715
|
+
Only the top-scoring chunks are included in the prompt, typically reducing code
|
|
716
|
+
context by 40-60%.
|
|
717
|
+
|
|
718
|
+
## Summary Distillation
|
|
719
|
+
|
|
720
|
+
SUMMARY.md files from dependency slices are distilled to their essential structured
|
|
721
|
+
data: provides, requires, key_files, and key_decisions. Verbose prose descriptions
|
|
722
|
+
are dropped to save context budget. Progressive field dropping ensures output fits
|
|
723
|
+
within any budget constraint.
|
|
724
|
+
|
|
725
|
+
## Cache Optimization
|
|
726
|
+
|
|
727
|
+
Prompt sections are classified as static (system prompt, templates), semi-static
|
|
728
|
+
(slice plan, decisions), or dynamic (task plan, file contents). Sections are reordered
|
|
729
|
+
to place static content first, maximizing the cacheable prefix length for both
|
|
730
|
+
Anthropic and OpenAI prompt caching strategies.`,
|
|
731
|
+
|
|
732
|
+
`---
|
|
733
|
+
id: S04
|
|
734
|
+
provides:
|
|
735
|
+
- dispatch-pipeline
|
|
736
|
+
- task-routing
|
|
737
|
+
- verification-gate
|
|
738
|
+
requires:
|
|
739
|
+
- database-schema
|
|
740
|
+
- prompt-compressor
|
|
741
|
+
- semantic-chunker
|
|
742
|
+
- cache-optimizer
|
|
743
|
+
key_files:
|
|
744
|
+
- src/extensions/gsd/auto-dispatch.ts
|
|
745
|
+
- src/extensions/gsd/model-router.ts
|
|
746
|
+
- src/extensions/gsd/verification-gate.ts
|
|
747
|
+
- src/extensions/gsd/auto-supervisor.ts
|
|
748
|
+
key_decisions:
|
|
749
|
+
- D008
|
|
750
|
+
patterns_established:
|
|
751
|
+
- Budget-aware dispatch with automatic compression
|
|
752
|
+
- Model routing based on task complexity
|
|
753
|
+
- Evidence-based verification before task completion
|
|
754
|
+
---
|
|
755
|
+
|
|
756
|
+
# S04: Dispatch Pipeline
|
|
757
|
+
|
|
758
|
+
This slice implements the end-to-end dispatch pipeline that takes a task plan,
|
|
759
|
+
assembles an optimized prompt, routes it to the appropriate model, and verifies
|
|
760
|
+
the executor's output before marking the task complete.
|
|
761
|
+
|
|
762
|
+
## Prompt Assembly
|
|
763
|
+
|
|
764
|
+
The dispatch pipeline collects context from multiple sources: decisions and
|
|
765
|
+
requirements from the database, dependency summaries from prior slices, code
|
|
766
|
+
context from the workspace index, and task-specific instructions from the plan.
|
|
767
|
+
All content passes through the optimization pipeline before assembly.
|
|
768
|
+
|
|
769
|
+
## Model Routing
|
|
770
|
+
|
|
771
|
+
Tasks are routed to models based on complexity classification: simple tasks go
|
|
772
|
+
to smaller/faster models, complex tasks go to larger models with bigger context
|
|
773
|
+
windows. The router considers available context budget, estimated token usage,
|
|
774
|
+
and historical success rates for each model-task combination.
|
|
775
|
+
|
|
776
|
+
## Verification
|
|
777
|
+
|
|
778
|
+
Each completed task passes through a verification gate that checks for evidence
|
|
779
|
+
of completion: modified files, passing tests, and explicit verification commands
|
|
780
|
+
defined in the task plan. Tasks without sufficient evidence are flagged for
|
|
781
|
+
review rather than silently accepted.`,
|
|
782
|
+
];
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
// ---------------------------------------------------------------------------
|
|
786
|
+
// Fixture: Verbose prompt content (5000+ chars) for compression benchmark
|
|
787
|
+
// ---------------------------------------------------------------------------
|
|
788
|
+
|
|
789
|
+
function buildVerbosePrompt(): string {
|
|
790
|
+
return `# Executor Instructions
|
|
791
|
+
|
|
792
|
+
<!-- These instructions are generated automatically by the GSD dispatch system. -->
|
|
793
|
+
<!-- Version: 2.4.1 -->
|
|
794
|
+
<!-- Generated: 2026-03-17T10:00:00Z -->
|
|
795
|
+
<!-- Template: executor-v3 -->
|
|
796
|
+
|
|
797
|
+
---
|
|
798
|
+
|
|
799
|
+
## Context and Background
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
In order to complete this task successfully, it is important to note that the system architecture follows a modular design pattern. The following sections describe the relevant context for your work.
|
|
803
|
+
|
|
804
|
+
As mentioned previously, the database layer uses SQLite with WAL mode enabled. In addition to the database configuration, you should be aware of the caching strategy that has been implemented.
|
|
805
|
+
|
|
806
|
+
Due to the fact that we need to maintain backward compatibility, all API changes must be additive. At this point in time, we do not support breaking changes to the public API surface.
|
|
807
|
+
|
|
808
|
+
For the purpose of maintaining consistency, all new code should follow the established patterns documented in the architecture decision records. In the event that you encounter a conflict between patterns, prefer the most recent decision.
|
|
809
|
+
|
|
810
|
+
With regard to testing, all new functionality must include unit tests with at least 80% branch coverage. Prior to submitting your changes, run the full test suite to verify no regressions.
|
|
811
|
+
|
|
812
|
+
Subsequent to completing the implementation, update the SUMMARY.md file with any new patterns or decisions established during development.
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
---
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
## Technical Requirements
|
|
819
|
+
|
|
820
|
+
In accordance with the project standards, the implementation must satisfy the following requirements:
|
|
821
|
+
|
|
822
|
+
(none)
|
|
823
|
+
N/A
|
|
824
|
+
(not applicable)
|
|
825
|
+
(empty)
|
|
826
|
+
|
|
827
|
+
A number of performance constraints apply to this module. In the case of database operations, queries must complete within 10ms at the 95th percentile. On the basis of our load testing results, the system handles approximately 500 concurrent requests.
|
|
828
|
+
|
|
829
|
+
In order to ensure proper error handling, all async functions must use try-catch blocks. In the event that an error occurs, it is important to note that the error should be logged before re-throwing.
|
|
830
|
+
|
|
831
|
+
The following code patterns should be followed:
|
|
832
|
+
|
|
833
|
+
\`\`\`typescript
|
|
834
|
+
// Always use strict null checks
|
|
835
|
+
interface Result<T> {
|
|
836
|
+
data: T | null;
|
|
837
|
+
error: string | null;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
// Prefer explicit return types
|
|
841
|
+
export function processItem(item: unknown): Result<ProcessedItem> {
|
|
842
|
+
if (!isValid(item)) {
|
|
843
|
+
return { data: null, error: "Invalid item format" };
|
|
844
|
+
}
|
|
845
|
+
return { data: transform(item), error: null };
|
|
846
|
+
}
|
|
847
|
+
\`\`\`
|
|
848
|
+
|
|
849
|
+
---
|
|
850
|
+
|
|
851
|
+
## Dependencies
|
|
852
|
+
|
|
853
|
+
- **Database module** (src/db/connection.ts): Provides connection pool management
|
|
854
|
+
- **Auth module** (src/auth/tokens.ts): Handles token validation and refresh
|
|
855
|
+
- **Logger** (src/utils/logger.ts): Structured logging with context propagation
|
|
856
|
+
- **Config module** (src/config/loader.ts): Configuration loading and validation
|
|
857
|
+
|
|
858
|
+
> Note: The database module is currently being refactored as part of M002/S03.
|
|
859
|
+
> Use the stable API surface and avoid internal implementation details.
|
|
860
|
+
> In order to avoid breakage, do not import from internal paths.
|
|
861
|
+
|
|
862
|
+
---
|
|
863
|
+
|
|
864
|
+
## Task Plan
|
|
865
|
+
|
|
866
|
+
In order to implement the requested changes, you should follow these steps:
|
|
867
|
+
|
|
868
|
+
1. Review the existing implementation in the target files
|
|
869
|
+
2. Implement the changes described in the task description
|
|
870
|
+
3. Write unit tests covering all new code paths
|
|
871
|
+
4. Update documentation if any public APIs change
|
|
872
|
+
5. Run the verification commands listed below
|
|
873
|
+
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
## Carry-Forward Context
|
|
877
|
+
|
|
878
|
+
In order to understand the current state of the codebase, it is important to note that the following decisions were made in prior slices:
|
|
879
|
+
|
|
880
|
+
- In the event that a database connection fails, the system should retry with exponential backoff. Due to the fact that connection failures are transient, this approach works well.
|
|
881
|
+
- Due to the fact that we use SQLite, all write operations are serialized through a single writer connection. In order to prevent lock contention, the pool is configured with 1 writer and 4 readers.
|
|
882
|
+
- As mentioned previously, the token optimization pipeline processes content in three stages: light, moderate, and aggressive compression. In order to preserve semantic meaning, code blocks are excluded from compression.
|
|
883
|
+
- For the purpose of maintaining cache efficiency, static prompt sections are always placed before dynamic sections. In the event that sections are reordered, cache hit rates drop significantly.
|
|
884
|
+
- At this point in time, the system supports three providers: Anthropic, OpenAI, and Google. In order to add a new provider, implement the ProviderAdapter interface.
|
|
885
|
+
- In accordance with the security policy, all environment variables are filtered through an allowlist. For the purpose of preventing accidental exposure, unknown variables are redacted.
|
|
886
|
+
- With regard to the plugin system, plugins are loaded from the .gsd/plugins/ directory. Prior to loading, each plugin manifest is validated against the JSON schema.
|
|
887
|
+
- Subsequent to task completion, the verification gate checks for evidence of completion. In the case of missing evidence, the task is flagged for review.
|
|
888
|
+
|
|
889
|
+
N/A
|
|
890
|
+
(none)
|
|
891
|
+
(not applicable)
|
|
892
|
+
(empty)
|
|
893
|
+
|
|
894
|
+
---
|
|
895
|
+
|
|
896
|
+
## Verification Commands
|
|
897
|
+
|
|
898
|
+
\`\`\`bash
|
|
899
|
+
npm run test -- --grep "database"
|
|
900
|
+
npm run lint
|
|
901
|
+
npm run build
|
|
902
|
+
\`\`\`
|
|
903
|
+
|
|
904
|
+
<!-- End of generated instructions -->
|
|
905
|
+
<!-- Do not modify below this line -->`;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
909
|
+
// Tests
|
|
910
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
911
|
+
|
|
912
|
+
describe("Token Optimization Benchmark", () => {
|
|
913
|
+
// -----------------------------------------------------------------------
|
|
914
|
+
// Test 1: Structured Data Savings
|
|
915
|
+
// -----------------------------------------------------------------------
|
|
916
|
+
it("structured data savings benchmark", () => {
|
|
917
|
+
const decisions = buildDecisions();
|
|
918
|
+
const requirements = buildRequirements();
|
|
919
|
+
|
|
920
|
+
const markdownDecisions = formatDecisionsAsMarkdownTable(decisions);
|
|
921
|
+
const compactDecisions = formatDecisionsCompact(decisions);
|
|
922
|
+
|
|
923
|
+
const decisionSavings = measureSavings(compactDecisions, markdownDecisions);
|
|
924
|
+
|
|
925
|
+
console.log(
|
|
926
|
+
` Decisions compact: ${decisionSavings.toFixed(1)}% savings (${markdownDecisions.length} -> ${compactDecisions.length} chars)`,
|
|
927
|
+
);
|
|
928
|
+
assert.ok(
|
|
929
|
+
decisionSavings > 15,
|
|
930
|
+
`Decisions savings should be >15%, got ${decisionSavings.toFixed(1)}%`,
|
|
931
|
+
);
|
|
932
|
+
|
|
933
|
+
const markdownReqs = formatRequirementsAsMarkdown(requirements);
|
|
934
|
+
const compactReqs = formatRequirementsCompact(requirements);
|
|
935
|
+
|
|
936
|
+
const reqSavings = measureSavings(compactReqs, markdownReqs);
|
|
937
|
+
|
|
938
|
+
console.log(
|
|
939
|
+
` Requirements compact: ${reqSavings.toFixed(1)}% savings (${markdownReqs.length} -> ${compactReqs.length} chars)`,
|
|
940
|
+
);
|
|
941
|
+
assert.ok(
|
|
942
|
+
reqSavings > 5,
|
|
943
|
+
`Requirements savings should be >5%, got ${reqSavings.toFixed(1)}%`,
|
|
944
|
+
);
|
|
945
|
+
});
|
|
946
|
+
|
|
947
|
+
// -----------------------------------------------------------------------
|
|
948
|
+
// Test 2: Prompt Compression
|
|
949
|
+
// -----------------------------------------------------------------------
|
|
950
|
+
it("prompt compression benchmark", () => {
|
|
951
|
+
const verbose = buildVerbosePrompt();
|
|
952
|
+
|
|
953
|
+
const light = compressPrompt(verbose, { level: "light" });
|
|
954
|
+
console.log(
|
|
955
|
+
` Compression light: ${light.savingsPercent.toFixed(1)}% savings (${light.originalChars} -> ${light.compressedChars} chars, ${light.transformationsApplied} transforms)`,
|
|
956
|
+
);
|
|
957
|
+
assert.ok(
|
|
958
|
+
light.savingsPercent > 5,
|
|
959
|
+
`Light compression should save >5%, got ${light.savingsPercent}%`,
|
|
960
|
+
);
|
|
961
|
+
|
|
962
|
+
const moderate = compressPrompt(verbose, { level: "moderate" });
|
|
963
|
+
console.log(
|
|
964
|
+
` Compression moderate: ${moderate.savingsPercent.toFixed(1)}% savings (${moderate.originalChars} -> ${moderate.compressedChars} chars, ${moderate.transformationsApplied} transforms)`,
|
|
965
|
+
);
|
|
966
|
+
assert.ok(
|
|
967
|
+
moderate.savingsPercent > 10,
|
|
968
|
+
`Moderate compression should save >10%, got ${moderate.savingsPercent}%`,
|
|
969
|
+
);
|
|
970
|
+
|
|
971
|
+
const aggressive = compressPrompt(verbose, { level: "aggressive" });
|
|
972
|
+
console.log(
|
|
973
|
+
` Compression aggressive: ${aggressive.savingsPercent.toFixed(1)}% savings (${aggressive.originalChars} -> ${aggressive.compressedChars} chars, ${aggressive.transformationsApplied} transforms)`,
|
|
974
|
+
);
|
|
975
|
+
assert.ok(
|
|
976
|
+
aggressive.savingsPercent > 15,
|
|
977
|
+
`Aggressive compression should save >15%, got ${aggressive.savingsPercent}%`,
|
|
978
|
+
);
|
|
979
|
+
|
|
980
|
+
// Verify code blocks are preserved
|
|
981
|
+
assert.ok(
|
|
982
|
+
aggressive.content.includes("interface Result<T>"),
|
|
983
|
+
"Code blocks should be preserved through all compression levels",
|
|
984
|
+
);
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
// -----------------------------------------------------------------------
|
|
988
|
+
// Test 3: Semantic Chunking
|
|
989
|
+
// -----------------------------------------------------------------------
|
|
990
|
+
it("semantic chunking benchmark", () => {
|
|
991
|
+
const query = "database connection config validation";
|
|
992
|
+
const result = chunkByRelevance(SAMPLE_CODE, query, {
|
|
993
|
+
maxChunks: 5,
|
|
994
|
+
minScore: 0.05,
|
|
995
|
+
});
|
|
996
|
+
|
|
997
|
+
console.log(
|
|
998
|
+
` Semantic chunking: ${result.totalChunks} total chunks, ${result.chunks.length} selected, ${result.omittedChunks} omitted`,
|
|
999
|
+
);
|
|
1000
|
+
console.log(
|
|
1001
|
+
` Chunking savings: ${result.savingsPercent}% of content omitted`,
|
|
1002
|
+
);
|
|
1003
|
+
|
|
1004
|
+
assert.ok(
|
|
1005
|
+
result.totalChunks >= 4,
|
|
1006
|
+
`Should produce at least 4 chunks, got ${result.totalChunks}`,
|
|
1007
|
+
);
|
|
1008
|
+
assert.ok(
|
|
1009
|
+
result.savingsPercent > 40,
|
|
1010
|
+
`Should omit >40% of content, got ${result.savingsPercent}%`,
|
|
1011
|
+
);
|
|
1012
|
+
|
|
1013
|
+
// Verify that chunks relevant to the query score higher
|
|
1014
|
+
const scores = result.chunks.map((c) => c.score);
|
|
1015
|
+
const hasHighScorer = scores.some((s) => s > 0.5);
|
|
1016
|
+
assert.ok(hasHighScorer, "At least one chunk should score above 0.5");
|
|
1017
|
+
|
|
1018
|
+
// Verify selected content contains query-relevant terms
|
|
1019
|
+
const selectedText = result.chunks.map((c) => c.content).join("\n");
|
|
1020
|
+
const hasRelevantContent =
|
|
1021
|
+
selectedText.includes("Config") ||
|
|
1022
|
+
selectedText.includes("config") ||
|
|
1023
|
+
selectedText.includes("database") ||
|
|
1024
|
+
selectedText.includes("connect") ||
|
|
1025
|
+
selectedText.includes("validate");
|
|
1026
|
+
assert.ok(
|
|
1027
|
+
hasRelevantContent,
|
|
1028
|
+
"Selected chunks should contain query-relevant content",
|
|
1029
|
+
);
|
|
1030
|
+
});
|
|
1031
|
+
|
|
1032
|
+
// -----------------------------------------------------------------------
|
|
1033
|
+
// Test 4: Summary Distillation
|
|
1034
|
+
// -----------------------------------------------------------------------
|
|
1035
|
+
it("summary distillation benchmark", () => {
|
|
1036
|
+
const summaries = buildSummaries();
|
|
1037
|
+
const originalTotalChars = summaries.reduce((s, c) => s + c.length, 0);
|
|
1038
|
+
|
|
1039
|
+
// Use a generous budget so we can measure natural distillation savings
|
|
1040
|
+
const result = distillSummaries(summaries, 100_000);
|
|
1041
|
+
|
|
1042
|
+
console.log(
|
|
1043
|
+
` Summary distillation: ${result.savingsPercent}% savings (${result.originalChars} -> ${result.distilledChars} chars, ${result.summaryCount} summaries)`,
|
|
1044
|
+
);
|
|
1045
|
+
|
|
1046
|
+
assert.ok(
|
|
1047
|
+
result.savingsPercent > 40,
|
|
1048
|
+
`Summary distillation should save >40%, got ${result.savingsPercent}%`,
|
|
1049
|
+
);
|
|
1050
|
+
assert.equal(result.summaryCount, 4, "Should process all 4 summaries");
|
|
1051
|
+
|
|
1052
|
+
// Verify key structured fields are preserved
|
|
1053
|
+
assert.ok(
|
|
1054
|
+
result.content.includes("provides:"),
|
|
1055
|
+
"Distilled output should preserve 'provides' field",
|
|
1056
|
+
);
|
|
1057
|
+
assert.ok(
|
|
1058
|
+
result.content.includes("key_files:"),
|
|
1059
|
+
"Distilled output should preserve 'key_files' field",
|
|
1060
|
+
);
|
|
1061
|
+
assert.ok(
|
|
1062
|
+
result.content.includes("key_decisions:"),
|
|
1063
|
+
"Distilled output should preserve 'key_decisions' field",
|
|
1064
|
+
);
|
|
1065
|
+
|
|
1066
|
+
// Verify slice IDs are preserved
|
|
1067
|
+
assert.ok(result.content.includes("S01"), "Should preserve S01 reference");
|
|
1068
|
+
assert.ok(result.content.includes("S02"), "Should preserve S02 reference");
|
|
1069
|
+
assert.ok(result.content.includes("S03"), "Should preserve S03 reference");
|
|
1070
|
+
assert.ok(result.content.includes("S04"), "Should preserve S04 reference");
|
|
1071
|
+
});
|
|
1072
|
+
|
|
1073
|
+
// -----------------------------------------------------------------------
|
|
1074
|
+
// Test 5: Combined Pipeline
|
|
1075
|
+
// -----------------------------------------------------------------------
|
|
1076
|
+
it("combined pipeline benchmark", () => {
|
|
1077
|
+
const decisions = buildDecisions();
|
|
1078
|
+
const requirements = buildRequirements();
|
|
1079
|
+
const summaries = buildSummaries();
|
|
1080
|
+
const knowledgeFile = SAMPLE_CODE;
|
|
1081
|
+
const carryForward = buildVerbosePrompt();
|
|
1082
|
+
|
|
1083
|
+
// --- Unoptimized baseline ---
|
|
1084
|
+
const unoptDecisions = formatDecisionsAsMarkdownTable(decisions);
|
|
1085
|
+
const unoptRequirements = formatRequirementsAsMarkdown(requirements);
|
|
1086
|
+
const unoptSummaries = summaries.join("\n\n---\n\n");
|
|
1087
|
+
const unoptKnowledge = knowledgeFile;
|
|
1088
|
+
const unoptCarry = carryForward;
|
|
1089
|
+
|
|
1090
|
+
const unoptimizedTotal =
|
|
1091
|
+
unoptDecisions.length +
|
|
1092
|
+
unoptRequirements.length +
|
|
1093
|
+
unoptSummaries.length +
|
|
1094
|
+
unoptKnowledge.length +
|
|
1095
|
+
unoptCarry.length;
|
|
1096
|
+
|
|
1097
|
+
// --- Optimized pipeline ---
|
|
1098
|
+
// 1. Compact format for decisions and requirements
|
|
1099
|
+
const optDecisions = formatDecisionsCompact(decisions);
|
|
1100
|
+
const optRequirements = formatRequirementsCompact(requirements);
|
|
1101
|
+
|
|
1102
|
+
// 2. Distill summaries
|
|
1103
|
+
const distilled = distillSummaries(summaries, 100_000);
|
|
1104
|
+
|
|
1105
|
+
// 3. Chunk knowledge file
|
|
1106
|
+
const chunked = chunkByRelevance(knowledgeFile, "database config validation", {
|
|
1107
|
+
maxChunks: 5,
|
|
1108
|
+
minScore: 0.05,
|
|
1109
|
+
});
|
|
1110
|
+
const optKnowledge = chunked.chunks.map((c) => c.content).join("\n\n");
|
|
1111
|
+
|
|
1112
|
+
// 4. Compress carry-forward
|
|
1113
|
+
const compressed = compressPrompt(carryForward, { level: "moderate" });
|
|
1114
|
+
|
|
1115
|
+
const optimizedTotal =
|
|
1116
|
+
optDecisions.length +
|
|
1117
|
+
optRequirements.length +
|
|
1118
|
+
distilled.distilledChars +
|
|
1119
|
+
optKnowledge.length +
|
|
1120
|
+
compressed.compressedChars;
|
|
1121
|
+
|
|
1122
|
+
const totalSavingsPercent =
|
|
1123
|
+
((unoptimizedTotal - optimizedTotal) / unoptimizedTotal) * 100;
|
|
1124
|
+
|
|
1125
|
+
console.log(
|
|
1126
|
+
` Combined pipeline: ${totalSavingsPercent.toFixed(1)}% total savings (${unoptimizedTotal} -> ${optimizedTotal} chars)`,
|
|
1127
|
+
);
|
|
1128
|
+
console.log(
|
|
1129
|
+
` Decisions: ${unoptDecisions.length} -> ${optDecisions.length} chars`,
|
|
1130
|
+
);
|
|
1131
|
+
console.log(
|
|
1132
|
+
` Requirements: ${unoptRequirements.length} -> ${optRequirements.length} chars`,
|
|
1133
|
+
);
|
|
1134
|
+
console.log(
|
|
1135
|
+
` Summaries: ${unoptSummaries.length} -> ${distilled.distilledChars} chars`,
|
|
1136
|
+
);
|
|
1137
|
+
console.log(
|
|
1138
|
+
` Knowledge: ${unoptKnowledge.length} -> ${optKnowledge.length} chars`,
|
|
1139
|
+
);
|
|
1140
|
+
console.log(
|
|
1141
|
+
` Carry-fwd: ${unoptCarry.length} -> ${compressed.compressedChars} chars`,
|
|
1142
|
+
);
|
|
1143
|
+
|
|
1144
|
+
assert.ok(
|
|
1145
|
+
totalSavingsPercent > 30,
|
|
1146
|
+
`Combined pipeline should save >30%, got ${totalSavingsPercent.toFixed(1)}%`,
|
|
1147
|
+
);
|
|
1148
|
+
});
|
|
1149
|
+
|
|
1150
|
+
// -----------------------------------------------------------------------
|
|
1151
|
+
// Test 6: Cache Efficiency Analysis
|
|
1152
|
+
// -----------------------------------------------------------------------
|
|
1153
|
+
it("cache efficiency analysis", () => {
|
|
1154
|
+
const sections_input = [
|
|
1155
|
+
section(
|
|
1156
|
+
"system-prompt",
|
|
1157
|
+
"You are a GSD executor agent. Follow the task plan precisely. Report evidence of completion. Do not deviate from the assigned scope. Always verify your work before reporting done.",
|
|
1158
|
+
),
|
|
1159
|
+
section(
|
|
1160
|
+
"template-executor",
|
|
1161
|
+
"## Output Format\n\nProvide your response in the following structure:\n1. Analysis of the task requirements\n2. Implementation plan\n3. Code changes with file paths\n4. Verification evidence\n5. Summary of changes made\n\nDo not include preamble or meta-commentary.",
|
|
1162
|
+
),
|
|
1163
|
+
section(
|
|
1164
|
+
"slice-plan",
|
|
1165
|
+
"## Slice S03: Advanced Context Selection\n\nTasks:\n- T01: Implement semantic chunker with TF-IDF scoring\n- T02: Build summary distiller with progressive dropping\n- T03: Create cache optimizer with section classification\n- T04: Write benchmark tests for all optimization modules\n- T05: Integration test for combined pipeline",
|
|
1166
|
+
),
|
|
1167
|
+
section(
|
|
1168
|
+
"decisions",
|
|
1169
|
+
formatDecisionsCompact(buildDecisions()),
|
|
1170
|
+
),
|
|
1171
|
+
section(
|
|
1172
|
+
"requirements",
|
|
1173
|
+
formatRequirementsCompact(buildRequirements()),
|
|
1174
|
+
),
|
|
1175
|
+
section(
|
|
1176
|
+
"task-plan",
|
|
1177
|
+
"## T04: Write benchmark tests\n\nCreate comprehensive benchmark tests that measure token savings from each optimization module. Include realistic fixture data and conservative assertion targets.\n\nFiles: src/extensions/gsd/tests/token-optimization-benchmark.test.ts\nVerify: npm run test -- --grep benchmark",
|
|
1178
|
+
),
|
|
1179
|
+
section(
|
|
1180
|
+
"task-context",
|
|
1181
|
+
"Current implementation status: all optimization modules are complete and passing unit tests. This task adds end-to-end validation.\n\nRecent changes:\n- prompt-compressor.ts: added aggressive level\n- semantic-chunker.ts: improved boundary detection\n- summary-distiller.ts: added progressive field dropping",
|
|
1182
|
+
),
|
|
1183
|
+
];
|
|
1184
|
+
|
|
1185
|
+
const optimized = optimizeForCaching(sections_input);
|
|
1186
|
+
|
|
1187
|
+
console.log(
|
|
1188
|
+
` Cache efficiency: ${(optimized.cacheEfficiency * 100).toFixed(1)}% cacheable prefix (${optimized.cacheablePrefixChars} / ${optimized.totalChars} chars)`,
|
|
1189
|
+
);
|
|
1190
|
+
console.log(
|
|
1191
|
+
` Static sections: ${optimized.sectionCounts.static}, Semi-static: ${optimized.sectionCounts["semi-static"]}, Dynamic: ${optimized.sectionCounts.dynamic}`,
|
|
1192
|
+
);
|
|
1193
|
+
|
|
1194
|
+
assert.ok(
|
|
1195
|
+
optimized.cacheEfficiency > 0.6,
|
|
1196
|
+
`Cache efficiency should be >60%, got ${(optimized.cacheEfficiency * 100).toFixed(1)}%`,
|
|
1197
|
+
);
|
|
1198
|
+
|
|
1199
|
+
const anthropicSavings = estimateCacheSavings(optimized, "anthropic");
|
|
1200
|
+
console.log(
|
|
1201
|
+
` Estimated Anthropic savings: ${(anthropicSavings * 100).toFixed(1)}%`,
|
|
1202
|
+
);
|
|
1203
|
+
assert.ok(
|
|
1204
|
+
anthropicSavings > 0.5,
|
|
1205
|
+
`Anthropic cache savings should be >50%, got ${(anthropicSavings * 100).toFixed(1)}%`,
|
|
1206
|
+
);
|
|
1207
|
+
|
|
1208
|
+
const openaiSavings = estimateCacheSavings(optimized, "openai");
|
|
1209
|
+
console.log(
|
|
1210
|
+
` Estimated OpenAI savings: ${(openaiSavings * 100).toFixed(1)}%`,
|
|
1211
|
+
);
|
|
1212
|
+
assert.ok(
|
|
1213
|
+
anthropicSavings > openaiSavings,
|
|
1214
|
+
"Anthropic savings should exceed OpenAI savings (90% vs 50% discount)",
|
|
1215
|
+
);
|
|
1216
|
+
});
|
|
1217
|
+
|
|
1218
|
+
// -----------------------------------------------------------------------
|
|
1219
|
+
// Test 7: Provider-Aware Budget Accuracy
|
|
1220
|
+
// -----------------------------------------------------------------------
|
|
1221
|
+
it("provider-aware budget accuracy", () => {
|
|
1222
|
+
const contextWindow = 200_000;
|
|
1223
|
+
|
|
1224
|
+
const anthropicBudget = computeBudgets(contextWindow, "anthropic");
|
|
1225
|
+
const openaiBudget = computeBudgets(contextWindow, "openai");
|
|
1226
|
+
|
|
1227
|
+
const anthropicCharsPerToken = getCharsPerToken("anthropic");
|
|
1228
|
+
const openaiCharsPerToken = getCharsPerToken("openai");
|
|
1229
|
+
|
|
1230
|
+
console.log(
|
|
1231
|
+
` Anthropic: ${anthropicCharsPerToken} chars/token, inline budget: ${anthropicBudget.inlineContextBudgetChars} chars`,
|
|
1232
|
+
);
|
|
1233
|
+
console.log(
|
|
1234
|
+
` OpenAI: ${openaiCharsPerToken} chars/token, inline budget: ${openaiBudget.inlineContextBudgetChars} chars`,
|
|
1235
|
+
);
|
|
1236
|
+
|
|
1237
|
+
// OpenAI has higher chars-per-token (4.0 vs 3.5), so it gets more chars per budget
|
|
1238
|
+
const charsDifference =
|
|
1239
|
+
openaiBudget.inlineContextBudgetChars -
|
|
1240
|
+
anthropicBudget.inlineContextBudgetChars;
|
|
1241
|
+
const percentDifference =
|
|
1242
|
+
(charsDifference / anthropicBudget.inlineContextBudgetChars) * 100;
|
|
1243
|
+
|
|
1244
|
+
console.log(
|
|
1245
|
+
` OpenAI gets ${percentDifference.toFixed(1)}% more chars per budget unit (${charsDifference} chars difference)`,
|
|
1246
|
+
);
|
|
1247
|
+
|
|
1248
|
+
// OpenAI should get ~14% more chars (4.0/3.5 = 1.143)
|
|
1249
|
+
assert.ok(
|
|
1250
|
+
percentDifference > 10,
|
|
1251
|
+
`OpenAI should get >10% more chars, got ${percentDifference.toFixed(1)}%`,
|
|
1252
|
+
);
|
|
1253
|
+
assert.ok(
|
|
1254
|
+
percentDifference < 20,
|
|
1255
|
+
`Difference should be <20%, got ${percentDifference.toFixed(1)}%`,
|
|
1256
|
+
);
|
|
1257
|
+
|
|
1258
|
+
// Verify token estimates differ for the same content
|
|
1259
|
+
const sampleContent = SAMPLE_CODE;
|
|
1260
|
+
const anthropicTokens = estimateTokensForProvider(sampleContent, "anthropic");
|
|
1261
|
+
const openaiTokens = estimateTokensForProvider(sampleContent, "openai");
|
|
1262
|
+
|
|
1263
|
+
console.log(
|
|
1264
|
+
` Same content (${sampleContent.length} chars): Anthropic estimates ${anthropicTokens} tokens, OpenAI estimates ${openaiTokens} tokens`,
|
|
1265
|
+
);
|
|
1266
|
+
|
|
1267
|
+
assert.ok(
|
|
1268
|
+
anthropicTokens > openaiTokens,
|
|
1269
|
+
"Anthropic should estimate more tokens (smaller chars-per-token ratio)",
|
|
1270
|
+
);
|
|
1271
|
+
});
|
|
1272
|
+
});
|