@renaiss-shipflow/cli 0.21.0 → 0.22.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.
@@ -0,0 +1,11 @@
1
+ import type { Command } from "commander";
2
+ /**
3
+ * `renaiss-shipflow priorities` — read the standing priorities doc the loop
4
+ * consults at intake (issue #211 slice 1). Purely local (repo file, no API):
5
+ * parses `docs/PRIORITIES.md` and prints the ordered greenlit work classes +
6
+ * WIP shares. The doc is human-edited ONLY — this command (and the loop) never
7
+ * writes it. `found: false` / an empty class list means there is no standing
8
+ * policy: intake escalates product-priority sign-off exactly as before.
9
+ */
10
+ export declare function registerPrioritiesCommand(program: Command): void;
11
+ //# sourceMappingURL=priorities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.d.ts","sourceRoot":"","sources":["../../src/commands/priorities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuBhE"}
@@ -0,0 +1,37 @@
1
+ import { emit, runAction } from "./helpers.js";
2
+ import { loadPrioritiesDoc, PRIORITIES_DOC_RELPATH } from "../priorities.js";
3
+ import { renderTable } from "../term-render.js";
4
+ /**
5
+ * `renaiss-shipflow priorities` — read the standing priorities doc the loop
6
+ * consults at intake (issue #211 slice 1). Purely local (repo file, no API):
7
+ * parses `docs/PRIORITIES.md` and prints the ordered greenlit work classes +
8
+ * WIP shares. The doc is human-edited ONLY — this command (and the loop) never
9
+ * writes it. `found: false` / an empty class list means there is no standing
10
+ * policy: intake escalates product-priority sign-off exactly as before.
11
+ */
12
+ export function registerPrioritiesCommand(program) {
13
+ program
14
+ .command("priorities")
15
+ .description(`Standing priorities doc (${PRIORITIES_DOC_RELPATH}) consulted at loop intake — greenlit work classes + WIP share (human-edited only)`)
16
+ .option("--json", "Output the parsed doc as JSON")
17
+ .action(runAction(async (opts) => {
18
+ const doc = loadPrioritiesDoc();
19
+ emit(opts, doc, () => {
20
+ if (!doc.found) {
21
+ console.log(`No standing priorities doc at ${PRIORITIES_DOC_RELPATH} — loop intake escalates product-priority sign-off as before.`);
22
+ return;
23
+ }
24
+ if (doc.warning) {
25
+ console.log(`⚠️ ${doc.warning}`);
26
+ console.log(` ${doc.path}`);
27
+ return;
28
+ }
29
+ console.log(`📋 Standing priorities — ${doc.classes.length} greenlit work class(es) (${PRIORITIES_DOC_RELPATH}, human-edited only)`);
30
+ const rows = doc.classes.map((c) => [String(c.rank), c.workClass, c.wipShare, c.notes]);
31
+ for (const l of renderTable(["#", "Work class", "WIP share", "Notes"], rows))
32
+ console.log(` ${l}`);
33
+ console.log("\nGreenlit class + normal slice → intake may proceed; deploy-blast-radius work ALWAYS needs per-item sign-off; off-doc work escalates as today (#211).");
34
+ }, { pretty: true });
35
+ }));
36
+ }
37
+ //# sourceMappingURL=priorities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.js","sourceRoot":"","sources":["../../src/commands/priorities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,4BAA4B,sBAAsB,oFAAoF,CAAC;SACnJ,MAAM,CAAC,QAAQ,EAAE,+BAA+B,CAAC;SACjD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACnD,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,iCAAiC,sBAAsB,+DAA+D,CAAC,CAAC;gBACpI,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,OAAO,CAAC,MAAM,6BAA6B,sBAAsB,sBAAsB,CAAC,CAAC;YACrI,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACxF,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpG,OAAO,CAAC,GAAG,CAAC,wJAAwJ,CAAC,CAAC;QACxK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC,CAAC;AACR,CAAC"}
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ import { registerIssuesCommand } from "./commands/issues.js";
16
16
  import { registerIssueCommand } from "./commands/issue.js";
