opencode-repos 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +10 -6
- package/package.json +1 -1
- package/src/__tests__/git.test.ts +33 -2
- package/src/git.ts +32 -5
- package/.sisyphus/boulder.json +0 -8
- package/.sisyphus/notepads/opencode-repos/decisions.md +0 -15
- package/.sisyphus/notepads/opencode-repos/learnings.md +0 -384
- package/.sisyphus/plans/opencode-repos.md +0 -987
- package/.tmux-sessionizer +0 -8
- package/TODO.md +0 -3
- package/oh-my-opencode/.github/FUNDING.yml +0 -15
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/bug_report.yml +0 -129
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/config.yml +0 -8
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/feature_request.yml +0 -100
- package/oh-my-opencode/.github/ISSUE_TEMPLATE/general.yml +0 -83
- package/oh-my-opencode/.github/assets/google.jpg +0 -0
- package/oh-my-opencode/.github/assets/hero.jpg +0 -0
- package/oh-my-opencode/.github/assets/indent.jpg +0 -0
- package/oh-my-opencode/.github/assets/microsoft.jpg +0 -0
- package/oh-my-opencode/.github/assets/omo.png +0 -0
- package/oh-my-opencode/.github/assets/orchestrator-atlas.png +0 -0
- package/oh-my-opencode/.github/assets/sisyphus.png +0 -0
- package/oh-my-opencode/.github/assets/sisyphuslabs.png +0 -0
- package/oh-my-opencode/.github/pull_request_template.md +0 -34
- package/oh-my-opencode/.github/workflows/ci.yml +0 -138
- package/oh-my-opencode/.github/workflows/cla.yml +0 -41
- package/oh-my-opencode/.github/workflows/lint-workflows.yml +0 -22
- package/oh-my-opencode/.github/workflows/publish.yml +0 -165
- package/oh-my-opencode/.github/workflows/sisyphus-agent.yml +0 -500
- package/oh-my-opencode/.opencode/background-tasks.json +0 -27
- package/oh-my-opencode/.opencode/command/get-unpublished-changes.md +0 -84
- package/oh-my-opencode/.opencode/command/omomomo.md +0 -37
- package/oh-my-opencode/.opencode/command/publish.md +0 -257
- package/oh-my-opencode/AGENTS.md +0 -179
- package/oh-my-opencode/CLA.md +0 -58
- package/oh-my-opencode/CONTRIBUTING.md +0 -268
- package/oh-my-opencode/LICENSE.md +0 -82
- package/oh-my-opencode/README.ja.md +0 -370
- package/oh-my-opencode/README.md +0 -376
- package/oh-my-opencode/README.zh-cn.md +0 -380
- package/oh-my-opencode/assets/oh-my-opencode.schema.json +0 -2171
- package/oh-my-opencode/bin/oh-my-opencode.js +0 -80
- package/oh-my-opencode/bin/platform.js +0 -38
- package/oh-my-opencode/bin/platform.test.ts +0 -148
- package/oh-my-opencode/bun.lock +0 -314
- package/oh-my-opencode/bunfig.toml +0 -2
- package/oh-my-opencode/docs/category-skill-guide.md +0 -200
- package/oh-my-opencode/docs/cli-guide.md +0 -272
- package/oh-my-opencode/docs/configurations.md +0 -654
- package/oh-my-opencode/docs/features.md +0 -550
- package/oh-my-opencode/docs/guide/installation.md +0 -288
- package/oh-my-opencode/docs/guide/overview.md +0 -97
- package/oh-my-opencode/docs/guide/understanding-orchestration-system.md +0 -445
- package/oh-my-opencode/docs/orchestration-guide.md +0 -152
- package/oh-my-opencode/docs/ultrawork-manifesto.md +0 -197
- package/oh-my-opencode/package.json +0 -89
- package/oh-my-opencode/packages/darwin-arm64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/darwin-arm64/package.json +0 -22
- package/oh-my-opencode/packages/darwin-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/darwin-x64/package.json +0 -22
- package/oh-my-opencode/packages/linux-arm64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-arm64/package.json +0 -25
- package/oh-my-opencode/packages/linux-arm64-musl/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-arm64-musl/package.json +0 -25
- package/oh-my-opencode/packages/linux-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-x64/package.json +0 -25
- package/oh-my-opencode/packages/linux-x64-musl/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/linux-x64-musl/package.json +0 -25
- package/oh-my-opencode/packages/windows-x64/bin/.gitkeep +0 -0
- package/oh-my-opencode/packages/windows-x64/package.json +0 -22
- package/oh-my-opencode/postinstall.mjs +0 -43
- package/oh-my-opencode/script/build-binaries.ts +0 -103
- package/oh-my-opencode/script/build-schema.ts +0 -28
- package/oh-my-opencode/script/generate-changelog.ts +0 -92
- package/oh-my-opencode/script/publish.ts +0 -344
- package/oh-my-opencode/signatures/cla.json +0 -676
- package/oh-my-opencode/src/agents/AGENTS.md +0 -67
- package/oh-my-opencode/src/agents/atlas.ts +0 -1383
- package/oh-my-opencode/src/agents/dynamic-agent-prompt-builder.ts +0 -400
- package/oh-my-opencode/src/agents/explore.ts +0 -122
- package/oh-my-opencode/src/agents/index.ts +0 -13
- package/oh-my-opencode/src/agents/librarian.ts +0 -326
- package/oh-my-opencode/src/agents/metis.ts +0 -315
- package/oh-my-opencode/src/agents/momus.test.ts +0 -57
- package/oh-my-opencode/src/agents/momus.ts +0 -444
- package/oh-my-opencode/src/agents/multimodal-looker.ts +0 -56
- package/oh-my-opencode/src/agents/oracle.ts +0 -122
- package/oh-my-opencode/src/agents/prometheus-prompt.test.ts +0 -22
- package/oh-my-opencode/src/agents/prometheus-prompt.ts +0 -1196
- package/oh-my-opencode/src/agents/sisyphus-junior.test.ts +0 -232
- package/oh-my-opencode/src/agents/sisyphus-junior.ts +0 -134
- package/oh-my-opencode/src/agents/sisyphus.ts +0 -633
- package/oh-my-opencode/src/agents/types.ts +0 -80
- package/oh-my-opencode/src/agents/utils.test.ts +0 -311
- package/oh-my-opencode/src/agents/utils.ts +0 -240
- package/oh-my-opencode/src/cli/AGENTS.md +0 -91
- package/oh-my-opencode/src/cli/config-manager.test.ts +0 -364
- package/oh-my-opencode/src/cli/config-manager.ts +0 -641
- package/oh-my-opencode/src/cli/doctor/checks/auth.test.ts +0 -114
- package/oh-my-opencode/src/cli/doctor/checks/auth.ts +0 -115
- package/oh-my-opencode/src/cli/doctor/checks/config.test.ts +0 -103
- package/oh-my-opencode/src/cli/doctor/checks/config.ts +0 -123
- package/oh-my-opencode/src/cli/doctor/checks/dependencies.test.ts +0 -152
- package/oh-my-opencode/src/cli/doctor/checks/dependencies.ts +0 -163
- package/oh-my-opencode/src/cli/doctor/checks/gh.test.ts +0 -151
- package/oh-my-opencode/src/cli/doctor/checks/gh.ts +0 -171
- package/oh-my-opencode/src/cli/doctor/checks/index.ts +0 -34
- package/oh-my-opencode/src/cli/doctor/checks/lsp.test.ts +0 -134
- package/oh-my-opencode/src/cli/doctor/checks/lsp.ts +0 -77
- package/oh-my-opencode/src/cli/doctor/checks/mcp.test.ts +0 -115
- package/oh-my-opencode/src/cli/doctor/checks/mcp.ts +0 -128
- package/oh-my-opencode/src/cli/doctor/checks/opencode.test.ts +0 -227
- package/oh-my-opencode/src/cli/doctor/checks/opencode.ts +0 -178
- package/oh-my-opencode/src/cli/doctor/checks/plugin.test.ts +0 -109
- package/oh-my-opencode/src/cli/doctor/checks/plugin.ts +0 -124
- package/oh-my-opencode/src/cli/doctor/checks/version.test.ts +0 -148
- package/oh-my-opencode/src/cli/doctor/checks/version.ts +0 -135
- package/oh-my-opencode/src/cli/doctor/constants.ts +0 -72
- package/oh-my-opencode/src/cli/doctor/formatter.test.ts +0 -218
- package/oh-my-opencode/src/cli/doctor/formatter.ts +0 -140
- package/oh-my-opencode/src/cli/doctor/index.ts +0 -11
- package/oh-my-opencode/src/cli/doctor/runner.test.ts +0 -153
- package/oh-my-opencode/src/cli/doctor/runner.ts +0 -132
- package/oh-my-opencode/src/cli/doctor/types.ts +0 -113
- package/oh-my-opencode/src/cli/get-local-version/formatter.ts +0 -66
- package/oh-my-opencode/src/cli/get-local-version/index.ts +0 -106
- package/oh-my-opencode/src/cli/get-local-version/types.ts +0 -14
- package/oh-my-opencode/src/cli/index.ts +0 -153
- package/oh-my-opencode/src/cli/install.ts +0 -523
- package/oh-my-opencode/src/cli/model-fallback.ts +0 -246
- package/oh-my-opencode/src/cli/run/completion.test.ts +0 -170
- package/oh-my-opencode/src/cli/run/completion.ts +0 -79
- package/oh-my-opencode/src/cli/run/events.test.ts +0 -155
- package/oh-my-opencode/src/cli/run/events.ts +0 -325
- package/oh-my-opencode/src/cli/run/index.ts +0 -2
- package/oh-my-opencode/src/cli/run/runner.ts +0 -159
- package/oh-my-opencode/src/cli/run/types.ts +0 -76
- package/oh-my-opencode/src/cli/types.ts +0 -40
- package/oh-my-opencode/src/config/index.ts +0 -26
- package/oh-my-opencode/src/config/schema.test.ts +0 -444
- package/oh-my-opencode/src/config/schema.ts +0 -339
- package/oh-my-opencode/src/features/AGENTS.md +0 -77
- package/oh-my-opencode/src/features/background-agent/concurrency.test.ts +0 -418
- package/oh-my-opencode/src/features/background-agent/concurrency.ts +0 -137
- package/oh-my-opencode/src/features/background-agent/index.ts +0 -3
- package/oh-my-opencode/src/features/background-agent/manager.test.ts +0 -1928
- package/oh-my-opencode/src/features/background-agent/manager.ts +0 -1335
- package/oh-my-opencode/src/features/background-agent/types.ts +0 -66
- package/oh-my-opencode/src/features/boulder-state/constants.ts +0 -13
- package/oh-my-opencode/src/features/boulder-state/index.ts +0 -3
- package/oh-my-opencode/src/features/boulder-state/storage.test.ts +0 -250
- package/oh-my-opencode/src/features/boulder-state/storage.ts +0 -150
- package/oh-my-opencode/src/features/boulder-state/types.ts +0 -26
- package/oh-my-opencode/src/features/builtin-commands/commands.ts +0 -89
- package/oh-my-opencode/src/features/builtin-commands/index.ts +0 -2
- package/oh-my-opencode/src/features/builtin-commands/templates/init-deep.ts +0 -300
- package/oh-my-opencode/src/features/builtin-commands/templates/ralph-loop.ts +0 -38
- package/oh-my-opencode/src/features/builtin-commands/templates/refactor.ts +0 -619
- package/oh-my-opencode/src/features/builtin-commands/templates/start-work.ts +0 -72
- package/oh-my-opencode/src/features/builtin-commands/types.ts +0 -9
- package/oh-my-opencode/src/features/builtin-skills/frontend-ui-ux/SKILL.md +0 -78
- package/oh-my-opencode/src/features/builtin-skills/git-master/SKILL.md +0 -1105
- package/oh-my-opencode/src/features/builtin-skills/index.ts +0 -2
- package/oh-my-opencode/src/features/builtin-skills/skills.ts +0 -1203
- package/oh-my-opencode/src/features/builtin-skills/types.ts +0 -16
- package/oh-my-opencode/src/features/claude-code-agent-loader/index.ts +0 -2
- package/oh-my-opencode/src/features/claude-code-agent-loader/loader.ts +0 -90
- package/oh-my-opencode/src/features/claude-code-agent-loader/types.ts +0 -17
- package/oh-my-opencode/src/features/claude-code-command-loader/index.ts +0 -2
- package/oh-my-opencode/src/features/claude-code-command-loader/loader.ts +0 -144
- package/oh-my-opencode/src/features/claude-code-command-loader/types.ts +0 -46
- package/oh-my-opencode/src/features/claude-code-mcp-loader/env-expander.ts +0 -27
- package/oh-my-opencode/src/features/claude-code-mcp-loader/index.ts +0 -11
- package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.test.ts +0 -162
- package/oh-my-opencode/src/features/claude-code-mcp-loader/loader.ts +0 -113
- package/oh-my-opencode/src/features/claude-code-mcp-loader/transformer.ts +0 -53
- package/oh-my-opencode/src/features/claude-code-mcp-loader/types.ts +0 -42
- package/oh-my-opencode/src/features/claude-code-plugin-loader/index.ts +0 -3
- package/oh-my-opencode/src/features/claude-code-plugin-loader/loader.ts +0 -486
- package/oh-my-opencode/src/features/claude-code-plugin-loader/types.ts +0 -210
- package/oh-my-opencode/src/features/claude-code-session-state/index.ts +0 -1
- package/oh-my-opencode/src/features/claude-code-session-state/state.test.ts +0 -126
- package/oh-my-opencode/src/features/claude-code-session-state/state.ts +0 -37
- package/oh-my-opencode/src/features/context-injector/collector.test.ts +0 -330
- package/oh-my-opencode/src/features/context-injector/collector.ts +0 -85
- package/oh-my-opencode/src/features/context-injector/index.ts +0 -14
- package/oh-my-opencode/src/features/context-injector/injector.test.ts +0 -122
- package/oh-my-opencode/src/features/context-injector/injector.ts +0 -167
- package/oh-my-opencode/src/features/context-injector/types.ts +0 -91
- package/oh-my-opencode/src/features/hook-message-injector/constants.ts +0 -6
- package/oh-my-opencode/src/features/hook-message-injector/index.ts +0 -4
- package/oh-my-opencode/src/features/hook-message-injector/injector.ts +0 -195
- package/oh-my-opencode/src/features/hook-message-injector/types.ts +0 -47
- package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.test.ts +0 -448
- package/oh-my-opencode/src/features/opencode-skill-loader/async-loader.ts +0 -180
- package/oh-my-opencode/src/features/opencode-skill-loader/blocking.test.ts +0 -210
- package/oh-my-opencode/src/features/opencode-skill-loader/blocking.ts +0 -62
- package/oh-my-opencode/src/features/opencode-skill-loader/discover-worker.ts +0 -59
- package/oh-my-opencode/src/features/opencode-skill-loader/index.ts +0 -4
- package/oh-my-opencode/src/features/opencode-skill-loader/loader.test.ts +0 -273
- package/oh-my-opencode/src/features/opencode-skill-loader/loader.ts +0 -259
- package/oh-my-opencode/src/features/opencode-skill-loader/merger.ts +0 -267
- package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.test.ts +0 -267
- package/oh-my-opencode/src/features/opencode-skill-loader/skill-content.ts +0 -206
- package/oh-my-opencode/src/features/opencode-skill-loader/types.ts +0 -38
- package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.test.ts +0 -201
- package/oh-my-opencode/src/features/skill-mcp-manager/env-cleaner.ts +0 -27
- package/oh-my-opencode/src/features/skill-mcp-manager/index.ts +0 -2
- package/oh-my-opencode/src/features/skill-mcp-manager/manager.test.ts +0 -611
- package/oh-my-opencode/src/features/skill-mcp-manager/manager.ts +0 -520
- package/oh-my-opencode/src/features/skill-mcp-manager/types.ts +0 -14
- package/oh-my-opencode/src/features/task-toast-manager/index.ts +0 -2
- package/oh-my-opencode/src/features/task-toast-manager/manager.test.ts +0 -249
- package/oh-my-opencode/src/features/task-toast-manager/manager.ts +0 -215
- package/oh-my-opencode/src/features/task-toast-manager/types.ts +0 -24
- package/oh-my-opencode/src/hooks/AGENTS.md +0 -73
- package/oh-my-opencode/src/hooks/agent-usage-reminder/constants.ts +0 -54
- package/oh-my-opencode/src/hooks/agent-usage-reminder/index.ts +0 -109
- package/oh-my-opencode/src/hooks/agent-usage-reminder/storage.ts +0 -42
- package/oh-my-opencode/src/hooks/agent-usage-reminder/types.ts +0 -6
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.test.ts +0 -307
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/executor.ts +0 -485
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/index.ts +0 -151
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/parser.ts +0 -201
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.test.ts +0 -33
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-deduplication.ts +0 -184
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/pruning-types.ts +0 -44
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.test.ts +0 -77
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/storage.ts +0 -250
- package/oh-my-opencode/src/hooks/anthropic-context-window-limit-recovery/types.ts +0 -42
- package/oh-my-opencode/src/hooks/atlas/index.test.ts +0 -953
- package/oh-my-opencode/src/hooks/atlas/index.ts +0 -771
- package/oh-my-opencode/src/hooks/auto-slash-command/constants.ts +0 -12
- package/oh-my-opencode/src/hooks/auto-slash-command/detector.test.ts +0 -296
- package/oh-my-opencode/src/hooks/auto-slash-command/detector.ts +0 -65
- package/oh-my-opencode/src/hooks/auto-slash-command/executor.ts +0 -205
- package/oh-my-opencode/src/hooks/auto-slash-command/index.test.ts +0 -254
- package/oh-my-opencode/src/hooks/auto-slash-command/index.ts +0 -89
- package/oh-my-opencode/src/hooks/auto-slash-command/types.ts +0 -23
- package/oh-my-opencode/src/hooks/auto-update-checker/cache.ts +0 -93
- package/oh-my-opencode/src/hooks/auto-update-checker/checker.test.ts +0 -24
- package/oh-my-opencode/src/hooks/auto-update-checker/checker.ts +0 -284
- package/oh-my-opencode/src/hooks/auto-update-checker/constants.ts +0 -64
- package/oh-my-opencode/src/hooks/auto-update-checker/index.test.ts +0 -254
- package/oh-my-opencode/src/hooks/auto-update-checker/index.ts +0 -260
- package/oh-my-opencode/src/hooks/auto-update-checker/types.ts +0 -29
- package/oh-my-opencode/src/hooks/background-compaction/index.ts +0 -87
- package/oh-my-opencode/src/hooks/background-notification/index.ts +0 -28
- package/oh-my-opencode/src/hooks/background-notification/types.ts +0 -5
- package/oh-my-opencode/src/hooks/claude-code-hooks/AGENTS.md +0 -70
- package/oh-my-opencode/src/hooks/claude-code-hooks/config-loader.ts +0 -107
- package/oh-my-opencode/src/hooks/claude-code-hooks/config.ts +0 -103
- package/oh-my-opencode/src/hooks/claude-code-hooks/index.ts +0 -401
- package/oh-my-opencode/src/hooks/claude-code-hooks/plugin-config.ts +0 -12
- package/oh-my-opencode/src/hooks/claude-code-hooks/post-tool-use.ts +0 -199
- package/oh-my-opencode/src/hooks/claude-code-hooks/pre-compact.ts +0 -109
- package/oh-my-opencode/src/hooks/claude-code-hooks/pre-tool-use.ts +0 -172
- package/oh-my-opencode/src/hooks/claude-code-hooks/stop.ts +0 -118
- package/oh-my-opencode/src/hooks/claude-code-hooks/todo.ts +0 -76
- package/oh-my-opencode/src/hooks/claude-code-hooks/tool-input-cache.ts +0 -47
- package/oh-my-opencode/src/hooks/claude-code-hooks/transcript.ts +0 -252
- package/oh-my-opencode/src/hooks/claude-code-hooks/types.ts +0 -204
- package/oh-my-opencode/src/hooks/claude-code-hooks/user-prompt-submit.ts +0 -117
- package/oh-my-opencode/src/hooks/comment-checker/cli.test.ts +0 -68
- package/oh-my-opencode/src/hooks/comment-checker/cli.ts +0 -221
- package/oh-my-opencode/src/hooks/comment-checker/downloader.ts +0 -196
- package/oh-my-opencode/src/hooks/comment-checker/index.ts +0 -171
- package/oh-my-opencode/src/hooks/comment-checker/types.ts +0 -33
- package/oh-my-opencode/src/hooks/compaction-context-injector/index.ts +0 -61
- package/oh-my-opencode/src/hooks/context-window-monitor.ts +0 -99
- package/oh-my-opencode/src/hooks/delegate-task-retry/index.test.ts +0 -119
- package/oh-my-opencode/src/hooks/delegate-task-retry/index.ts +0 -136
- package/oh-my-opencode/src/hooks/directory-agents-injector/constants.ts +0 -9
- package/oh-my-opencode/src/hooks/directory-agents-injector/index.ts +0 -182
- package/oh-my-opencode/src/hooks/directory-agents-injector/storage.ts +0 -48
- package/oh-my-opencode/src/hooks/directory-agents-injector/types.ts +0 -5
- package/oh-my-opencode/src/hooks/directory-readme-injector/constants.ts +0 -9
- package/oh-my-opencode/src/hooks/directory-readme-injector/index.ts +0 -177
- package/oh-my-opencode/src/hooks/directory-readme-injector/storage.ts +0 -48
- package/oh-my-opencode/src/hooks/directory-readme-injector/types.ts +0 -5
- package/oh-my-opencode/src/hooks/edit-error-recovery/index.test.ts +0 -126
- package/oh-my-opencode/src/hooks/edit-error-recovery/index.ts +0 -57
- package/oh-my-opencode/src/hooks/empty-task-response-detector.ts +0 -27
- package/oh-my-opencode/src/hooks/index.ts +0 -32
- package/oh-my-opencode/src/hooks/interactive-bash-session/constants.ts +0 -15
- package/oh-my-opencode/src/hooks/interactive-bash-session/index.ts +0 -262
- package/oh-my-opencode/src/hooks/interactive-bash-session/storage.ts +0 -59
- package/oh-my-opencode/src/hooks/interactive-bash-session/types.ts +0 -11
- package/oh-my-opencode/src/hooks/keyword-detector/constants.ts +0 -300
- package/oh-my-opencode/src/hooks/keyword-detector/detector.ts +0 -52
- package/oh-my-opencode/src/hooks/keyword-detector/index.test.ts +0 -529
- package/oh-my-opencode/src/hooks/keyword-detector/index.ts +0 -100
- package/oh-my-opencode/src/hooks/keyword-detector/types.ts +0 -4
- package/oh-my-opencode/src/hooks/non-interactive-env/constants.ts +0 -70
- package/oh-my-opencode/src/hooks/non-interactive-env/detector.ts +0 -19
- package/oh-my-opencode/src/hooks/non-interactive-env/index.test.ts +0 -323
- package/oh-my-opencode/src/hooks/non-interactive-env/index.ts +0 -63
- package/oh-my-opencode/src/hooks/non-interactive-env/types.ts +0 -3
- package/oh-my-opencode/src/hooks/prometheus-md-only/constants.ts +0 -32
- package/oh-my-opencode/src/hooks/prometheus-md-only/index.test.ts +0 -488
- package/oh-my-opencode/src/hooks/prometheus-md-only/index.ts +0 -136
- package/oh-my-opencode/src/hooks/ralph-loop/constants.ts +0 -5
- package/oh-my-opencode/src/hooks/ralph-loop/index.test.ts +0 -835
- package/oh-my-opencode/src/hooks/ralph-loop/index.ts +0 -417
- package/oh-my-opencode/src/hooks/ralph-loop/storage.ts +0 -115
- package/oh-my-opencode/src/hooks/ralph-loop/types.ts +0 -19
- package/oh-my-opencode/src/hooks/rules-injector/constants.ts +0 -30
- package/oh-my-opencode/src/hooks/rules-injector/finder.test.ts +0 -381
- package/oh-my-opencode/src/hooks/rules-injector/finder.ts +0 -263
- package/oh-my-opencode/src/hooks/rules-injector/index.ts +0 -223
- package/oh-my-opencode/src/hooks/rules-injector/matcher.ts +0 -63
- package/oh-my-opencode/src/hooks/rules-injector/parser.test.ts +0 -226
- package/oh-my-opencode/src/hooks/rules-injector/parser.ts +0 -211
- package/oh-my-opencode/src/hooks/rules-injector/storage.ts +0 -59
- package/oh-my-opencode/src/hooks/rules-injector/types.ts +0 -57
- package/oh-my-opencode/src/hooks/session-notification-utils.ts +0 -140
- package/oh-my-opencode/src/hooks/session-notification.test.ts +0 -361
- package/oh-my-opencode/src/hooks/session-notification.ts +0 -330
- package/oh-my-opencode/src/hooks/session-recovery/constants.ts +0 -10
- package/oh-my-opencode/src/hooks/session-recovery/index.test.ts +0 -223
- package/oh-my-opencode/src/hooks/session-recovery/index.ts +0 -435
- package/oh-my-opencode/src/hooks/session-recovery/storage.ts +0 -390
- package/oh-my-opencode/src/hooks/session-recovery/types.ts +0 -98
- package/oh-my-opencode/src/hooks/start-work/index.test.ts +0 -402
- package/oh-my-opencode/src/hooks/start-work/index.ts +0 -242
- package/oh-my-opencode/src/hooks/task-resume-info/index.ts +0 -36
- package/oh-my-opencode/src/hooks/think-mode/detector.ts +0 -57
- package/oh-my-opencode/src/hooks/think-mode/index.test.ts +0 -353
- package/oh-my-opencode/src/hooks/think-mode/index.ts +0 -89
- package/oh-my-opencode/src/hooks/think-mode/switcher.test.ts +0 -461
- package/oh-my-opencode/src/hooks/think-mode/switcher.ts +0 -222
- package/oh-my-opencode/src/hooks/think-mode/types.ts +0 -21
- package/oh-my-opencode/src/hooks/thinking-block-validator/index.ts +0 -171
- package/oh-my-opencode/src/hooks/todo-continuation-enforcer.test.ts +0 -876
- package/oh-my-opencode/src/hooks/todo-continuation-enforcer.ts +0 -480
- package/oh-my-opencode/src/hooks/tool-output-truncator.test.ts +0 -168
- package/oh-my-opencode/src/hooks/tool-output-truncator.ts +0 -61
- package/oh-my-opencode/src/index.ts +0 -589
- package/oh-my-opencode/src/mcp/AGENTS.md +0 -70
- package/oh-my-opencode/src/mcp/context7.ts +0 -6
- package/oh-my-opencode/src/mcp/grep-app.ts +0 -6
- package/oh-my-opencode/src/mcp/index.test.ts +0 -86
- package/oh-my-opencode/src/mcp/index.ts +0 -32
- package/oh-my-opencode/src/mcp/types.ts +0 -9
- package/oh-my-opencode/src/mcp/websearch.ts +0 -10
- package/oh-my-opencode/src/plugin-config.test.ts +0 -119
- package/oh-my-opencode/src/plugin-config.ts +0 -135
- package/oh-my-opencode/src/plugin-handlers/config-handler.test.ts +0 -103
- package/oh-my-opencode/src/plugin-handlers/config-handler.ts +0 -399
- package/oh-my-opencode/src/plugin-handlers/index.ts +0 -1
- package/oh-my-opencode/src/plugin-state.ts +0 -30
- package/oh-my-opencode/src/shared/AGENTS.md +0 -63
- package/oh-my-opencode/src/shared/agent-tool-restrictions.ts +0 -44
- package/oh-my-opencode/src/shared/agent-variant.test.ts +0 -83
- package/oh-my-opencode/src/shared/agent-variant.ts +0 -40
- package/oh-my-opencode/src/shared/claude-config-dir.test.ts +0 -60
- package/oh-my-opencode/src/shared/claude-config-dir.ts +0 -11
- package/oh-my-opencode/src/shared/command-executor.ts +0 -225
- package/oh-my-opencode/src/shared/config-errors.ts +0 -18
- package/oh-my-opencode/src/shared/config-path.ts +0 -47
- package/oh-my-opencode/src/shared/data-path.ts +0 -22
- package/oh-my-opencode/src/shared/deep-merge.test.ts +0 -336
- package/oh-my-opencode/src/shared/deep-merge.ts +0 -53
- package/oh-my-opencode/src/shared/dynamic-truncator.ts +0 -193
- package/oh-my-opencode/src/shared/external-plugin-detector.test.ts +0 -133
- package/oh-my-opencode/src/shared/external-plugin-detector.ts +0 -132
- package/oh-my-opencode/src/shared/file-reference-resolver.ts +0 -85
- package/oh-my-opencode/src/shared/file-utils.ts +0 -40
- package/oh-my-opencode/src/shared/first-message-variant.test.ts +0 -32
- package/oh-my-opencode/src/shared/first-message-variant.ts +0 -28
- package/oh-my-opencode/src/shared/frontmatter.test.ts +0 -262
- package/oh-my-opencode/src/shared/frontmatter.ts +0 -31
- package/oh-my-opencode/src/shared/hook-disabled.ts +0 -22
- package/oh-my-opencode/src/shared/index.ts +0 -29
- package/oh-my-opencode/src/shared/jsonc-parser.test.ts +0 -266
- package/oh-my-opencode/src/shared/jsonc-parser.ts +0 -66
- package/oh-my-opencode/src/shared/logger.ts +0 -20
- package/oh-my-opencode/src/shared/migration.test.ts +0 -602
- package/oh-my-opencode/src/shared/migration.ts +0 -191
- package/oh-my-opencode/src/shared/model-resolver.test.ts +0 -101
- package/oh-my-opencode/src/shared/model-resolver.ts +0 -35
- package/oh-my-opencode/src/shared/model-sanitizer.ts +0 -12
- package/oh-my-opencode/src/shared/opencode-config-dir.test.ts +0 -318
- package/oh-my-opencode/src/shared/opencode-config-dir.ts +0 -142
- package/oh-my-opencode/src/shared/opencode-version.test.ts +0 -223
- package/oh-my-opencode/src/shared/opencode-version.ts +0 -72
- package/oh-my-opencode/src/shared/pattern-matcher.ts +0 -29
- package/oh-my-opencode/src/shared/permission-compat.test.ts +0 -134
- package/oh-my-opencode/src/shared/permission-compat.ts +0 -77
- package/oh-my-opencode/src/shared/session-cursor.test.ts +0 -66
- package/oh-my-opencode/src/shared/session-cursor.ts +0 -85
- package/oh-my-opencode/src/shared/shell-env.test.ts +0 -278
- package/oh-my-opencode/src/shared/shell-env.ts +0 -111
- package/oh-my-opencode/src/shared/snake-case.ts +0 -49
- package/oh-my-opencode/src/shared/system-directive.ts +0 -40
- package/oh-my-opencode/src/shared/tool-name.ts +0 -26
- package/oh-my-opencode/src/shared/zip-extractor.ts +0 -83
- package/oh-my-opencode/src/tools/AGENTS.md +0 -74
- package/oh-my-opencode/src/tools/ast-grep/cli.ts +0 -230
- package/oh-my-opencode/src/tools/ast-grep/constants.ts +0 -261
- package/oh-my-opencode/src/tools/ast-grep/downloader.ts +0 -128
- package/oh-my-opencode/src/tools/ast-grep/index.ts +0 -13
- package/oh-my-opencode/src/tools/ast-grep/tools.ts +0 -112
- package/oh-my-opencode/src/tools/ast-grep/types.ts +0 -61
- package/oh-my-opencode/src/tools/ast-grep/utils.ts +0 -102
- package/oh-my-opencode/src/tools/background-task/constants.ts +0 -7
- package/oh-my-opencode/src/tools/background-task/index.ts +0 -7
- package/oh-my-opencode/src/tools/background-task/tools.ts +0 -479
- package/oh-my-opencode/src/tools/background-task/types.ts +0 -16
- package/oh-my-opencode/src/tools/call-omo-agent/constants.ts +0 -7
- package/oh-my-opencode/src/tools/call-omo-agent/index.ts +0 -3
- package/oh-my-opencode/src/tools/call-omo-agent/tools.ts +0 -338
- package/oh-my-opencode/src/tools/call-omo-agent/types.ts +0 -27
- package/oh-my-opencode/src/tools/delegate-task/constants.ts +0 -205
- package/oh-my-opencode/src/tools/delegate-task/index.ts +0 -3
- package/oh-my-opencode/src/tools/delegate-task/tools.test.ts +0 -1575
- package/oh-my-opencode/src/tools/delegate-task/tools.ts +0 -885
- package/oh-my-opencode/src/tools/delegate-task/types.ts +0 -9
- package/oh-my-opencode/src/tools/glob/cli.test.ts +0 -158
- package/oh-my-opencode/src/tools/glob/cli.ts +0 -191
- package/oh-my-opencode/src/tools/glob/constants.ts +0 -12
- package/oh-my-opencode/src/tools/glob/index.ts +0 -3
- package/oh-my-opencode/src/tools/glob/tools.ts +0 -41
- package/oh-my-opencode/src/tools/glob/types.ts +0 -22
- package/oh-my-opencode/src/tools/glob/utils.ts +0 -26
- package/oh-my-opencode/src/tools/grep/cli.ts +0 -229
- package/oh-my-opencode/src/tools/grep/constants.ts +0 -127
- package/oh-my-opencode/src/tools/grep/downloader.test.ts +0 -103
- package/oh-my-opencode/src/tools/grep/downloader.ts +0 -145
- package/oh-my-opencode/src/tools/grep/index.ts +0 -3
- package/oh-my-opencode/src/tools/grep/tools.ts +0 -40
- package/oh-my-opencode/src/tools/grep/types.ts +0 -39
- package/oh-my-opencode/src/tools/grep/utils.ts +0 -53
- package/oh-my-opencode/src/tools/index.ts +0 -72
- package/oh-my-opencode/src/tools/interactive-bash/constants.ts +0 -18
- package/oh-my-opencode/src/tools/interactive-bash/index.ts +0 -4
- package/oh-my-opencode/src/tools/interactive-bash/tools.ts +0 -126
- package/oh-my-opencode/src/tools/interactive-bash/utils.ts +0 -71
- package/oh-my-opencode/src/tools/look-at/constants.ts +0 -3
- package/oh-my-opencode/src/tools/look-at/index.ts +0 -3
- package/oh-my-opencode/src/tools/look-at/tools.test.ts +0 -73
- package/oh-my-opencode/src/tools/look-at/tools.ts +0 -173
- package/oh-my-opencode/src/tools/look-at/types.ts +0 -4
- package/oh-my-opencode/src/tools/lsp/client.ts +0 -596
- package/oh-my-opencode/src/tools/lsp/config.test.ts +0 -130
- package/oh-my-opencode/src/tools/lsp/config.ts +0 -285
- package/oh-my-opencode/src/tools/lsp/constants.ts +0 -390
- package/oh-my-opencode/src/tools/lsp/index.ts +0 -7
- package/oh-my-opencode/src/tools/lsp/tools.ts +0 -261
- package/oh-my-opencode/src/tools/lsp/types.ts +0 -124
- package/oh-my-opencode/src/tools/lsp/utils.ts +0 -406
- package/oh-my-opencode/src/tools/session-manager/constants.ts +0 -97
- package/oh-my-opencode/src/tools/session-manager/index.ts +0 -3
- package/oh-my-opencode/src/tools/session-manager/storage.test.ts +0 -315
- package/oh-my-opencode/src/tools/session-manager/storage.ts +0 -238
- package/oh-my-opencode/src/tools/session-manager/tools.test.ts +0 -124
- package/oh-my-opencode/src/tools/session-manager/tools.ts +0 -146
- package/oh-my-opencode/src/tools/session-manager/types.ts +0 -99
- package/oh-my-opencode/src/tools/session-manager/utils.test.ts +0 -160
- package/oh-my-opencode/src/tools/session-manager/utils.ts +0 -199
- package/oh-my-opencode/src/tools/skill/constants.ts +0 -8
- package/oh-my-opencode/src/tools/skill/index.ts +0 -3
- package/oh-my-opencode/src/tools/skill/tools.test.ts +0 -239
- package/oh-my-opencode/src/tools/skill/tools.ts +0 -200
- package/oh-my-opencode/src/tools/skill/types.ts +0 -31
- package/oh-my-opencode/src/tools/skill-mcp/constants.ts +0 -3
- package/oh-my-opencode/src/tools/skill-mcp/index.ts +0 -3
- package/oh-my-opencode/src/tools/skill-mcp/tools.test.ts +0 -215
- package/oh-my-opencode/src/tools/skill-mcp/tools.ts +0 -172
- package/oh-my-opencode/src/tools/skill-mcp/types.ts +0 -8
- package/oh-my-opencode/src/tools/slashcommand/index.ts +0 -2
- package/oh-my-opencode/src/tools/slashcommand/tools.ts +0 -252
- package/oh-my-opencode/src/tools/slashcommand/types.ts +0 -28
- package/oh-my-opencode/test-setup.ts +0 -6
- package/oh-my-opencode/tsconfig.json +0 -20
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export const HOOK_NAME = "auto-slash-command" as const
|
|
2
|
-
|
|
3
|
-
export const AUTO_SLASH_COMMAND_TAG_OPEN = "<auto-slash-command>"
|
|
4
|
-
export const AUTO_SLASH_COMMAND_TAG_CLOSE = "</auto-slash-command>"
|
|
5
|
-
|
|
6
|
-
export const SLASH_COMMAND_PATTERN = /^\/([a-zA-Z][\w-]*)\s*(.*)/
|
|
7
|
-
|
|
8
|
-
export const EXCLUDED_COMMANDS = new Set([
|
|
9
|
-
"ralph-loop",
|
|
10
|
-
"cancel-ralph",
|
|
11
|
-
"ulw-loop",
|
|
12
|
-
])
|
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test"
|
|
2
|
-
import {
|
|
3
|
-
parseSlashCommand,
|
|
4
|
-
detectSlashCommand,
|
|
5
|
-
isExcludedCommand,
|
|
6
|
-
removeCodeBlocks,
|
|
7
|
-
extractPromptText,
|
|
8
|
-
} from "./detector"
|
|
9
|
-
|
|
10
|
-
describe("auto-slash-command detector", () => {
|
|
11
|
-
describe("removeCodeBlocks", () => {
|
|
12
|
-
it("should remove markdown code blocks", () => {
|
|
13
|
-
// #given text with code blocks
|
|
14
|
-
const text = "Hello ```code here``` world"
|
|
15
|
-
|
|
16
|
-
// #when removing code blocks
|
|
17
|
-
const result = removeCodeBlocks(text)
|
|
18
|
-
|
|
19
|
-
// #then code blocks should be removed
|
|
20
|
-
expect(result).toBe("Hello world")
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it("should remove multiline code blocks", () => {
|
|
24
|
-
// #given text with multiline code blocks
|
|
25
|
-
const text = `Before
|
|
26
|
-
\`\`\`javascript
|
|
27
|
-
/command-inside-code
|
|
28
|
-
\`\`\`
|
|
29
|
-
After`
|
|
30
|
-
|
|
31
|
-
// #when removing code blocks
|
|
32
|
-
const result = removeCodeBlocks(text)
|
|
33
|
-
|
|
34
|
-
// #then code blocks should be removed
|
|
35
|
-
expect(result).toContain("Before")
|
|
36
|
-
expect(result).toContain("After")
|
|
37
|
-
expect(result).not.toContain("/command-inside-code")
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it("should handle text without code blocks", () => {
|
|
41
|
-
// #given text without code blocks
|
|
42
|
-
const text = "Just regular text"
|
|
43
|
-
|
|
44
|
-
// #when removing code blocks
|
|
45
|
-
const result = removeCodeBlocks(text)
|
|
46
|
-
|
|
47
|
-
// #then text should remain unchanged
|
|
48
|
-
expect(result).toBe("Just regular text")
|
|
49
|
-
})
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
describe("parseSlashCommand", () => {
|
|
53
|
-
it("should parse simple command without args", () => {
|
|
54
|
-
// #given a simple slash command
|
|
55
|
-
const text = "/commit"
|
|
56
|
-
|
|
57
|
-
// #when parsing
|
|
58
|
-
const result = parseSlashCommand(text)
|
|
59
|
-
|
|
60
|
-
// #then should extract command correctly
|
|
61
|
-
expect(result).not.toBeNull()
|
|
62
|
-
expect(result?.command).toBe("commit")
|
|
63
|
-
expect(result?.args).toBe("")
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it("should parse command with arguments", () => {
|
|
67
|
-
// #given a slash command with arguments
|
|
68
|
-
const text = "/plan create a new feature for auth"
|
|
69
|
-
|
|
70
|
-
// #when parsing
|
|
71
|
-
const result = parseSlashCommand(text)
|
|
72
|
-
|
|
73
|
-
// #then should extract command and args
|
|
74
|
-
expect(result).not.toBeNull()
|
|
75
|
-
expect(result?.command).toBe("plan")
|
|
76
|
-
expect(result?.args).toBe("create a new feature for auth")
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it("should parse command with quoted arguments", () => {
|
|
80
|
-
// #given a slash command with quoted arguments
|
|
81
|
-
const text = '/execute "build the API"'
|
|
82
|
-
|
|
83
|
-
// #when parsing
|
|
84
|
-
const result = parseSlashCommand(text)
|
|
85
|
-
|
|
86
|
-
// #then should extract command and args
|
|
87
|
-
expect(result).not.toBeNull()
|
|
88
|
-
expect(result?.command).toBe("execute")
|
|
89
|
-
expect(result?.args).toBe('"build the API"')
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it("should parse command with hyphen in name", () => {
|
|
93
|
-
// #given a slash command with hyphen
|
|
94
|
-
const text = "/frontend-template-creator project"
|
|
95
|
-
|
|
96
|
-
// #when parsing
|
|
97
|
-
const result = parseSlashCommand(text)
|
|
98
|
-
|
|
99
|
-
// #then should extract full command name
|
|
100
|
-
expect(result).not.toBeNull()
|
|
101
|
-
expect(result?.command).toBe("frontend-template-creator")
|
|
102
|
-
expect(result?.args).toBe("project")
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it("should return null for non-slash text", () => {
|
|
106
|
-
// #given text without slash
|
|
107
|
-
const text = "regular text"
|
|
108
|
-
|
|
109
|
-
// #when parsing
|
|
110
|
-
const result = parseSlashCommand(text)
|
|
111
|
-
|
|
112
|
-
// #then should return null
|
|
113
|
-
expect(result).toBeNull()
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it("should return null for slash not at start", () => {
|
|
117
|
-
// #given text with slash in middle
|
|
118
|
-
const text = "some text /command"
|
|
119
|
-
|
|
120
|
-
// #when parsing
|
|
121
|
-
const result = parseSlashCommand(text)
|
|
122
|
-
|
|
123
|
-
// #then should return null (slash not at start)
|
|
124
|
-
expect(result).toBeNull()
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
it("should return null for just a slash", () => {
|
|
128
|
-
// #given just a slash
|
|
129
|
-
const text = "/"
|
|
130
|
-
|
|
131
|
-
// #when parsing
|
|
132
|
-
const result = parseSlashCommand(text)
|
|
133
|
-
|
|
134
|
-
// #then should return null
|
|
135
|
-
expect(result).toBeNull()
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
it("should return null for slash followed by number", () => {
|
|
139
|
-
// #given slash followed by number
|
|
140
|
-
const text = "/123"
|
|
141
|
-
|
|
142
|
-
// #when parsing
|
|
143
|
-
const result = parseSlashCommand(text)
|
|
144
|
-
|
|
145
|
-
// #then should return null (command must start with letter)
|
|
146
|
-
expect(result).toBeNull()
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
it("should handle whitespace before slash", () => {
|
|
150
|
-
// #given command with leading whitespace
|
|
151
|
-
const text = " /commit"
|
|
152
|
-
|
|
153
|
-
// #when parsing
|
|
154
|
-
const result = parseSlashCommand(text)
|
|
155
|
-
|
|
156
|
-
// #then should parse after trimming
|
|
157
|
-
expect(result).not.toBeNull()
|
|
158
|
-
expect(result?.command).toBe("commit")
|
|
159
|
-
})
|
|
160
|
-
})
|
|
161
|
-
|
|
162
|
-
describe("isExcludedCommand", () => {
|
|
163
|
-
it("should exclude ralph-loop", () => {
|
|
164
|
-
// #given ralph-loop command
|
|
165
|
-
// #when checking exclusion
|
|
166
|
-
// #then should be excluded
|
|
167
|
-
expect(isExcludedCommand("ralph-loop")).toBe(true)
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
it("should exclude cancel-ralph", () => {
|
|
171
|
-
// #given cancel-ralph command
|
|
172
|
-
// #when checking exclusion
|
|
173
|
-
// #then should be excluded
|
|
174
|
-
expect(isExcludedCommand("cancel-ralph")).toBe(true)
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
it("should be case-insensitive for exclusion", () => {
|
|
178
|
-
// #given uppercase variants
|
|
179
|
-
// #when checking exclusion
|
|
180
|
-
// #then should still be excluded
|
|
181
|
-
expect(isExcludedCommand("RALPH-LOOP")).toBe(true)
|
|
182
|
-
expect(isExcludedCommand("Cancel-Ralph")).toBe(true)
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it("should not exclude regular commands", () => {
|
|
186
|
-
// #given regular commands
|
|
187
|
-
// #when checking exclusion
|
|
188
|
-
// #then should not be excluded
|
|
189
|
-
expect(isExcludedCommand("commit")).toBe(false)
|
|
190
|
-
expect(isExcludedCommand("plan")).toBe(false)
|
|
191
|
-
expect(isExcludedCommand("execute")).toBe(false)
|
|
192
|
-
})
|
|
193
|
-
})
|
|
194
|
-
|
|
195
|
-
describe("detectSlashCommand", () => {
|
|
196
|
-
it("should detect slash command in plain text", () => {
|
|
197
|
-
// #given plain text with slash command
|
|
198
|
-
const text = "/commit fix typo"
|
|
199
|
-
|
|
200
|
-
// #when detecting
|
|
201
|
-
const result = detectSlashCommand(text)
|
|
202
|
-
|
|
203
|
-
// #then should detect
|
|
204
|
-
expect(result).not.toBeNull()
|
|
205
|
-
expect(result?.command).toBe("commit")
|
|
206
|
-
expect(result?.args).toBe("fix typo")
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
it("should NOT detect slash command inside code block", () => {
|
|
210
|
-
// #given slash command inside code block
|
|
211
|
-
const text = "```bash\n/command\n```"
|
|
212
|
-
|
|
213
|
-
// #when detecting
|
|
214
|
-
const result = detectSlashCommand(text)
|
|
215
|
-
|
|
216
|
-
// #then should not detect (only code block content)
|
|
217
|
-
expect(result).toBeNull()
|
|
218
|
-
})
|
|
219
|
-
|
|
220
|
-
it("should detect command when text has code blocks elsewhere", () => {
|
|
221
|
-
// #given slash command before code block
|
|
222
|
-
const text = "/commit fix\n```code```"
|
|
223
|
-
|
|
224
|
-
// #when detecting
|
|
225
|
-
const result = detectSlashCommand(text)
|
|
226
|
-
|
|
227
|
-
// #then should detect the command
|
|
228
|
-
expect(result).not.toBeNull()
|
|
229
|
-
expect(result?.command).toBe("commit")
|
|
230
|
-
})
|
|
231
|
-
|
|
232
|
-
it("should NOT detect excluded commands", () => {
|
|
233
|
-
// #given excluded command
|
|
234
|
-
const text = "/ralph-loop do something"
|
|
235
|
-
|
|
236
|
-
// #when detecting
|
|
237
|
-
const result = detectSlashCommand(text)
|
|
238
|
-
|
|
239
|
-
// #then should not detect
|
|
240
|
-
expect(result).toBeNull()
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
it("should return null for non-command text", () => {
|
|
244
|
-
// #given regular text
|
|
245
|
-
const text = "Just some regular text"
|
|
246
|
-
|
|
247
|
-
// #when detecting
|
|
248
|
-
const result = detectSlashCommand(text)
|
|
249
|
-
|
|
250
|
-
// #then should return null
|
|
251
|
-
expect(result).toBeNull()
|
|
252
|
-
})
|
|
253
|
-
})
|
|
254
|
-
|
|
255
|
-
describe("extractPromptText", () => {
|
|
256
|
-
it("should extract text from parts", () => {
|
|
257
|
-
// #given message parts
|
|
258
|
-
const parts = [
|
|
259
|
-
{ type: "text", text: "Hello " },
|
|
260
|
-
{ type: "tool_use", id: "123" },
|
|
261
|
-
{ type: "text", text: "world" },
|
|
262
|
-
]
|
|
263
|
-
|
|
264
|
-
// #when extracting
|
|
265
|
-
const result = extractPromptText(parts)
|
|
266
|
-
|
|
267
|
-
// #then should join text parts
|
|
268
|
-
expect(result).toBe("Hello world")
|
|
269
|
-
})
|
|
270
|
-
|
|
271
|
-
it("should handle empty parts", () => {
|
|
272
|
-
// #given empty parts
|
|
273
|
-
const parts: Array<{ type: string; text?: string }> = []
|
|
274
|
-
|
|
275
|
-
// #when extracting
|
|
276
|
-
const result = extractPromptText(parts)
|
|
277
|
-
|
|
278
|
-
// #then should return empty string
|
|
279
|
-
expect(result).toBe("")
|
|
280
|
-
})
|
|
281
|
-
|
|
282
|
-
it("should handle parts without text", () => {
|
|
283
|
-
// #given parts without text content
|
|
284
|
-
const parts = [
|
|
285
|
-
{ type: "tool_use", id: "123" },
|
|
286
|
-
{ type: "tool_result", output: "result" },
|
|
287
|
-
]
|
|
288
|
-
|
|
289
|
-
// #when extracting
|
|
290
|
-
const result = extractPromptText(parts)
|
|
291
|
-
|
|
292
|
-
// #then should return empty string
|
|
293
|
-
expect(result).toBe("")
|
|
294
|
-
})
|
|
295
|
-
})
|
|
296
|
-
})
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SLASH_COMMAND_PATTERN,
|
|
3
|
-
EXCLUDED_COMMANDS,
|
|
4
|
-
} from "./constants"
|
|
5
|
-
import type { ParsedSlashCommand } from "./types"
|
|
6
|
-
|
|
7
|
-
const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g
|
|
8
|
-
|
|
9
|
-
export function removeCodeBlocks(text: string): string {
|
|
10
|
-
return text.replace(CODE_BLOCK_PATTERN, "")
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function parseSlashCommand(text: string): ParsedSlashCommand | null {
|
|
14
|
-
const trimmed = text.trim()
|
|
15
|
-
|
|
16
|
-
if (!trimmed.startsWith("/")) {
|
|
17
|
-
return null
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const match = trimmed.match(SLASH_COMMAND_PATTERN)
|
|
21
|
-
if (!match) {
|
|
22
|
-
return null
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const [raw, command, args] = match
|
|
26
|
-
return {
|
|
27
|
-
command: command.toLowerCase(),
|
|
28
|
-
args: args.trim(),
|
|
29
|
-
raw,
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function isExcludedCommand(command: string): boolean {
|
|
34
|
-
return EXCLUDED_COMMANDS.has(command.toLowerCase())
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function detectSlashCommand(text: string): ParsedSlashCommand | null {
|
|
38
|
-
const textWithoutCodeBlocks = removeCodeBlocks(text)
|
|
39
|
-
const trimmed = textWithoutCodeBlocks.trim()
|
|
40
|
-
|
|
41
|
-
if (!trimmed.startsWith("/")) {
|
|
42
|
-
return null
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const parsed = parseSlashCommand(trimmed)
|
|
46
|
-
|
|
47
|
-
if (!parsed) {
|
|
48
|
-
return null
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (isExcludedCommand(parsed.command)) {
|
|
52
|
-
return null
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return parsed
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function extractPromptText(
|
|
59
|
-
parts: Array<{ type: string; text?: string }>
|
|
60
|
-
): string {
|
|
61
|
-
return parts
|
|
62
|
-
.filter((p) => p.type === "text")
|
|
63
|
-
.map((p) => p.text || "")
|
|
64
|
-
.join(" ")
|
|
65
|
-
}
|
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync, readFileSync } from "fs"
|
|
2
|
-
import { join, basename, dirname } from "path"
|
|
3
|
-
import { homedir } from "os"
|
|
4
|
-
import {
|
|
5
|
-
parseFrontmatter,
|
|
6
|
-
resolveCommandsInText,
|
|
7
|
-
resolveFileReferencesInText,
|
|
8
|
-
sanitizeModelField,
|
|
9
|
-
getClaudeConfigDir,
|
|
10
|
-
} from "../../shared"
|
|
11
|
-
import type { CommandFrontmatter } from "../../features/claude-code-command-loader/types"
|
|
12
|
-
import { isMarkdownFile } from "../../shared/file-utils"
|
|
13
|
-
import { discoverAllSkills, type LoadedSkill, type LazyContentLoader } from "../../features/opencode-skill-loader"
|
|
14
|
-
import type { ParsedSlashCommand } from "./types"
|
|
15
|
-
|
|
16
|
-
interface CommandScope {
|
|
17
|
-
type: "user" | "project" | "opencode" | "opencode-project" | "skill"
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface CommandMetadata {
|
|
21
|
-
name: string
|
|
22
|
-
description: string
|
|
23
|
-
argumentHint?: string
|
|
24
|
-
model?: string
|
|
25
|
-
agent?: string
|
|
26
|
-
subtask?: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
interface CommandInfo {
|
|
30
|
-
name: string
|
|
31
|
-
path?: string
|
|
32
|
-
metadata: CommandMetadata
|
|
33
|
-
content?: string
|
|
34
|
-
scope: CommandScope["type"]
|
|
35
|
-
lazyContentLoader?: LazyContentLoader
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function discoverCommandsFromDir(commandsDir: string, scope: CommandScope["type"]): CommandInfo[] {
|
|
39
|
-
if (!existsSync(commandsDir)) {
|
|
40
|
-
return []
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const entries = readdirSync(commandsDir, { withFileTypes: true })
|
|
44
|
-
const commands: CommandInfo[] = []
|
|
45
|
-
|
|
46
|
-
for (const entry of entries) {
|
|
47
|
-
if (!isMarkdownFile(entry)) continue
|
|
48
|
-
|
|
49
|
-
const commandPath = join(commandsDir, entry.name)
|
|
50
|
-
const commandName = basename(entry.name, ".md")
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
const content = readFileSync(commandPath, "utf-8")
|
|
54
|
-
const { data, body } = parseFrontmatter<CommandFrontmatter>(content)
|
|
55
|
-
|
|
56
|
-
const isOpencodeSource = scope === "opencode" || scope === "opencode-project"
|
|
57
|
-
const metadata: CommandMetadata = {
|
|
58
|
-
name: commandName,
|
|
59
|
-
description: data.description || "",
|
|
60
|
-
argumentHint: data["argument-hint"],
|
|
61
|
-
model: sanitizeModelField(data.model, isOpencodeSource ? "opencode" : "claude-code"),
|
|
62
|
-
agent: data.agent,
|
|
63
|
-
subtask: Boolean(data.subtask),
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
commands.push({
|
|
67
|
-
name: commandName,
|
|
68
|
-
path: commandPath,
|
|
69
|
-
metadata,
|
|
70
|
-
content: body,
|
|
71
|
-
scope,
|
|
72
|
-
})
|
|
73
|
-
} catch {
|
|
74
|
-
continue
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return commands
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function skillToCommandInfo(skill: LoadedSkill): CommandInfo {
|
|
82
|
-
return {
|
|
83
|
-
name: skill.name,
|
|
84
|
-
path: skill.path,
|
|
85
|
-
metadata: {
|
|
86
|
-
name: skill.name,
|
|
87
|
-
description: skill.definition.description || "",
|
|
88
|
-
argumentHint: skill.definition.argumentHint,
|
|
89
|
-
model: skill.definition.model,
|
|
90
|
-
agent: skill.definition.agent,
|
|
91
|
-
subtask: skill.definition.subtask,
|
|
92
|
-
},
|
|
93
|
-
content: skill.definition.template,
|
|
94
|
-
scope: "skill",
|
|
95
|
-
lazyContentLoader: skill.lazyContent,
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export interface ExecutorOptions {
|
|
100
|
-
skills?: LoadedSkill[]
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
async function discoverAllCommands(options?: ExecutorOptions): Promise<CommandInfo[]> {
|
|
104
|
-
const userCommandsDir = join(getClaudeConfigDir(), "commands")
|
|
105
|
-
const projectCommandsDir = join(process.cwd(), ".claude", "commands")
|
|
106
|
-
const opencodeGlobalDir = join(homedir(), ".config", "opencode", "command")
|
|
107
|
-
const opencodeProjectDir = join(process.cwd(), ".opencode", "command")
|
|
108
|
-
|
|
109
|
-
const userCommands = discoverCommandsFromDir(userCommandsDir, "user")
|
|
110
|
-
const opencodeGlobalCommands = discoverCommandsFromDir(opencodeGlobalDir, "opencode")
|
|
111
|
-
const projectCommands = discoverCommandsFromDir(projectCommandsDir, "project")
|
|
112
|
-
const opencodeProjectCommands = discoverCommandsFromDir(opencodeProjectDir, "opencode-project")
|
|
113
|
-
|
|
114
|
-
const skills = options?.skills ?? await discoverAllSkills()
|
|
115
|
-
const skillCommands = skills.map(skillToCommandInfo)
|
|
116
|
-
|
|
117
|
-
return [
|
|
118
|
-
...opencodeProjectCommands,
|
|
119
|
-
...projectCommands,
|
|
120
|
-
...opencodeGlobalCommands,
|
|
121
|
-
...userCommands,
|
|
122
|
-
...skillCommands,
|
|
123
|
-
]
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async function findCommand(commandName: string, options?: ExecutorOptions): Promise<CommandInfo | null> {
|
|
127
|
-
const allCommands = await discoverAllCommands(options)
|
|
128
|
-
return allCommands.find(
|
|
129
|
-
(cmd) => cmd.name.toLowerCase() === commandName.toLowerCase()
|
|
130
|
-
) ?? null
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async function formatCommandTemplate(cmd: CommandInfo, args: string): Promise<string> {
|
|
134
|
-
const sections: string[] = []
|
|
135
|
-
|
|
136
|
-
sections.push(`# /${cmd.name} Command\n`)
|
|
137
|
-
|
|
138
|
-
if (cmd.metadata.description) {
|
|
139
|
-
sections.push(`**Description**: ${cmd.metadata.description}\n`)
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (args) {
|
|
143
|
-
sections.push(`**User Arguments**: ${args}\n`)
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (cmd.metadata.model) {
|
|
147
|
-
sections.push(`**Model**: ${cmd.metadata.model}\n`)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (cmd.metadata.agent) {
|
|
151
|
-
sections.push(`**Agent**: ${cmd.metadata.agent}\n`)
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
sections.push(`**Scope**: ${cmd.scope}\n`)
|
|
155
|
-
sections.push("---\n")
|
|
156
|
-
sections.push("## Command Instructions\n")
|
|
157
|
-
|
|
158
|
-
let content = cmd.content || ""
|
|
159
|
-
if (!content && cmd.lazyContentLoader) {
|
|
160
|
-
content = await cmd.lazyContentLoader.load()
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const commandDir = cmd.path ? dirname(cmd.path) : process.cwd()
|
|
164
|
-
const withFileRefs = await resolveFileReferencesInText(content, commandDir)
|
|
165
|
-
const resolvedContent = await resolveCommandsInText(withFileRefs)
|
|
166
|
-
sections.push(resolvedContent.trim())
|
|
167
|
-
|
|
168
|
-
if (args) {
|
|
169
|
-
sections.push("\n\n---\n")
|
|
170
|
-
sections.push("## User Request\n")
|
|
171
|
-
sections.push(args)
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return sections.join("\n")
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export interface ExecuteResult {
|
|
178
|
-
success: boolean
|
|
179
|
-
replacementText?: string
|
|
180
|
-
error?: string
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
export async function executeSlashCommand(parsed: ParsedSlashCommand, options?: ExecutorOptions): Promise<ExecuteResult> {
|
|
184
|
-
const command = await findCommand(parsed.command, options)
|
|
185
|
-
|
|
186
|
-
if (!command) {
|
|
187
|
-
return {
|
|
188
|
-
success: false,
|
|
189
|
-
error: `Command "/${parsed.command}" not found. Use the slashcommand tool to list available commands.`,
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
const template = await formatCommandTemplate(command, parsed.args)
|
|
195
|
-
return {
|
|
196
|
-
success: true,
|
|
197
|
-
replacementText: template,
|
|
198
|
-
}
|
|
199
|
-
} catch (err) {
|
|
200
|
-
return {
|
|
201
|
-
success: false,
|
|
202
|
-
error: `Failed to load command "/${parsed.command}": ${err instanceof Error ? err.message : String(err)}`,
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|