opencode-ship 1.1.7 → 1.1.9-rc.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/CHANGELOG.md +36 -1
- package/README.md +13 -13
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/assets/agents/ship-controller.md +47 -22
- package/assets/agents/ship-final-spec-reviewer.md +11 -11
- package/assets/agents/ship-final-standards-reviewer.md +11 -11
- package/assets/agents/ship-plan.md +24 -5
- package/assets/agents/ship-planner.md +46 -20
- package/assets/agents/{delivery-reviewer.md → ship-reviewer.md} +16 -16
- package/assets/agents/ship-task-builder.md +11 -11
- package/assets/agents/ship-task-reviewer.md +12 -12
- package/assets/agents/{delivery-verifier.md → ship-verifier.md} +13 -13
- package/assets/commands/setup-ship-workflow.md +6 -5
- package/assets/commands/ship-deliver.md +27 -30
- package/assets/defaults/workflow-models.history.json +7 -0
- package/assets/defaults/workflow-models.json +5 -0
- package/assets/skills/brainstorming/SKILL.md +10 -7
- package/assets/skills/dispatching-parallel-agents/SKILL.md +1 -1
- package/assets/skills/engineering-workflow/SKILL.md +10 -4
- package/assets/skills/executing-plans/SKILL.md +18 -63
- package/assets/skills/planning-research-checkpoint/SKILL.md +16 -13
- package/assets/skills/receiving-code-review/SKILL.md +1 -1
- package/assets/skills/requesting-code-review/SKILL.md +1 -1
- package/assets/skills/setup-ship-workflow/SKILL.md +27 -33
- package/assets/skills/ship-workflow/SKILL.md +83 -0
- package/assets/skills/skill-discovery/SKILL.md +17 -89
- package/assets/skills/subagent-driven-development/SKILL.md +6 -2
- package/assets/skills/systematic-debugging/SKILL.md +1 -1
- package/assets/skills/test-driven-development/SKILL.md +1 -1
- package/assets/skills/verification-before-completion/SKILL.md +1 -1
- package/assets/skills/wayfinder/SKILL.md +7 -1
- package/assets/skills/writing-plans/SKILL.md +31 -20
- package/dist/cli.js +1482 -175
- package/dist/core.d.ts +18 -0
- package/dist/core.js +528 -11
- package/dist/plugin.js +18613 -17483
- package/package.json +2 -1
- package/schema/project-adapter.example.json +2 -2
- package/schema/project-opencode-shim.json +2 -0
- package/schema/ship-lock.schema.json +23 -2
- package/tests/plugin/expected-tools.mjs +48 -5
- package/tests/plugin/plugin-load.test.mjs +27 -5
- package/vendor/sources.json +21 -21
- package/assets/skills/delivery-workflow/SKILL.md +0 -64
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-ship",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.9-rc.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "npm-distributed OpenCode installer that materializes the delivery plugin, reviewer/verifier agents, skills, ship config and lock into any consumer repository.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"files": [
|
|
47
47
|
"dist",
|
|
48
48
|
"assets/agents",
|
|
49
|
+
"assets/defaults",
|
|
49
50
|
"assets/commands",
|
|
50
51
|
"assets/skills",
|
|
51
52
|
"schema",
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
"invalidateOnHeadChange": true
|
|
25
25
|
},
|
|
26
26
|
"review": {
|
|
27
|
-
"agent": "
|
|
27
|
+
"agent": "ship-reviewer",
|
|
28
28
|
"required": true,
|
|
29
29
|
"invalidateOnHeadChange": true
|
|
30
30
|
},
|
|
31
31
|
"ci": {
|
|
32
32
|
"driver": "github-status-checks",
|
|
33
|
-
"requiredChecks": ["
|
|
33
|
+
"requiredChecks": ["opencode-ship-verify"],
|
|
34
34
|
"wait": true,
|
|
35
35
|
"flakyRetry": 1
|
|
36
36
|
},
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
"required": ["contractVersion", "manager", "files", "integrity"],
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"properties": {
|
|
9
|
-
"contractVersion": { "enum": [1, 2, 3, 4] },
|
|
9
|
+
"contractVersion": { "enum": [1, 2, 3, 4, 5] },
|
|
10
10
|
"manager": {
|
|
11
11
|
"type": "object",
|
|
12
12
|
"required": ["schemaVersion", "name", "version", "appliedAt", "config"],
|
|
13
13
|
"additionalProperties": false,
|
|
14
14
|
"properties": {
|
|
15
|
-
"schemaVersion": { "enum": [1, 2, 3, 4] },
|
|
15
|
+
"schemaVersion": { "enum": [1, 2, 3, 4, 5] },
|
|
16
16
|
"name": { "type": "string", "pattern": "^opencode-ship$" },
|
|
17
17
|
"version": { "type": "string", "minLength": 1 },
|
|
18
18
|
"templateSet": { "type": "string", "minLength": 1 },
|
|
@@ -35,6 +35,16 @@
|
|
|
35
35
|
"existed": { "type": "boolean" }
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
|
+
"models": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"additionalProperties": false,
|
|
41
|
+
"required": ["planner", "builder", "finalReviewer"],
|
|
42
|
+
"properties": {
|
|
43
|
+
"planner": { "$ref": "#/$defs/modelProvenance" },
|
|
44
|
+
"builder": { "$ref": "#/$defs/modelProvenance" },
|
|
45
|
+
"finalReviewer": { "$ref": "#/$defs/modelProvenance" }
|
|
46
|
+
}
|
|
47
|
+
},
|
|
38
48
|
"rootDocuments": {
|
|
39
49
|
"type": "array",
|
|
40
50
|
"items": {
|
|
@@ -103,5 +113,16 @@
|
|
|
103
113
|
"coreVersion": { "type": "string" }
|
|
104
114
|
}
|
|
105
115
|
}
|
|
116
|
+
},
|
|
117
|
+
"$defs": {
|
|
118
|
+
"modelProvenance": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"required": ["source", "applied"],
|
|
122
|
+
"properties": {
|
|
123
|
+
"source": { "enum": ["default", "override"] },
|
|
124
|
+
"applied": { "type": "string", "minLength": 1 }
|
|
125
|
+
}
|
|
126
|
+
}
|
|
106
127
|
}
|
|
107
128
|
}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Canonical opencode-ship tool set.
|
|
3
3
|
*
|
|
4
|
-
* The bundled plugin registers
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The bundled plugin registers 51 typed tools:
|
|
5
|
+
* - 17 canonical ship_* lifecycle tools
|
|
6
|
+
* - 17 delivery_* aliases (same runners; kept for one minor)
|
|
7
|
+
* - 17 already-canonical ship_* workflow tools
|
|
8
|
+
*
|
|
9
|
+
* This module is the single source of truth for the expected set so:
|
|
7
10
|
*
|
|
8
11
|
* - the in-process plugin-load test asserts the contract at the
|
|
9
12
|
* plugin boundary;
|
|
@@ -17,7 +20,8 @@
|
|
|
17
20
|
*/
|
|
18
21
|
|
|
19
22
|
export const EXPECTED_OPENCODE_SHIP_TOOLS = Object.freeze([
|
|
20
|
-
//
|
|
23
|
+
// 17 delivery_* aliases
|
|
24
|
+
"delivery_abandon",
|
|
21
25
|
"delivery_cleanup",
|
|
22
26
|
"delivery_github_read",
|
|
23
27
|
"delivery_inspect",
|
|
@@ -34,7 +38,26 @@ export const EXPECTED_OPENCODE_SHIP_TOOLS = Object.freeze([
|
|
|
34
38
|
"delivery_sync",
|
|
35
39
|
"delivery_verify",
|
|
36
40
|
"delivery_worktree",
|
|
37
|
-
//
|
|
41
|
+
// 17 canonical ship_* lifecycle tools
|
|
42
|
+
"ship_abandon",
|
|
43
|
+
"ship_cleanup",
|
|
44
|
+
"ship_github_read",
|
|
45
|
+
"ship_inspect",
|
|
46
|
+
"ship_issue",
|
|
47
|
+
"ship_issue_close",
|
|
48
|
+
"ship_issue_comment",
|
|
49
|
+
"ship_issue_labels",
|
|
50
|
+
"ship_issue_link",
|
|
51
|
+
"ship_merge",
|
|
52
|
+
"ship_pr",
|
|
53
|
+
"ship_publish",
|
|
54
|
+
"ship_ready",
|
|
55
|
+
"ship_review",
|
|
56
|
+
"ship_sync",
|
|
57
|
+
"ship_verify",
|
|
58
|
+
"ship_worktree",
|
|
59
|
+
// 17 already-canonical ship workflow tools
|
|
60
|
+
"ship_deliver",
|
|
38
61
|
"ship_final_review",
|
|
39
62
|
"ship_plan_approve",
|
|
40
63
|
"ship_plan_start",
|
|
@@ -62,3 +85,23 @@ export const EXPECTED_OPENCODE_SHIP_TOOL_IDS = Object.freeze(
|
|
|
62
85
|
);
|
|
63
86
|
|
|
64
87
|
export const OPENCODE_SHIP_TOOL_COUNT = EXPECTED_OPENCODE_SHIP_TOOLS.length;
|
|
88
|
+
|
|
89
|
+
export const LIFECYCLE_TOOL_ALIASES = Object.freeze([
|
|
90
|
+
["ship_inspect", "delivery_inspect"],
|
|
91
|
+
["ship_issue", "delivery_issue"],
|
|
92
|
+
["ship_worktree", "delivery_worktree"],
|
|
93
|
+
["ship_verify", "delivery_verify"],
|
|
94
|
+
["ship_review", "delivery_review"],
|
|
95
|
+
["ship_pr", "delivery_pr"],
|
|
96
|
+
["ship_ready", "delivery_ready"],
|
|
97
|
+
["ship_merge", "delivery_merge"],
|
|
98
|
+
["ship_cleanup", "delivery_cleanup"],
|
|
99
|
+
["ship_abandon", "delivery_abandon"],
|
|
100
|
+
["ship_github_read", "delivery_github_read"],
|
|
101
|
+
["ship_issue_comment", "delivery_issue_comment"],
|
|
102
|
+
["ship_issue_labels", "delivery_issue_labels"],
|
|
103
|
+
["ship_issue_link", "delivery_issue_link"],
|
|
104
|
+
["ship_issue_close", "delivery_issue_close"],
|
|
105
|
+
["ship_sync", "delivery_sync"],
|
|
106
|
+
["ship_publish", "delivery_publish"],
|
|
107
|
+
]);
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* runtime types without booting OpenCode. It verifies:
|
|
6
6
|
* - the bundled plugin is the default-exported function
|
|
7
7
|
* - calling it returns an object with a `tool` key
|
|
8
|
-
* - the `tool` object exposes exactly the
|
|
9
|
-
* definitions (
|
|
8
|
+
* - the `tool` object exposes exactly the canonical named tool
|
|
9
|
+
* definitions (17 ship lifecycle + 17 delivery aliases + 17 workflow)
|
|
10
10
|
*
|
|
11
|
-
* The canonical
|
|
11
|
+
* The canonical tool set is imported from
|
|
12
12
|
* `tests/plugin/expected-tools.mjs`, the single source of truth
|
|
13
13
|
* shared with the opencode-discovery smoke test.
|
|
14
14
|
*/
|
|
@@ -17,7 +17,7 @@ import test from "node:test";
|
|
|
17
17
|
import assert from "node:assert/strict";
|
|
18
18
|
import { pathToFileURL } from "node:url";
|
|
19
19
|
import { resolve } from "node:path";
|
|
20
|
-
import { EXPECTED_OPENCODE_SHIP_TOOL_IDS, OPENCODE_SHIP_TOOL_COUNT } from "./expected-tools.mjs";
|
|
20
|
+
import { EXPECTED_OPENCODE_SHIP_TOOL_IDS, OPENCODE_SHIP_TOOL_COUNT, LIFECYCLE_TOOL_ALIASES } from "./expected-tools.mjs";
|
|
21
21
|
|
|
22
22
|
const pluginPath = pathToFileURL(resolve("dist/plugin.js")).href;
|
|
23
23
|
|
|
@@ -34,7 +34,7 @@ test("plugin: bundle exports only plugin entry functions", async () => {
|
|
|
34
34
|
assert.deepEqual(Object.keys(mod).sort(), ["ShipPlugin", "default"]);
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
-
test("plugin: registers
|
|
37
|
+
test("plugin: registers the canonical tool set including delivery_* aliases", async () => {
|
|
38
38
|
const mod = await import(pluginPath);
|
|
39
39
|
const fakeCtx = {
|
|
40
40
|
worktree: process.cwd(),
|
|
@@ -68,3 +68,25 @@ test("plugin: every tool returns a contract-version-2 envelope", async () => {
|
|
|
68
68
|
assert.ok(typeof parsed.kind === "string", `${id} must include a kind`);
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
|
+
|
|
72
|
+
test("plugin: ship_issue and delivery_issue exist and share behavior", async () => {
|
|
73
|
+
const mod = await import(pluginPath);
|
|
74
|
+
const fakeCtx = {
|
|
75
|
+
worktree: process.cwd(),
|
|
76
|
+
project: { worktree: process.cwd() },
|
|
77
|
+
client: {},
|
|
78
|
+
directory: process.cwd(),
|
|
79
|
+
};
|
|
80
|
+
const result = await mod.default(fakeCtx);
|
|
81
|
+
for (const [canonical, alias] of LIFECYCLE_TOOL_ALIASES) {
|
|
82
|
+
assert.ok(result.tool[canonical], `missing canonical ${canonical}`);
|
|
83
|
+
assert.ok(result.tool[alias], `missing alias ${alias}`);
|
|
84
|
+
assert.equal(result.tool[canonical].description, result.tool[alias].description, `${canonical} and ${alias} must share description`);
|
|
85
|
+
const canonicalEnv = JSON.parse(await result.tool[canonical].execute({}, fakeCtx));
|
|
86
|
+
const aliasEnv = JSON.parse(await result.tool[alias].execute({}, fakeCtx));
|
|
87
|
+
assert.equal(canonicalEnv.ok, aliasEnv.ok, `${canonical} and ${alias} must share ok`);
|
|
88
|
+
const canonicalBody = canonicalEnv.data ?? canonicalEnv.details ?? canonicalEnv.message;
|
|
89
|
+
const aliasBody = aliasEnv.data ?? aliasEnv.details ?? aliasEnv.message;
|
|
90
|
+
assert.deepEqual(canonicalBody, aliasBody, `${canonical} and ${alias} must share payload`);
|
|
91
|
+
}
|
|
92
|
+
});
|
package/vendor/sources.json
CHANGED
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
"localFrozenPath": "vendor/upstreams/mattpocock/skills/engineering/wayfinder/SKILL.md",
|
|
178
178
|
"localFrozenSha256": "257e40665b28ae959ffdcb97d7a72b074360f4a3d201bd84786505308546e434",
|
|
179
179
|
"localTarget": "assets/skills/wayfinder/SKILL.md",
|
|
180
|
-
"localSha256": "
|
|
180
|
+
"localSha256": "8a918643fa69af6230f4425ab171eb29dcc1483e9ca2cef1e059057de005d257",
|
|
181
181
|
"reuseMode": "adapted",
|
|
182
182
|
"license": "MIT",
|
|
183
183
|
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. The strong planner child session is\nconfigured with `openai/gpt-5.6-sol` and the durable workflow\nstate lives under `<git-common-dir>/opencode-ship/`. All\nGitHub mutations go through Ship's typed tools; never use\n`gh api` or raw shell."
|
|
@@ -337,10 +337,10 @@
|
|
|
337
337
|
"localFrozenPath": "vendor/upstreams/obra/skills/brainstorming/SKILL.md",
|
|
338
338
|
"localFrozenSha256": "4a54a4858b99807f3155ed1614b2f116e35ea5c1b788e793f565dd837fd3891f",
|
|
339
339
|
"localTarget": "assets/skills/brainstorming/SKILL.md",
|
|
340
|
-
"localSha256": "
|
|
340
|
+
"localSha256": "bf41cd2c67a0df2a7b6ecf2a87eeabc4bcd3e9ff90830c32d459a30c407fafa1",
|
|
341
341
|
"reuseMode": "adapted",
|
|
342
342
|
"license": "MIT",
|
|
343
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
343
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
346
|
"skill": "brainstorming",
|
|
@@ -385,10 +385,10 @@
|
|
|
385
385
|
"localFrozenPath": "vendor/upstreams/obra/skills/writing-plans/SKILL.md",
|
|
386
386
|
"localFrozenSha256": "72190c88b2b5a67a96b91d66aa72b9161913e10e8769da3f28a226f4cc7b99d0",
|
|
387
387
|
"localTarget": "assets/skills/writing-plans/SKILL.md",
|
|
388
|
-
"localSha256": "
|
|
388
|
+
"localSha256": "8fa16292dee603703729918e211ccc311d0e85592c5dd425bd2104dc408a229d",
|
|
389
389
|
"reuseMode": "adapted",
|
|
390
390
|
"license": "MIT",
|
|
391
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
391
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
392
392
|
},
|
|
393
393
|
{
|
|
394
394
|
"skill": "writing-plans",
|
|
@@ -417,10 +417,10 @@
|
|
|
417
417
|
"localFrozenPath": "vendor/upstreams/obra/skills/executing-plans/SKILL.md",
|
|
418
418
|
"localFrozenSha256": "c4c3d8b628c51114cd165fb8246fe02744cd8be180032328391252e653028d9b",
|
|
419
419
|
"localTarget": "assets/skills/executing-plans/SKILL.md",
|
|
420
|
-
"localSha256": "
|
|
420
|
+
"localSha256": "8508289357f611997cba6a3fb2a6f4d2c5b420fbb181319df6535e7b0edeb943",
|
|
421
421
|
"reuseMode": "adapted",
|
|
422
422
|
"license": "MIT",
|
|
423
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
423
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
424
424
|
},
|
|
425
425
|
{
|
|
426
426
|
"skill": "subagent-driven-development",
|
|
@@ -433,10 +433,10 @@
|
|
|
433
433
|
"localFrozenPath": "vendor/upstreams/obra/skills/subagent-driven-development/SKILL.md",
|
|
434
434
|
"localFrozenSha256": "349a08ad8b59b19b86c13a7d2f34a1a38719bf88257004a863eefefa8d9f9e40",
|
|
435
435
|
"localTarget": "assets/skills/subagent-driven-development/SKILL.md",
|
|
436
|
-
"localSha256": "
|
|
436
|
+
"localSha256": "4a9a0b66814a0213e0225a39bb1a88caf44b10297b3feae1f9f11618a2bac708",
|
|
437
437
|
"reuseMode": "adapted",
|
|
438
438
|
"license": "MIT",
|
|
439
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
439
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
440
440
|
},
|
|
441
441
|
{
|
|
442
442
|
"skill": "subagent-driven-development",
|
|
@@ -497,10 +497,10 @@
|
|
|
497
497
|
"localFrozenPath": "vendor/upstreams/obra/skills/dispatching-parallel-agents/SKILL.md",
|
|
498
498
|
"localFrozenSha256": "1968923066f3b707eb01d1992cdf4c42284c3855f70253b9cd5000ff45fca13c",
|
|
499
499
|
"localTarget": "assets/skills/dispatching-parallel-agents/SKILL.md",
|
|
500
|
-
"localSha256": "
|
|
500
|
+
"localSha256": "44c29ba284855b57537e908ee0d16d56cc3be484553d1953276148d423de0397",
|
|
501
501
|
"reuseMode": "adapted",
|
|
502
502
|
"license": "MIT",
|
|
503
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
503
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
504
504
|
},
|
|
505
505
|
{
|
|
506
506
|
"skill": "test-driven-development",
|
|
@@ -513,10 +513,10 @@
|
|
|
513
513
|
"localFrozenPath": "vendor/upstreams/obra/skills/test-driven-development/SKILL.md",
|
|
514
514
|
"localFrozenSha256": "bf1b8216e523851a411e91d429a7c1c2a173e79d88957bc78e348218d50edd54",
|
|
515
515
|
"localTarget": "assets/skills/test-driven-development/SKILL.md",
|
|
516
|
-
"localSha256": "
|
|
516
|
+
"localSha256": "da29c14a2e16b77cfcfc7b1a6c137e86b3f60458b27c64505df4404813e817dc",
|
|
517
517
|
"reuseMode": "adapted",
|
|
518
518
|
"license": "MIT",
|
|
519
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
519
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
520
520
|
},
|
|
521
521
|
{
|
|
522
522
|
"skill": "test-driven-development",
|
|
@@ -561,10 +561,10 @@
|
|
|
561
561
|
"localFrozenPath": "vendor/upstreams/obra/skills/systematic-debugging/SKILL.md",
|
|
562
562
|
"localFrozenSha256": "808fc5717aa88ad65efff312b11c186294d3e6ee301afb584e2f86599b137787",
|
|
563
563
|
"localTarget": "assets/skills/systematic-debugging/SKILL.md",
|
|
564
|
-
"localSha256": "
|
|
564
|
+
"localSha256": "135f297fde873ff99de25d948003e14e90602de88ff75e59f2ee113854c74c6c",
|
|
565
565
|
"reuseMode": "adapted",
|
|
566
566
|
"license": "MIT",
|
|
567
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
567
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
568
568
|
},
|
|
569
569
|
{
|
|
570
570
|
"skill": "systematic-debugging",
|
|
@@ -721,10 +721,10 @@
|
|
|
721
721
|
"localFrozenPath": "vendor/upstreams/obra/skills/verification-before-completion/SKILL.md",
|
|
722
722
|
"localFrozenSha256": "2befe7fc55bcadaa3d97dd9e8efeb633d2561c0ebe74c5a8b17c4d9e7e4520b3",
|
|
723
723
|
"localTarget": "assets/skills/verification-before-completion/SKILL.md",
|
|
724
|
-
"localSha256": "
|
|
724
|
+
"localSha256": "46b6d98d8a6349ce1c301ad88b84f31b865fecc06ee8f4e81087aacc41b703b6",
|
|
725
725
|
"reuseMode": "adapted",
|
|
726
726
|
"license": "MIT",
|
|
727
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
727
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
728
728
|
},
|
|
729
729
|
{
|
|
730
730
|
"skill": "requesting-code-review",
|
|
@@ -737,10 +737,10 @@
|
|
|
737
737
|
"localFrozenPath": "vendor/upstreams/obra/skills/requesting-code-review/SKILL.md",
|
|
738
738
|
"localFrozenSha256": "d71cc01ba56d2325cf8af5f7c11837819b63ecd57de0bfdb812f7f3ff7751df8",
|
|
739
739
|
"localTarget": "assets/skills/requesting-code-review/SKILL.md",
|
|
740
|
-
"localSha256": "
|
|
740
|
+
"localSha256": "3eed2e41ba0b40cf6ecff658d4b5fc19dde1e615cfbea1d2a294c99e69dd6df3",
|
|
741
741
|
"reuseMode": "adapted",
|
|
742
742
|
"license": "MIT",
|
|
743
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
743
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
744
744
|
},
|
|
745
745
|
{
|
|
746
746
|
"skill": "requesting-code-review",
|
|
@@ -769,10 +769,10 @@
|
|
|
769
769
|
"localFrozenPath": "vendor/upstreams/obra/skills/receiving-code-review/SKILL.md",
|
|
770
770
|
"localFrozenSha256": "091df1629510af1b92fc4abd6f96732ebedb4cb2c0f3457e8f2740b0504a2438",
|
|
771
771
|
"localTarget": "assets/skills/receiving-code-review/SKILL.md",
|
|
772
|
-
"localSha256": "
|
|
772
|
+
"localSha256": "a83b0aef63159f3f970bbd4276f2d3705642ed06cf6ec5463f56f1bad8509cbb",
|
|
773
773
|
"reuseMode": "adapted",
|
|
774
774
|
"license": "MIT",
|
|
775
|
-
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`
|
|
775
|
+
"adaptationNote": "## Ship integration\n\nThis skill is part of the engineering profile shipped by\n`opencode-ship@1.0`. Execution is driven by the deterministic\nShip controller; the cheap builder (`minimax/MiniMax-M3`) cannot\ncommit, push, mutate GitHub, mark Ready, or merge. The\nverification-before-completion rule is enforced by\n`ship_verify`, not by the model self-asserting completion."
|
|
776
776
|
}
|
|
777
777
|
]
|
|
778
778
|
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: delivery-workflow
|
|
3
|
-
description: Orchestrates the canonical delivery lifecycle from issue creation through Ready PR. Use when the user asks for "implement issue N", "work on ready issues", "delivery", "autonomous delivery", or after a plan-mode session confirms the work scope.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# delivery-workflow
|
|
7
|
-
|
|
8
|
-
You drive the opencode-ship package from a one-line user request to a green, conflict-free, ready-to-merge pull request.
|
|
9
|
-
|
|
10
|
-
## When you trigger
|
|
11
|
-
|
|
12
|
-
- "Implement issue N", "work on issue N", "deliver issue N"
|
|
13
|
-
- "Pick the next ready issue and implement it"
|
|
14
|
-
- "Open a PR for #N"
|
|
15
|
-
- "Mark PR #N ready"
|
|
16
|
-
- "Merge PR #N" — only valid if you already created the PR through this workflow
|
|
17
|
-
- "Clean up my worktree" / "Tidy old worktrees" — entry point for next-task cleanup
|
|
18
|
-
|
|
19
|
-
Do **not** trigger on:
|
|
20
|
-
- Read-only questions ("explain issue N")
|
|
21
|
-
- Plain chat about the project's domain model
|
|
22
|
-
- Typo / doc one-liners that do not deserve a PR
|
|
23
|
-
|
|
24
|
-
## Lifecycle contract
|
|
25
|
-
|
|
26
|
-
| Step | Tool | Notes |
|
|
27
|
-
|---|---|---|
|
|
28
|
-
| 1. Cleanup old worktrees | `delivery_inspect` for each manifest, recovery scan, `delivery_cleanup` for provably-merged ones | Runs immediately after a successful merge; retries on next Build task if interrupted |
|
|
29
|
-
| 2. Offer research checkpoint | (this skill) | Single-shot per session; offer only if the plan is non-trivial |
|
|
30
|
-
| 3. Find or create the issue | `delivery_issue` | Always idempotent; never create a duplicate |
|
|
31
|
-
| 4. Create a worktree | `delivery_worktree` | Refuse overwrites; refuse dirty tree |
|
|
32
|
-
| 5. Implement | (consumer-owned) | Stay inside the worktree |
|
|
33
|
-
| 6. Commit + push | (consumer-owned `git`) | Use Conventional Commits |
|
|
34
|
-
| 7. Open draft PR | `delivery_pr` | `Closes #N` is added automatically |
|
|
35
|
-
| 8. Sync with default branch | (consumer-owned `git`) | Merge `origin/main` into the feature branch; never rebase a published branch |
|
|
36
|
-
| 9. Review | `task reviewer:delivery-reviewer` | Re-run if HEAD changed |
|
|
37
|
-
| 10. Verify | `task verifier:delivery-verifier` | Same final HEAD required |
|
|
38
|
-
| 11. Mark Ready | `delivery_ready` | Refreshes checks; refuses if any gate is stale |
|
|
39
|
-
| 12. Stop at Ready | (this skill) | Do not merge without an explicit user request |
|
|
40
|
-
| 13. Merge (only on explicit request) | `delivery_merge` | Re-checks base, head, and mergeability |
|
|
41
|
-
| 14. Immediate cleanup | `delivery_cleanup` | Runs automatically right after a successful merge |
|
|
42
|
-
|
|
43
|
-
## Hard rules
|
|
44
|
-
|
|
45
|
-
1. Every PR carries a `Closes #N` reference. If the issue does not exist, create it first.
|
|
46
|
-
2. The lifecycle stops at Ready by default. An explicit "merge it" is the only thing that triggers `delivery_merge`.
|
|
47
|
-
3. Force-push, hard-reset, stash, and `git worktree remove` are denied to you. Use `delivery_worktree` and `delivery_cleanup` instead.
|
|
48
|
-
4. You never edit `main` directly. You never bypass the reviewer/verifier gates.
|
|
49
|
-
5. The typed `delivery_*` tools are the only sanctioned way to mutate GitHub state. Do not invoke `gh pr merge`, `gh api`, or raw Git plumbing directly.
|
|
50
|
-
6. When a gate fails, fix the cause and re-run only the failed gate; never skip.
|
|
51
|
-
7. If `delivery_merge` returns a `MergeError`, surface it verbatim. Do not invent a workaround.
|
|
52
|
-
|
|
53
|
-
## Single-shot research checkpoint
|
|
54
|
-
|
|
55
|
-
If you decide the task is non-trivial, pause once and **ask the user** whether to run Deep Research before generating any prompt. The default save-tokens path is "no research, continue with the plan as written". Only on explicit "yes" do you generate a draft Deep Research prompt and run the research; summarize the relevant findings inline and continue. Do not write to `docs/research/` unless the findings materially shape an ADR; ADR storage is the project's call, not yours. Continue only after the user confirms or declines.
|
|
56
|
-
|
|
57
|
-
The full procedure lives in the `planning-research-checkpoint` skill. Do not duplicate the prompt-generation logic here — just trigger the skill and respect its ask-first policy.
|
|
58
|
-
|
|
59
|
-
## Stop conditions
|
|
60
|
-
|
|
61
|
-
- Ready reached: stop. Surface the PR URL, the worktree path, the recorded verifier SHA, and the explicit-merge instruction.
|
|
62
|
-
- `merge it` requested and gates are fresh: perform the squash merge. Surface the merge SHA. The plugin will queue immediate cleanup; if cleanup fails it is recorded as `cleanupPending` and retried on the next Build task.
|
|
63
|
-
- Any gate fails after one re-run: stop. Surface the failing tool, the failing input, and the recorded evidence.
|
|
64
|
-
- Unexpected lifecycle error (missing-manifest, head-changed, ci-failing): stop. Surface the error envelope.
|