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.
Files changed (42) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +10 -10
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/assets/agents/ship-controller.md +50 -28
  5. package/assets/agents/ship-final-spec-reviewer.md +11 -11
  6. package/assets/agents/ship-final-standards-reviewer.md +11 -11
  7. package/assets/agents/ship-plan.md +24 -5
  8. package/assets/agents/ship-planner.md +46 -20
  9. package/assets/agents/{delivery-reviewer.md → ship-reviewer.md} +16 -16
  10. package/assets/agents/ship-task-builder.md +11 -11
  11. package/assets/agents/ship-task-reviewer.md +12 -12
  12. package/assets/agents/{delivery-verifier.md → ship-verifier.md} +13 -13
  13. package/assets/commands/setup-ship-workflow.md +6 -5
  14. package/assets/commands/ship-deliver.md +21 -9
  15. package/assets/defaults/workflow-models.history.json +7 -0
  16. package/assets/defaults/workflow-models.json +5 -0
  17. package/assets/skills/brainstorming/SKILL.md +10 -7
  18. package/assets/skills/dispatching-parallel-agents/SKILL.md +1 -1
  19. package/assets/skills/engineering-workflow/SKILL.md +10 -4
  20. package/assets/skills/executing-plans/SKILL.md +18 -63
  21. package/assets/skills/planning-research-checkpoint/SKILL.md +16 -13
  22. package/assets/skills/receiving-code-review/SKILL.md +1 -1
  23. package/assets/skills/requesting-code-review/SKILL.md +1 -1
  24. package/assets/skills/setup-ship-workflow/SKILL.md +27 -33
  25. package/assets/skills/{delivery-workflow → ship-workflow}/SKILL.md +37 -11
  26. package/assets/skills/skill-discovery/SKILL.md +17 -89
  27. package/assets/skills/subagent-driven-development/SKILL.md +6 -2
  28. package/assets/skills/systematic-debugging/SKILL.md +1 -1
  29. package/assets/skills/test-driven-development/SKILL.md +1 -1
  30. package/assets/skills/verification-before-completion/SKILL.md +1 -1
  31. package/assets/skills/wayfinder/SKILL.md +7 -1
  32. package/assets/skills/writing-plans/SKILL.md +31 -20
  33. package/dist/cli.js +1476 -174
  34. package/dist/core.js +99 -7
  35. package/dist/plugin.js +18510 -17921
  36. package/package.json +2 -1
  37. package/schema/project-adapter.example.json +2 -2
  38. package/schema/project-opencode-shim.json +2 -0
  39. package/schema/ship-lock.schema.json +23 -2
  40. package/tests/plugin/expected-tools.mjs +46 -5
  41. package/tests/plugin/plugin-load.test.mjs +27 -5
  42. package/vendor/sources.json +21 -21
package/dist/core.js CHANGED
@@ -1,4 +1,4 @@
1
- // opencode-ship/core v1.1.8
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
- return { contractVersion: 1, manifestPath: path, pr: m.prNumber, workflowId };
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
- return { kind: "merge", contractVersion: 1, manifestPath: path, pr: m.prNumber, taskId: m.taskId };
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.8";
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,