runward 0.14.0 → 0.14.2

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.
@@ -166,4 +166,13 @@ export async function checkCommand(opts) {
166
166
  console.log("\n" + status.warning(`${parts.join(" · ")}. No phase closes without its artifact — and, under --strict, without its CRITICAL/HIGH rules accounted for.`));
167
167
  process.exitCode = 1;
168
168
  }
169
+ // Transmission surface: name the next gesture, so the operating agent can hand the human a decision.
170
+ console.log(section("Next"));
171
+ if (gaps === 0 && strictGaps === 0 && hookFailed === 0) {
172
+ console.log(` Assemble the evidence pack with ${c.primary("runward compliance <regime>")} ${c.darkGray("(iso-42001 · nist-ai-rmf · eu-ai-act), or")} ${c.primary("runward status")} ${c.darkGray("for a handover snapshot.")}`);
173
+ }
174
+ else {
175
+ console.log(` Fill the deliverable(s) named above, then re-run ${c.primary("runward check")}. ${c.primary("runward status")} ${c.darkGray("names exactly what is open at the current gate.")}`);
176
+ }
177
+ console.log();
169
178
  }
@@ -5,7 +5,7 @@ import { TEMPLATES, MISSION_LAYOUT, VERSION, WORKFLOWS } from "../lib/paths.js";
5
5
  import { EXPECTED_RULES, EXPECTED_MAPPED, EXPECTED_ADAPTERS } from "../lib/constants.js";
6
6
  import { expectedRules } from "../lib/conformance.js";
7
7
  import { findMissionRoot } from "../lib/mission.js";
8
- import { createHeader, section, status } from "../lib/styles.js";
8
+ import { c, createHeader, section, status } from "../lib/styles.js";
9
9
  /**
10
10
  * Environment and installation checks.
11
11
  * Exit codes: 0 = all good, 1 = warnings, 2 = critical failure.
@@ -80,5 +80,10 @@ export async function doctorCommand() {
80
80
  }
81
81
  else
82
82
  console.log(" " + status.success("all checks passed"));
83
+ // Transmission surface: name the next gesture.
84
+ console.log(section("Next"));
85
+ console.log(" " + (root
86
+ ? `Run ${c.primary("runward check")} to see which gate this mission is at.`
87
+ : `Run ${c.primary("runward init")} to scaffold a mission, then ${c.primary("runward check")} to see where you stand.`));
83
88
  console.log();
84
89
  }
@@ -45,5 +45,9 @@ export async function updateCommand(opts) {
45
45
  }
46
46
  console.log(section("Summary"));
47
47
  console.log(` ${status.success(`${same} up to date`)} ${added ? status.info(`${added} added`) + " " : ""}${drifted ? status.warning(`${drifted} drifted${opts.force ? " (overwritten)" : ""}`) : ""}`);
48
- console.log(c.darkGray("\n Mission state (framing, architecture, ADRs, governance) is never touched by update.\n"));
48
+ console.log(c.darkGray("\n Mission state (framing, architecture, ADRs, governance) is never touched by update."));
49
+ // Transmission surface: name the next gesture.
50
+ console.log(section("Next"));
51
+ console.log(` Re-run ${c.primary("runward check")} to re-verify the gate against the refreshed rules and workflows.`);
52
+ console.log();
49
53
  }
package/dist/lib/tools.js CHANGED
@@ -46,11 +46,16 @@ const skillBody = (s) => [
46
46
  "This skill helps you *apply* the rules; it does not enforce them. `runward check --strict` is the sole authority and verifies the manifest deterministically. A rule surfaced here but not accounted for still fails the gate.",
47
47
  "",
48
48
  ].join("\n");
49
+ /** A YAML-safe double-quoted scalar. The description embeds the `when` trigger, which carries
50
+ * colons (and apostrophes) — left bare, a spec-conformant YAML parser (PyYAML safe_load,
51
+ * js-yaml) rejects the frontmatter, even though today's lenient line-based harness readers
52
+ * tolerate it. Double quotes take colons and apostrophes without escaping. */
53
+ const yamlStr = (v) => `"${v.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
49
54
  /** SKILL.md open-format: name + description (the relevance trigger) + body. */
50
55
  const skillMd = (s) => [
51
56
  "---",
52
57
  `name: runward-${s.phase}`,
53
- `description: Runward ${s.label} craft rules. Use when ${s.when}.`,
58
+ `description: ${yamlStr(`Runward ${s.label} craft rules. Use when ${s.when}.`)}`,
54
59
  "---",
55
60
  "",
56
61
  skillBody(s),
@@ -110,7 +115,7 @@ export const TOOL_PROFILES = [
110
115
  label: "Continue.dev (.continue/rules/runward-*)",
111
116
  files: (root) => PHASE_SKILLS.map((s) => ({
112
117
  path: join(root, ".continue", "rules", `runward-${s.phase}.md`),
113
- content: ["---", `name: Runward ${s.label} craft`, `description: Use when ${s.when}.`, "alwaysApply: false", "---", "", skillBody(s)].join("\n"),
118
+ content: ["---", `name: ${yamlStr(`Runward ${s.label} craft`)}`, `description: ${yamlStr(`Use when ${s.when}.`)}`, "alwaysApply: false", "---", "", skillBody(s)].join("\n"),
114
119
  })),
115
120
  },
116
121
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runward",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "After the spec: ship and run. A delivery framework for agentic systems — floor first, evolution on evidence, governance from day zero, handover with proof.",
5
5
  "keywords": [
6
6
  "agentic",
@@ -49,6 +49,7 @@
49
49
  "@types/node": "^22.0.0",
50
50
  "ajv": "^8.20.0",
51
51
  "ajv-formats": "^3.0.1",
52
+ "js-yaml": "^5.2.1",
52
53
  "typescript": "^5.5.0"
53
54
  }
54
55
  }