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
package/index.ts
CHANGED
|
@@ -347,9 +347,11 @@ async function ensureRepoAvailable(
|
|
|
347
347
|
const repoPath = join(cacheDir, owner, repo)
|
|
348
348
|
const url = buildGitUrl(owner, repo, useHttps)
|
|
349
349
|
|
|
350
|
+
let actualBranch = branch
|
|
350
351
|
try {
|
|
351
352
|
await withManifestLock(async () => {
|
|
352
|
-
await cloneRepo(url, repoPath, { branch })
|
|
353
|
+
const cloneResult = await cloneRepo(url, repoPath, { branch })
|
|
354
|
+
actualBranch = cloneResult.branch
|
|
353
355
|
|
|
354
356
|
const now = new Date().toISOString()
|
|
355
357
|
const updatedManifest = await loadManifest()
|
|
@@ -359,7 +361,7 @@ async function ensureRepoAvailable(
|
|
|
359
361
|
clonedAt: now,
|
|
360
362
|
lastAccessed: now,
|
|
361
363
|
lastUpdated: now,
|
|
362
|
-
currentBranch:
|
|
364
|
+
currentBranch: actualBranch,
|
|
363
365
|
shallow: true,
|
|
364
366
|
}
|
|
365
367
|
await saveManifest(updatedManifest)
|
|
@@ -371,7 +373,7 @@ async function ensureRepoAvailable(
|
|
|
371
373
|
|
|
372
374
|
return {
|
|
373
375
|
repoPath,
|
|
374
|
-
branch,
|
|
376
|
+
branch: actualBranch,
|
|
375
377
|
type: "cached",
|
|
376
378
|
}
|
|
377
379
|
}
|
|
@@ -988,8 +990,10 @@ When user mentions another project or asks about external code:
|
|
|
988
990
|
} catch {}
|
|
989
991
|
}
|
|
990
992
|
|
|
993
|
+
let actualBranch = branch
|
|
991
994
|
try {
|
|
992
|
-
await cloneRepo(url, destPath, { branch })
|
|
995
|
+
const cloneResult = await cloneRepo(url, destPath, { branch })
|
|
996
|
+
actualBranch = cloneResult.branch
|
|
993
997
|
} catch (error) {
|
|
994
998
|
const message =
|
|
995
999
|
error instanceof Error ? error.message : String(error)
|
|
@@ -1003,7 +1007,7 @@ When user mentions another project or asks about external code:
|
|
|
1003
1007
|
clonedAt: now,
|
|
1004
1008
|
lastAccessed: now,
|
|
1005
1009
|
lastUpdated: now,
|
|
1006
|
-
currentBranch:
|
|
1010
|
+
currentBranch: actualBranch,
|
|
1007
1011
|
shallow: true,
|
|
1008
1012
|
}
|
|
1009
1013
|
manifest.repos[repoKey] = entry
|
|
@@ -1012,7 +1016,7 @@ When user mentions another project or asks about external code:
|
|
|
1012
1016
|
|
|
1013
1017
|
return {
|
|
1014
1018
|
path: destPath,
|
|
1015
|
-
branch,
|
|
1019
|
+
branch: actualBranch,
|
|
1016
1020
|
status: "cloned" as const,
|
|
1017
1021
|
alreadyExists: false,
|
|
1018
1022
|
}
|
package/package.json
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
cloneRepo,
|
|
9
9
|
updateRepo,
|
|
10
10
|
getRepoInfo,
|
|
11
|
+
getRemoteDefaultBranch,
|
|
11
12
|
} from "../git"
|
|
12
13
|
|
|
13
14
|
describe("parseRepoSpec", () => {
|
|
@@ -90,6 +91,22 @@ describe("buildGitUrl", () => {
|
|
|
90
91
|
})
|
|
91
92
|
})
|
|
92
93
|
|
|
94
|
+
describe("getRemoteDefaultBranch", () => {
|
|
95
|
+
test("returns default branch for a public repo", async () => {
|
|
96
|
+
const branch = await getRemoteDefaultBranch(
|
|
97
|
+
"https://github.com/octocat/Hello-World.git"
|
|
98
|
+
)
|
|
99
|
+
expect(branch).toBe("master")
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
test("returns null for nonexistent repo", async () => {
|
|
103
|
+
const branch = await getRemoteDefaultBranch(
|
|
104
|
+
"https://github.com/nonexistent-user-12345/nonexistent-repo-67890.git"
|
|
105
|
+
)
|
|
106
|
+
expect(branch).toBeNull()
|
|
107
|
+
})
|
|
108
|
+
})
|
|
109
|
+
|
|
93
110
|
describe("git operations (integration)", () => {
|
|
94
111
|
const testDir = join(tmpdir(), `opencode-repos-test-${Date.now()}`)
|
|
95
112
|
const repoPath = join(testDir, "test-repo")
|
|
@@ -102,13 +119,14 @@ describe("git operations (integration)", () => {
|
|
|
102
119
|
await rm(testDir, { recursive: true, force: true })
|
|
103
120
|
})
|
|
104
121
|
|
|
105
|
-
test("cloneRepo clones a public repository", async () => {
|
|
106
|
-
await cloneRepo(
|
|
122
|
+
test("cloneRepo clones a public repository and returns branch", async () => {
|
|
123
|
+
const result = await cloneRepo(
|
|
107
124
|
"https://github.com/octocat/Hello-World.git",
|
|
108
125
|
repoPath,
|
|
109
126
|
{ branch: "master" }
|
|
110
127
|
)
|
|
111
128
|
|
|
129
|
+
expect(result.branch).toBe("master")
|
|
112
130
|
const exists = await Bun.file(join(repoPath, ".git/config")).exists()
|
|
113
131
|
expect(exists).toBe(true)
|
|
114
132
|
})
|
|
@@ -143,4 +161,17 @@ describe("git operations (integration)", () => {
|
|
|
143
161
|
expect(exists).toBe(false)
|
|
144
162
|
}
|
|
145
163
|
})
|
|
164
|
+
|
|
165
|
+
test("cloneRepo falls back to actual default branch when main does not exist", async () => {
|
|
166
|
+
const fallbackPath = join(testDir, "fallback-repo")
|
|
167
|
+
|
|
168
|
+
const result = await cloneRepo(
|
|
169
|
+
"https://github.com/octocat/Hello-World.git",
|
|
170
|
+
fallbackPath
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
expect(result.branch).toBe("master")
|
|
174
|
+
const exists = await Bun.file(join(fallbackPath, ".git/config")).exists()
|
|
175
|
+
expect(exists).toBe(true)
|
|
176
|
+
})
|
|
146
177
|
})
|
package/src/git.ts
CHANGED
|
@@ -58,20 +58,47 @@ export function buildGitUrl(owner: string, repo: string, useHttps: boolean = fal
|
|
|
58
58
|
return `git@github.com:${owner}/${repo}.git`
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
export async function getRemoteDefaultBranch(url: string): Promise<string | null> {
|
|
62
|
+
try {
|
|
63
|
+
const output = await $`git ls-remote --symref ${url} HEAD`.text()
|
|
64
|
+
const match = output.match(/ref: refs\/heads\/(\S+)\s+HEAD/)
|
|
65
|
+
return match?.[1] ?? null
|
|
66
|
+
} catch {
|
|
67
|
+
return null
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
61
71
|
export async function cloneRepo(
|
|
62
72
|
url: string,
|
|
63
73
|
destPath: string,
|
|
64
74
|
options: CloneOptions = {}
|
|
65
|
-
): Promise<
|
|
66
|
-
const
|
|
75
|
+
): Promise<{ branch: string }> {
|
|
76
|
+
const requestedBranch = options.branch || "main"
|
|
67
77
|
|
|
68
78
|
try {
|
|
69
|
-
await $`git clone --depth=1 --branch ${
|
|
70
|
-
|
|
79
|
+
await $`git clone --depth=1 --branch ${requestedBranch} --config core.hooksPath=/dev/null ${url} ${destPath}`.quiet()
|
|
80
|
+
return { branch: requestedBranch }
|
|
81
|
+
} catch (firstError) {
|
|
71
82
|
try {
|
|
72
83
|
await rm(destPath, { recursive: true, force: true })
|
|
73
84
|
} catch {}
|
|
74
|
-
|
|
85
|
+
|
|
86
|
+
if (!options.branch) {
|
|
87
|
+
const defaultBranch = await getRemoteDefaultBranch(url)
|
|
88
|
+
if (defaultBranch && defaultBranch !== requestedBranch) {
|
|
89
|
+
try {
|
|
90
|
+
await $`git clone --depth=1 --branch ${defaultBranch} --config core.hooksPath=/dev/null ${url} ${destPath}`.quiet()
|
|
91
|
+
return { branch: defaultBranch }
|
|
92
|
+
} catch (secondError) {
|
|
93
|
+
try {
|
|
94
|
+
await rm(destPath, { recursive: true, force: true })
|
|
95
|
+
} catch {}
|
|
96
|
+
throw secondError
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
throw firstError
|
|
75
102
|
}
|
|
76
103
|
}
|
|
77
104
|
|
package/.sisyphus/boulder.json
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Decisions - opencode-repos
|
|
2
|
-
|
|
3
|
-
## Task 0: Project Setup
|
|
4
|
-
|
|
5
|
-
### Placeholder Test File
|
|
6
|
-
**Decision**: Created `src/__tests__/setup.test.ts` with a trivial passing test.
|
|
7
|
-
**Rationale**: `bun test` exits with code 1 when no tests found, which would fail verification. A placeholder ensures clean test runs during development.
|
|
8
|
-
|
|
9
|
-
### tsconfig.json Pattern
|
|
10
|
-
**Decision**: Followed opencode-tmux tsconfig exactly rather than bun init default.
|
|
11
|
-
**Rationale**: Consistency with existing plugin ecosystem. The tmux pattern is proven to work with OpenCode plugin system.
|
|
12
|
-
|
|
13
|
-
### Directory Structure
|
|
14
|
-
**Decision**: Using `src/` directory for modules rather than flat structure.
|
|
15
|
-
**Rationale**: Plan specifies src/ directory. Allows separation of implementation from root-level plugin entry point.
|
|
@@ -1,384 +0,0 @@
|
|
|
1
|
-
# Learnings - opencode-repos
|
|
2
|
-
|
|
3
|
-
## Task 0: Project Setup
|
|
4
|
-
|
|
5
|
-
### Plugin Version Discovery
|
|
6
|
-
- @opencode-ai/plugin does not have version 0.0.1
|
|
7
|
-
- Earliest version is 1.1.x series
|
|
8
|
-
- tmux plugin pattern: peerDependencies uses `*`, devDependencies uses `^1.1.25`
|
|
9
|
-
|
|
10
|
-
### Bun Test Behavior
|
|
11
|
-
- `bun test` exits with code 1 when no test files found
|
|
12
|
-
- Need at least one placeholder test for clean CI/verification
|
|
13
|
-
- Test file pattern: `**{.test,.spec,_test_,_spec_}.{js,ts,jsx,tsx}`
|
|
14
|
-
|
|
15
|
-
### tsconfig.json
|
|
16
|
-
- Bun init creates tsconfig with comments (invalid JSON for some tools)
|
|
17
|
-
- Replaced with clean JSON matching tmux plugin pattern
|
|
18
|
-
- Key settings: ES2022 target, ESNext module, bundler moduleResolution
|
|
19
|
-
|
|
20
|
-
## Task 1: Manifest Types and Operations
|
|
21
|
-
|
|
22
|
-
### Atomic File Writes
|
|
23
|
-
- Pattern: write to .tmp file, then rename (atomic at OS level)
|
|
24
|
-
- `fs.rename()` is atomic on POSIX systems
|
|
25
|
-
- Prevents partial writes from corrupting manifest
|
|
26
|
-
|
|
27
|
-
### File Locking Pattern
|
|
28
|
-
- Manual lock file approach works well with Bun
|
|
29
|
-
- Check lock existence, check staleness (>5 min), create lock, execute, release
|
|
30
|
-
- Use `stat().mtimeMs` to check lock age
|
|
31
|
-
- Stale lock detection prevents deadlocks from crashed processes
|
|
32
|
-
|
|
33
|
-
### Bun File APIs
|
|
34
|
-
- `Bun.file(path).exists()` for existence check
|
|
35
|
-
- `Bun.file(path).text()` for reading
|
|
36
|
-
- `Bun.write(path, content)` for writing
|
|
37
|
-
- `Bun.sleep(ms)` for delays in lock retry loop
|
|
38
|
-
|
|
39
|
-
### Test Isolation
|
|
40
|
-
- Tests modify real cache dir (~/.cache/opencode-repos)
|
|
41
|
-
- Use beforeEach/afterEach to clean up
|
|
42
|
-
- `rm(path, { recursive: true, force: true })` for cleanup
|
|
43
|
-
|
|
44
|
-
### Graceful Error Handling
|
|
45
|
-
- Missing manifest: return empty, don't throw
|
|
46
|
-
- Corrupted JSON: log warning, return empty
|
|
47
|
-
- Lock acquisition failure: throw after max attempts
|
|
48
|
-
|
|
49
|
-
## Task 2: Git Operations Module
|
|
50
|
-
|
|
51
|
-
### Bun Shell Execution
|
|
52
|
-
- Import `$` from "bun" for shell commands
|
|
53
|
-
- Use `.quiet()` to suppress stdout/stderr output
|
|
54
|
-
- Use `.text()` to get string output from commands
|
|
55
|
-
- Pattern: `await $\`git command\`.quiet()` for silent execution
|
|
56
|
-
|
|
57
|
-
### Git Clone Flags
|
|
58
|
-
- `--depth=1`: Shallow clone (single commit)
|
|
59
|
-
- `--single-branch`: Only fetch specified branch
|
|
60
|
-
- `--branch ${branch}`: Specify branch to clone
|
|
61
|
-
- `--config core.hooksPath=/dev/null`: Disable git hooks
|
|
62
|
-
|
|
63
|
-
### Git Directory Operations
|
|
64
|
-
- Use `-C ${path}` to run git commands in a specific directory
|
|
65
|
-
- Avoids need to change working directory
|
|
66
|
-
|
|
67
|
-
### Cleanup on Failure
|
|
68
|
-
- Wrap clone in try/catch
|
|
69
|
-
- On failure, remove destination directory with `rm(destPath, { recursive: true, force: true })`
|
|
70
|
-
- Nested try/catch for cleanup to ignore cleanup errors
|
|
71
|
-
|
|
72
|
-
### Repo Spec Parsing
|
|
73
|
-
- Format: "owner/repo" or "owner/repo@branch"
|
|
74
|
-
- Split on "@" first for branch extraction
|
|
75
|
-
- Split on "/" for owner/repo
|
|
76
|
-
- Branch can contain "/" (e.g., "feature/my-branch")
|
|
77
|
-
- Validate: owner and repo must not be empty
|
|
78
|
-
|
|
79
|
-
### Integration Testing
|
|
80
|
-
- Use `tmpdir()` for test directories
|
|
81
|
-
- Use `beforeAll`/`afterAll` for setup/teardown
|
|
82
|
-
- GitHub's octocat/Hello-World is a good public test repo
|
|
83
|
-
- Commit hashes match pattern `/^[a-f0-9]{40}$/`
|
|
84
|
-
|
|
85
|
-
## Task 3: Plugin Export and repo_clone Tool
|
|
86
|
-
|
|
87
|
-
### Plugin Export Pattern
|
|
88
|
-
- Import `Plugin` type and `tool` from "@opencode-ai/plugin"
|
|
89
|
-
- Plugin is an async function returning object with `tool` property
|
|
90
|
-
- Tools are defined using `tool({ description, args, execute })`
|
|
91
|
-
- Export both named (`OpencodeRepos`) and default export
|
|
92
|
-
|
|
93
|
-
### Tool Schema Pattern
|
|
94
|
-
- Use `tool.schema.string()`, `tool.schema.boolean()` for arg types
|
|
95
|
-
- Chain `.optional()`, `.default(value)`, `.describe()` for metadata
|
|
96
|
-
- Args are automatically validated before execute() is called
|
|
97
|
-
|
|
98
|
-
### Smart Clone Flow
|
|
99
|
-
- Check manifest first (within lock) for existing entry
|
|
100
|
-
- If cached and not force: update lastAccessed, return path
|
|
101
|
-
- If force: delete existing directory before clone
|
|
102
|
-
- Clone to `~/.cache/opencode-repos/{owner}/{repo}@{branch}/`
|
|
103
|
-
- Update manifest with new entry after successful clone
|
|
104
|
-
|
|
105
|
-
### Error Handling in Tools
|
|
106
|
-
- Wrap error messages: `error instanceof Error ? error.message : String(error)`
|
|
107
|
-
- Throw descriptive errors with repo context
|
|
108
|
-
- Return markdown-formatted success messages
|
|
109
|
-
|
|
110
|
-
### Manifest Locking
|
|
111
|
-
- All manifest read/write operations wrapped in `withManifestLock()`
|
|
112
|
-
- Ensures concurrent clone operations don't corrupt manifest
|
|
113
|
-
- Lock is released even if operation throws
|
|
114
|
-
|
|
115
|
-
## Task 4: repo_list Tool
|
|
116
|
-
|
|
117
|
-
### List Tool Pattern
|
|
118
|
-
- Reference: opencode-tmux tmux_list tool (lines 414-471)
|
|
119
|
-
- Use enum schema for filtering: `tool.schema.enum(["all", "cached", "local"])`
|
|
120
|
-
- Return markdown-formatted output with tables
|
|
121
|
-
|
|
122
|
-
### Markdown Table Output
|
|
123
|
-
- Header row with column names
|
|
124
|
-
- Separator row with dashes
|
|
125
|
-
- Data rows with pipe-separated values
|
|
126
|
-
- Summary line at end with counts
|
|
127
|
-
|
|
128
|
-
### Repo Key Parsing
|
|
129
|
-
- Keys stored as "owner/repo@branch"
|
|
130
|
-
- Extract repo name: `repoKey.substring(0, repoKey.lastIndexOf("@"))`
|
|
131
|
-
- Branch available from entry.defaultBranch
|
|
132
|
-
|
|
133
|
-
### Size Formatting
|
|
134
|
-
- sizeBytes may not exist (local repos don't track size yet)
|
|
135
|
-
- Format as MB: `Math.round(entry.sizeBytes / 1024 / 1024)`
|
|
136
|
-
- Show "-" if sizeBytes undefined
|
|
137
|
-
|
|
138
|
-
### Filtering Logic
|
|
139
|
-
- Object.entries() to iterate manifest.repos
|
|
140
|
-
- Filter by entry.type matching args.type
|
|
141
|
-
- "all" type returns everything
|
|
142
|
-
|
|
143
|
-
## Task 5: repo_read Tool
|
|
144
|
-
|
|
145
|
-
### Glob Pattern Support
|
|
146
|
-
- Use `glob` npm package (v10.x) for file pattern matching
|
|
147
|
-
- Check for `*` or `?` in path to determine if glob needed
|
|
148
|
-
- `glob(pattern, { nodir: true })` returns only files, not directories
|
|
149
|
-
- Single file paths work without glob
|
|
150
|
-
|
|
151
|
-
### File Reading Pattern
|
|
152
|
-
- Use `readFile(path, "utf-8")` from node:fs/promises
|
|
153
|
-
- Split content by newlines for line counting
|
|
154
|
-
- Truncate at maxLines with `[truncated at N lines, M total]` message
|
|
155
|
-
- Handle errors per-file to continue reading other files
|
|
156
|
-
|
|
157
|
-
### Relative Path Display
|
|
158
|
-
- Store repoPath from manifest entry
|
|
159
|
-
- Calculate relative: `filePath.replace(repoPath + "/", "")`
|
|
160
|
-
- Display relative paths in output for readability
|
|
161
|
-
|
|
162
|
-
### Manifest Update After Read
|
|
163
|
-
- Update lastAccessed timestamp after successful read
|
|
164
|
-
- Use withManifestLock for atomic update
|
|
165
|
-
- Re-load manifest inside lock to avoid stale data
|
|
166
|
-
|
|
167
|
-
### Error Handling
|
|
168
|
-
- Repo not found: Return helpful message with repo_clone suggestion
|
|
169
|
-
- No files found: Return message with the pattern that failed
|
|
170
|
-
- File read error: Include in output but continue with other files
|
|
171
|
-
|
|
172
|
-
## Task 6: Scanner Module
|
|
173
|
-
|
|
174
|
-
### fd Command for Git Discovery
|
|
175
|
-
- `fd -H -t d '^.git$' --max-depth 4 ${searchPath}` finds all .git directories
|
|
176
|
-
- `-H`: Include hidden files/dirs (required since .git is hidden)
|
|
177
|
-
- `-t d`: Type directory only
|
|
178
|
-
- `'^.git$'`: Regex for exact match ".git"
|
|
179
|
-
- `--max-depth 4`: Limit depth to avoid deep nested structures
|
|
180
|
-
|
|
181
|
-
### Remote URL Parsing
|
|
182
|
-
- SSH format: `git@github.com:owner/repo.git` -> extract with regex `/git@github\.com:(.+)/`
|
|
183
|
-
- HTTPS format: `https://github.com/owner/repo.git` -> extract with regex `/https:\/\/github\.com\/(.+)/`
|
|
184
|
-
- Remove `.git` suffix first with `.replace(/\.git$/, "")`
|
|
185
|
-
- Return null for unsupported formats (GitLab, Bitbucket, etc.)
|
|
186
|
-
|
|
187
|
-
### Graceful Error Handling
|
|
188
|
-
- Invalid search path: catch and continue to next path
|
|
189
|
-
- Repo without remote: catch git error and continue
|
|
190
|
-
- Repo with git errors: catch and continue
|
|
191
|
-
- No repos found: return empty array (not an error)
|
|
192
|
-
|
|
193
|
-
### Git Commands for Repo Info
|
|
194
|
-
- `git -C ${repoPath} remote get-url origin`: Get remote URL
|
|
195
|
-
- `git -C ${repoPath} branch --show-current`: Get current branch
|
|
196
|
-
- Default to "main" if branch is empty (detached HEAD state)
|
|
197
|
-
|
|
198
|
-
## Task 7: repo_scan Tool
|
|
199
|
-
|
|
200
|
-
### Config Loading Pattern
|
|
201
|
-
- Config file location: `~/.config/opencode/opencode-repos.json`
|
|
202
|
-
- Use `existsSync()` to check file existence before reading
|
|
203
|
-
- Parse JSON with try/catch, return null on failure
|
|
204
|
-
- Config interface: `{ localSearchPaths: string[] }`
|
|
205
|
-
|
|
206
|
-
### Tool Args Override Pattern
|
|
207
|
-
- Accept optional `paths` array argument
|
|
208
|
-
- If provided, use args.paths directly
|
|
209
|
-
- If not provided, fall back to config file
|
|
210
|
-
- If neither available, return helpful error with config file example
|
|
211
|
-
|
|
212
|
-
### Manifest Update for Local Repos
|
|
213
|
-
- Local repos use `type: "local"` (vs `type: "cached"` for cloned)
|
|
214
|
-
- Local repos have `shallow: false` (they're full clones)
|
|
215
|
-
- Add to both `manifest.repos` and `manifest.localIndex`
|
|
216
|
-
- `localIndex` maps remote URL to local path for quick lookups
|
|
217
|
-
|
|
218
|
-
### Repo Key Construction
|
|
219
|
-
- Use `matchRemoteToSpec()` to convert remote URL to "owner/repo" format
|
|
220
|
-
- Skip non-GitHub remotes (matchRemoteToSpec returns null)
|
|
221
|
-
- Construct key as `${spec}@${branch}` to match cached repo format
|
|
222
|
-
- Check for existing entry before adding to avoid duplicates
|
|
223
|
-
|
|
224
|
-
### Summary Output Format
|
|
225
|
-
- Report total found, new registered, and already existing
|
|
226
|
-
- Include helpful message about repo_list when new repos added
|
|
227
|
-
- Handle zero repos found case with list of searched paths
|
|
228
|
-
|
|
229
|
-
## Task 8a: repo_update Tool
|
|
230
|
-
|
|
231
|
-
### Update vs Status Pattern
|
|
232
|
-
- Cached repos: fetch + reset to update to latest
|
|
233
|
-
- Local repos: show status only, never modify
|
|
234
|
-
- Differentiate by `entry.type === "local"` check
|
|
235
|
-
|
|
236
|
-
### Git Update Commands
|
|
237
|
-
- `updateRepo(path, branch)` from git module handles fetch + reset
|
|
238
|
-
- `getRepoInfo(path)` returns commit hash for confirmation message
|
|
239
|
-
- Commit hash truncated to 7 chars for display: `info.commit.substring(0, 7)`
|
|
240
|
-
|
|
241
|
-
### Git Status for Local Repos
|
|
242
|
-
- Use `git -C ${path} status --short` for compact status
|
|
243
|
-
- Empty output means working tree is clean
|
|
244
|
-
- Display "Working tree clean" when status is empty
|
|
245
|
-
|
|
246
|
-
### Manifest Timestamp Updates
|
|
247
|
-
- Update both `lastUpdated` and `lastAccessed` on successful update
|
|
248
|
-
- Use `withManifestLock` for atomic manifest updates
|
|
249
|
-
- Re-load manifest inside lock to avoid stale data
|
|
250
|
-
|
|
251
|
-
### Error Recovery Suggestions
|
|
252
|
-
- Repo not found: suggest `repo_clone`
|
|
253
|
-
- Update failed: suggest `repo_clone({ force: true })` to re-clone
|
|
254
|
-
- Corrupted repos can be fixed by force re-clone
|
|
255
|
-
|
|
256
|
-
## Task 8b: repo_remove Tool
|
|
257
|
-
|
|
258
|
-
### Removal Behavior by Type
|
|
259
|
-
- Cached repos: require confirmation, delete directory + unregister from manifest
|
|
260
|
-
- Local repos: unregister only, preserve files on disk
|
|
261
|
-
- Distinction prevents accidental deletion of user-managed repos
|
|
262
|
-
|
|
263
|
-
### Confirmation Pattern
|
|
264
|
-
- Use `confirm: boolean` arg with default false
|
|
265
|
-
- Without confirm: return message explaining what will happen
|
|
266
|
-
- With confirm: proceed with deletion
|
|
267
|
-
- Local repos don't need confirmation since files aren't deleted
|
|
268
|
-
|
|
269
|
-
### Manifest Cleanup for Local Repos
|
|
270
|
-
- Delete from `manifest.repos[repoKey]`
|
|
271
|
-
- Also delete from `manifest.localIndex` by finding matching path
|
|
272
|
-
- Iterate localIndex entries to find remote URL that maps to entry.path
|
|
273
|
-
|
|
274
|
-
### Error Recovery on Delete Failure
|
|
275
|
-
- If `rm()` fails, still try to unregister from manifest
|
|
276
|
-
- Wrap manifest cleanup in nested try/catch to ignore cleanup errors
|
|
277
|
-
- Return message noting manual cleanup may be needed
|
|
278
|
-
- User can manually delete directory at the path shown
|
|
279
|
-
|
|
280
|
-
### rm() Options
|
|
281
|
-
- `{ recursive: true, force: true }` for directory deletion
|
|
282
|
-
- `force: true` prevents errors if directory doesn't exist
|
|
283
|
-
- `recursive: true` required for non-empty directories
|
|
284
|
-
|
|
285
|
-
## Task 9: Define repo-explorer Agent
|
|
286
|
-
|
|
287
|
-
### AgentConfig Type Location
|
|
288
|
-
- Import from `@opencode-ai/sdk` not `@opencode-ai/plugin`
|
|
289
|
-
- Type defined in `node_modules/@opencode-ai/sdk/dist/gen/types.gen.d.ts`
|
|
290
|
-
- v2 types have more permissions than v1 types
|
|
291
|
-
|
|
292
|
-
### AgentConfig Properties
|
|
293
|
-
- `description`: When to use this agent (shown in agent selection)
|
|
294
|
-
- `mode`: "subagent" | "primary" | "all" - subagent for spawned agents
|
|
295
|
-
- `temperature`: 0.1 for focused, deterministic exploration
|
|
296
|
-
- `permission`: Object with permission rules per tool category
|
|
297
|
-
- `prompt`: System prompt defining agent behavior
|
|
298
|
-
|
|
299
|
-
### Permission Structure (v1 SDK)
|
|
300
|
-
- Available permissions: `edit`, `bash`, `webfetch`, `doom_loop`, `external_directory`
|
|
301
|
-
- Values: "ask" | "allow" | "deny"
|
|
302
|
-
- `task` and `delegate_task` permissions NOT available in v1 SDK types
|
|
303
|
-
- For read-only agent: `edit: "deny"` is sufficient
|
|
304
|
-
|
|
305
|
-
### System Prompt Best Practices
|
|
306
|
-
- Clearly state agent capabilities
|
|
307
|
-
- Define exploration approach (high-level to detailed)
|
|
308
|
-
- Specify output format (file paths, code snippets, explanations)
|
|
309
|
-
- State constraints explicitly (read-only, no modifications)
|
|
310
|
-
- Include example questions the agent can answer
|
|
311
|
-
|
|
312
|
-
### Agent File Location
|
|
313
|
-
- Created in `src/agents/` directory
|
|
314
|
-
- Export function pattern: `createRepoExplorerAgent(): AgentConfig`
|
|
315
|
-
- Function returns config object, not the agent itself
|
|
316
|
-
|
|
317
|
-
## Task 10: repo_explore Tool and Config Handler
|
|
318
|
-
|
|
319
|
-
### Plugin Config Handler Pattern
|
|
320
|
-
- Plugin can return `config` function alongside `tool` object
|
|
321
|
-
- Config handler receives OpenCode config object
|
|
322
|
-
- Register agents by merging into `config.agent`: `config.agent = { ...config.agent, "name": agentConfig }`
|
|
323
|
-
- Config handler runs before tools are available
|
|
324
|
-
|
|
325
|
-
### Agent Spawning via ctx.client
|
|
326
|
-
- Tool execute function receives `ctx` as second parameter
|
|
327
|
-
- `ctx.client.session.prompt()` spawns agent sessions
|
|
328
|
-
- Body format: `{ agent: "agent-name", parts: [{ type: "text", text: prompt }] }`
|
|
329
|
-
- Agent name must match what was registered in config handler
|
|
330
|
-
|
|
331
|
-
### Auto-Clone Pattern for repo_explore
|
|
332
|
-
- Check manifest for existing repo entry
|
|
333
|
-
- If not found, clone it first (reuse repo_clone logic inline)
|
|
334
|
-
- Use same CACHE_DIR and manifest update pattern
|
|
335
|
-
- Return helpful error if clone fails
|
|
336
|
-
|
|
337
|
-
### Exploration Prompt Structure
|
|
338
|
-
- Include working directory path for agent context
|
|
339
|
-
- State the question clearly
|
|
340
|
-
- List available tools (read, glob, grep, bash)
|
|
341
|
-
- Provide guidance on exploration approach
|
|
342
|
-
- Agent's system prompt handles the rest
|
|
343
|
-
|
|
344
|
-
### Manifest Access Tracking
|
|
345
|
-
- Update `lastAccessed` after successful exploration
|
|
346
|
-
- Use `withManifestLock` for atomic update
|
|
347
|
-
- Re-load manifest inside lock to avoid stale data
|
|
348
|
-
|
|
349
|
-
## Task 11: Documentation and Final Polish
|
|
350
|
-
|
|
351
|
-
### README Structure
|
|
352
|
-
- Follow opencode-tmux README pattern for consistency
|
|
353
|
-
- Include: Features, Installation, Quick Start, Configuration, Tools, Agent, Use Cases, Limitations, Development
|
|
354
|
-
- Each tool section: description, arguments, examples, returns
|
|
355
|
-
- Use TypeScript code blocks for examples
|
|
356
|
-
|
|
357
|
-
### package.json Keywords
|
|
358
|
-
- Required keywords: opencode, opencode-plugin, repos, repository, cache, codebase
|
|
359
|
-
- Keywords help with npm discoverability
|
|
360
|
-
- Keep description concise but comprehensive
|
|
361
|
-
|
|
362
|
-
### Plugin API Learnings
|
|
363
|
-
- `PluginInput` has `client` property for SDK access
|
|
364
|
-
- `ToolContext` has `sessionID` for current session
|
|
365
|
-
- `client.session.prompt()` requires `path.id` with session ID
|
|
366
|
-
- Response handling: check `response.error`, extract text from `response.data.parts`
|
|
367
|
-
|
|
368
|
-
### Type Safety with SDK Response
|
|
369
|
-
- Parts array contains various types (text, tool, file, etc.)
|
|
370
|
-
- Filter by `p.type === "text"` to get text parts
|
|
371
|
-
- Use `"text" in p` guard for safe property access
|
|
372
|
-
- TypeScript type predicates need to match full Part type
|
|
373
|
-
|
|
374
|
-
### LSP vs tsc Discrepancies
|
|
375
|
-
- LSP may show stale errors after file changes
|
|
376
|
-
- Always verify with `bunx tsc --noEmit` as source of truth
|
|
377
|
-
- tsc clean = code is correct, ignore stale LSP errors
|
|
378
|
-
|
|
379
|
-
### Project Completion Summary
|
|
380
|
-
- 7 tools implemented: repo_clone, repo_list, repo_read, repo_scan, repo_update, repo_remove, repo_explore
|
|
381
|
-
- 1 custom agent: repo-explorer (read-only codebase exploration)
|
|
382
|
-
- 27 tests passing across 3 test files
|
|
383
|
-
- Config file support for local search paths
|
|
384
|
-
- Comprehensive README with examples for all tools
|