@caseyharalson/orrery 0.14.3 → 0.15.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.
@@ -1,9 +1,11 @@
1
1
  ---
2
2
  name: discovery
3
3
  description: >
4
- Create executable plans for building systems, features, or modules. Use for
5
- planning requests, architectural decisions, or when decomposing big ideas
6
- into concrete implementation steps.
4
+ Author an orrery plan a YAML file under the orrery plans directory that
5
+ the orrery CLI executes step-by-step. Use ONLY when the user explicitly
6
+ asks to create an orrery plan (e.g., "make an orrery plan", "use orrery
7
+ discovery", "/discovery"). Do NOT use for general planning, architectural
8
+ discussion, or decomposing ideas unless the output is an orrery plan file.
7
9
  hooks:
8
10
  PostToolUse:
9
11
  - matcher: "Write"
@@ -1,7 +1,10 @@
1
1
  ---
2
2
  name: orrery-execute
3
3
  description: >
4
- Write or modify code according to a plan step. Handle implementation.
4
+ Implement a single step from an orrery plan (YAML file under the orrery
5
+ plans directory) when invoked by the orrery orchestrator. Do NOT use for
6
+ general coding, bug fixes, or implementation work outside of an orrery
7
+ plan run.
5
8
  user-invocable: false
6
9
  ---
7
10
 
@@ -1,9 +1,11 @@
1
1
  ---
2
2
  name: orrery-report
3
3
  description: >
4
- Final reporting phase for the orrery workflow. Outputs structured JSON
5
- summarizing execution results, test outcomes, and status. Use after
6
- orrery-verify completes or when reporting blocked status.
4
+ Final reporting phase for a single step of an orrery plan, invoked by the
5
+ orrery orchestrator after orrery-verify completes (or when reporting blocked
6
+ status). Outputs structured JSON consumed by the orrery orchestrator. Do
7
+ NOT use for general status summaries or reports outside of an orrery plan
8
+ run.
7
9
  user-invocable: false
8
10
  ---
9
11
 
@@ -1,7 +1,10 @@
1
1
  ---
2
2
  name: orrery-review
3
3
  description: >
4
- Review code changes after each step execution and provide structured feedback.
4
+ Review changes made for a single step of an orrery plan (YAML file under
5
+ the orrery plans directory) when invoked by the orrery orchestrator, and
6
+ produce structured feedback for the editor agent. Do NOT use for general
7
+ code review outside of an orrery plan run.
5
8
  user-invocable: false
6
9
  ---
7
10
 
@@ -1,9 +1,11 @@
1
1
  ---
2
2
  name: orrery-verify
3
3
  description: >
4
- Run tests, linting, and validation to verify changes work correctly.
5
- Use after implementation to check acceptance criteria, run test suites,
6
- and ensure nothing is broken.
4
+ Verify a single step from an orrery plan (YAML file under the orrery plans
5
+ directory) when invoked by the orrery orchestrator after orrery-execute.
6
+ Runs the plan step's acceptance criteria, tests, and linting. Do NOT use
7
+ for general test runs, linting, or verification work outside of an orrery
8
+ plan run.
7
9
  user-invocable: false
8
10
  ---
9
11
 
@@ -1,10 +1,12 @@
1
1
  ---
2
2
  name: refine-plan
3
3
  description: >
4
- Analyze and improve an existing plan file. Reviews plan structure, dependencies,
5
- context quality, and acceptance criteria, then implements improvements directly.
6
- Requires a plan file argument (e.g., /refine-plan my-plan.yaml).
7
- Run `orrery plans-dir` to find the plans directory.
4
+ Analyze and improve an existing orrery plan (YAML file under the orrery
5
+ plans directory). Reviews plan structure, dependencies, context quality,
6
+ and acceptance criteria, then edits the plan file directly. Use ONLY when
7
+ the user explicitly asks to refine an orrery plan and provides a plan file
8
+ argument (e.g., /refine-plan my-plan.yaml). Run `orrery plans-dir` to find
9
+ the plans directory. Do NOT use for general plan or design-doc review.
8
10
  hooks:
9
11
  PostToolUse:
10
12
  - matcher: "Write"
@@ -1,10 +1,12 @@
1
1
  ---
2
2
  name: simulate-plan
3
3
  description: >
4
- Explore a plan through conversational dialogue before committing to execution.
5
- Requires a plan file argument (e.g., /simulate-plan my-plan.yaml, /simulate-plan my-plan).
6
- Run `orrery plans-dir` to find the plans directory.
7
- Ask "what if" questions, trace dependencies, and build intuition about what you're building.
4
+ Explore an existing orrery plan (YAML file under the orrery plans directory)
5
+ through conversational dialogue before committing to execution. Use ONLY
6
+ when the user explicitly asks to simulate an orrery plan and provides a
7
+ plan file argument (e.g., /simulate-plan my-plan.yaml, /simulate-plan
8
+ my-plan). Run `orrery plans-dir` to find the plans directory. Do NOT use
9
+ for general "what if" brainstorming outside of an orrery plan.
8
10
  ---
9
11
 
10
12
  # Simulate Skill
@@ -27,8 +27,8 @@ function colorize(text, color) {
27
27
  }
28
28
 
29
29
  function getPlanStatus(plan) {
30
- if (plan.isSuccessful()) return "complete";
31
- if (plan.steps.some((step) => step.status === "blocked")) return "blocked";
30
+ if (plan.isComplete()) return "complete";
31
+ if (plan.hasBlockedSteps()) return "blocked";
32
32
  if (plan.steps.some((step) => step.status === "in_progress")) {
33
33
  return "in_progress";
34
34
  }
@@ -469,7 +469,7 @@ async function orchestrate(options = {}) {
469
469
  normalizedOptions.onComplete
470
470
  );
471
471
 
472
- if (result.isComplete && result.isSuccessful) {
472
+ if (result.isComplete) {
473
473
  // Plan completed successfully - return to source branch for next plan
474
474
  const currentBranch = getCurrentBranch(REPO_ROOT);
475
475
  if (currentBranch !== sourceBranch) {
@@ -601,20 +601,19 @@ async function resumeInWorktree(
601
601
  );
602
602
  logPullRequestInfo(prInfo);
603
603
 
604
- const isSuccessful = plan.isSuccessful();
605
604
  runOnCompleteHook(
606
605
  onComplete,
607
606
  {
608
607
  planName: planFileName,
609
608
  planFile,
610
- outcome: isSuccessful ? "success" : "partial",
609
+ outcome: "success",
611
610
  workBranch: plan.metadata.work_branch || "",
612
611
  sourceBranch,
613
612
  prUrl: prInfo.url || "",
614
613
  stepsTotal: plan.steps.length,
615
614
  stepsCompleted: plan.steps.filter((s) => s.status === "complete")
616
615
  .length,
617
- stepsBlocked: plan.steps.filter((s) => s.status === "blocked").length
616
+ stepsBlocked: 0
618
617
  },
619
618
  worktreePath
620
619
  );
@@ -830,13 +829,12 @@ async function handleResumeMode(
830
829
  const prInfo = createPullRequest(prTitle, prBody, sourceBranch, REPO_ROOT);
831
830
  logPullRequestInfo(prInfo);
832
831
 
833
- const isSuccessful = matchingPlan.isSuccessful();
834
832
  runOnCompleteHook(
835
833
  onComplete,
836
834
  {
837
835
  planName: planFileName,
838
836
  planFile: matchingPlanFile,
839
- outcome: isSuccessful ? "success" : "partial",
837
+ outcome: "success",
840
838
  workBranch: matchingPlan.metadata.work_branch || currentBranch,
841
839
  sourceBranch,
842
840
  prUrl: prInfo.url || "",
@@ -844,8 +842,7 @@ async function handleResumeMode(
844
842
  stepsCompleted: matchingPlan.steps.filter(
845
843
  (s) => s.status === "complete"
846
844
  ).length,
847
- stepsBlocked: matchingPlan.steps.filter((s) => s.status === "blocked")
848
- .length
845
+ stepsBlocked: 0
849
846
  },
850
847
  REPO_ROOT
851
848
  );
@@ -1014,8 +1011,6 @@ async function processPlanInWorktree(normalizedOptions) {
1014
1011
  const isComplete = plan.isComplete();
1015
1012
 
1016
1013
  if (isComplete) {
1017
- const isSuccessful = plan.isSuccessful();
1018
-
1019
1014
  // Archive the plan
1020
1015
  archivePlan(resolvedPlanFile, plan, completedDir);
1021
1016
 
@@ -1046,14 +1041,14 @@ async function processPlanInWorktree(normalizedOptions) {
1046
1041
  {
1047
1042
  planName: planFileName,
1048
1043
  planFile: resolvedPlanFile,
1049
- outcome: isSuccessful ? "success" : "partial",
1044
+ outcome: "success",
1050
1045
  workBranch,
1051
1046
  sourceBranch,
1052
1047
  prUrl: prInfo.url || "",
1053
1048
  stepsTotal: plan.steps.length,
1054
1049
  stepsCompleted: plan.steps.filter((s) => s.status === "complete")
1055
1050
  .length,
1056
- stepsBlocked: plan.steps.filter((s) => s.status === "blocked").length
1051
+ stepsBlocked: 0
1057
1052
  },
1058
1053
  worktreePath
1059
1054
  );
@@ -1066,11 +1061,7 @@ async function processPlanInWorktree(normalizedOptions) {
1066
1061
  console.error(`Failed to clean up worktree: ${err.message}`);
1067
1062
  }
1068
1063
 
1069
- if (isSuccessful) {
1070
- console.log("\n=== Plan Complete (success) ===");
1071
- } else {
1072
- console.log("\n=== Plan Complete (partial — some steps blocked) ===");
1073
- }
1064
+ console.log("\n=== Plan Complete (success) ===");
1074
1065
  } else {
1075
1066
  // Plan not complete — commit WIP and preserve worktree
1076
1067
  const progressCommit = commit(
@@ -1124,7 +1115,7 @@ async function processPlanInWorktree(normalizedOptions) {
1124
1115
  * @param {string} completedDir - Directory for completed plans
1125
1116
  * @param {string} reportsDir - Directory for reports
1126
1117
  * @param {boolean} parallelEnabled - Whether parallel execution with worktrees is enabled
1127
- * @returns {Promise<{isComplete: boolean, isSuccessful: boolean, workBranch: string}>}
1118
+ * @returns {Promise<{isComplete: boolean, workBranch: string}>}
1128
1119
  */
1129
1120
  async function processPlanWithBranching(
1130
1121
  planFile,
@@ -1178,8 +1169,6 @@ async function processPlanWithBranching(
1178
1169
  const isComplete = plan.isComplete();
1179
1170
 
1180
1171
  if (isComplete) {
1181
- const isSuccessful = plan.isSuccessful();
1182
-
1183
1172
  // Step 6: Archive the plan (on work branch)
1184
1173
  archivePlan(planFile, plan, completedDir);
1185
1174
 
@@ -1204,19 +1193,19 @@ async function processPlanWithBranching(
1204
1193
  {
1205
1194
  planName: planFileName,
1206
1195
  planFile,
1207
- outcome: isSuccessful ? "success" : "partial",
1196
+ outcome: "success",
1208
1197
  workBranch,
1209
1198
  sourceBranch,
1210
1199
  prUrl: prInfo.url || "",
1211
1200
  stepsTotal: plan.steps.length,
1212
1201
  stepsCompleted: plan.steps.filter((s) => s.status === "complete")
1213
1202
  .length,
1214
- stepsBlocked: plan.steps.filter((s) => s.status === "blocked").length
1203
+ stepsBlocked: 0
1215
1204
  },
1216
1205
  REPO_ROOT
1217
1206
  );
1218
1207
 
1219
- return { isComplete: true, isSuccessful, workBranch };
1208
+ return { isComplete: true, workBranch };
1220
1209
  } else {
1221
1210
  // Plan not complete (still has pending steps or was interrupted)
1222
1211
  // Commit any progress made
@@ -1250,7 +1239,7 @@ async function processPlanWithBranching(
1250
1239
  "\nPlan not complete. Work branch preserved for later continuation."
1251
1240
  );
1252
1241
 
1253
- return { isComplete: false, isSuccessful: false, workBranch };
1242
+ return { isComplete: false, workBranch };
1254
1243
  }
1255
1244
  }
1256
1245
 
@@ -1291,26 +1280,15 @@ function logPullRequestInfo(prInfo) {
1291
1280
  */
1292
1281
  function generatePRBody(plan) {
1293
1282
  const steps = plan.steps || [];
1294
- const completed = steps.filter((s) => s.status === "complete").length;
1295
- const blocked = steps.filter((s) => s.status === "blocked").length;
1296
1283
  const total = steps.length;
1297
1284
 
1298
1285
  let body = `## Plan Summary\n\n`;
1299
- body += `- **Status:** ${plan.metadata.outcome === "success" ? "All steps complete" : "Partial (some steps blocked)"}\n`;
1300
- body += `- **Steps:** ${completed}/${total} complete`;
1301
- if (blocked > 0) {
1302
- body += `, ${blocked} blocked`;
1303
- }
1304
- body += `\n\n`;
1286
+ body += `- **Status:** All steps complete\n`;
1287
+ body += `- **Steps:** ${total}/${total} complete\n\n`;
1305
1288
 
1306
1289
  body += `## Steps\n\n`;
1307
1290
  for (const step of steps) {
1308
- const icon =
1309
- step.status === "complete" ? "x" : step.status === "blocked" ? "-" : " ";
1310
- body += `- [${icon}] **${step.id}**: ${step.description}\n`;
1311
- if (step.status === "blocked" && step.blocked_reason) {
1312
- body += ` - Blocked: ${step.blocked_reason}\n`;
1313
- }
1291
+ body += `- [x] **${step.id}**: ${step.description}\n`;
1314
1292
  }
1315
1293
 
1316
1294
  body += `\n---\n*Generated by Orrery*`;
@@ -2037,17 +2015,12 @@ function runOnCompleteHook(command, context, cwd) {
2037
2015
  * Archive a completed plan
2038
2016
  */
2039
2017
  function archivePlan(planFile, plan, completedDir) {
2040
- const success = plan.isSuccessful();
2041
- const status = success ? "SUCCESS" : "PARTIAL (some steps blocked)";
2042
-
2043
- // Add completion metadata
2044
2018
  plan.metadata.completed_at = new Date().toISOString();
2045
- plan.metadata.outcome = success ? "success" : "partial";
2019
+ plan.metadata.outcome = "success";
2046
2020
  savePlan(plan);
2047
2021
 
2048
- // Move to completed
2049
2022
  const destPath = movePlanToCompleted(planFile, completedDir);
2050
- console.log(`\nPlan archived: ${status}`);
2023
+ console.log(`\nPlan archived: SUCCESS`);
2051
2024
  console.log(` -> ${path.relative(REPO_ROOT, destPath)}`);
2052
2025
  }
2053
2026
 
@@ -52,21 +52,19 @@ function loadPlan(filePath) {
52
52
  },
53
53
 
54
54
  /**
55
- * Check if all steps are complete or blocked
55
+ * Check if all steps are complete
56
56
  * @returns {boolean}
57
57
  */
58
58
  isComplete() {
59
- return this.steps.every(
60
- (s) => s.status === "complete" || s.status === "blocked"
61
- );
59
+ return this.steps.every((s) => s.status === "complete");
62
60
  },
63
61
 
64
62
  /**
65
- * Check if all steps are complete (none blocked)
63
+ * Check if the plan has any blocked steps
66
64
  * @returns {boolean}
67
65
  */
68
- isSuccessful() {
69
- return this.steps.every((s) => s.status === "complete");
66
+ hasBlockedSteps() {
67
+ return this.steps.some((s) => s.status === "blocked");
70
68
  }
71
69
  };
72
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caseyharalson/orrery",
3
- "version": "0.14.3",
3
+ "version": "0.15.0",
4
4
  "description": "Workflow planning and orchestration CLI for AI agents",
5
5
  "license": "MIT",
6
6
  "author": "Casey Haralson",