17
17
  import { registerInboxCommand } from "./commands/inbox.js";
18
18
  import { registerFeaturesCommand } from "./commands/features.js";
19
+ import { registerPrioritiesCommand } from "./commands/priorities.js";
19
20
  import { registerConfigCommand } from "./commands/config.js";
20
21
  import { registerClaimsCommand } from "./commands/claims.js";
21
22
  import { registerPRCommand } from "./commands/pr.js";
@@ -55,6 +56,7 @@ registerIssuesCommand(program);
55
56
  registerIssueCommand(program);
56
57
  registerInboxCommand(program);
57
58
  registerFeaturesCommand(program);
59
+ registerPrioritiesCommand(program);
58
60
  registerConfigCommand(program);
59
61
  registerClaimsCommand(program);
60
62
  registerPRCommand(program);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /** Repo-relative location fixed by the owner decision on #211. */
2
+ export declare const PRIORITIES_DOC_RELPATH = "docs/PRIORITIES.md";
3
+ export interface WorkClass {
4
+ /** 1-based rank — the doc's ordered list position (first cell). */
5
+ rank: number;
6
+ /** The work-class name, e.g. "Bug fixes". */
7
+ workClass: string;
8
+ /** WIP share as written in the doc (e.g. "50%"), or "" when the cell is empty. */
9
+ wipShare: string;
10
+ /** Free-form notes cell, "" when absent. */
11
+ notes: string;
12
+ }
13
+ export interface PrioritiesDoc {
14
+ found: boolean;
15
+ /** Absolute path checked (present whether or not the file exists). */
16
+ path: string;
17
+ /** Ordered greenlit work classes; empty when not found or no table parsed. */
18
+ classes: WorkClass[];
19
+ /** Set when the file exists but no work-class table row parsed — the
20
+ * reviewer must treat this exactly like `found: false` (off-doc). */
21
+ warning?: string;
22
+ }
23
+ /**
24
+ * Parse the ordered work-class table out of the doc's markdown.
25
+ *
26
+ * Schema (owner decision, #211): a plain ordered list + WIP share, kept as the
27
+ * first markdown table whose header row contains a "work class" column:
28
+ *
29
+ * | # | Work class | WIP share | Notes |
30
+ *
31
+ * Rows with a non-numeric first cell are skipped (they're prose in a table,
32
+ * not a ranked class). Pure — no fs/git — so tests feed it strings.
33
+ */
34
+ export declare function parseWorkClasses(markdown: string): WorkClass[];
35
+ /** Resolve the repo root for the doc lookup; falls back to cwd outside a repo. */
36
+ export declare function repoRoot(): string;
37
+ /** Load + parse the standing priorities doc from the repo root. */
38
+ export declare function loadPrioritiesDoc(root?: string): PrioritiesDoc;
39
+ //# sourceMappingURL=priorities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.d.ts","sourceRoot":"","sources":["../src/priorities.ts"],"names":[],"mappings":"AAiBA,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB;yEACqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CA6B9D;AAED,kFAAkF;AAClF,wBAAgB,QAAQ,IAAI,MAAM,CAQjC;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAmB,GAAG,aAAa,CAa1E"}
@@ -0,0 +1,98 @@
1
+ // Standing priorities doc — parser for `docs/PRIORITIES.md` (issue #211 slice 1).
2
+ //
3
+ // The doc is the owner's standing product-priority policy: a plain ordered
4
+ // work-class list + WIP share, human-edited ONLY (the loop never writes it),
5
+ // versioned by git history — no extra machinery. `renaiss-shipflow priorities`
6
+ // reads and parses it so loop intake consults one deterministic surface instead
7
+ // of escalating per-epic sign-off for greenlit work classes.
8
+ //
9
+ // This module is a dumb reader on purpose: the intake SEMANTICS (auto-proceed
10
+ // on greenlit classes for normal slices; NEVER for deploy-blast-radius work;
11
+ // off-doc work escalates as today) live in the doc itself and in
12
+ // skills/shipflow/references/loop-reviewer.md Mode 1 — not in code.
13
+ import { existsSync, readFileSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { _exec } from "./sh.js";
16
+ /** Repo-relative location fixed by the owner decision on #211. */
17
+ export const PRIORITIES_DOC_RELPATH = "docs/PRIORITIES.md";
18
+ /** Split one `| a | b | c |` markdown row into trimmed cells. */
19
+ function tableCells(line) {
20
+ const t = line.trim();
21
+ if (!t.startsWith("|") || !t.endsWith("|") || t.length < 2)
22
+ return null;
23
+ return t.slice(1, -1).split("|").map((c) => c.trim());
24
+ }
25
+ const isDividerRow = (cells) => cells.every((c) => /^:?-{3,}:?$/.test(c));
26
+ /**
27
+ * Parse the ordered work-class table out of the doc's markdown.
28
+ *
29
+ * Schema (owner decision, #211): a plain ordered list + WIP share, kept as the
30
+ * first markdown table whose header row contains a "work class" column:
31
+ *
32
+ * | # | Work class | WIP share | Notes |
33
+ *
34
+ * Rows with a non-numeric first cell are skipped (they're prose in a table,
35
+ * not a ranked class). Pure — no fs/git — so tests feed it strings.
36
+ */
37
+ export function parseWorkClasses(markdown) {
38
+ const lines = markdown.split("\n");
39
+ let inTable = false;
40
+ const classes = [];
41
+ for (const line of lines) {
42
+ const cells = tableCells(line);
43
+ if (!cells) {
44
+ // A non-table line after rows were collected ends the (single) table.
45
+ if (inTable && classes.length)
46
+ break;
47
+ inTable = false;
48
+ continue;
49
+ }
50
+ if (!inTable) {
51
+ if (cells.some((c) => c.toLowerCase().replace(/\s+/g, " ").includes("work class")))
52
+ inTable = true;
53
+ continue;
54
+ }
55
+ if (isDividerRow(cells))
56
+ continue;
57
+ // Strict digits-only rank: parseInt would misread garbage like "5x" as 5,
58
+ // silently admitting a malformed row instead of skipping it.
59
+ const rawRank = cells[0] ?? "";
60
+ if (!/^\d+$/.test(rawRank))
61
+ continue;
62
+ classes.push({
63
+ rank: Number.parseInt(rawRank, 10),
64
+ workClass: cells[1] ?? "",
65
+ wipShare: cells[2] ?? "",
66
+ notes: cells[3] ?? "",
67
+ });
68
+ }
69
+ return classes;
70
+ }
71
+ /** Resolve the repo root for the doc lookup; falls back to cwd outside a repo. */
72
+ export function repoRoot() {
73
+ try {
74
+ return _exec("git rev-parse --show-toplevel", { stdio: ["ignore", "pipe", "ignore"] })
75
+ .toString()
76
+ .trim() || process.cwd();
77
+ }
78
+ catch {
79
+ return process.cwd();
80
+ }
81
+ }
82
+ /** Load + parse the standing priorities doc from the repo root. */
83
+ export function loadPrioritiesDoc(root = repoRoot()) {
84
+ const path = join(root, PRIORITIES_DOC_RELPATH);
85
+ if (!existsSync(path))
86
+ return { found: false, path, classes: [] };
87
+ const classes = parseWorkClasses(readFileSync(path, "utf8"));
88
+ if (!classes.length) {
89
+ return {
90
+ found: true,
91
+ path,
92
+ classes,
93
+ warning: "doc exists but no ordered work-class table parsed — treat as off-doc (escalate as today)",
94
+ };
95
+ }
96
+ return { found: true, path, classes };
97
+ }
98
+ //# sourceMappingURL=priorities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.js","sourceRoot":"","sources":["../src/priorities.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renaiss-shipflow/cli",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "CLI tool for RenaissShipFlow - AI-powered project management automation",
5
5
  "type": "module",
6
6
  "bin": {