goatcode-sh 0.0.1 → 0.1.2
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/.github/workflows/ci.yml +85 -0
- package/.github/workflows/release.yml +107 -0
- package/.opencode/plugins/goatcode.js +1 -0
- package/AGENTS.md +59 -0
- package/CONTRIBUTING.md +110 -0
- package/LICENSE +21 -0
- package/README.md +106 -12
- package/bun.lock +2081 -0
- package/bunfig.toml +3 -0
- package/dist/agents/advisor/config.d.ts +4 -0
- package/dist/agents/advisor/index.d.ts +2 -0
- package/dist/agents/advisor/plugin.d.ts +1 -0
- package/dist/agents/advisor/prompt-meta.d.ts +2 -0
- package/dist/agents/advisor/prompt.d.ts +1 -0
- package/dist/agents/agent-builder.d.ts +10 -0
- package/dist/agents/agent-registry.d.ts +8 -0
- package/dist/agents/builtin-agents.d.ts +2 -0
- package/dist/agents/deep-worker/config.d.ts +4 -0
- package/dist/agents/deep-worker/index.d.ts +2 -0
- package/dist/agents/deep-worker/plugin.d.ts +1 -0
- package/dist/agents/deep-worker/prompt-meta.d.ts +2 -0
- package/dist/agents/deep-worker/prompt.d.ts +1 -0
- package/dist/agents/explorer/config.d.ts +4 -0
- package/dist/agents/explorer/index.d.ts +2 -0
- package/dist/agents/explorer/plugin.d.ts +1 -0
- package/dist/agents/explorer/prompt-meta.d.ts +2 -0
- package/dist/agents/explorer/prompt.d.ts +1 -0
- package/dist/agents/fallback-chains.d.ts +2 -0
- package/dist/agents/index.d.ts +14 -0
- package/dist/agents/orchestrator/config.d.ts +4 -0
- package/dist/agents/orchestrator/index.d.ts +2 -0
- package/dist/agents/orchestrator/plugin.d.ts +1 -0
- package/dist/agents/orchestrator/prompt-meta.d.ts +2 -0
- package/dist/agents/orchestrator/prompt.d.ts +1 -0
- package/dist/agents/planner/config.d.ts +4 -0
- package/dist/agents/planner/index.d.ts +2 -0
- package/dist/agents/planner/plugin.d.ts +1 -0
- package/dist/agents/planner/prompt-meta.d.ts +2 -0
- package/dist/agents/planner/prompt.d.ts +1 -0
- package/dist/agents/prompt-meta.d.ts +11 -0
- package/dist/agents/prompt-registry.d.ts +4 -0
- package/dist/agents/researcher/config.d.ts +4 -0
- package/dist/agents/researcher/index.d.ts +2 -0
- package/dist/agents/researcher/plugin.d.ts +1 -0
- package/dist/agents/researcher/prompt-meta.d.ts +2 -0
- package/dist/agents/researcher/prompt.d.ts +1 -0
- package/dist/agents/tool-restrictions.d.ts +7 -0
- package/dist/agents/worker/config.d.ts +4 -0
- package/dist/agents/worker/index.d.ts +2 -0
- package/dist/agents/worker/plugin.d.ts +1 -0
- package/dist/agents/worker/prompt-meta.d.ts +2 -0
- package/dist/agents/worker/prompt.d.ts +1 -0
- package/dist/bootstrap.d.ts +3 -0
- package/dist/cli/cli.d.ts +3 -0
- package/dist/cli/commands/install.d.ts +12 -0
- package/dist/cli/commands/update.d.ts +1 -0
- package/dist/cli/config-generator.d.ts +26 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/define-config.d.ts +27 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/paths.d.ts +4 -0
- package/dist/config/schema.d.ts +273 -0
- package/dist/config/validator.d.ts +9 -0
- package/dist/features/auto-update/index.d.ts +3 -0
- package/dist/features/auto-update/plugin.d.ts +2 -0
- package/dist/features/auto-update/update-checker.d.ts +7 -0
- package/dist/features/background-agent/concurrency.d.ts +10 -0
- package/dist/features/background-agent/index.d.ts +6 -0
- package/dist/features/background-agent/manager.d.ts +18 -0
- package/dist/features/background-agent/poller.d.ts +17 -0
- package/dist/features/background-agent/singleton.d.ts +7 -0
- package/dist/features/background-agent/spawner.d.ts +6 -0
- package/dist/features/background-agent/types.d.ts +18 -0
- package/dist/features/builtin-features.d.ts +2 -0
- package/dist/features/categories/category-config.d.ts +9 -0
- package/dist/features/categories/category-resolver.d.ts +6 -0
- package/dist/features/categories/index.d.ts +3 -0
- package/dist/features/categories/prompt-appends.d.ts +10 -0
- package/dist/features/loops/file-store.d.ts +22 -0
- package/dist/features/loops/handler.d.ts +9 -0
- package/dist/features/loops/index.d.ts +5 -0
- package/dist/features/loops/memory-store.d.ts +11 -0
- package/dist/features/loops/plugin.d.ts +34 -0
- package/dist/features/loops/shared/event-utils.d.ts +7 -0
- package/dist/features/loops/state.d.ts +22 -0
- package/dist/features/prompt-builder/agent-table-builder.d.ts +6 -0
- package/dist/features/prompt-builder/category-section-builder.d.ts +2 -0
- package/dist/features/prompt-builder/dynamic-prompt-builder.d.ts +9 -0
- package/dist/features/prompt-builder/index.d.ts +7 -0
- package/dist/features/prompt-builder/skill-section-builder.d.ts +5 -0
- package/dist/features/session-state/index.d.ts +5 -0
- package/dist/features/session-state/session-cursor.d.ts +13 -0
- package/dist/features/session-state/session-store.d.ts +12 -0
- package/dist/features/session-state/session-tools-store.d.ts +4 -0
- package/dist/features/skills/builtin/git-master.d.ts +2 -0
- package/dist/features/skills/index.d.ts +10 -0
- package/dist/features/skills/skill-loader.d.ts +22 -0
- package/dist/features/skills/skill-merger.d.ts +2 -0
- package/dist/features/slash-commands/command-registry.d.ts +3 -0
- package/dist/features/slash-commands/commands/cancel-loop.d.ts +2 -0
- package/dist/features/slash-commands/commands/handoff.d.ts +2 -0
- package/dist/features/slash-commands/commands/init-deep.d.ts +2 -0
- package/dist/features/slash-commands/commands/loop.d.ts +2 -0
- package/dist/features/slash-commands/commands/start-work.d.ts +2 -0
- package/dist/features/slash-commands/commands/stop-continuation.d.ts +2 -0
- package/dist/features/slash-commands/index.d.ts +2 -0
- package/dist/features/slash-commands/types.d.ts +5 -0
- package/dist/hooks/anthropic-effort/handler.d.ts +5 -0
- package/dist/hooks/anthropic-effort/index.d.ts +3 -0
- package/dist/hooks/anthropic-effort/plugin.d.ts +1 -0
- package/dist/hooks/builtin-hooks.d.ts +2 -0
- package/dist/hooks/comment-checker/handler.d.ts +5 -0
- package/dist/hooks/comment-checker/index.d.ts +2 -0
- package/dist/hooks/comment-checker/plugin.d.ts +1 -0
- package/dist/hooks/compaction-context/handler.d.ts +2 -0
- package/dist/hooks/compaction-context/index.d.ts +2 -0
- package/dist/hooks/compaction-context/plugin.d.ts +1 -0
- package/dist/hooks/compaction-todo-preserver/handler.d.ts +4 -0
- package/dist/hooks/compaction-todo-preserver/index.d.ts +2 -0
- package/dist/hooks/compaction-todo-preserver/plugin.d.ts +1 -0
- package/dist/hooks/context-injector/handlers/agents.d.ts +1 -0
- package/dist/hooks/context-injector/handlers/readme.d.ts +1 -0
- package/dist/hooks/context-injector/handlers/rules.d.ts +1 -0
- package/dist/hooks/context-injector/index.d.ts +4 -0
- package/dist/hooks/context-injector/plugin.d.ts +1 -0
- package/dist/hooks/context-window-limit/handler.d.ts +6 -0
- package/dist/hooks/context-window-limit/index.d.ts +2 -0
- package/dist/hooks/context-window-limit/plugin.d.ts +1 -0
- package/dist/hooks/delegate-retry/handler.d.ts +16 -0
- package/dist/hooks/delegate-retry/index.d.ts +3 -0
- package/dist/hooks/delegate-retry/plugin.d.ts +1 -0
- package/dist/hooks/edit-error/handler.d.ts +6 -0
- package/dist/hooks/edit-error/index.d.ts +2 -0
- package/dist/hooks/edit-error/plugin.d.ts +1 -0
- package/dist/hooks/empty-response-detector/handler.d.ts +5 -0
- package/dist/hooks/empty-response-detector/index.d.ts +2 -0
- package/dist/hooks/empty-response-detector/plugin.d.ts +1 -0
- package/dist/hooks/error-diagnostics/handler.d.ts +6 -0
- package/dist/hooks/error-diagnostics/patterns.d.ts +3 -0
- package/dist/hooks/error-diagnostics/plugin.d.ts +1 -0
- package/dist/hooks/error-diagnostics/types.d.ts +14 -0
- package/dist/hooks/foreground-fallback/handler.d.ts +22 -0
- package/dist/hooks/foreground-fallback/index.d.ts +2 -0
- package/dist/hooks/foreground-fallback/plugin.d.ts +1 -0
- package/dist/hooks/hashline-diff-enhancer/handler.d.ts +28 -0
- package/dist/hooks/hashline-diff-enhancer/index.d.ts +2 -0
- package/dist/hooks/hashline-diff-enhancer/plugin.d.ts +1 -0
- package/dist/hooks/hashline-read-enhancer/handler.d.ts +4 -0
- package/dist/hooks/hashline-read-enhancer/index.d.ts +2 -0
- package/dist/hooks/hashline-read-enhancer/plugin.d.ts +1 -0
- package/dist/hooks/hook-composer.d.ts +4 -0
- package/dist/hooks/hook-ordering.d.ts +9 -0
- package/dist/hooks/hook-types.d.ts +3 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/json-error/handler.d.ts +6 -0
- package/dist/hooks/json-error/index.d.ts +2 -0
- package/dist/hooks/json-error/plugin.d.ts +1 -0
- package/dist/hooks/keyword-detector/handler.d.ts +8 -0
- package/dist/hooks/keyword-detector/index.d.ts +3 -0
- package/dist/hooks/keyword-detector/plugin.d.ts +1 -0
- package/dist/hooks/model-fallback/handler.d.ts +21 -0
- package/dist/hooks/model-fallback/index.d.ts +2 -0
- package/dist/hooks/model-fallback/plugin.d.ts +1 -0
- package/dist/hooks/phase-reminder/handler.d.ts +5 -0
- package/dist/hooks/phase-reminder/index.d.ts +2 -0
- package/dist/hooks/phase-reminder/plugin.d.ts +1 -0
- package/dist/hooks/post-read-nudge/handler.d.ts +5 -0
- package/dist/hooks/post-read-nudge/index.d.ts +2 -0
- package/dist/hooks/post-read-nudge/plugin.d.ts +1 -0
- package/dist/hooks/preemptive-compaction/handler.d.ts +31 -0
- package/dist/hooks/preemptive-compaction/index.d.ts +2 -0
- package/dist/hooks/preemptive-compaction/plugin.d.ts +1 -0
- package/dist/hooks/runtime-fallback/handler.d.ts +21 -0
- package/dist/hooks/runtime-fallback/index.d.ts +2 -0
- package/dist/hooks/runtime-fallback/plugin.d.ts +1 -0
- package/dist/hooks/safe-hook-wrapper.d.ts +2 -0
- package/dist/hooks/session-recovery/handler.d.ts +6 -0
- package/dist/hooks/session-recovery/index.d.ts +2 -0
- package/dist/hooks/session-recovery/plugin.d.ts +1 -0
- package/dist/hooks/skill-discovery/plugin.d.ts +1 -0
- package/dist/hooks/stop-guard/handler.d.ts +4 -0
- package/dist/hooks/stop-guard/index.d.ts +2 -0
- package/dist/hooks/stop-guard/plugin.d.ts +1 -0
- package/dist/hooks/task-resume-info/handler.d.ts +4 -0
- package/dist/hooks/task-resume-info/index.d.ts +2 -0
- package/dist/hooks/task-resume-info/plugin.d.ts +1 -0
- package/dist/hooks/think-mode/handler.d.ts +4 -0
- package/dist/hooks/think-mode/index.d.ts +2 -0
- package/dist/hooks/think-mode/plugin.d.ts +1 -0
- package/dist/hooks/thinking-block-validator/handler.d.ts +4 -0
- package/dist/hooks/thinking-block-validator/index.d.ts +2 -0
- package/dist/hooks/thinking-block-validator/plugin.d.ts +1 -0
- package/dist/hooks/todo-enforcer/handler.d.ts +4 -0
- package/dist/hooks/todo-enforcer/index.d.ts +2 -0
- package/dist/hooks/todo-enforcer/plugin.d.ts +1 -0
- package/dist/hooks/todowrite-disabler/handler.d.ts +6 -0
- package/dist/hooks/todowrite-disabler/index.d.ts +2 -0
- package/dist/hooks/todowrite-disabler/plugin.d.ts +1 -0
- package/dist/hooks/tool-output-truncator/handler.d.ts +4 -0
- package/dist/hooks/tool-output-truncator/index.d.ts +2 -0
- package/dist/hooks/tool-output-truncator/plugin.d.ts +1 -0
- package/dist/hooks/write-file-guard/handler.d.ts +7 -0
- package/dist/hooks/write-file-guard/index.d.ts +2 -0
- package/dist/hooks/write-file-guard/plugin.d.ts +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +8547 -0
- package/dist/plugin/compositor.d.ts +9 -0
- package/dist/plugin/index.d.ts +1 -0
- package/dist/plugin-api/define-plugin.d.ts +33 -0
- package/dist/plugin-api/index.d.ts +3 -0
- package/dist/plugin-api/types.d.ts +10 -0
- package/dist/registry/agent-aggregator.d.ts +3 -0
- package/dist/registry/contribution-aggregator.d.ts +10 -0
- package/dist/registry/dependency-resolver.d.ts +3 -0
- package/dist/registry/hook-aggregator.d.ts +2 -0
- package/dist/registry/index.d.ts +6 -0
- package/dist/registry/plugin-registry.d.ts +16 -0
- package/dist/registry/tool-aggregator.d.ts +3 -0
- package/dist/registry/types.d.ts +9 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/shared/data-path.d.ts +4 -0
- package/dist/shared/deep-merge.d.ts +13 -0
- package/dist/shared/fallback-chain.d.ts +1 -0
- package/dist/shared/index.d.ts +19 -0
- package/dist/shared/logger.d.ts +4 -0
- package/dist/shared/model-availability.d.ts +1 -0
- package/dist/shared/model-normalization.d.ts +6 -0
- package/dist/shared/model-prefix-map.d.ts +11 -0
- package/dist/shared/model-resolution-pipeline.d.ts +14 -0
- package/dist/shared/models-dev.d.ts +29 -0
- package/dist/shared/provider-discovery.d.ts +28 -0
- package/dist/shared/provider-registry.d.ts +16 -0
- package/dist/shared/safe-create-hook.d.ts +3 -0
- package/dist/shared/snake-case.d.ts +1 -0
- package/dist/shared/truncate-description.d.ts +1 -0
- package/dist/test-utils/index.d.ts +6 -0
- package/dist/test-utils/mock-agent-config.d.ts +5 -0
- package/dist/test-utils/mock-hook-inputs.d.ts +20 -0
- package/dist/test-utils/mock-hook-outputs.d.ts +20 -0
- package/dist/test-utils/mock-plugin-context.d.ts +6 -0
- package/dist/test-utils/mock-sdk-client.d.ts +41 -0
- package/dist/test-utils/mock-tool-context.d.ts +6 -0
- package/dist/tools/ast-grep/index.d.ts +4 -0
- package/dist/tools/ast-grep/replace/handler.d.ts +7 -0
- package/dist/tools/ast-grep/replace/plugin.d.ts +1 -0
- package/dist/tools/ast-grep/replace/types.d.ts +37 -0
- package/dist/tools/ast-grep/search/handler.d.ts +14 -0
- package/dist/tools/ast-grep/search/plugin.d.ts +1 -0
- package/dist/tools/ast-grep/search/types.d.ts +37 -0
- package/dist/tools/background-task/cancel/handler.d.ts +4 -0
- package/dist/tools/background-task/cancel/plugin.d.ts +2 -0
- package/dist/tools/background-task/cancel/types.d.ts +4 -0
- package/dist/tools/background-task/index.d.ts +2 -0
- package/dist/tools/background-task/output/handler.d.ts +3 -0
- package/dist/tools/background-task/output/plugin.d.ts +2 -0
- package/dist/tools/background-task/output/types.d.ts +11 -0
- package/dist/tools/bridge.d.ts +7 -0
- package/dist/tools/builtin-tools.d.ts +2 -0
- package/dist/tools/delegate-task/category-resolver.d.ts +4 -0
- package/dist/tools/delegate-task/constants.d.ts +3 -0
- package/dist/tools/delegate-task/executor.d.ts +10 -0
- package/dist/tools/delegate-task/handler.d.ts +3 -0
- package/dist/tools/delegate-task/index.d.ts +7 -0
- package/dist/tools/delegate-task/plugin.d.ts +2 -0
- package/dist/tools/delegate-task/types.d.ts +17 -0
- package/dist/tools/glob/handler.d.ts +7 -0
- package/dist/tools/glob/index.d.ts +2 -0
- package/dist/tools/glob/plugin.d.ts +1 -0
- package/dist/tools/glob/types.d.ts +7 -0
- package/dist/tools/grep/handler.d.ts +13 -0
- package/dist/tools/grep/index.d.ts +2 -0
- package/dist/tools/grep/plugin.d.ts +1 -0
- package/dist/tools/grep/types.d.ts +15 -0
- package/dist/tools/hashline-edit/constants.d.ts +4 -0
- package/dist/tools/hashline-edit/edit-operations.d.ts +4 -0
- package/dist/tools/hashline-edit/handler.d.ts +5 -0
- package/dist/tools/hashline-edit/hash-computation.d.ts +2 -0
- package/dist/tools/hashline-edit/index.d.ts +5 -0
- package/dist/tools/hashline-edit/plugin.d.ts +3 -0
- package/dist/tools/hashline-edit/types.d.ts +21 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/look-at/handler.d.ts +6 -0
- package/dist/tools/look-at/index.d.ts +3 -0
- package/dist/tools/look-at/plugin.d.ts +1 -0
- package/dist/tools/look-at/types.d.ts +9 -0
- package/dist/tools/lsp/client.d.ts +7 -0
- package/dist/tools/lsp/diagnostics/handler.d.ts +2 -0
- package/dist/tools/lsp/diagnostics/plugin.d.ts +1 -0
- package/dist/tools/lsp/diagnostics/types.d.ts +13 -0
- package/dist/tools/lsp/find-references/handler.d.ts +2 -0
- package/dist/tools/lsp/find-references/plugin.d.ts +1 -0
- package/dist/tools/lsp/find-references/types.d.ts +8 -0
- package/dist/tools/lsp/goto-definition/handler.d.ts +2 -0
- package/dist/tools/lsp/goto-definition/plugin.d.ts +1 -0
- package/dist/tools/lsp/goto-definition/types.d.ts +7 -0
- package/dist/tools/lsp/index.d.ts +6 -0
- package/dist/tools/lsp/prepare-rename/handler.d.ts +2 -0
- package/dist/tools/lsp/prepare-rename/plugin.d.ts +1 -0
- package/dist/tools/lsp/prepare-rename/types.d.ts +7 -0
- package/dist/tools/lsp/rename/handler.d.ts +2 -0
- package/dist/tools/lsp/rename/plugin.d.ts +1 -0
- package/dist/tools/lsp/rename/types.d.ts +8 -0
- package/dist/tools/lsp/symbols/handler.d.ts +2 -0
- package/dist/tools/lsp/symbols/plugin.d.ts +1 -0
- package/dist/tools/lsp/symbols/types.d.ts +11 -0
- package/dist/tools/session-manager/client-context.d.ts +3 -0
- package/dist/tools/session-manager/index.d.ts +5 -0
- package/dist/tools/session-manager/info/handler.d.ts +3 -0
- package/dist/tools/session-manager/info/plugin.d.ts +1 -0
- package/dist/tools/session-manager/info/types.d.ts +3 -0
- package/dist/tools/session-manager/list/handler.d.ts +3 -0
- package/dist/tools/session-manager/list/plugin.d.ts +1 -0
- package/dist/tools/session-manager/list/types.d.ts +6 -0
- package/dist/tools/session-manager/read/handler.d.ts +3 -0
- package/dist/tools/session-manager/read/plugin.d.ts +1 -0
- package/dist/tools/session-manager/read/types.d.ts +6 -0
- package/dist/tools/session-manager/search/handler.d.ts +3 -0
- package/dist/tools/session-manager/search/plugin.d.ts +1 -0
- package/dist/tools/session-manager/search/types.d.ts +6 -0
- package/dist/tools/session-manager/session-formatter.d.ts +29 -0
- package/dist/tools/session-manager/types.d.ts +36 -0
- package/dist/tools/shared/constants.d.ts +3 -0
- package/dist/tools/skill/handler.d.ts +4 -0
- package/dist/tools/skill/index.d.ts +3 -0
- package/dist/tools/skill/plugin.d.ts +1 -0
- package/dist/tools/skill/types.d.ts +12 -0
- package/dist/tools/skill-mcp/handler.d.ts +5 -0
- package/dist/tools/skill-mcp/index.d.ts +3 -0
- package/dist/tools/skill-mcp/plugin.d.ts +1 -0
- package/dist/tools/skill-mcp/types.d.ts +13 -0
- package/dist/tools/task/create/handler.d.ts +2 -0
- package/dist/tools/task/create/plugin.d.ts +1 -0
- package/dist/tools/task/format-task.d.ts +2 -0
- package/dist/tools/task/get/handler.d.ts +2 -0
- package/dist/tools/task/get/plugin.d.ts +1 -0
- package/dist/tools/task/index.d.ts +4 -0
- package/dist/tools/task/list/handler.d.ts +2 -0
- package/dist/tools/task/list/plugin.d.ts +1 -0
- package/dist/tools/task/storage.d.ts +7 -0
- package/dist/tools/task/types.d.ts +84 -0
- package/dist/tools/task/update/handler.d.ts +2 -0
- package/dist/tools/task/update/plugin.d.ts +1 -0
- package/dist/tools/tool-builder.d.ts +7 -0
- package/dist/tools/tool-registry-adapter.d.ts +3 -0
- package/dist/types/agent.d.ts +40 -0
- package/dist/types/category.d.ts +22 -0
- package/dist/types/config.d.ts +23 -0
- package/dist/types/hook.d.ts +18 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/plugin.d.ts +41 -0
- package/dist/types/tool.d.ts +7 -0
- package/eval/README.md +160 -0
- package/eval/ablation-config.yaml +43 -0
- package/eval/assertions/ablation-scorer.ts +81 -0
- package/eval/assertions/hook-impact.ts +152 -0
- package/eval/assertions/task-completion.ts +65 -0
- package/eval/assertions/tool-accuracy.ts +56 -0
- package/eval/promptfooconfig.yaml +42 -0
- package/eval/providers/opencode-baseline.ts +63 -0
- package/eval/providers/opencode-client.ts +112 -0
- package/eval/providers/opencode-provider.ts +66 -0
- package/eval/spike/config.yaml +13 -0
- package/eval/spike/provider.ts +15 -0
- package/npm-reserve/README.md +19 -0
- package/npm-reserve/package.json +24 -0
- package/opencode.json +6 -0
- package/package.json +47 -8
- package/src/agents/advisor/config.ts +6 -0
- package/src/agents/advisor/index.ts +2 -0
- package/src/agents/advisor/plugin.test.ts +48 -0
- package/src/agents/advisor/plugin.ts +17 -0
- package/src/agents/advisor/prompt-meta.ts +14 -0
- package/src/agents/advisor/prompt.ts +93 -0
- package/src/agents/agent-builder.test.ts +66 -0
- package/src/agents/agent-builder.ts +97 -0
- package/src/agents/agent-plugins.test.ts +98 -0
- package/src/agents/agent-registry.ts +25 -0
- package/src/agents/builtin-agents.ts +18 -0
- package/src/agents/deep-worker/config.ts +6 -0
- package/src/agents/deep-worker/index.ts +2 -0
- package/src/agents/deep-worker/plugin.test.ts +31 -0
- package/src/agents/deep-worker/plugin.ts +16 -0
- package/src/agents/deep-worker/prompt-meta.ts +14 -0
- package/src/agents/deep-worker/prompt.ts +121 -0
- package/src/agents/disabled/analyst/config.ts +6 -0
- package/src/agents/disabled/analyst/index.ts +2 -0
- package/src/agents/disabled/analyst/plugin.ts +16 -0
- package/src/agents/disabled/analyst/prompt.ts +1 -0
- package/src/agents/disabled/executor/config.ts +9 -0
- package/src/agents/disabled/executor/index.ts +2 -0
- package/src/agents/disabled/executor/plugin.ts +16 -0
- package/src/agents/disabled/executor/prompt.ts +1 -0
- package/src/agents/disabled/inspector/config.ts +6 -0
- package/src/agents/disabled/inspector/index.ts +2 -0
- package/src/agents/disabled/inspector/plugin.ts +18 -0
- package/src/agents/disabled/inspector/prompt.ts +1 -0
- package/src/agents/disabled/reviewer/config.ts +6 -0
- package/src/agents/disabled/reviewer/index.ts +2 -0
- package/src/agents/disabled/reviewer/plugin.ts +18 -0
- package/src/agents/disabled/reviewer/prompt.ts +1 -0
- package/src/agents/explorer/config.ts +6 -0
- package/src/agents/explorer/index.ts +2 -0
- package/src/agents/explorer/plugin.test.ts +36 -0
- package/src/agents/explorer/plugin.ts +15 -0
- package/src/agents/explorer/prompt-meta.ts +14 -0
- package/src/agents/explorer/prompt.ts +96 -0
- package/src/agents/fallback-chains.ts +13 -0
- package/src/agents/index.ts +18 -0
- package/src/agents/model-resolution.test.ts +79 -0
- package/src/agents/orchestrator/config.ts +10 -0
- package/src/agents/orchestrator/index.ts +2 -0
- package/src/agents/orchestrator/plugin.test.ts +31 -0
- package/src/agents/orchestrator/plugin.ts +16 -0
- package/src/agents/orchestrator/prompt-meta.ts +14 -0
- package/src/agents/orchestrator/prompt.ts +143 -0
- package/src/agents/planner/config.ts +6 -0
- package/src/agents/planner/index.ts +2 -0
- package/src/agents/planner/plugin.test.ts +31 -0
- package/src/agents/planner/plugin.ts +16 -0
- package/src/agents/planner/prompt-meta.ts +14 -0
- package/src/agents/planner/prompt.ts +138 -0
- package/src/agents/prompt-meta.ts +12 -0
- package/src/agents/prompt-registry.test.ts +98 -0
- package/src/agents/prompt-registry.ts +22 -0
- package/src/agents/researcher/config.ts +6 -0
- package/src/agents/researcher/index.ts +2 -0
- package/src/agents/researcher/plugin.test.ts +31 -0
- package/src/agents/researcher/plugin.ts +16 -0
- package/src/agents/researcher/prompt-meta.ts +14 -0
- package/src/agents/researcher/prompt.ts +116 -0
- package/src/agents/tool-restrictions.ts +87 -0
- package/src/agents/worker/config.ts +6 -0
- package/src/agents/worker/index.ts +2 -0
- package/src/agents/worker/plugin.test.ts +31 -0
- package/src/agents/worker/plugin.ts +15 -0
- package/src/agents/worker/prompt-meta.ts +14 -0
- package/src/agents/worker/prompt.ts +83 -0
- package/src/bootstrap.integration.test.ts +168 -0
- package/src/bootstrap.ts +171 -0
- package/src/cli/cli.ts +42 -0
- package/src/cli/commands/install.test.ts +40 -0
- package/src/cli/commands/install.ts +125 -0
- package/src/cli/commands/update.test.ts +84 -0
- package/src/cli/commands/update.ts +45 -0
- package/src/cli/config-generator.test.ts +178 -0
- package/src/cli/config-generator.ts +119 -0
- package/src/cli/index.test.ts +34 -0
- package/src/cli/index.ts +4 -0
- package/src/config/defaults.ts +24 -0
- package/src/config/define-config.ts +38 -0
- package/src/config/index.ts +6 -0
- package/src/config/loader.test.ts +218 -0
- package/src/config/loader.ts +89 -0
- package/src/config/paths.ts +30 -0
- package/src/config/schema.test.ts +69 -0
- package/src/config/schema.ts +57 -0
- package/src/config/validator.ts +24 -0
- package/src/features/auto-update/auto-update.test.ts +105 -0
- package/src/features/auto-update/index.ts +4 -0
- package/src/features/auto-update/plugin.ts +45 -0
- package/src/features/auto-update/update-checker.ts +66 -0
- package/src/features/background-agent/concurrency.test.ts +65 -0
- package/src/features/background-agent/concurrency.ts +44 -0
- package/src/features/background-agent/index.ts +12 -0
- package/src/features/background-agent/manager.ts +214 -0
- package/src/features/background-agent/poller.test.ts +33 -0
- package/src/features/background-agent/poller.ts +75 -0
- package/src/features/background-agent/singleton.ts +26 -0
- package/src/features/background-agent/spawner.ts +51 -0
- package/src/features/background-agent/types.ts +20 -0
- package/src/features/builtin-features.ts +5 -0
- package/src/features/categories/categories.test.ts +68 -0
- package/src/features/categories/category-config.ts +70 -0
- package/src/features/categories/category-resolver.ts +36 -0
- package/src/features/categories/index.ts +8 -0
- package/src/features/categories/prompt-appends.ts +38 -0
- package/src/features/loops/file-store.ts +151 -0
- package/src/features/loops/handler.ts +89 -0
- package/src/features/loops/index.ts +28 -0
- package/src/features/loops/loops.test.ts +175 -0
- package/src/features/loops/memory-store.ts +53 -0
- package/src/features/loops/plugin.ts +107 -0
- package/src/features/loops/shared/event-utils.ts +50 -0
- package/src/features/loops/state.ts +44 -0
- package/src/features/prompt-builder/agent-table-builder.ts +23 -0
- package/src/features/prompt-builder/category-section-builder.ts +21 -0
- package/src/features/prompt-builder/dynamic-prompt-builder.ts +42 -0
- package/src/features/prompt-builder/index.ts +7 -0
- package/src/features/prompt-builder/prompt-builder.test.ts +244 -0
- package/src/features/prompt-builder/skill-section-builder.ts +25 -0
- package/src/features/session-state/index.ts +17 -0
- package/src/features/session-state/session-cursor.test.ts +137 -0
- package/src/features/session-state/session-cursor.ts +80 -0
- package/src/features/session-state/session-store.test.ts +82 -0
- package/src/features/session-state/session-store.ts +37 -0
- package/src/features/session-state/session-tools-store.ts +18 -0
- package/src/features/skills/builtin/git-master.ts +109 -0
- package/src/features/skills/index.ts +97 -0
- package/src/features/skills/skill-loader.ts +133 -0
- package/src/features/skills/skill-merger.ts +15 -0
- package/src/features/skills/skills.test.ts +120 -0
- package/src/features/slash-commands/command-registry.ts +36 -0
- package/src/features/slash-commands/commands/cancel-loop.ts +17 -0
- package/src/features/slash-commands/commands/handoff.ts +59 -0
- package/src/features/slash-commands/commands/init-deep.ts +40 -0
- package/src/features/slash-commands/commands/loop.ts +39 -0
- package/src/features/slash-commands/commands/start-work.ts +39 -0
- package/src/features/slash-commands/commands/stop-continuation.ts +21 -0
- package/src/features/slash-commands/index.ts +2 -0
- package/src/features/slash-commands/slash-commands.test.ts +68 -0
- package/src/features/slash-commands/types.ts +5 -0
- package/src/hooks/anthropic-effort/handler.test.ts +156 -0
- package/src/hooks/anthropic-effort/handler.ts +64 -0
- package/src/hooks/anthropic-effort/index.ts +3 -0
- package/src/hooks/anthropic-effort/plugin.ts +17 -0
- package/src/hooks/builtin-hooks.ts +64 -0
- package/src/hooks/comment-checker/handler.test.ts +65 -0
- package/src/hooks/comment-checker/handler.ts +60 -0
- package/src/hooks/comment-checker/index.ts +2 -0
- package/src/hooks/comment-checker/plugin.ts +15 -0
- package/src/hooks/compaction-context/handler.test.ts +160 -0
- package/src/hooks/compaction-context/handler.ts +179 -0
- package/src/hooks/compaction-context/index.ts +5 -0
- package/src/hooks/compaction-context/plugin.ts +40 -0
- package/src/hooks/compaction-todo-preserver/handler.test.ts +155 -0
- package/src/hooks/compaction-todo-preserver/handler.ts +129 -0
- package/src/hooks/compaction-todo-preserver/index.ts +2 -0
- package/src/hooks/compaction-todo-preserver/plugin.ts +18 -0
- package/src/hooks/context-injection.test.ts +124 -0
- package/src/hooks/context-injector/handlers/agents.test.ts +90 -0
- package/src/hooks/context-injector/handlers/agents.ts +81 -0
- package/src/hooks/context-injector/handlers/readme.ts +55 -0
- package/src/hooks/context-injector/handlers/rules.ts +62 -0
- package/src/hooks/context-injector/index.ts +4 -0
- package/src/hooks/context-injector/plugin.ts +56 -0
- package/src/hooks/context-window-limit/handler.test.ts +103 -0
- package/src/hooks/context-window-limit/handler.ts +128 -0
- package/src/hooks/context-window-limit/index.ts +6 -0
- package/src/hooks/context-window-limit/plugin.ts +15 -0
- package/src/hooks/continuation.test.ts +103 -0
- package/src/hooks/delegate-retry/handler.test.ts +212 -0
- package/src/hooks/delegate-retry/handler.ts +137 -0
- package/src/hooks/delegate-retry/index.ts +8 -0
- package/src/hooks/delegate-retry/plugin.ts +15 -0
- package/src/hooks/edit-error/handler.test.ts +82 -0
- package/src/hooks/edit-error/handler.ts +50 -0
- package/src/hooks/edit-error/index.ts +6 -0
- package/src/hooks/edit-error/plugin.ts +15 -0
- package/src/hooks/empty-response-detector/handler.test.ts +133 -0
- package/src/hooks/empty-response-detector/handler.ts +62 -0
- package/src/hooks/empty-response-detector/index.ts +2 -0
- package/src/hooks/empty-response-detector/plugin.ts +18 -0
- package/src/hooks/error-diagnostics/error-diagnostics.test.ts +116 -0
- package/src/hooks/error-diagnostics/handler.test.ts +147 -0
- package/src/hooks/error-diagnostics/handler.ts +135 -0
- package/src/hooks/error-diagnostics/patterns.ts +93 -0
- package/src/hooks/error-diagnostics/plugin.ts +11 -0
- package/src/hooks/error-diagnostics/types.ts +26 -0
- package/src/hooks/error-recovery.test.ts +85 -0
- package/src/hooks/foreground-fallback/handler.test.ts +229 -0
- package/src/hooks/foreground-fallback/handler.ts +294 -0
- package/src/hooks/foreground-fallback/index.ts +2 -0
- package/src/hooks/foreground-fallback/plugin.ts +18 -0
- package/src/hooks/hashline-diff-enhancer/handler.test.ts +166 -0
- package/src/hooks/hashline-diff-enhancer/handler.ts +186 -0
- package/src/hooks/hashline-diff-enhancer/index.ts +6 -0
- package/src/hooks/hashline-diff-enhancer/plugin.ts +24 -0
- package/src/hooks/hashline-read-enhancer/handler.test.ts +121 -0
- package/src/hooks/hashline-read-enhancer/handler.ts +165 -0
- package/src/hooks/hashline-read-enhancer/index.ts +2 -0
- package/src/hooks/hashline-read-enhancer/plugin.ts +18 -0
- package/src/hooks/hook-composer.test.ts +52 -0
- package/src/hooks/hook-composer.ts +17 -0
- package/src/hooks/hook-composition.integration.test.ts +274 -0
- package/src/hooks/hook-ordering.ts +41 -0
- package/src/hooks/hook-types.ts +22 -0
- package/src/hooks/index.ts +6 -0
- package/src/hooks/json-error/handler.test.ts +95 -0
- package/src/hooks/json-error/handler.ts +82 -0
- package/src/hooks/json-error/index.ts +6 -0
- package/src/hooks/json-error/plugin.ts +15 -0
- package/src/hooks/keyword-detector/handler.test.ts +113 -0
- package/src/hooks/keyword-detector/handler.ts +73 -0
- package/src/hooks/keyword-detector/index.ts +8 -0
- package/src/hooks/keyword-detector/plugin.ts +24 -0
- package/src/hooks/model-fallback/handler.test.ts +163 -0
- package/src/hooks/model-fallback/handler.ts +178 -0
- package/src/hooks/model-fallback/index.ts +2 -0
- package/src/hooks/model-fallback/plugin.ts +11 -0
- package/src/hooks/model-management.test.ts +121 -0
- package/src/hooks/phase-reminder/handler.test.ts +105 -0
- package/src/hooks/phase-reminder/handler.ts +54 -0
- package/src/hooks/phase-reminder/index.ts +2 -0
- package/src/hooks/phase-reminder/plugin.ts +18 -0
- package/src/hooks/post-read-nudge/handler.test.ts +106 -0
- package/src/hooks/post-read-nudge/handler.ts +28 -0
- package/src/hooks/post-read-nudge/index.ts +2 -0
- package/src/hooks/post-read-nudge/plugin.ts +18 -0
- package/src/hooks/preemptive-compaction/handler.test.ts +130 -0
- package/src/hooks/preemptive-compaction/handler.ts +84 -0
- package/src/hooks/preemptive-compaction/index.ts +2 -0
- package/src/hooks/preemptive-compaction/plugin.ts +15 -0
- package/src/hooks/productivity.test.ts +332 -0
- package/src/hooks/quality.test.ts +330 -0
- package/src/hooks/runtime-fallback/handler.test.ts +142 -0
- package/src/hooks/runtime-fallback/handler.ts +171 -0
- package/src/hooks/runtime-fallback/index.ts +2 -0
- package/src/hooks/runtime-fallback/plugin.ts +13 -0
- package/src/hooks/safe-hook-wrapper.test.ts +35 -0
- package/src/hooks/safe-hook-wrapper.ts +12 -0
- package/src/hooks/session-recovery/handler.test.ts +88 -0
- package/src/hooks/session-recovery/handler.ts +87 -0
- package/src/hooks/session-recovery/index.ts +6 -0
- package/src/hooks/session-recovery/plugin.ts +15 -0
- package/src/hooks/skill-discovery/plugin.ts +45 -0
- package/src/hooks/stop-guard/handler.test.ts +147 -0
- package/src/hooks/stop-guard/handler.ts +127 -0
- package/src/hooks/stop-guard/index.ts +2 -0
- package/src/hooks/stop-guard/plugin.ts +15 -0
- package/src/hooks/task-hooks.test.ts +324 -0
- package/src/hooks/task-resume-info/handler.test.ts +180 -0
- package/src/hooks/task-resume-info/handler.ts +61 -0
- package/src/hooks/task-resume-info/index.ts +2 -0
- package/src/hooks/task-resume-info/plugin.ts +15 -0
- package/src/hooks/think-mode/handler.test.ts +139 -0
- package/src/hooks/think-mode/handler.ts +50 -0
- package/src/hooks/think-mode/index.ts +2 -0
- package/src/hooks/think-mode/plugin.ts +15 -0
- package/src/hooks/thinking-block-validator/handler.test.ts +79 -0
- package/src/hooks/thinking-block-validator/handler.ts +93 -0
- package/src/hooks/thinking-block-validator/index.ts +2 -0
- package/src/hooks/thinking-block-validator/plugin.ts +18 -0
- package/src/hooks/todo-enforcer/handler.test.ts +153 -0
- package/src/hooks/todo-enforcer/handler.ts +100 -0
- package/src/hooks/todo-enforcer/index.ts +2 -0
- package/src/hooks/todo-enforcer/plugin.ts +15 -0
- package/src/hooks/todowrite-disabler/handler.test.ts +119 -0
- package/src/hooks/todowrite-disabler/handler.ts +50 -0
- package/src/hooks/todowrite-disabler/index.ts +6 -0
- package/src/hooks/todowrite-disabler/plugin.ts +46 -0
- package/src/hooks/tool-output-truncator/handler.test.ts +113 -0
- package/src/hooks/tool-output-truncator/handler.ts +83 -0
- package/src/hooks/tool-output-truncator/index.ts +2 -0
- package/src/hooks/tool-output-truncator/plugin.ts +18 -0
- package/src/hooks/tool-output.test.ts +238 -0
- package/src/hooks/workflow-reminders.test.ts +187 -0
- package/src/hooks/write-file-guard/handler.test.ts +107 -0
- package/src/hooks/write-file-guard/handler.ts +166 -0
- package/src/hooks/write-file-guard/index.ts +2 -0
- package/src/hooks/write-file-guard/plugin.ts +23 -0
- package/src/index.ts +8 -0
- package/src/plugin/compositor.ts +99 -0
- package/src/plugin/index.ts +1 -0
- package/src/plugin-api/define-plugin.test.ts +66 -0
- package/src/plugin-api/define-plugin.ts +36 -0
- package/src/plugin-api/index.ts +26 -0
- package/src/plugin-api/types.ts +28 -0
- package/src/registry/agent-aggregator.ts +13 -0
- package/src/registry/contribution-aggregator.test.ts +62 -0
- package/src/registry/contribution-aggregator.ts +114 -0
- package/src/registry/contribution-conflicts.integration.test.ts +186 -0
- package/src/registry/dependency-resolver.test.ts +35 -0
- package/src/registry/dependency-resolver.ts +64 -0
- package/src/registry/hook-aggregator.test.ts +78 -0
- package/src/registry/hook-aggregator.ts +63 -0
- package/src/registry/index.ts +6 -0
- package/src/registry/plugin-lifecycle.integration.test.ts +94 -0
- package/src/registry/plugin-overrides.integration.test.ts +140 -0
- package/src/registry/plugin-registry.test.ts +56 -0
- package/src/registry/plugin-registry.ts +82 -0
- package/src/registry/tool-aggregator.ts +13 -0
- package/src/registry/types.ts +11 -0
- package/src/runtime/index.ts +43 -0
- package/src/shared/data-path.ts +18 -0
- package/src/shared/deep-merge.test.ts +36 -0
- package/src/shared/deep-merge.ts +61 -0
- package/src/shared/fallback-chain.ts +8 -0
- package/src/shared/index.ts +59 -0
- package/src/shared/logger.ts +54 -0
- package/src/shared/model-availability.ts +18 -0
- package/src/shared/model-normalization.test.ts +75 -0
- package/src/shared/model-normalization.ts +28 -0
- package/src/shared/model-prefix-map.test.ts +75 -0
- package/src/shared/model-prefix-map.ts +58 -0
- package/src/shared/model-resolution-pipeline.test.ts +111 -0
- package/src/shared/model-resolution-pipeline.ts +55 -0
- package/src/shared/models-dev.test.ts +277 -0
- package/src/shared/models-dev.ts +176 -0
- package/src/shared/provider-discovery.test.ts +97 -0
- package/src/shared/provider-discovery.ts +73 -0
- package/src/shared/provider-registry.test.ts +212 -0
- package/src/shared/provider-registry.ts +157 -0
- package/src/shared/safe-create-hook.ts +15 -0
- package/src/shared/snake-case.ts +7 -0
- package/src/shared/truncate-description.ts +6 -0
- package/src/test-utils/index.ts +6 -0
- package/src/test-utils/mock-agent-config.ts +13 -0
- package/src/test-utils/mock-hook-inputs.ts +148 -0
- package/src/test-utils/mock-hook-outputs.ts +153 -0
- package/src/test-utils/mock-plugin-context.test.ts +32 -0
- package/src/test-utils/mock-plugin-context.ts +21 -0
- package/src/test-utils/mock-sdk-client.ts +52 -0
- package/src/test-utils/mock-tool-context.ts +24 -0
- package/src/tools/ast-grep/index.ts +4 -0
- package/src/tools/ast-grep/replace/handler.test.ts +93 -0
- package/src/tools/ast-grep/replace/handler.ts +89 -0
- package/src/tools/ast-grep/replace/plugin.ts +10 -0
- package/src/tools/ast-grep/replace/types.ts +14 -0
- package/src/tools/ast-grep/search/handler.test.ts +94 -0
- package/src/tools/ast-grep/search/handler.ts +93 -0
- package/src/tools/ast-grep/search/plugin.ts +10 -0
- package/src/tools/ast-grep/search/types.ts +42 -0
- package/src/tools/background-task/background-task.test.ts +185 -0
- package/src/tools/background-task/cancel/handler.test.ts +141 -0
- package/src/tools/background-task/cancel/handler.ts +52 -0
- package/src/tools/background-task/cancel/plugin.ts +30 -0
- package/src/tools/background-task/cancel/types.ts +4 -0
- package/src/tools/background-task/index.ts +2 -0
- package/src/tools/background-task/output/handler.test.ts +142 -0
- package/src/tools/background-task/output/handler.ts +93 -0
- package/src/tools/background-task/output/plugin.ts +60 -0
- package/src/tools/background-task/output/types.ts +11 -0
- package/src/tools/bridge.test.ts +55 -0
- package/src/tools/bridge.ts +13 -0
- package/src/tools/builtin-tools.ts +54 -0
- package/src/tools/code-search.test.ts +203 -0
- package/src/tools/delegate-task/category-resolver.ts +18 -0
- package/src/tools/delegate-task/constants.ts +43 -0
- package/src/tools/delegate-task/delegate-task.test.ts +245 -0
- package/src/tools/delegate-task/executor.ts +157 -0
- package/src/tools/delegate-task/handler.ts +74 -0
- package/src/tools/delegate-task/index.ts +7 -0
- package/src/tools/delegate-task/plugin.ts +21 -0
- package/src/tools/delegate-task/types.ts +19 -0
- package/src/tools/glob/handler.test.ts +80 -0
- package/src/tools/glob/handler.ts +74 -0
- package/src/tools/glob/index.ts +2 -0
- package/src/tools/glob/plugin.ts +10 -0
- package/src/tools/glob/types.ts +14 -0
- package/src/tools/grep/handler.test.ts +79 -0
- package/src/tools/grep/handler.ts +104 -0
- package/src/tools/grep/index.ts +2 -0
- package/src/tools/grep/plugin.ts +10 -0
- package/src/tools/grep/types.ts +28 -0
- package/src/tools/hashline-edit/constants.ts +10 -0
- package/src/tools/hashline-edit/edit-operations.ts +115 -0
- package/src/tools/hashline-edit/handler.test.ts +105 -0
- package/src/tools/hashline-edit/handler.ts +33 -0
- package/src/tools/hashline-edit/hash-computation.ts +20 -0
- package/src/tools/hashline-edit/hashline-edit.test.ts +62 -0
- package/src/tools/hashline-edit/index.ts +5 -0
- package/src/tools/hashline-edit/plugin.ts +28 -0
- package/src/tools/hashline-edit/types.ts +42 -0
- package/src/tools/index.ts +4 -0
- package/src/tools/look-at/handler.test.ts +189 -0
- package/src/tools/look-at/handler.ts +232 -0
- package/src/tools/look-at/index.ts +3 -0
- package/src/tools/look-at/look-at.test.ts +200 -0
- package/src/tools/look-at/plugin.ts +10 -0
- package/src/tools/look-at/types.ts +17 -0
- package/src/tools/lsp/client.ts +145 -0
- package/src/tools/lsp/diagnostics/handler.test.ts +94 -0
- package/src/tools/lsp/diagnostics/handler.ts +39 -0
- package/src/tools/lsp/diagnostics/plugin.ts +10 -0
- package/src/tools/lsp/diagnostics/types.ts +15 -0
- package/src/tools/lsp/find-references/handler.test.ts +79 -0
- package/src/tools/lsp/find-references/handler.ts +38 -0
- package/src/tools/lsp/find-references/plugin.ts +10 -0
- package/src/tools/lsp/find-references/types.ts +10 -0
- package/src/tools/lsp/goto-definition/handler.test.ts +80 -0
- package/src/tools/lsp/goto-definition/handler.ts +38 -0
- package/src/tools/lsp/goto-definition/plugin.ts +10 -0
- package/src/tools/lsp/goto-definition/types.ts +9 -0
- package/src/tools/lsp/index.ts +6 -0
- package/src/tools/lsp/lsp-tools.test.ts +150 -0
- package/src/tools/lsp/prepare-rename/handler.test.ts +81 -0
- package/src/tools/lsp/prepare-rename/handler.ts +34 -0
- package/src/tools/lsp/prepare-rename/plugin.ts +10 -0
- package/src/tools/lsp/prepare-rename/types.ts +9 -0
- package/src/tools/lsp/rename/handler.test.ts +87 -0
- package/src/tools/lsp/rename/handler.ts +34 -0
- package/src/tools/lsp/rename/plugin.ts +10 -0
- package/src/tools/lsp/rename/types.ts +10 -0
- package/src/tools/lsp/symbols/handler.test.ts +108 -0
- package/src/tools/lsp/symbols/handler.ts +43 -0
- package/src/tools/lsp/symbols/plugin.ts +10 -0
- package/src/tools/lsp/symbols/types.ts +13 -0
- package/src/tools/session-manager/client-context.ts +16 -0
- package/src/tools/session-manager/index.ts +5 -0
- package/src/tools/session-manager/info/handler.test.ts +100 -0
- package/src/tools/session-manager/info/handler.ts +27 -0
- package/src/tools/session-manager/info/plugin.ts +40 -0
- package/src/tools/session-manager/info/types.ts +3 -0
- package/src/tools/session-manager/list/handler.test.ts +122 -0
- package/src/tools/session-manager/list/handler.ts +56 -0
- package/src/tools/session-manager/list/plugin.ts +52 -0
- package/src/tools/session-manager/list/types.ts +6 -0
- package/src/tools/session-manager/read/handler.test.ts +114 -0
- package/src/tools/session-manager/read/handler.ts +36 -0
- package/src/tools/session-manager/read/plugin.ts +57 -0
- package/src/tools/session-manager/read/types.ts +6 -0
- package/src/tools/session-manager/search/handler.test.ts +115 -0
- package/src/tools/session-manager/search/handler.ts +72 -0
- package/src/tools/session-manager/search/plugin.ts +57 -0
- package/src/tools/session-manager/search/types.ts +6 -0
- package/src/tools/session-manager/session-formatter.ts +315 -0
- package/src/tools/session-manager/session-manager.test.ts +254 -0
- package/src/tools/session-manager/types.ts +41 -0
- package/src/tools/shared/constants.ts +3 -0
- package/src/tools/skill/handler.test.ts +57 -0
- package/src/tools/skill/handler.ts +27 -0
- package/src/tools/skill/index.ts +3 -0
- package/src/tools/skill/plugin.ts +41 -0
- package/src/tools/skill/types.ts +14 -0
- package/src/tools/skill-mcp/handler.test.ts +68 -0
- package/src/tools/skill-mcp/handler.ts +84 -0
- package/src/tools/skill-mcp/index.ts +3 -0
- package/src/tools/skill-mcp/plugin.ts +37 -0
- package/src/tools/skill-mcp/types.ts +15 -0
- package/src/tools/skill-tools.test.ts +172 -0
- package/src/tools/task/create/handler.test.ts +64 -0
- package/src/tools/task/create/handler.ts +43 -0
- package/src/tools/task/create/plugin.ts +10 -0
- package/src/tools/task/format-task.test.ts +37 -0
- package/src/tools/task/format-task.ts +19 -0
- package/src/tools/task/get/handler.test.ts +76 -0
- package/src/tools/task/get/handler.ts +35 -0
- package/src/tools/task/get/plugin.ts +10 -0
- package/src/tools/task/index.ts +4 -0
- package/src/tools/task/list/handler.test.ts +70 -0
- package/src/tools/task/list/handler.ts +48 -0
- package/src/tools/task/list/plugin.ts +10 -0
- package/src/tools/task/storage.ts +14 -0
- package/src/tools/task/task.test.ts +165 -0
- package/src/tools/task/types.ts +51 -0
- package/src/tools/task/update/handler.test.ts +86 -0
- package/src/tools/task/update/handler.ts +54 -0
- package/src/tools/task/update/plugin.ts +10 -0
- package/src/tools/tool-builder.test.ts +32 -0
- package/src/tools/tool-builder.ts +24 -0
- package/src/tools/tool-registry-adapter.test.ts +51 -0
- package/src/tools/tool-registry-adapter.ts +19 -0
- package/src/types/agent.ts +53 -0
- package/src/types/category.ts +32 -0
- package/src/types/config.ts +26 -0
- package/src/types/hook.ts +44 -0
- package/src/types/index.ts +12 -0
- package/src/types/plugin.ts +47 -0
- package/src/types/tool.ts +10 -0
- package/test-setup.ts +8 -0
- package/tsconfig.json +20 -0
- /package/{index.js → npm-reserve/index.js} +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Skill } from "./skill-loader";
|
|
2
|
+
|
|
3
|
+
export function mergeSkills(builtinSkills: Skill[], userSkills: Skill[]): Skill[] {
|
|
4
|
+
const merged = new Map<string, Skill>();
|
|
5
|
+
|
|
6
|
+
for (const builtinSkill of builtinSkills) {
|
|
7
|
+
merged.set(builtinSkill.name, builtinSkill);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
for (const userSkill of userSkills) {
|
|
11
|
+
merged.set(userSkill.name, userSkill);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return Array.from(merged.values());
|
|
15
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it } from "bun:test";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import {
|
|
6
|
+
createMergedSkillLoader,
|
|
7
|
+
gitMasterSkill,
|
|
8
|
+
loadProjectSkills,
|
|
9
|
+
mergeSkills,
|
|
10
|
+
registerProjectSkillLoader,
|
|
11
|
+
} from "./index";
|
|
12
|
+
|
|
13
|
+
const tempDirectories: string[] = [];
|
|
14
|
+
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
for (const tempDirectory of tempDirectories.splice(0)) {
|
|
17
|
+
rmSync(tempDirectory, { recursive: true, force: true });
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe("#given builtin git-master skill", () => {
|
|
22
|
+
describe("#when reading its metadata", () => {
|
|
23
|
+
it("#then it has name, description, and non-empty template", () => {
|
|
24
|
+
expect(gitMasterSkill.name).toBe("git-master");
|
|
25
|
+
expect(gitMasterSkill.description.length).toBeGreaterThan(0);
|
|
26
|
+
expect(gitMasterSkill.template.length).toBeGreaterThan(0);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe("#given project skills in .opencode/skills", () => {
|
|
32
|
+
describe("#when loading markdown files", () => {
|
|
33
|
+
it("#then frontmatter + body are parsed into skills", () => {
|
|
34
|
+
const projectDirectory = createTempProjectDirectory();
|
|
35
|
+
writeProjectSkill(
|
|
36
|
+
projectDirectory,
|
|
37
|
+
"release-checklist.md",
|
|
38
|
+
`---
|
|
39
|
+
name: release-checklist
|
|
40
|
+
description: release readiness checks
|
|
41
|
+
---
|
|
42
|
+
Validate release notes and run smoke tests.
|
|
43
|
+
`,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const loaded = loadProjectSkills(projectDirectory);
|
|
47
|
+
|
|
48
|
+
expect(loaded).toHaveLength(1);
|
|
49
|
+
expect(loaded[0]).toEqual({
|
|
50
|
+
name: "release-checklist",
|
|
51
|
+
description: "release readiness checks",
|
|
52
|
+
template: "Validate release notes and run smoke tests.",
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("#given builtin and user skills with same name", () => {
|
|
59
|
+
describe("#when merging skills", () => {
|
|
60
|
+
it("#then user skill overrides builtin by name", () => {
|
|
61
|
+
const merged = mergeSkills(
|
|
62
|
+
[{ name: "git-master", description: "builtin", template: "builtin template" }],
|
|
63
|
+
[{ name: "git-master", description: "user", template: "user template" }],
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
expect(merged).toHaveLength(1);
|
|
67
|
+
expect(merged[0]).toEqual({
|
|
68
|
+
name: "git-master",
|
|
69
|
+
description: "user",
|
|
70
|
+
template: "user template",
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe("#given a user override file for git-master", () => {
|
|
77
|
+
describe("#when creating merged skill loader", () => {
|
|
78
|
+
it("#then load('git-master') returns user template", () => {
|
|
79
|
+
const projectDirectory = createTempProjectDirectory();
|
|
80
|
+
writeProjectSkill(
|
|
81
|
+
projectDirectory,
|
|
82
|
+
"git-master.md",
|
|
83
|
+
`---
|
|
84
|
+
name: git-master
|
|
85
|
+
description: custom project git policy
|
|
86
|
+
---
|
|
87
|
+
Use custom git policy for this repository.
|
|
88
|
+
`,
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const loader = createMergedSkillLoader(projectDirectory);
|
|
92
|
+
|
|
93
|
+
expect(loader.load("git-master")).toBe("Use custom git policy for this repository.");
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe("#given registerProjectSkillLoader", () => {
|
|
99
|
+
describe("#when skillHandler.registerSkillLoader is not available", () => {
|
|
100
|
+
it("#then logs that registration is unavailable without throwing", () => {
|
|
101
|
+
//#given
|
|
102
|
+
const projectDirectory = createTempProjectDirectory();
|
|
103
|
+
|
|
104
|
+
//#when / #then — should not throw
|
|
105
|
+
expect(() => registerProjectSkillLoader(projectDirectory)).not.toThrow();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
function createTempProjectDirectory(): string {
|
|
111
|
+
const directory = mkdtempSync(join(tmpdir(), "goatcode-skills-"));
|
|
112
|
+
tempDirectories.push(directory);
|
|
113
|
+
return directory;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function writeProjectSkill(projectDirectory: string, fileName: string, contents: string): void {
|
|
117
|
+
const skillDirectory = join(projectDirectory, ".opencode", "skills");
|
|
118
|
+
mkdirSync(skillDirectory, { recursive: true });
|
|
119
|
+
writeFileSync(join(skillDirectory, fileName), contents, "utf8");
|
|
120
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { log } from "../../shared/logger";
|
|
2
|
+
import type { SlashCommand } from "./types";
|
|
3
|
+
import { loopCommand } from "./commands/loop";
|
|
4
|
+
import { cancelLoopCommand } from "./commands/cancel-loop";
|
|
5
|
+
import { startWorkCommand } from "./commands/start-work";
|
|
6
|
+
import { stopContinuationCommand } from "./commands/stop-continuation";
|
|
7
|
+
import { handoffCommand } from "./commands/handoff";
|
|
8
|
+
import { initDeepCommand } from "./commands/init-deep";
|
|
9
|
+
|
|
10
|
+
const COMMANDS: SlashCommand[] = [
|
|
11
|
+
loopCommand,
|
|
12
|
+
cancelLoopCommand,
|
|
13
|
+
startWorkCommand,
|
|
14
|
+
stopContinuationCommand,
|
|
15
|
+
handoffCommand,
|
|
16
|
+
initDeepCommand,
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
const COMMAND_MAP: Map<string, SlashCommand> = new Map();
|
|
20
|
+
for (const cmd of COMMANDS) {
|
|
21
|
+
if (COMMAND_MAP.has(cmd.name)) {
|
|
22
|
+
throw new Error(`Duplicate slash command name detected: ${cmd.name}`);
|
|
23
|
+
}
|
|
24
|
+
COMMAND_MAP.set(cmd.name, cmd);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function getCommand(name: string): SlashCommand | undefined {
|
|
28
|
+
const command = COMMAND_MAP.get(name);
|
|
29
|
+
log("slash-commands: getCommand", { name, found: command !== undefined });
|
|
30
|
+
return command;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getAllCommands(): SlashCommand[] {
|
|
34
|
+
log("slash-commands: getAllCommands", { count: COMMANDS.length });
|
|
35
|
+
return [...COMMANDS];
|
|
36
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SlashCommand } from "../types";
|
|
2
|
+
|
|
3
|
+
export const cancelLoopCommand: SlashCommand = {
|
|
4
|
+
name: "cancel-loop",
|
|
5
|
+
description: "Cancel active loop and clear persisted loop state",
|
|
6
|
+
template: `<command-instruction>
|
|
7
|
+
Cancel the currently active unified loop.
|
|
8
|
+
|
|
9
|
+
This will:
|
|
10
|
+
1. Stop the loop from continuing
|
|
11
|
+
2. Clear in-memory loop state for the session
|
|
12
|
+
3. Remove only this session's loop entry from .sisyphus/loop-state.json (do not delete other sessions)
|
|
13
|
+
4. Allow the session to end normally
|
|
14
|
+
|
|
15
|
+
Check if a loop is active, cancel it, and inform the user of the result.
|
|
16
|
+
</command-instruction>`,
|
|
17
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { SlashCommand } from "../types";
|
|
2
|
+
|
|
3
|
+
export const handoffCommand: SlashCommand = {
|
|
4
|
+
name: "handoff",
|
|
5
|
+
description: "Create a detailed context summary for continuing work in a new session",
|
|
6
|
+
template: `<command-instruction>
|
|
7
|
+
# Handoff Command
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Use /handoff when:
|
|
12
|
+
- The current session context is getting too long and quality is degrading
|
|
13
|
+
- You want to start fresh while preserving essential context from this session
|
|
14
|
+
- The context window is approaching capacity
|
|
15
|
+
|
|
16
|
+
This creates a detailed context summary that can be used to continue work in a new session.
|
|
17
|
+
|
|
18
|
+
## PHASE 1: GATHER PROGRAMMATIC CONTEXT
|
|
19
|
+
|
|
20
|
+
Execute these tools to gather concrete data:
|
|
21
|
+
|
|
22
|
+
1. session_read({ session_id: "$SESSION_ID" }) - full session history
|
|
23
|
+
2. todoread() - current task progress
|
|
24
|
+
3. Bash({ command: "git diff --stat HEAD~10..HEAD" }) - recent file changes
|
|
25
|
+
4. Bash({ command: "git status --porcelain" }) - uncommitted changes
|
|
26
|
+
|
|
27
|
+
## PHASE 2: EXTRACT CONTEXT
|
|
28
|
+
|
|
29
|
+
Write the context summary from first person perspective ("I did...", "I told you...").
|
|
30
|
+
|
|
31
|
+
Focus on:
|
|
32
|
+
- Capabilities and behavior, not file-by-file implementation details
|
|
33
|
+
- What matters for continuing the work
|
|
34
|
+
- USER REQUESTS (AS-IS) must be verbatim (do not paraphrase)
|
|
35
|
+
- EXPLICIT CONSTRAINTS must be verbatim only (do not invent)
|
|
36
|
+
|
|
37
|
+
## PHASE 3: FORMAT OUTPUT
|
|
38
|
+
|
|
39
|
+
Generate a handoff summary using the HANDOFF CONTEXT format with sections:
|
|
40
|
+
USER REQUESTS (AS-IS), GOAL, WORK COMPLETED, CURRENT STATE, PENDING TASKS,
|
|
41
|
+
KEY FILES, IMPORTANT DECISIONS, EXPLICIT CONSTRAINTS, CONTEXT FOR CONTINUATION.
|
|
42
|
+
|
|
43
|
+
## IMPORTANT CONSTRAINTS
|
|
44
|
+
|
|
45
|
+
- DO NOT attempt to programmatically create new sessions
|
|
46
|
+
- DO provide a self-contained summary that works without access to this session
|
|
47
|
+
- DO NOT include sensitive information (API keys, credentials, secrets)
|
|
48
|
+
- DO NOT exceed 10 files in the KEY FILES section
|
|
49
|
+
</command-instruction>
|
|
50
|
+
|
|
51
|
+
<session-context>
|
|
52
|
+
Session ID: $SESSION_ID
|
|
53
|
+
Timestamp: $TIMESTAMP
|
|
54
|
+
</session-context>
|
|
55
|
+
|
|
56
|
+
<user-request>
|
|
57
|
+
$ARGUMENTS
|
|
58
|
+
</user-request>`,
|
|
59
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { SlashCommand } from "../types";
|
|
2
|
+
|
|
3
|
+
export const initDeepCommand: SlashCommand = {
|
|
4
|
+
name: "init-deep",
|
|
5
|
+
description: "Initialize hierarchical AGENTS.md knowledge base",
|
|
6
|
+
template: `<command-instruction>
|
|
7
|
+
# /init-deep
|
|
8
|
+
|
|
9
|
+
Generate hierarchical AGENTS.md files. Root + complexity-scored subdirectories.
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
\`\`\`
|
|
14
|
+
/init-deep # Update mode: modify existing + create new where warranted
|
|
15
|
+
/init-deep --create-new # Read existing -> remove all -> regenerate from scratch
|
|
16
|
+
/init-deep --max-depth=2 # Limit directory depth (default: 3)
|
|
17
|
+
\`\`\`
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
1. **Discovery + Analysis** (concurrent)
|
|
22
|
+
- Fire background explore agents immediately
|
|
23
|
+
- Main session: bash structure + LSP codemap + read existing AGENTS.md
|
|
24
|
+
2. **Score & Decide** - Determine AGENTS.md locations from merged findings
|
|
25
|
+
3. **Generate** - Root first, then subdirs in parallel
|
|
26
|
+
4. **Review** - Deduplicate, trim, validate
|
|
27
|
+
|
|
28
|
+
## Critical Rules
|
|
29
|
+
|
|
30
|
+
- TodoWrite ALL phases. Mark in_progress -> completed in real-time.
|
|
31
|
+
- Root AGENTS.md is ALWAYS created
|
|
32
|
+
- Child AGENTS.md never repeats parent content
|
|
33
|
+
- Remove generic advice that applies to ALL projects
|
|
34
|
+
- Telegraphic style: dense, no filler
|
|
35
|
+
</command-instruction>
|
|
36
|
+
|
|
37
|
+
<user-request>
|
|
38
|
+
$ARGUMENTS
|
|
39
|
+
</user-request>`,
|
|
40
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SlashCommand } from "../types";
|
|
2
|
+
|
|
3
|
+
export const loopCommand: SlashCommand = {
|
|
4
|
+
name: "loop",
|
|
5
|
+
description: "Start unified continuation loop until completion",
|
|
6
|
+
template: `<command-instruction>
|
|
7
|
+
You are starting a unified LOOP that can run in memory or with disk persistence.
|
|
8
|
+
|
|
9
|
+
## How LOOP Works
|
|
10
|
+
|
|
11
|
+
1. You will work on the task continuously
|
|
12
|
+
2. When fully complete, output: \`<promise>{{COMPLETION_PROMISE}}</promise>\`
|
|
13
|
+
3. If the promise is not emitted, the loop injects a continuation prompt automatically
|
|
14
|
+
|
|
15
|
+
## Options
|
|
16
|
+
|
|
17
|
+
- \`--persist\`: use disk-backed state in \`.sisyphus/loop-state.json\` (resumable)
|
|
18
|
+
- without \`--persist\`: in-memory loop state (default)
|
|
19
|
+
- \`--max-iterations=N\`: set an explicit iteration limit
|
|
20
|
+
|
|
21
|
+
Default completion promise is "DONE".
|
|
22
|
+
Default max iterations is 100 for in-memory loops and 1000 for persisted loops.
|
|
23
|
+
|
|
24
|
+
## Exit Conditions
|
|
25
|
+
|
|
26
|
+
1. **Completion**: You emit the completion promise tag
|
|
27
|
+
2. **Max Iterations**: Loop stops at configured limit
|
|
28
|
+
3. **Cancel**: User runs \`/cancel-loop\`
|
|
29
|
+
|
|
30
|
+
## Your Task
|
|
31
|
+
|
|
32
|
+
Parse the arguments below and begin working on the task. The format is:
|
|
33
|
+
\`"task description" [--completion-promise=TEXT] [--max-iterations=N] [--persist] [--strategy=reset|continue]\`
|
|
34
|
+
</command-instruction>
|
|
35
|
+
|
|
36
|
+
<user-task>
|
|
37
|
+
$ARGUMENTS
|
|
38
|
+
</user-task>`,
|
|
39
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SlashCommand } from "../types";
|
|
2
|
+
|
|
3
|
+
export const startWorkCommand: SlashCommand = {
|
|
4
|
+
name: "start-work",
|
|
5
|
+
description: "Start Sisyphus work session from Prometheus plan",
|
|
6
|
+
template: `<command-instruction>
|
|
7
|
+
You are starting a Sisyphus work session.
|
|
8
|
+
|
|
9
|
+
## ARGUMENTS
|
|
10
|
+
|
|
11
|
+
- \`/start-work [plan-name] [--worktree <path>]\`
|
|
12
|
+
- \`plan-name\` (optional): name or partial match of the plan to start
|
|
13
|
+
- \`--worktree <path>\` (optional): absolute path to an existing git worktree to work in
|
|
14
|
+
|
|
15
|
+
## WHAT TO DO
|
|
16
|
+
|
|
17
|
+
1. **Find available plans**: Search for Prometheus-generated plan files at \`.sisyphus/plans/\`
|
|
18
|
+
2. **Decision logic**:
|
|
19
|
+
- If \`plan-name\` is provided: resolve by exact/partial match and use that plan (or report no match)
|
|
20
|
+
- Else if a plan is already in progress: continue the existing plan
|
|
21
|
+
- Else: list available plan files and select one
|
|
22
|
+
3. **Read the plan file** and start executing tasks
|
|
23
|
+
|
|
24
|
+
## CRITICAL
|
|
25
|
+
|
|
26
|
+
- Read the FULL plan file before delegating any tasks
|
|
27
|
+
- Follow atlas delegation protocols (7-section format)
|
|
28
|
+
- Decompose every plan task into granular, implementation-level sub-steps
|
|
29
|
+
</command-instruction>
|
|
30
|
+
|
|
31
|
+
<session-context>
|
|
32
|
+
Session ID: $SESSION_ID
|
|
33
|
+
Timestamp: $TIMESTAMP
|
|
34
|
+
</session-context>
|
|
35
|
+
|
|
36
|
+
<user-request>
|
|
37
|
+
$ARGUMENTS
|
|
38
|
+
</user-request>`,
|
|
39
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SlashCommand } from "../types";
|
|
2
|
+
|
|
3
|
+
export const stopContinuationCommand: SlashCommand = {
|
|
4
|
+
name: "stop-continuation",
|
|
5
|
+
description: "Stop all continuation mechanisms (loop, todo continuation) for this session",
|
|
6
|
+
template: `<command-instruction>
|
|
7
|
+
Stop all continuation mechanisms for the current session.
|
|
8
|
+
|
|
9
|
+
This command will:
|
|
10
|
+
1. Stop the todo-continuation-enforcer from automatically continuing incomplete tasks
|
|
11
|
+
2. Cancel any active unified Loop
|
|
12
|
+
3. Remove persisted loop state when applicable (.sisyphus/loop-state.json)
|
|
13
|
+
|
|
14
|
+
After running this command:
|
|
15
|
+
- The session will not auto-continue when idle
|
|
16
|
+
- You can manually continue work when ready
|
|
17
|
+
- Persisted loop sessions will remain stopped across sessions until explicitly restarted
|
|
18
|
+
|
|
19
|
+
Use this when you need to pause automated continuation and take manual control.
|
|
20
|
+
</command-instruction>`,
|
|
21
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { getAllCommands, getCommand } from "./command-registry";
|
|
3
|
+
|
|
4
|
+
const EXPECTED_COMMAND_NAMES = [
|
|
5
|
+
"loop",
|
|
6
|
+
"cancel-loop",
|
|
7
|
+
"start-work",
|
|
8
|
+
"stop-continuation",
|
|
9
|
+
"handoff",
|
|
10
|
+
"init-deep",
|
|
11
|
+
] as const;
|
|
12
|
+
|
|
13
|
+
describe("getAllCommands", () => {
|
|
14
|
+
describe("#given the command registry is initialized", () => {
|
|
15
|
+
describe("#when getAllCommands is called", () => {
|
|
16
|
+
it("#then returns all 6 commands", () => {
|
|
17
|
+
const commands = getAllCommands();
|
|
18
|
+
expect(commands).toHaveLength(EXPECTED_COMMAND_NAMES.length);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("#then every command has name, description, and template", () => {
|
|
22
|
+
const commands = getAllCommands();
|
|
23
|
+
for (const command of commands) {
|
|
24
|
+
expect(typeof command.name).toBe("string");
|
|
25
|
+
expect(command.name.length).toBeGreaterThan(0);
|
|
26
|
+
expect(typeof command.description).toBe("string");
|
|
27
|
+
expect(command.description.length).toBeGreaterThan(0);
|
|
28
|
+
expect(typeof command.template).toBe("string");
|
|
29
|
+
expect(command.template.length).toBeGreaterThan(0);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("#then all expected command names are present", () => {
|
|
34
|
+
const commands = getAllCommands();
|
|
35
|
+
const names = commands.map((c) => c.name);
|
|
36
|
+
for (const expected of EXPECTED_COMMAND_NAMES) {
|
|
37
|
+
expect(names).toContain(expected);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe("getCommand", () => {
|
|
45
|
+
describe("#given a valid command name", () => {
|
|
46
|
+
for (const name of EXPECTED_COMMAND_NAMES) {
|
|
47
|
+
it(`#then returns '${name}'`, () => {
|
|
48
|
+
const command = getCommand(name);
|
|
49
|
+
expect(command).toBeDefined();
|
|
50
|
+
expect(command?.name).toBe(name);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
it("#then returns the start-work command with $ARGUMENTS in template", () => {
|
|
55
|
+
const command = getCommand("start-work");
|
|
56
|
+
expect(command?.template).toContain("$ARGUMENTS");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("#given an unknown command name", () => {
|
|
61
|
+
describe("#when getCommand is called with an unregistered name", () => {
|
|
62
|
+
it("#then returns undefined", () => {
|
|
63
|
+
const command = getCommand("nonexistent-command");
|
|
64
|
+
expect(command).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { createAnthropicEffortHandler } from "./handler";
|
|
3
|
+
|
|
4
|
+
function makeInput(providerID: string, modelID: string) {
|
|
5
|
+
return {
|
|
6
|
+
sessionID: "ses_test",
|
|
7
|
+
agent: "sisyphus",
|
|
8
|
+
model: { providerID, modelID },
|
|
9
|
+
provider: { id: providerID },
|
|
10
|
+
message: {},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function makeOutput() {
|
|
15
|
+
return {
|
|
16
|
+
temperature: 0.1,
|
|
17
|
+
topP: 1,
|
|
18
|
+
topK: 0,
|
|
19
|
+
options: {} as Record<string, unknown>,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
describe("createAnthropicEffortHandler", () => {
|
|
24
|
+
describe("#given effort level 'medium' and Anthropic model", () => {
|
|
25
|
+
describe("#when chat.params hook is called", () => {
|
|
26
|
+
it("#then injects thinking with budget_tokens=5000", async () => {
|
|
27
|
+
const handler = createAnthropicEffortHandler("medium");
|
|
28
|
+
const input = makeInput("anthropic", "claude-sonnet-4-6");
|
|
29
|
+
const output = makeOutput();
|
|
30
|
+
|
|
31
|
+
await handler(input, output);
|
|
32
|
+
|
|
33
|
+
expect(output.options.thinking).toEqual({
|
|
34
|
+
type: "enabled",
|
|
35
|
+
budget_tokens: 5000,
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe("#given effort level 'high' and Anthropic model", () => {
|
|
42
|
+
describe("#when chat.params hook is called", () => {
|
|
43
|
+
it("#then injects thinking with budget_tokens=10000", async () => {
|
|
44
|
+
const handler = createAnthropicEffortHandler("high");
|
|
45
|
+
const input = makeInput("anthropic", "claude-sonnet-4-6");
|
|
46
|
+
const output = makeOutput();
|
|
47
|
+
|
|
48
|
+
await handler(input, output);
|
|
49
|
+
|
|
50
|
+
expect(output.options.thinking).toEqual({
|
|
51
|
+
type: "enabled",
|
|
52
|
+
budget_tokens: 10000,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("#given effort level 'max' and Anthropic sonnet model", () => {
|
|
59
|
+
describe("#when chat.params hook is called", () => {
|
|
60
|
+
it("#then injects thinking with budget_tokens=32000 but no effort flag", async () => {
|
|
61
|
+
const handler = createAnthropicEffortHandler("max");
|
|
62
|
+
const input = makeInput("anthropic", "claude-sonnet-4-6");
|
|
63
|
+
const output = makeOutput();
|
|
64
|
+
|
|
65
|
+
await handler(input, output);
|
|
66
|
+
|
|
67
|
+
expect(output.options.thinking).toEqual({
|
|
68
|
+
type: "enabled",
|
|
69
|
+
budget_tokens: 32000,
|
|
70
|
+
});
|
|
71
|
+
expect(output.options.effort).toBeUndefined();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe("#given effort level 'max' and Anthropic opus model", () => {
|
|
77
|
+
describe("#when chat.params hook is called", () => {
|
|
78
|
+
it("#then injects thinking and sets effort='max'", async () => {
|
|
79
|
+
const handler = createAnthropicEffortHandler("max");
|
|
80
|
+
const input = makeInput("anthropic", "claude-opus-4-6");
|
|
81
|
+
const output = makeOutput();
|
|
82
|
+
|
|
83
|
+
await handler(input, output);
|
|
84
|
+
|
|
85
|
+
expect(output.options.thinking).toEqual({
|
|
86
|
+
type: "enabled",
|
|
87
|
+
budget_tokens: 32000,
|
|
88
|
+
});
|
|
89
|
+
expect(output.options.effort).toBe("max");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("#given effort level 'low'", () => {
|
|
95
|
+
describe("#when chat.params hook is called", () => {
|
|
96
|
+
it("#then does not inject any parameters", async () => {
|
|
97
|
+
const handler = createAnthropicEffortHandler("low");
|
|
98
|
+
const input = makeInput("anthropic", "claude-sonnet-4-6");
|
|
99
|
+
const output = makeOutput();
|
|
100
|
+
|
|
101
|
+
await handler(input, output);
|
|
102
|
+
|
|
103
|
+
expect(output.options.thinking).toBeUndefined();
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
describe("#given default effort level (no argument)", () => {
|
|
109
|
+
describe("#when chat.params hook is called with Anthropic model", () => {
|
|
110
|
+
it("#then defaults to 'high' with budget_tokens=10000", async () => {
|
|
111
|
+
const handler = createAnthropicEffortHandler();
|
|
112
|
+
const input = makeInput("anthropic", "claude-sonnet-4-6");
|
|
113
|
+
const output = makeOutput();
|
|
114
|
+
|
|
115
|
+
await handler(input, output);
|
|
116
|
+
|
|
117
|
+
expect(output.options.thinking).toEqual({
|
|
118
|
+
type: "enabled",
|
|
119
|
+
budget_tokens: 10000,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe("#given a non-Anthropic model", () => {
|
|
126
|
+
describe("#when chat.params hook is called with effort 'high'", () => {
|
|
127
|
+
it("#then does not inject any parameters", async () => {
|
|
128
|
+
const handler = createAnthropicEffortHandler("high");
|
|
129
|
+
const input = makeInput("openai", "gpt-5.4");
|
|
130
|
+
const output = makeOutput();
|
|
131
|
+
|
|
132
|
+
await handler(input, output);
|
|
133
|
+
|
|
134
|
+
expect(output.options.thinking).toBeUndefined();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe("#given thinking is already configured", () => {
|
|
140
|
+
describe("#when chat.params hook is called with effort 'high'", () => {
|
|
141
|
+
it("#then does not overwrite existing thinking config", async () => {
|
|
142
|
+
const handler = createAnthropicEffortHandler("high");
|
|
143
|
+
const input = makeInput("anthropic", "claude-sonnet-4-6");
|
|
144
|
+
const output = makeOutput();
|
|
145
|
+
output.options.thinking = { type: "enabled", budget_tokens: 999 };
|
|
146
|
+
|
|
147
|
+
await handler(input, output);
|
|
148
|
+
|
|
149
|
+
expect(output.options.thinking).toEqual({
|
|
150
|
+
type: "enabled",
|
|
151
|
+
budget_tokens: 999,
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
});
|