oh-my-opencode 5.0.0-beta.8 → 5.0.0-beta.9

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.
Files changed (114) hide show
  1. package/.agents/command/publish.md +44 -16
  2. package/.agents/skills/publish/SKILL.md +44 -16
  3. package/.opencode/command/publish.md +44 -16
  4. package/dist/agents/atlas/agent.d.ts +0 -1
  5. package/dist/cli/index.js +34 -31
  6. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  7. package/dist/cli-node/index.js +34 -31
  8. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  9. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  10. package/dist/index.js +25 -24
  11. package/dist/shared/shell-env.d.ts +1 -1
  12. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +35 -8
  13. package/dist/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  14. package/dist/tui.js +2 -2
  15. package/package.json +15 -14
  16. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  17. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  18. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +2 -2
  20. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +2 -2
  21. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  25. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +3 -17
  29. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  30. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  31. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  33. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  35. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +16 -23
  36. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  37. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  38. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  39. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  40. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  41. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +37 -69
  42. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  43. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -15
  44. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  45. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +0 -3
  47. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +2 -16
  48. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  49. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
  51. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  52. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  56. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  57. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  58. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  59. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  60. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  61. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  62. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +2 -35
  63. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
  64. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  87. package/packages/omo-codex/plugin/package-lock.json +20 -20
  88. package/packages/omo-codex/plugin/package.json +1 -1
  89. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +35 -8
  90. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  91. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  92. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +4 -24
  93. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  94. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  95. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  96. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  97. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  98. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  99. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
  100. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  101. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  102. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  103. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  104. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  105. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
  106. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  107. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  108. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  109. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +35 -8
  110. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  111. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  112. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  113. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  114. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Publish oh-my-opencode to npm via GitHub Actions workflow
3
- argument-hint: <patch|minor|major>
3
+ argument-hint: <patch|minor|major|explicit-semver>
4
4
  ---
5
5
 
6
6
 
@@ -54,15 +54,16 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
54
54
 
55
55
  ## CRITICAL: ARGUMENT REQUIREMENT
56
56
 
57
- **You MUST receive a version bump type from the user.** Valid options:
57
+ **You MUST receive one release selector from the user.** Valid options:
58
58
  - `patch`: Bug fixes, backward-compatible (1.1.7 → 1.1.8)
59
59
  - `minor`: New features, backward-compatible (1.1.7 → 1.2.0)
60
60
  - `major`: Breaking changes (1.1.7 → 2.0.0)
61
+ - An explicit valid semantic version, including a prerelease such as `5.0.0-beta.9`
61
62
 
62
- **If the user did not provide a bump type argument, STOP IMMEDIATELY and ask:**
63
- > "To proceed with deployment, please specify a version bump type: `patch`, `minor`, or `major`"
63
+ **If the user did not provide a release selector, STOP IMMEDIATELY and ask:**
64
+ > "To proceed with deployment, specify `patch`, `minor`, `major`, or an explicit semantic version such as `5.0.0-beta.9`."
64
65
 
65
- **DO NOT PROCEED without explicit user confirmation of bump type.**
66
+ Reject any other value. Do not infer or repair malformed versions.
66
67
 
67
68
  ---
68
69
 
@@ -72,7 +73,7 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
72
73
 
