opencode-ship 1.1.8 → 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 +21 -0
- package/README.md +10 -10
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/assets/agents/ship-controller.md +50 -28
- 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 +21 -9
- 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/{delivery-workflow → ship-workflow}/SKILL.md +37 -11
- 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 +1476 -174
- package/dist/core.js +99 -7
- package/dist/plugin.js +18510 -17921
- 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 +46 -5
- package/tests/plugin/plugin-load.test.mjs +27 -5
- package/vendor/sources.json +21 -21
package/dist/core.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// opencode-ship/core v1.1.
|
|
1
|
+
// opencode-ship/core v1.1.9-rc.1
|
|
2
2
|
|
|
3
3
|
// src/adapter.js
|
|
4
4
|
import { readFile, writeFile, mkdir, rename } from "node:fs/promises";
|
|
@@ -1100,6 +1100,19 @@ Closes #${issueNumber}`;
|
|
|
1100
1100
|
]);
|
|
1101
1101
|
return fields.headRefOid;
|
|
1102
1102
|
},
|
|
1103
|
+
async readIssue({ repo, number }) {
|
|
1104
|
+
if (typeof number !== "number") throw new Error("readIssue: number is required");
|
|
1105
|
+
if (!parseRepoSlug(repo)) throw new Error(`readIssue: invalid repo slug ${repo}`);
|
|
1106
|
+
return ghJson(run, [
|
|
1107
|
+
"issue",
|
|
1108
|
+
"view",
|
|
1109
|
+
String(number),
|
|
1110
|
+
"--repo",
|
|
1111
|
+
repo,
|
|
1112
|
+
"--json",
|
|
1113
|
+
"title,body"
|
|
1114
|
+
]);
|
|
1115
|
+
},
|
|
1103
1116
|
async runCommand(argv) {
|
|
1104
1117
|
if (!Array.isArray(argv) || argv.length === 0) {
|
|
1105
1118
|
throw new Error("runCommand: argv must be a non-empty array");
|
|
@@ -1400,6 +1413,60 @@ function createInspectTool(deps) {
|
|
|
1400
1413
|
};
|
|
1401
1414
|
}
|
|
1402
1415
|
|
|
1416
|
+
// src/runtime/stages.js
|
|
1417
|
+
function progressLine(stage, extra = {}) {
|
|
1418
|
+
switch (stage) {
|
|
1419
|
+
case "setup":
|
|
1420
|
+
return "Setup: ready.";
|
|
1421
|
+
case "discover":
|
|
1422
|
+
return extra.count > 0 ? `Discover: ${extra.count} skills installed.` : "Discover: none (catalog only).";
|
|
1423
|
+
case "plan":
|
|
1424
|
+
return `Plan: ${extra.path}`;
|
|
1425
|
+
case "track":
|
|
1426
|
+
return `Track: issue #${extra.number}.`;
|
|
1427
|
+
case "build":
|
|
1428
|
+
return `Build: task ${extra.k}/${extra.n} ${extra.title}.`;
|
|
1429
|
+
case "review":
|
|
1430
|
+
return extra.ok ? "Review: pass." : "Review: fail (see notes).";
|
|
1431
|
+
case "verify":
|
|
1432
|
+
return extra.ok ? "Verify: pass." : "Verify: fail.";
|
|
1433
|
+
case "ready":
|
|
1434
|
+
return `Ready: PR #${extra.number}.`;
|
|
1435
|
+
case "merge":
|
|
1436
|
+
return `Merge: ${extra.sha}.`;
|
|
1437
|
+
case "cleanup":
|
|
1438
|
+
return "Cleanup: done.";
|
|
1439
|
+
default:
|
|
1440
|
+
return null;
|
|
1441
|
+
}
|
|
1442
|
+
}
|
|
1443
|
+
function nextLine(stage) {
|
|
1444
|
+
switch (stage) {
|
|
1445
|
+
case "setup":
|
|
1446
|
+
return "Next: tell me what you want to build.";
|
|
1447
|
+
case "discover":
|
|
1448
|
+
return "Next: I will use these skills while building.";
|
|
1449
|
+
case "plan":
|
|
1450
|
+
return "Next: say if this is the product you want.";
|
|
1451
|
+
case "approve":
|
|
1452
|
+
return "Next: start building now, or continue later.";
|
|
1453
|
+
case "track":
|
|
1454
|
+
return "Next: building starts.";
|
|
1455
|
+
case "build":
|
|
1456
|
+
case "review":
|
|
1457
|
+
case "verify":
|
|
1458
|
+
return "Next: I keep going.";
|
|
1459
|
+
case "ready":
|
|
1460
|
+
return "Next: say if I should merge it.";
|
|
1461
|
+
case "merge":
|
|
1462
|
+
return "Next: cleanup.";
|
|
1463
|
+
case "cleanup":
|
|
1464
|
+
return "Next: tell me what to build next.";
|
|
1465
|
+
default:
|
|
1466
|
+
return null;
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1403
1470
|
// src/tools/delivery-issue.js
|
|
1404
1471
|
function createIssueTool(deps) {
|
|
1405
1472
|
return async function issue(input) {
|
|
@@ -1409,13 +1476,16 @@ function createIssueTool(deps) {
|
|
|
1409
1476
|
if (!input.branch) return { kind: "missing-input", field: "branch" };
|
|
1410
1477
|
const existing = await readManifest(deps.repoRoot, input.taskId);
|
|
1411
1478
|
if (existing) {
|
|
1479
|
+
const stage2 = "track";
|
|
1412
1480
|
return {
|
|
1413
1481
|
contractVersion: 1,
|
|
1414
1482
|
created: false,
|
|
1415
1483
|
issueNumber: existing.issueNumber,
|
|
1416
1484
|
issueUrl: `https://github.com/${deps.repoSlug}/issues/${existing.issueNumber}`,
|
|
1417
1485
|
manifestPath: "preserved",
|
|
1418
|
-
preserved: true
|
|
1486
|
+
preserved: true,
|
|
1487
|
+
progress: progressLine(stage2, { number: existing.issueNumber }),
|
|
1488
|
+
next: nextLine(stage2)
|
|
1419
1489
|
};
|
|
1420
1490
|
}
|
|
1421
1491
|
const ensured = await deps.driver.ensureIssue({
|
|
@@ -1453,12 +1523,15 @@ function createIssueTool(deps) {
|
|
|
1453
1523
|
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1454
1524
|
};
|
|
1455
1525
|
const path = await writeManifest(deps.repoRoot, next);
|
|
1526
|
+
const stage = "track";
|
|
1456
1527
|
return {
|
|
1457
1528
|
contractVersion: 1,
|
|
1458
1529
|
created: ensured.created,
|
|
1459
1530
|
issueNumber: ensured.summary.number,
|
|
1460
1531
|
issueUrl: ensured.summary.url,
|
|
1461
|
-
manifestPath: path
|
|
1532
|
+
manifestPath: path,
|
|
1533
|
+
progress: progressLine(stage, { number: ensured.summary.number }),
|
|
1534
|
+
next: nextLine(stage)
|
|
1462
1535
|
};
|
|
1463
1536
|
};
|
|
1464
1537
|
}
|
|
@@ -2499,7 +2572,15 @@ function createReadyTool(deps) {
|
|
|
2499
2572
|
data: { headSha: prHead, taskId: input.taskId }
|
|
2500
2573
|
});
|
|
2501
2574
|
}
|
|
2502
|
-
|
|
2575
|
+
const stage = "ready";
|
|
2576
|
+
return {
|
|
2577
|
+
contractVersion: 1,
|
|
2578
|
+
manifestPath: path,
|
|
2579
|
+
pr: m.prNumber,
|
|
2580
|
+
workflowId,
|
|
2581
|
+
progress: progressLine(stage, { number: m.prNumber }),
|
|
2582
|
+
next: nextLine(stage)
|
|
2583
|
+
};
|
|
2503
2584
|
};
|
|
2504
2585
|
}
|
|
2505
2586
|
|
|
@@ -2561,7 +2642,16 @@ function createMergeTool(deps) {
|
|
|
2561
2642
|
data: { mergeSha: merged2.mergeSha ?? merged2.mergeCommitSha ?? merged2.headSha }
|
|
2562
2643
|
});
|
|
2563
2644
|
}
|
|
2564
|
-
|
|
2645
|
+
const stage = "merge";
|
|
2646
|
+
return {
|
|
2647
|
+
kind: "merge",
|
|
2648
|
+
contractVersion: 1,
|
|
2649
|
+
manifestPath: path,
|
|
2650
|
+
pr: m.prNumber,
|
|
2651
|
+
taskId: m.taskId,
|
|
2652
|
+
progress: progressLine(stage, { sha: merged2.headSha.slice(0, 7) }),
|
|
2653
|
+
next: nextLine(stage)
|
|
2654
|
+
};
|
|
2565
2655
|
}
|
|
2566
2656
|
if (pr.merged) {
|
|
2567
2657
|
return recordMerged(pr, `reconciled external merge as ${input.subject}`);
|
|
@@ -2773,7 +2863,9 @@ function createCleanupTool(deps) {
|
|
|
2773
2863
|
contractVersion: 1,
|
|
2774
2864
|
manifestPath: null,
|
|
2775
2865
|
removedPath: wtPath,
|
|
2776
|
-
bootstrapRecovery: isBootstrapRecovery
|
|
2866
|
+
bootstrapRecovery: isBootstrapRecovery,
|
|
2867
|
+
progress: progressLine("cleanup"),
|
|
2868
|
+
next: nextLine("cleanup")
|
|
2777
2869
|
};
|
|
2778
2870
|
};
|
|
2779
2871
|
}
|
|
@@ -3203,7 +3295,7 @@ function createAbandonTool(deps) {
|
|
|
3203
3295
|
import { readFileSync, existsSync as existsSync9 } from "node:fs";
|
|
3204
3296
|
import { dirname as dirname4, resolve as resolve10 } from "node:path";
|
|
3205
3297
|
import { fileURLToPath } from "node:url";
|
|
3206
|
-
var PACKAGE_VERSION = "1.1.
|
|
3298
|
+
var PACKAGE_VERSION = "1.1.9-rc.1";
|
|
3207
3299
|
var TEMPLATE_SET = `v${PACKAGE_VERSION}`;
|
|
3208
3300
|
export {
|
|
3209
3301
|
ADAPTER_CONTRACT_VERSION,
|