@snappedly-tools/shipyard 0.5.0 → 0.6.0

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 (58) hide show
  1. package/README.md +56 -8
  2. package/dist/index.js +27 -9
  3. package/dist/index.js.map +1 -1
  4. package/dist/main.js +51 -15
  5. package/dist/main.js.map +1 -1
  6. package/dist/templates/parallel-planner/block-scope.sh +160 -0
  7. package/dist/templates/parallel-planner/conflict-prompt.md +22 -0
  8. package/dist/templates/parallel-planner/handoff.sh +175 -0
  9. package/dist/templates/parallel-planner/implement-prompt.md +10 -56
  10. package/dist/templates/parallel-planner/main.mts +434 -188
  11. package/dist/templates/parallel-planner/merge-prompt.md +9 -21
  12. package/dist/templates/parallel-planner/plan-prompt.md +5 -31
  13. package/dist/templates/parallel-planner/select-issues.mjs +788 -0
  14. package/dist/templates/parallel-planner/setup.sh +51 -0
  15. package/dist/templates/parallel-planner/spec-wave-prompt.md +16 -0
  16. package/dist/templates/parallel-planner/template.json +1 -1
  17. package/dist/templates/parallel-planner/triage-prompt.md +5 -0
  18. package/dist/templates/parallel-planner/verify-triage.sh +19 -0
  19. package/dist/templates/parallel-planner-with-review/block-scope.sh +160 -0
  20. package/dist/templates/parallel-planner-with-review/conflict-prompt.md +22 -0
  21. package/dist/templates/parallel-planner-with-review/handoff.sh +175 -0
  22. package/dist/templates/parallel-planner-with-review/implement-prompt.md +10 -56
  23. package/dist/templates/parallel-planner-with-review/main.mts +473 -205
  24. package/dist/templates/parallel-planner-with-review/merge-prompt.md +9 -21
  25. package/dist/templates/parallel-planner-with-review/plan-prompt.md +5 -31
  26. package/dist/templates/parallel-planner-with-review/review-prompt.md +11 -49
  27. package/dist/templates/parallel-planner-with-review/select-issues.mjs +788 -0
  28. package/dist/templates/parallel-planner-with-review/setup.sh +51 -0
  29. package/dist/templates/parallel-planner-with-review/spec-wave-prompt.md +16 -0
  30. package/dist/templates/parallel-planner-with-review/template.json +1 -1
  31. package/dist/templates/parallel-planner-with-review/triage-prompt.md +5 -0
  32. package/dist/templates/parallel-planner-with-review/verify-triage.sh +19 -0
  33. package/dist/templates/sequential-reviewer/block-scope.sh +160 -0
  34. package/dist/templates/sequential-reviewer/handoff.sh +175 -0
  35. package/dist/templates/sequential-reviewer/implement-prompt.md +12 -46
  36. package/dist/templates/sequential-reviewer/main.mts +199 -103
  37. package/dist/templates/sequential-reviewer/review-prompt.md +11 -49
  38. package/dist/templates/sequential-reviewer/select-issues.mjs +788 -0
  39. package/dist/templates/sequential-reviewer/setup.sh +51 -0
  40. package/dist/templates/sequential-reviewer/template.json +1 -1
  41. package/dist/templates/sequential-reviewer/triage-prompt.md +5 -0
  42. package/dist/templates/sequential-reviewer/verify-triage.sh +19 -0
  43. package/dist/templates/shared/block-scope.sh +160 -0
  44. package/dist/templates/shared/handoff.sh +175 -0
  45. package/dist/templates/shared/select-issues.mjs +788 -0
  46. package/dist/templates/shared/setup.sh +51 -0
  47. package/dist/templates/shared/triage-prompt.md +5 -0
  48. package/dist/templates/shared/verify-triage.sh +19 -0
  49. package/dist/templates/simple-loop/block-scope.sh +160 -0
  50. package/dist/templates/simple-loop/handoff.sh +175 -0
  51. package/dist/templates/simple-loop/main.mts +190 -45
  52. package/dist/templates/simple-loop/prompt.md +12 -46
  53. package/dist/templates/simple-loop/select-issues.mjs +788 -0
  54. package/dist/templates/simple-loop/setup.sh +51 -0
  55. package/dist/templates/simple-loop/template.json +1 -1
  56. package/dist/templates/simple-loop/triage-prompt.md +5 -0
  57. package/dist/templates/simple-loop/verify-triage.sh +19 -0
  58. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -78,7 +78,7 @@ var TEMPLATES = [
78
78
  },
79
79
  {
80
80
  name: "simple-loop",
81
- description: "Picks issues one by one and closes them"
81
+ description: "Implements standalone issues one by one and opens review PRs"
82
82
  },
83
83
  {
84
84
  name: "sequential-reviewer",
@@ -86,12 +86,12 @@ var TEMPLATES = [
86
86
  },
87
87
  {
88
88
  name: "parallel-planner",
89
- description: "Plans parallelizable issues, executes on separate branches, merges",
89
+ description: "Plans parallelizable issues, implements them, and opens review PRs",
90
90
  dependencies: ["zod"]
91
91
  },
92
92
  {
93
93
  name: "parallel-planner-with-review",
94
- description: "Plans parallelizable issues, executes with per-branch review, merges",
94
+ description: "Plans and implements parallel issues with per-branch review and PRs",
95
95
  dependencies: ["zod"]
96
96
  }
97
97
  ];