73
74
  ```
74
75
  [
75
- { "id": "confirm-bump", "content": "Confirm version bump type with user (patch/minor/major)", "status": "in_progress", "priority": "high" },
76
+ { "id": "confirm-release-input", "content": "Confirm release selector with user (patch/minor/major or explicit semver)", "status": "in_progress", "priority": "high" },
76
77
  { "id": "check-uncommitted", "content": "Check for uncommitted changes and commit if needed", "status": "pending", "priority": "high" },
77
78
  { "id": "sync-remote", "content": "Sync with remote (pull --rebase && push if unpushed commits)", "status": "pending", "priority": "high" },
78
79
  { "id": "run-workflow", "content": "Trigger GitHub Actions publish workflow", "status": "pending", "priority": "high" },
@@ -92,9 +93,23 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
92
93
 
93
94
  ---
94
95
 
95
- ## STEP 1: CONFIRM BUMP TYPE
96
+ ## STEP 1: CONFIRM AND CLASSIFY THE RELEASE SELECTOR
96
97
 
97
- If the user already named a bump type (argument or message), that IS the confirmation state it and continue immediately. Only ask and wait when no bump type was given.
98
+ If the user already supplied the selector in the command argument or message, that IS the confirmation. Parse it exactly once:
99
+
100
+ ```bash
101
+ RELEASE_INPUT="${ARGUMENTS}"
102
+ if [[ "$RELEASE_INPUT" =~ ^(patch|minor|major)$ ]]; then
103
+ RELEASE_KIND=bump
104
+ elif [[ "$RELEASE_INPUT" =~ ^([0-9]+\.){2}[0-9]+(-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$ ]]; then
105
+ RELEASE_KIND=version
106
+ else
107
+ echo "Invalid release selector: $RELEASE_INPUT" >&2
108
+ exit 1
109
+ fi
110
+ ```
111
+
112
+ Only ask and wait when no selector was provided.
98
113
 
99
114
  ---
100
115
 
@@ -125,16 +140,29 @@ This ensures the GitHub Actions workflow runs on the latest code including all l
125
140
 
126
141
  ## STEP 3: TRIGGER GITHUB ACTIONS WORKFLOW
127
142
 
128
- Run the publish workflow:
129
- ```bash
130
- gh workflow run publish -f bump={bump_type}
131
- ```
143
+ Dispatch from `dev`, pass bump selectors through `bump`, and pass exact versions through `version`. The required `bump` input remains `patch` for explicit-version dispatches but is ignored by the workflow because `version` takes precedence.
132
144
 
133
- Wait 3 seconds, then get the run ID:
134
145
  ```bash
135
- gh run list --workflow=publish --limit=1 --json databaseId,status --jq '.[0]'
146
+ if [ "$RELEASE_KIND" = bump ]; then
147
+ RUN_URL="$(gh workflow run publish.yml --ref dev -f "bump=${RELEASE_INPUT}")"
148
+ else
149
+ RUN_URL="$(gh workflow run publish.yml --ref dev -f bump=patch -f "version=${RELEASE_INPUT}")"
150
+ fi
151
+
152
+ if ! [[ "$RUN_URL" =~ ^https://github.com/code-yeongyu/oh-my-openagent/actions/runs/[0-9]+$ ]]; then
153
+ echo "Publish dispatch did not return an exact workflow run URL: $RUN_URL" >&2
154
+ exit 1
155
+ fi
156
+ RUN_ID="${RUN_URL##*/}"
157
+ if ! [[ "$RUN_ID" =~ ^[0-9]+$ ]]; then
158
+ echo "Publish dispatch returned an invalid run ID: $RUN_ID" >&2
159
+ exit 1
160
+ fi
161
+ gh run view "${RUN_ID}" --json databaseId,status,url --jq '{databaseId,status,url}'
136
162
  ```
137
163
 
164
+ The returned run ID owns this release attempt. Never replace it with a latest-run lookup.
165
+
138
166
  ---
139
167
 
140
168
  ## STEP 4: WAIT FOR WORKFLOW COMPLETION
@@ -150,14 +178,14 @@ The publish run is a single workflow with sequential stages. Expected timeline (
150
178
 
151
179
  Poll job-level status every 30 seconds and report stage transitions to the user:
152
180
  ```bash
153
- gh run view {run_id} --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
181
+ gh run view "${RUN_ID}" --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
154
182
  ```
155
183
 
156
184
  **IMPORTANT: Use polling loop, NOT sleep commands.** Use the waiting time to draft the enhanced release summary (Step 6) — do not sit idle, and do not start any review activity.
157
185
 
158
186
  If conclusion is `failure`, show error and stop:
159
187
  ```bash
160
- gh run view {run_id} --log-failed
188
+ gh run view "${RUN_ID}" --log-failed
161
189
  ```
162
190
 
163
191
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: publish
3
- description: "Publish oh-my-opencode to npm by triggering the GitHub Actions publish workflow and verifying its artifacts. Ship-only: never runs pre-publish-review or re-reviews merged code unless the user explicitly asks. Argument: <patch|minor|major>. Triggers: publish, release, deploy, npm publish."
3
+ description: "Publish oh-my-opencode to npm by triggering the GitHub Actions publish workflow and verifying its artifacts. Ship-only: never runs pre-publish-review or re-reviews merged code unless the user explicitly asks. Argument: <patch|minor|major|explicit-semver>. Triggers: publish, release, deploy, npm publish."
4
4
  ---
5
5
 
6
6
  You are the release manager for oh-my-opencode. Execute the FULL publish workflow from start to finish.
@@ -53,15 +53,16 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
53
53
 
54
54
  ## CRITICAL: ARGUMENT REQUIREMENT
55
55
 
56
- **You MUST receive a version bump type from the user.** Valid options:
56
+ **You MUST receive one release selector from the user.** Valid options:
57
57
  - `patch`: Bug fixes, backward-compatible (1.1.7 → 1.1.8)
58
58
  - `minor`: New features, backward-compatible (1.1.7 → 1.2.0)
59
59
  - `major`: Breaking changes (1.1.7 → 2.0.0)
60
+ - An explicit valid semantic version, including a prerelease such as `5.0.0-beta.9`
60
61
 
61
- **If the user did not provide a bump type argument, STOP IMMEDIATELY and ask:**
62
- > "To proceed with deployment, please specify a version bump type: `patch`, `minor`, or `major`"
62
+ **If the user did not provide a release selector, STOP IMMEDIATELY and ask:**
63
+ > "To proceed with deployment, specify `patch`, `minor`, `major`, or an explicit semantic version such as `5.0.0-beta.9`."
63
64
 
64
- **DO NOT PROCEED without explicit user confirmation of bump type.**
65
+ Reject any other value. Do not infer or repair malformed versions.
65
66
 
66
67
  ---
67
68
 
@@ -71,7 +72,7 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
71
72
 
72
73
  ```
73
74
  [
74
- { "id": "confirm-bump", "content": "Confirm version bump type with user (patch/minor/major)", "status": "in_progress", "priority": "high" },
75
+ { "id": "confirm-release-input", "content": "Confirm release selector with user (patch/minor/major or explicit semver)", "status": "in_progress", "priority": "high" },
75
76
  { "id": "check-uncommitted", "content": "Check for uncommitted changes and commit if needed", "status": "pending", "priority": "high" },
76
77
  { "id": "sync-remote", "content": "Sync with remote (pull --rebase && push if unpushed commits)", "status": "pending", "priority": "high" },
77
78
  { "id": "run-workflow", "content": "Trigger GitHub Actions publish workflow", "status": "pending", "priority": "high" },
@@ -91,9 +92,23 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
91
92
 
92
93
  ---
93
94
 
94
- ## STEP 1: CONFIRM BUMP TYPE
95
+ ## STEP 1: CONFIRM AND CLASSIFY THE RELEASE SELECTOR
95
96
 
96
- If the user already named a bump type (argument or message), that IS the confirmation state it and continue immediately. Only ask and wait when no bump type was given.
97
+ If the user already supplied the selector in the command argument or message, that IS the confirmation. Parse it exactly once:
98
+
99
+ ```bash
100
+ RELEASE_INPUT="${ARGUMENTS}"
101
+ if [[ "$RELEASE_INPUT" =~ ^(patch|minor|major)$ ]]; then
102
+ RELEASE_KIND=bump
103
+ elif [[ "$RELEASE_INPUT" =~ ^([0-9]+\.){2}[0-9]+(-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$ ]]; then
104
+ RELEASE_KIND=version
105
+ else
106
+ echo "Invalid release selector: $RELEASE_INPUT" >&2
107
+ exit 1
108
+ fi
109
+ ```
110
+
111
+ Only ask and wait when no selector was provided.
97
112
 
98
113
  ---
99
114
 
@@ -124,16 +139,29 @@ This ensures the GitHub Actions workflow runs on the latest code including all l
124
139
 
125
140
  ## STEP 3: TRIGGER GITHUB ACTIONS WORKFLOW
126
141
 
127
- Run the publish workflow:
128
- ```bash
129
- gh workflow run publish -f bump={bump_type}
130
- ```
142
+ Dispatch from `dev`, pass bump selectors through `bump`, and pass exact versions through `version`. The required `bump` input remains `patch` for explicit-version dispatches but is ignored by the workflow because `version` takes precedence.
131
143
 
132
- Wait 3 seconds, then get the run ID:
133
144
  ```bash
134
- gh run list --workflow=publish --limit=1 --json databaseId,status --jq '.[0]'
145
+ if [ "$RELEASE_KIND" = bump ]; then
146
+ RUN_URL="$(gh workflow run publish.yml --ref dev -f "bump=${RELEASE_INPUT}")"
147
+ else
148
+ RUN_URL="$(gh workflow run publish.yml --ref dev -f bump=patch -f "version=${RELEASE_INPUT}")"
149
+ fi
150
+
151
+ if ! [[ "$RUN_URL" =~ ^https://github.com/code-yeongyu/oh-my-openagent/actions/runs/[0-9]+$ ]]; then
152
+ echo "Publish dispatch did not return an exact workflow run URL: $RUN_URL" >&2
153
+ exit 1
154
+ fi
155
+ RUN_ID="${RUN_URL##*/}"
156
+ if ! [[ "$RUN_ID" =~ ^[0-9]+$ ]]; then
157
+ echo "Publish dispatch returned an invalid run ID: $RUN_ID" >&2
158
+ exit 1
159
+ fi
160
+ gh run view "${RUN_ID}" --json databaseId,status,url --jq '{databaseId,status,url}'
135
161
  ```
136
162
 
163
+ The returned run ID owns this release attempt. Never replace it with a latest-run lookup.
164
+
137
165
  ---
138
166
 
139
167
  ## STEP 4: WAIT FOR WORKFLOW COMPLETION
@@ -149,14 +177,14 @@ The publish run is a single workflow with sequential stages. Expected timeline (
149
177
 
150
178
  Poll job-level status every 30 seconds and report stage transitions to the user:
151
179
  ```bash
152
- gh run view {run_id} --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
180
+ gh run view "${RUN_ID}" --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
153
181
  ```
154
182
 
155
183
  **IMPORTANT: Use polling loop, NOT sleep commands.** Use the waiting time to draft the enhanced release summary (Step 6) — do not sit idle, and do not start any review activity.
156
184
 
157
185
  If conclusion is `failure`, show error and stop:
158
186
  ```bash
159
- gh run view {run_id} --log-failed
187
+ gh run view "${RUN_ID}" --log-failed
160
188
  ```
161
189
 
162
190
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: Publish oh-my-opencode to npm via GitHub Actions workflow
3
- argument-hint: <patch|minor|major>
3
+ argument-hint: <patch|minor|major|explicit-semver>
4
4
  ---
5
5
 
6
6
 
@@ -54,15 +54,16 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
54
54
 
55
55
  ## CRITICAL: ARGUMENT REQUIREMENT
56
56
 
57
- **You MUST receive a version bump type from the user.** Valid options:
57
+ **You MUST receive one release selector from the user.** Valid options:
58
58
  - `patch`: Bug fixes, backward-compatible (1.1.7 → 1.1.8)
59
59
  - `minor`: New features, backward-compatible (1.1.7 → 1.2.0)
60
60
  - `major`: Breaking changes (1.1.7 → 2.0.0)
61
+ - An explicit valid semantic version, including a prerelease such as `5.0.0-beta.9`
61
62
 
62
- **If the user did not provide a bump type argument, STOP IMMEDIATELY and ask:**
63
- > "To proceed with deployment, please specify a version bump type: `patch`, `minor`, or `major`"
63
+ **If the user did not provide a release selector, STOP IMMEDIATELY and ask:**
64
+ > "To proceed with deployment, specify `patch`, `minor`, `major`, or an explicit semantic version such as `5.0.0-beta.9`."
64
65
 
65
- **DO NOT PROCEED without explicit user confirmation of bump type.**
66
+ Reject any other value. Do not infer or repair malformed versions.
66
67
 
67
68
  ---
68
69
 
@@ -72,7 +73,7 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
72
73
 
73
74
  ```
74
75
  [
75
- { "id": "confirm-bump", "content": "Confirm version bump type with user (patch/minor/major)", "status": "in_progress", "priority": "high" },
76
+ { "id": "confirm-release-input", "content": "Confirm release selector with user (patch/minor/major or explicit semver)", "status": "in_progress", "priority": "high" },
76
77
  { "id": "check-uncommitted", "content": "Check for uncommitted changes and commit if needed", "status": "pending", "priority": "high" },
77
78
  { "id": "sync-remote", "content": "Sync with remote (pull --rebase && push if unpushed commits)", "status": "pending", "priority": "high" },
78
79
  { "id": "run-workflow", "content": "Trigger GitHub Actions publish workflow", "status": "pending", "priority": "high" },
@@ -92,9 +93,23 @@ This contract applies to the slash-command copies (`.agents/command/publish.md`,
92
93
 
93
94
  ---
94
95
 
95
- ## STEP 1: CONFIRM BUMP TYPE
96
+ ## STEP 1: CONFIRM AND CLASSIFY THE RELEASE SELECTOR
96
97
 
97
- If the user already named a bump type (argument or message), that IS the confirmation state it and continue immediately. Only ask and wait when no bump type was given.
98
+ If the user already supplied the selector in the command argument or message, that IS the confirmation. Parse it exactly once:
99
+
100
+ ```bash
101
+ RELEASE_INPUT="${ARGUMENTS}"
102
+ if [[ "$RELEASE_INPUT" =~ ^(patch|minor|major)$ ]]; then
103
+ RELEASE_KIND=bump
104
+ elif [[ "$RELEASE_INPUT" =~ ^([0-9]+\.){2}[0-9]+(-[0-9A-Za-z]+(\.[0-9A-Za-z]+)*)?$ ]]; then
105
+ RELEASE_KIND=version
106
+ else
107
+ echo "Invalid release selector: $RELEASE_INPUT" >&2
108
+ exit 1
109
+ fi
110
+ ```
111
+
112
+ Only ask and wait when no selector was provided.
98
113
 
99
114
  ---
100
115
 
@@ -125,16 +140,29 @@ This ensures the GitHub Actions workflow runs on the latest code including all l
125
140
 
126
141
  ## STEP 3: TRIGGER GITHUB ACTIONS WORKFLOW
127
142
 
128
- Run the publish workflow:
129
- ```bash
130
- gh workflow run publish -f bump={bump_type}
131
- ```
143
+ Dispatch from `dev`, pass bump selectors through `bump`, and pass exact versions through `version`. The required `bump` input remains `patch` for explicit-version dispatches but is ignored by the workflow because `version` takes precedence.
132
144
 
133
- Wait 3 seconds, then get the run ID:
134
145
  ```bash
135
- gh run list --workflow=publish --limit=1 --json databaseId,status --jq '.[0]'
146
+ if [ "$RELEASE_KIND" = bump ]; then
147
+ RUN_URL="$(gh workflow run publish.yml --ref dev -f "bump=${RELEASE_INPUT}")"
148
+ else
149
+ RUN_URL="$(gh workflow run publish.yml --ref dev -f bump=patch -f "version=${RELEASE_INPUT}")"
150
+ fi
151
+
152
+ if ! [[ "$RUN_URL" =~ ^https://github.com/code-yeongyu/oh-my-openagent/actions/runs/[0-9]+$ ]]; then
153
+ echo "Publish dispatch did not return an exact workflow run URL: $RUN_URL" >&2
154
+ exit 1
155
+ fi
156
+ RUN_ID="${RUN_URL##*/}"
157
+ if ! [[ "$RUN_ID" =~ ^[0-9]+$ ]]; then
158
+ echo "Publish dispatch returned an invalid run ID: $RUN_ID" >&2
159
+ exit 1
160
+ fi
161
+ gh run view "${RUN_ID}" --json databaseId,status,url --jq '{databaseId,status,url}'
136
162
  ```
137
163
 
164
+ The returned run ID owns this release attempt. Never replace it with a latest-run lookup.
165
+
138
166
  ---
139
167
 
140
168
  ## STEP 4: WAIT FOR WORKFLOW COMPLETION
@@ -150,14 +178,14 @@ The publish run is a single workflow with sequential stages. Expected timeline (
150
178
 
151
179
  Poll job-level status every 30 seconds and report stage transitions to the user:
152
180
  ```bash
153
- gh run view {run_id} --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
181
+ gh run view "${RUN_ID}" --json status,conclusion,jobs --jq '{status, conclusion, stage: ([.jobs[] | select(.status=="in_progress") | .name] | join(", "))}'
154
182
  ```
155
183
 
156
184
  **IMPORTANT: Use polling loop, NOT sleep commands.** Use the waiting time to draft the enhanced release summary (Step 6) — do not sit idle, and do not start any review activity.
157
185
 
158
186
  If conclusion is `failure`, show error and stop:
159
187
  ```bash
160
- gh run view {run_id} --log-failed
188
+ gh run view "${RUN_ID}" --log-failed
161
189
  ```
162
190
 
163
191
  ---
@@ -26,7 +26,6 @@ export interface OrchestratorContext {
26
26
  availableSkills?: AvailableSkill[];
27
27
  userCategories?: Record<string, CategoryConfig>;
28
28
  }
29
- export declare function getAtlasPrompt(model?: string): string;
30
29
  export declare function createAtlasAgent(ctx: OrchestratorContext): AgentConfig;
31
30
  export declare namespace createAtlasAgent {
32
31
  export { MODE as mode };
package/dist/cli/index.js CHANGED
@@ -1019,7 +1019,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1019
1019
  this._exitCallback = (err) => {
1020
1020
  if (err.code !== "commander.executeSubCommandAsync") {
1021
1021
  throw err;
1022
- } else {}
1022
+ }
1023
1023
  };
1024
1024
  }
1025
1025
  return this;
@@ -2145,7 +2145,7 @@ var package_default;
2145
2145
  var init_package = __esm(() => {
2146
2146
  package_default = {
2147
2147
  name: "oh-my-opencode",
2148
- version: "5.0.0-beta.8",
2148
+ version: "5.0.0-beta.9",
2149
2149
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2150
2150
  main: "./dist/index.js",
2151
2151
  types: "dist/index.d.ts",
@@ -2281,6 +2281,7 @@ var init_package = __esm(() => {
2281
2281
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
2282
2282
  test: "bun test",
2283
2283
  "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
2284
+ "test:fast": "bun run script/test-fast.ts",
2284
2285
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test packages/omo-senpi",
2285
2286
  "test:windows-codex": "bun run test:codex",
2286
2287
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
@@ -2325,7 +2326,7 @@ var init_package = __esm(() => {
2325
2326
  zod: "^4.4.3"
2326
2327
  },
2327
2328
  devDependencies: {
2328
- "@code-yeongyu/senpi": "2026.8.16",
2329
+ "@code-yeongyu/senpi": "2026.8.17",
2329
2330
  "@oh-my-opencode/agents-md-core": "workspace:*",
2330
2331
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
2331
2332
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -2366,18 +2367,18 @@ var init_package = __esm(() => {
2366
2367
  typescript: "^7.0.2"
2367
2368
  },
2368
2369
  optionalDependencies: {
2369
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.8",
2370
- "oh-my-opencode-darwin-x64": "5.0.0-beta.8",
2371
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.8",
2372
- "oh-my-opencode-linux-arm64": "5.0.0-beta.8",
2373
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.8",
2374
- "oh-my-opencode-linux-x64": "5.0.0-beta.8",
2375
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.8",
2376
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.8",
2377
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.8",
2378
- "oh-my-opencode-windows-arm64": "5.0.0-beta.8",
2379
- "oh-my-opencode-windows-x64": "5.0.0-beta.8",
2380
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.8"
2370
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.9",
2371
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.9",
2372
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.9",
2373
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.9",
2374
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.9",
2375
+ "oh-my-opencode-linux-x64": "5.0.0-beta.9",
2376
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.9",
2377
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.9",
2378
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.9",
2379
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.9",
2380
+ "oh-my-opencode-windows-x64": "5.0.0-beta.9",
2381
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.9"
2381
2382
  },
2382
2383
  overrides: {
2383
2384
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -18762,7 +18763,7 @@ function finalize(ctx, schema) {
18762
18763
  result.$schema = "http://json-schema.org/draft-07/schema#";
18763
18764
  } else if (ctx.target === "draft-04") {
18764
18765
  result.$schema = "http://json-schema.org/draft-04/schema#";
18765
- } else if (ctx.target === "openapi-3.0") {} else {}
18766
+ } else if (ctx.target === "openapi-3.0") {}
18766
18767
  if (ctx.external?.uri) {
18767
18768
  const id = ctx.external.registry.get(schema)?.id;
18768
18769
  if (!id)
@@ -19023,7 +19024,7 @@ var formatMap, stringProcessor = (schema, ctx, _json, _params) => {
19023
19024
  if (val === undefined) {
19024
19025
  if (ctx.unrepresentable === "throw") {
19025
19026
  throw new Error("Literal `undefined` cannot be represented in JSON Schema");
19026
- } else {}
19027
+ }
19027
19028
  } else if (typeof val === "bigint") {
19028
19029
  if (ctx.unrepresentable === "throw") {
19029
19030
  throw new Error("BigInt literals cannot be represented in JSON Schema");
@@ -83262,21 +83263,21 @@ var init_session_cursor = __esm(() => {
83262
83263
  });
83263
83264
 
83264
83265
  // packages/omo-opencode/src/shared/shell-env.ts
83265
- function detectShellType() {
83266
- if (process.env.SHELL) {
83267
- const shell = process.env.SHELL;
83266
+ function detectShellType(platform = process.platform, env2 = process.env) {
83267
+ if (env2.SHELL) {
83268
+ const shell = env2.SHELL;
83268
83269
  if (shell.includes("csh") || shell.includes("tcsh")) {
83269
83270
  return "csh";
83270
83271
  }
83271
83272
  return "unix";
83272
83273
  }
83273
- if (process.platform === "win32" && (process.env.BASH_VERSION || process.env.MSYSTEM || process.env.WSL_DISTRO_NAME)) {
83274
+ if (platform === "win32" && (env2.BASH_VERSION || env2.MSYSTEM || env2.WSL_DISTRO_NAME)) {
83274
83275
  return "unix";
83275
83276
  }
83276
- if (process.env.PSModulePath) {
83277
+ if (env2.PSModulePath) {
83277
83278
  return "powershell";
83278
83279
  }
83279
- return process.platform === "win32" ? "cmd" : "unix";
83280
+ return platform === "win32" ? "cmd" : "unix";
83280
83281
  }
83281
83282
  var init_shell_env = () => {};
83282
83283
 
@@ -94629,7 +94630,7 @@ var package_default2;
94629
94630
  var init_package2 = __esm(() => {
94630
94631
  package_default2 = {
94631
94632
  name: "@oh-my-opencode/omo-codex",
94632
- version: "5.0.0-beta.8",
94633
+ version: "5.0.0-beta.9",
94633
94634
  type: "module",
94634
94635
  private: true,
94635
94636
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -106414,7 +106415,7 @@ function createJsonOutputManager(options = {}) {
106414
106415
 
106415
106416
  // packages/omo-opencode/src/cli/run/on-complete-hook.ts
106416
106417
  init_spawn_with_windows_hide();
106417
- init_shared();
106418
+ init_shell_env();
106418
106419
  init_logger2();
106419
106420
  var defaultDeps3 = {
106420
106421
  spawnWithWindowsHide,
@@ -106434,15 +106435,15 @@ async function readOutput(stream, streamName, deps = defaultDeps3) {
106434
106435
  return "";
106435
106436
  }
106436
106437
  }
106437
- function resolveHookShellCommand(command) {
106438
- const shellType = detectShellType();
106438
+ function resolveHookShellCommand(command, platform, env3) {
106439
+ const shellType = detectShellType(platform, env3);
106439
106440
  switch (shellType) {
106440
106441
  case "powershell": {
106441
- const powershellExecutable = process.platform === "win32" ? "powershell.exe" : "pwsh";
106442
+ const powershellExecutable = platform === "win32" ? "powershell.exe" : "pwsh";
106442
106443
  return [powershellExecutable, "-NoProfile", "-Command", command];
106443
106444
  }
106444
106445
  case "cmd":
106445
- return [process.env.ComSpec || "cmd.exe", "/d", "/s", "/c", command];
106446
+ return [env3.ComSpec || "cmd.exe", "/d", "/s", "/c", command];
106446
106447
  case "csh":
106447
106448
  return ["csh", "-c", command];
106448
106449
  case "unix":
@@ -106458,10 +106459,12 @@ async function executeOnCompleteHook(options, deps = defaultDeps3) {
106458
106459
  }
106459
106460
  deps.log("Running on-complete hook", { command: trimmedCommand });
106460
106461
  try {
106461
- const shellCommand = resolveHookShellCommand(trimmedCommand);
106462
+ const platform = deps.platform ?? process.platform;
106463
+ const env3 = deps.env ?? process.env;
106464
+ const shellCommand = resolveHookShellCommand(trimmedCommand, platform, env3);
106462
106465
  const proc = deps.spawnWithWindowsHide(shellCommand, {
106463
106466
  env: {
106464
- ...process.env,
106467
+ ...env3,
106465
106468
  SESSION_ID: sessionId,
106466
106469
  EXIT_CODE: String(exitCode),
106467
106470
  DURATION_MS: String(durationMs),
@@ -3,6 +3,8 @@ import { log } from "../../shared/logger";
3
3
  type OnCompleteHookDeps = {
4
4
  spawnWithWindowsHide: typeof spawnWithWindowsHide;
5
5
  log: typeof log;
6
+ platform?: NodeJS.Platform;
7
+ env?: NodeJS.ProcessEnv;
6
8
  };
7
9
  export declare function executeOnCompleteHook(options: {
8
10
  command: string;