@@ -272,7 +272,7 @@ var ISSUE_TRACKER_REGISTRY = [
272
272
  envExample: `# GitHub personal access token \u2014 the agent uses it to read and manage GitHub Issues
273
273
  # Runner installation/start uses the host \`gh\` login for repository administration.
274
274
  # Create a fine-grained token: https://github.com/settings/personal-access-tokens/new
275
- # Required repository permissions: Issues (Read and write) and Metadata (Read)
275
+ # Required repository permissions: Contents, Issues, and Pull requests (Read and write); Metadata (Read)
276
276
  # Or leave blank and run: GH_TOKEN="$(gh auth token)" npx shipyard run
277
277
  GH_TOKEN=
278
278
  # GitHub repository (owner/repository)
@@ -331,7 +331,7 @@ var copyTemplateFiles = (templateDir, destDir, mainFilename) => Effect.gen(funct
331
331
  const files = yield* fs.readDirectory(templateDir).pipe(Effect.mapError((e) => new Error(e.message)));
332
332
  yield* Effect.all(
333
333
  files.filter(
334
- (f) => f !== "template.json" && f !== ".env.example" && !COMPILED_FILE_EXTENSIONS.some((ext) => f.endsWith(ext))
334
+ (f) => f !== "template.json" && f !== ".env.example" && (f === "select-issues.mjs" || !COMPILED_FILE_EXTENSIONS.some((ext) => f.endsWith(ext)))
335
335
  ).map((f) => {
336
336
  const destName = f === "main.mts" ? mainFilename : f;
337
337
  return fs.copyFile(join(templateDir, f), join(destDir, destName)).pipe(Effect.mapError((e) => new Error(e.message)));
@@ -1527,8 +1527,8 @@ var requireRunnerContext = async (repoDir, adapters) => {
1527
1527
  repoDir,
1528
1528
  repository,
1529
1529
  // The published workflow is an administrative runner preflight. Keep
1530
- // it on the host's gh login instead of the issue-agent token from
1531
- // .shipyard/.env, which intentionally only needs issue permissions.
1530
+ // it on the host's gh login instead of the runtime token from
1531
+ // .shipyard/.env, which has no runner administration permission.
1532
1532
  environment: hostEnvironment
1533
1533
  },
1534
1534
  adapters
@@ -2259,7 +2259,7 @@ var runnerCommand = Command.make(
2259
2259
  purgeRunnerCommand
2260
2260
  ])
2261
2261
  );
2262
- var VERSION = "0.5.0" ;
2262
+ var VERSION = "0.6.0" ;
2263
2263
 
2264
2264
  // src/cli.ts
2265
2265
  var imageNameOption = Options.text("image-name").pipe(
@@ -2728,13 +2728,49 @@ var initCommand = Command.make(
2728
2728
  selectedTemplate = selected;
2729
2729
  }
2730
2730
  if (selectedIssueTracker.name === "github-issues") {
2731
- yield* Effect.try({
2732
- try: () => execSync(
2733
- `gh label create "${ACTIVATION_LABEL}" --description "Issues for ${PRODUCT_NAME} to work on" --color "F9A825" --force 2>/dev/null`,
2734
- { cwd, stdio: "ignore" }
2735
- ),
2736
- catch: () => void 0
2737
- }).pipe(Effect.ignore);
2731
+ const failedLabels = [];
2732
+ for (const [name, description, color] of [
2733
+ [ACTIVATION_LABEL, `Issues for ${PRODUCT_NAME} to work on`, "F9A825"],
2734
+ ["bug", "Something is broken", "D73A4A"],
2735
+ ["enhancement", "New feature or improvement", "A2EEEF"],
2736
+ ["needs-triage", "Maintainer evaluation needed", "FBCA04"],
2737
+ ["needs-info", "Waiting for reporter information", "D4C5F9"],
2738
+ ["ready-for-agent", "Ready for agent implementation", "0E8A16"],
2739
+ ["ready-for-human", "Requires human implementation", "1D76DB"],
2740
+ ["wontfix", "Will not be actioned", "FFFFFF"],
2741
+ ["shipyard:blocked", "Shipyard work needs intervention", "B60205"],
2742
+ ["shipyard:pending", "Shipyard is working on this ticket", "1D76DB"],
2743
+ [
2744
+ "shipyard:complete",
2745
+ "Shipyard work ready for human review",
2746
+ "0E8A16"
2747
+ ],
2748
+ [
2749
+ "shipyard:outstanding-tasks",
2750
+ "Spec has uncompleted tickets",
2751
+ "FBCA04"
2752
+ ]
2753
+ ]) {
2754
+ try {
2755
+ execSync(
2756
+ `gh label create "${name}" --description "${description}" --color "${color}" --force`,
2757
+ { cwd, stdio: "ignore" }
2758
+ );
2759
+ } catch {
2760
+ failedLabels.push(name);
2761
+ }
2762
+ }
2763
+ if (failedLabels.length) {
2764
+ let connected = Boolean(process.env.GH_REPO);
2765
+ try {
2766
+ execSync("git remote get-url origin", { cwd, stdio: "ignore" });
2767
+ connected = true;
2768
+ } catch {
2769
+ }
2770
+ const message = `Could not create GitHub labels: ${failedLabels.join(", ")}. Check GitHub access and rerun init.`;
2771
+ if (connected) yield* Effect.fail(new InitError({ message }));
2772
+ console.warn(message);
2773
+ }
2738
2774
  }
2739
2775
  yield* d.spinner(
2740
2776
  `Scaffolding ${CONFIG_DIR}/ config directory...`,