@renaiss-shipflow/cli 0.18.0 → 0.19.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 (77) hide show
  1. package/dist/client.d.ts +4 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +10 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/claims.d.ts.map +1 -1
  6. package/dist/commands/claims.js +9 -4
  7. package/dist/commands/claims.js.map +1 -1
  8. package/dist/commands/config.d.ts.map +1 -1
  9. package/dist/commands/config.js +6 -3
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/features.d.ts.map +1 -1
  12. package/dist/commands/features.js +7 -4
  13. package/dist/commands/features.js.map +1 -1
  14. package/dist/commands/inbox.d.ts.map +1 -1
  15. package/dist/commands/inbox.js +23 -7
  16. package/dist/commands/inbox.js.map +1 -1
  17. package/dist/commands/issue.d.ts.map +1 -1
  18. package/dist/commands/issue.js +75 -17
  19. package/dist/commands/issue.js.map +1 -1
  20. package/dist/commands/issues.d.ts.map +1 -1
  21. package/dist/commands/issues.js +7 -4
  22. package/dist/commands/issues.js.map +1 -1
  23. package/dist/commands/pr.d.ts.map +1 -1
  24. package/dist/commands/pr.js +41 -6
  25. package/dist/commands/pr.js.map +1 -1
  26. package/dist/commands/profile.d.ts.map +1 -1
  27. package/dist/commands/profile.js +9 -9
  28. package/dist/commands/profile.js.map +1 -1
  29. package/dist/commands/regression.d.ts +2 -1
  30. package/dist/commands/regression.d.ts.map +1 -1
  31. package/dist/commands/regression.js +12 -2
  32. package/dist/commands/regression.js.map +1 -1
  33. package/dist/commands/repos.d.ts.map +1 -1
  34. package/dist/commands/repos.js +8 -5
  35. package/dist/commands/repos.js.map +1 -1
  36. package/dist/commands/stats.d.ts.map +1 -1
  37. package/dist/commands/stats.js +5 -3
  38. package/dist/commands/stats.js.map +1 -1
  39. package/dist/commands/status.d.ts.map +1 -1
  40. package/dist/commands/status.js +8 -2
  41. package/dist/commands/status.js.map +1 -1
  42. package/dist/commands/test.d.ts.map +1 -1
  43. package/dist/commands/test.js +3 -1
  44. package/dist/commands/test.js.map +1 -1
  45. package/dist/escalation-format.d.ts +9 -5
  46. package/dist/escalation-format.d.ts.map +1 -1
  47. package/dist/escalation-format.js +32 -9
  48. package/dist/escalation-format.js.map +1 -1
  49. package/dist/evidence.d.ts +4 -1
  50. package/dist/evidence.d.ts.map +1 -1
  51. package/dist/evidence.js +13 -1
  52. package/dist/evidence.js.map +1 -1
  53. package/dist/gh.d.ts +4 -0
  54. package/dist/gh.d.ts.map +1 -1
  55. package/dist/gh.js +8 -0
  56. package/dist/gh.js.map +1 -1
  57. package/dist/issue-order.d.ts +10 -0
  58. package/dist/issue-order.d.ts.map +1 -1
  59. package/dist/issue-order.js +14 -0
  60. package/dist/issue-order.js.map +1 -1
  61. package/dist/message-lint.d.ts +15 -0
  62. package/dist/message-lint.d.ts.map +1 -0
  63. package/dist/message-lint.js +64 -0
  64. package/dist/message-lint.js.map +1 -0
  65. package/dist/sh.d.ts +2 -0
  66. package/dist/sh.d.ts.map +1 -1
  67. package/dist/sh.js +15 -6
  68. package/dist/sh.js.map +1 -1
  69. package/dist/shipflow-contract-data.d.ts +6 -2
  70. package/dist/shipflow-contract-data.d.ts.map +1 -1
  71. package/dist/shipflow-contract-data.js +9 -5
  72. package/dist/shipflow-contract-data.js.map +1 -1
  73. package/dist/term-render.d.ts +15 -0
  74. package/dist/term-render.d.ts.map +1 -0
  75. package/dist/term-render.js +61 -0
  76. package/dist/term-render.js.map +1 -0
  77. package/package.json +1 -1
package/dist/sh.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sh.js","sourceRoot":"","sources":["../src/sh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEzD,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AACvE,2DAA2D;AAC3D,MAAM,CAAC,IAAI,KAAK,GAAoB,QAAQ,CAAC;AAC7C,MAAM,CAAC,IAAI,MAAM,GAAqB,SAAS,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,CAAkB,EAAE,IAAsB,SAAS;IAC1E,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU;IACxB,KAAK,GAAG,QAAQ,CAAC;IACjB,MAAM,GAAG,SAAS,CAAC;AACrB,CAAC;AAED;2DAC2D;AAC3D,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"sh.js","sourceRoot":"","sources":["../src/sh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEzD,yEAAyE;AACzE,2EAA2E;AAC3E,uEAAuE;AACvE,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhD,MAAM,YAAY,GAAG,CAAiE,OAAU,EAAE,EAAE,CAClG,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,OAAO,EAAE,CAAM,CAAC;AAE9E,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AACvE,2DAA2D;AAC3D,IAAI,QAAQ,GAAoB,QAAQ,CAAC;AACzC,IAAI,SAAS,GAAqB,SAAS,CAAC;AAC5C,MAAM,CAAC,IAAI,KAAK,GAAoB,CAAC,CAAC,GAAW,EAAE,OAAwC,EAAE,EAAE,CAC7F,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAoB,CAAC;AAC3D,MAAM,CAAC,IAAI,MAAM,GAAqB,CAAC,CAAC,GAAW,EAAE,IAAe,EAAE,OAAyC,EAAE,EAAE,CACjH,SAAS,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAqB,CAAC;AAEzE,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,CAAkB,EAAE,IAAsB,SAAS;IAC1E,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,CAAC,CAAC;AAChB,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU;IACxB,QAAQ,GAAG,QAAQ,CAAC;IACpB,SAAS,GAAG,SAAS,CAAC;AACxB,CAAC;AAED;2DAC2D;AAC3D,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AACzC,CAAC"}
@@ -6,7 +6,7 @@ export declare const SHIPFLOW_CONTRACT: {
6
6
  readonly values: readonly ["issue_triage", "commit_impact", "patch_notes", "regression_tests", "uat_tests", "weekly_summary", "planning_summary", "pr_notification", "pr_review", "bug_report_triage", "test_runner", "codebase_qa"];
7
7
  };
8
8
  readonly labels: {
9
- readonly $comment: "ShipFlow's GitHub label palette + the lifecycle label NAMES. `colors` maps a label name to its 6-hex color; ShipFlow owns these colors and BOTH the server's ensureLabels and the CLI's ghEnsureLabel source this ONE map (pre-contract they were byte-identical copies, so a color edit on one side flip-flopped the label). `prefixColors` colors open-ended label groups by name prefix. `names` are the lifecycle labels the code references by MEANING (claim / escalation / approval / reporter-review); every `names` value is also a `colors` key (parity-tested). Repaint/matching semantics stay per-consumer — only the literals are shared.";
9
+ readonly $comment: "ShipFlow's GitHub label palette + the lifecycle label NAMES. `colors` maps a label name to its 6-hex color; ShipFlow owns these colors and BOTH the server's ensureLabels and the CLI's ghEnsureLabel source this ONE map (pre-contract they were byte-identical copies, so a color edit on one side flip-flopped the label). `prefixColors` colors open-ended label groups by name prefix. `names` are the lifecycle labels the code references by MEANING (claim / escalation / approval / reporter-review / verify-failed); every `names` value is also a `colors` key (parity-tested). `verifyFailed` is applied by the post-deploy verifier when a PR's verification manifest has a failing assertion (issue #207) — it hooks the reporter ping and the follow-up auto-revert. Repaint/matching semantics stay per-consumer — only the literals are shared.";
10
10
  readonly colors: {
11
11
  readonly bug: "d73a4a";
12
12
  readonly enhancement: "a2eeef";
@@ -26,6 +26,7 @@ export declare const SHIPFLOW_CONTRACT: {
26
26
  readonly "shipflow-approved": "0e8a16";
27
27
  readonly "loop-proceed": "0e8a16";
28
28
  readonly "auto-qa": "5319e7";
29
+ readonly "verify-failed": "b60205";
29
30
  };
30
31
  readonly prefixColors: {
31
32
  readonly "category:": "5319e7";
@@ -35,15 +36,18 @@ export declare const SHIPFLOW_CONTRACT: {
35
36
  readonly needsReporterReview: "needs-reporter-review";
36
37
  readonly needsHuman: "needs-human";
37
38
  readonly shipflowApproved: "shipflow-approved";
39
+ readonly verifyFailed: "verify-failed";
38
40
  };
39
41
  };
40
42
  readonly markers: {
41
- readonly $comment: "Hidden issue-lifecycle markers + the escalation-banner literals. `triaged` is stamped on every ShipFlow-created issue so the issues.opened webhook suppresses the redundant AI Issue Triage pass (server domain.IssueAutoTriagedMarker + CLI ghIssueCreate). `loop` marks loop-progress comments — matched by the server's needs-human auto-unblock, written by the loop per the skill contract. `interpretationNote` is the deliberate-reinterpretation flag a worker embeds in a PR body when it ships an off-brief reading of the ask (issue #190): the CLI intent gate (`pr automerge`/`pr ready`, via packet.hasInterpretationSignal) treats its presence as a first-class merge blocker so the human reporter confirms before it reaches production, and the server companion pings the reporter on the resulting needs-reporter-review label. `escalationBannerEmoji` (🚧) is what the server matches with a LOOSE HasPrefix (legacy comments depend on it). `escalationBannerHeading` is the stricter prefix the CLI matches with startsWith AND the opening of the CLI's rendered banner; it MUST start with escalationBannerEmoji (parity-tested), so a CLI-posted banner always satisfies the server's loose match. Do NOT change these matching semantics — only the literals are single-sourced.";
43
+ readonly $comment: "Hidden issue-lifecycle markers + the escalation-banner literals. `triaged` is stamped on every ShipFlow-created issue so the issues.opened webhook suppresses the redundant AI Issue Triage pass (server domain.IssueAutoTriagedMarker + CLI ghIssueCreate). `loop` marks loop-progress comments — matched by the server's needs-human auto-unblock, written by the loop per the skill contract. `interpretationNote` is the deliberate-reinterpretation flag a worker embeds in a PR body when it ships an off-brief reading of the ask (issue #190): the CLI intent gate (`pr automerge`/`pr ready`, via packet.hasInterpretationSignal) treats its presence as a first-class merge blocker so the human reporter confirms before it reaches production, and the server companion pings the reporter on the resulting needs-reporter-review label. `escalationBannerEmoji` (🚧) is what the server matches with a LOOSE HasPrefix (legacy comments depend on it). `escalationBannerHeading` is the stricter prefix the CLI matches with startsWith AND the opening of the CLI's rendered banner; it MUST start with escalationBannerEmoji (parity-tested), so a CLI-posted banner always satisfies the server's loose match. `verificationManifestHeading` is the section heading text a PR author uses to declare post-deploy verification assertions (issue #207); the server matches it tolerantly (case-insensitive, ignoring leading `#` and trailing punctuation) to extract the manifest, then posts its verdict comment stamped with `verificationComment`. Do NOT change these matching semantics — only the literals are single-sourced.";
42
44
  readonly triaged: "<!-- shipflow:triaged -->";
43
45
  readonly loop: "<!-- shipflow:loop -->";
44
46
  readonly interpretationNote: "<!-- shipflow:interpretation -->";
45
47
  readonly escalationBannerEmoji: "🚧";
46
48
  readonly escalationBannerHeading: "🚧 **Needs a human**";
49
+ readonly verificationManifestHeading: "Verification manifest";
50
+ readonly verificationComment: "<!-- shipflow:verification -->";
47
51
  };
48
52
  readonly readability: {
49
53
  readonly $comment: "Deterministic message-readability cap shared across GitHub surfaces: any single line that renders UNFOLDED over this many words is dense prose, not a scannable point — its detail belongs in a folded section. Enforced by the server's readability.VisibleLineWordCap (PR review + triage rendering) and the CLI's ACTION_LINE_WORD_LIMIT (loop escalation lint). ~20-word sentences plus room for a code reference.";
@@ -1 +1 @@
1
- {"version":3,"file":"shipflow-contract-data.d.ts","sourceRoot":"","sources":["../src/shipflow-contract-data.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEpB,CAAC"}
1
+ {"version":3,"file":"shipflow-contract-data.d.ts","sourceRoot":"","sources":["../src/shipflow-contract-data.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoEpB,CAAC"}
@@ -23,7 +23,7 @@ export const SHIPFLOW_CONTRACT = {
23
23
  ]
24
24
  },
25
25
  "labels": {
26
- "$comment": "ShipFlow's GitHub label palette + the lifecycle label NAMES. `colors` maps a label name to its 6-hex color; ShipFlow owns these colors and BOTH the server's ensureLabels and the CLI's ghEnsureLabel source this ONE map (pre-contract they were byte-identical copies, so a color edit on one side flip-flopped the label). `prefixColors` colors open-ended label groups by name prefix. `names` are the lifecycle labels the code references by MEANING (claim / escalation / approval / reporter-review); every `names` value is also a `colors` key (parity-tested). Repaint/matching semantics stay per-consumer — only the literals are shared.",
26
+ "$comment": "ShipFlow's GitHub label palette + the lifecycle label NAMES. `colors` maps a label name to its 6-hex color; ShipFlow owns these colors and BOTH the server's ensureLabels and the CLI's ghEnsureLabel source this ONE map (pre-contract they were byte-identical copies, so a color edit on one side flip-flopped the label). `prefixColors` colors open-ended label groups by name prefix. `names` are the lifecycle labels the code references by MEANING (claim / escalation / approval / reporter-review / verify-failed); every `names` value is also a `colors` key (parity-tested). `verifyFailed` is applied by the post-deploy verifier when a PR's verification manifest has a failing assertion (issue #207) — it hooks the reporter ping and the follow-up auto-revert. Repaint/matching semantics stay per-consumer — only the literals are shared.",
27
27
  "colors": {
28
28
  "bug": "d73a4a",
29
29
  "enhancement": "a2eeef",
@@ -42,7 +42,8 @@ export const SHIPFLOW_CONTRACT = {
42
42
  "needs-human": "d93f0b",
43
43
  "shipflow-approved": "0e8a16",
44
44
  "loop-proceed": "0e8a16",
45
- "auto-qa": "5319e7"
45
+ "auto-qa": "5319e7",
46
+ "verify-failed": "b60205"
46
47
  },
47
48
  "prefixColors": {
48
49
  "category:": "5319e7"
@@ -51,16 +52,19 @@ export const SHIPFLOW_CONTRACT = {
51
52
  "inProgress": "🤖 in-progress",
52
53
  "needsReporterReview": "needs-reporter-review",
53
54
  "needsHuman": "needs-human",
54
- "shipflowApproved": "shipflow-approved"
55
+ "shipflowApproved": "shipflow-approved",
56
+ "verifyFailed": "verify-failed"
55
57
  }
56
58
  },
57
59
  "markers": {
58
- "$comment": "Hidden issue-lifecycle markers + the escalation-banner literals. `triaged` is stamped on every ShipFlow-created issue so the issues.opened webhook suppresses the redundant AI Issue Triage pass (server domain.IssueAutoTriagedMarker + CLI ghIssueCreate). `loop` marks loop-progress comments — matched by the server's needs-human auto-unblock, written by the loop per the skill contract. `interpretationNote` is the deliberate-reinterpretation flag a worker embeds in a PR body when it ships an off-brief reading of the ask (issue #190): the CLI intent gate (`pr automerge`/`pr ready`, via packet.hasInterpretationSignal) treats its presence as a first-class merge blocker so the human reporter confirms before it reaches production, and the server companion pings the reporter on the resulting needs-reporter-review label. `escalationBannerEmoji` (🚧) is what the server matches with a LOOSE HasPrefix (legacy comments depend on it). `escalationBannerHeading` is the stricter prefix the CLI matches with startsWith AND the opening of the CLI's rendered banner; it MUST start with escalationBannerEmoji (parity-tested), so a CLI-posted banner always satisfies the server's loose match. Do NOT change these matching semantics — only the literals are single-sourced.",
60
+ "$comment": "Hidden issue-lifecycle markers + the escalation-banner literals. `triaged` is stamped on every ShipFlow-created issue so the issues.opened webhook suppresses the redundant AI Issue Triage pass (server domain.IssueAutoTriagedMarker + CLI ghIssueCreate). `loop` marks loop-progress comments — matched by the server's needs-human auto-unblock, written by the loop per the skill contract. `interpretationNote` is the deliberate-reinterpretation flag a worker embeds in a PR body when it ships an off-brief reading of the ask (issue #190): the CLI intent gate (`pr automerge`/`pr ready`, via packet.hasInterpretationSignal) treats its presence as a first-class merge blocker so the human reporter confirms before it reaches production, and the server companion pings the reporter on the resulting needs-reporter-review label. `escalationBannerEmoji` (🚧) is what the server matches with a LOOSE HasPrefix (legacy comments depend on it). `escalationBannerHeading` is the stricter prefix the CLI matches with startsWith AND the opening of the CLI's rendered banner; it MUST start with escalationBannerEmoji (parity-tested), so a CLI-posted banner always satisfies the server's loose match. `verificationManifestHeading` is the section heading text a PR author uses to declare post-deploy verification assertions (issue #207); the server matches it tolerantly (case-insensitive, ignoring leading `#` and trailing punctuation) to extract the manifest, then posts its verdict comment stamped with `verificationComment`. Do NOT change these matching semantics — only the literals are single-sourced.",
59
61
  "triaged": "<!-- shipflow:triaged -->",
60
62
  "loop": "<!-- shipflow:loop -->",
61
63
  "interpretationNote": "<!-- shipflow:interpretation -->",
62
64
  "escalationBannerEmoji": "🚧",
63
- "escalationBannerHeading": "🚧 **Needs a human**"
65
+ "escalationBannerHeading": "🚧 **Needs a human**",
66
+ "verificationManifestHeading": "Verification manifest",
67
+ "verificationComment": "<!-- shipflow:verification -->"
64
68
  },
65
69
  "readability": {
66
70
  "$comment": "Deterministic message-readability cap shared across GitHub surfaces: any single line that renders UNFOLDED over this many words is dense prose, not a scannable point — its detail belongs in a folded section. Enforced by the server's readability.VisibleLineWordCap (PR review + triage rendering) and the CLI's ACTION_LINE_WORD_LIMIT (loop escalation lint). ~20-word sentences plus room for a code reference.",
@@ -1 +1 @@
1
- {"version":3,"file":"shipflow-contract-data.js","sourceRoot":"","sources":["../src/shipflow-contract-data.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,8EAA8E;AAC9E,yDAAyD;AACzD,6EAA6E;AAE7E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,UAAU,EAAE,iwCAAiwC;IAC7wC,SAAS,EAAE,CAAC;IACZ,eAAe,EAAE;QACf,UAAU,EAAE,0hBAA0hB;QACtiB,QAAQ,EAAE;YACR,cAAc;YACd,eAAe;YACf,aAAa;YACb,kBAAkB;YAClB,WAAW;YACX,gBAAgB;YAChB,kBAAkB;YAClB,iBAAiB;YACjB,WAAW;YACX,mBAAmB;YACnB,aAAa;YACb,aAAa;SACd;KACF;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,ynBAAynB;QACroB,QAAQ,EAAE;YACR,KAAK,EAAE,QAAQ;YACf,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,QAAQ;YACxB,iBAAiB,EAAE,QAAQ;YAC3B,eAAe,EAAE,QAAQ;YACzB,mBAAmB,EAAE,QAAQ;YAC7B,mBAAmB,EAAE,QAAQ;YAC7B,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,mBAAmB,EAAE,QAAQ;YAC7B,gBAAgB,EAAE,QAAQ;YAC1B,uBAAuB,EAAE,QAAQ;YACjC,aAAa,EAAE,QAAQ;YACvB,mBAAmB,EAAE,QAAQ;YAC7B,cAAc,EAAE,QAAQ;YACxB,SAAS,EAAE,QAAQ;SACpB;QACD,cAAc,EAAE;YACd,WAAW,EAAE,QAAQ;SACtB;QACD,OAAO,EAAE;YACP,YAAY,EAAE,gBAAgB;YAC9B,qBAAqB,EAAE,uBAAuB;YAC9C,YAAY,EAAE,aAAa;YAC3B,kBAAkB,EAAE,mBAAmB;SACxC;KACF;IACD,SAAS,EAAE;QACT,UAAU,EAAE,+uCAA+uC;QAC3vC,SAAS,EAAE,2BAA2B;QACtC,MAAM,EAAE,wBAAwB;QAChC,oBAAoB,EAAE,kCAAkC;QACxD,uBAAuB,EAAE,IAAI;QAC7B,yBAAyB,EAAE,sBAAsB;KAClD;IACD,aAAa,EAAE;QACb,UAAU,EAAE,wZAAwZ;QACpa,oBAAoB,EAAE,EAAE;KACzB;CACO,CAAC"}
1
+ {"version":3,"file":"shipflow-contract-data.js","sourceRoot":"","sources":["../src/shipflow-contract-data.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,8EAA8E;AAC9E,yDAAyD;AACzD,6EAA6E;AAE7E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,UAAU,EAAE,iwCAAiwC;IAC7wC,SAAS,EAAE,CAAC;IACZ,eAAe,EAAE;QACf,UAAU,EAAE,0hBAA0hB;QACtiB,QAAQ,EAAE;YACR,cAAc;YACd,eAAe;YACf,aAAa;YACb,kBAAkB;YAClB,WAAW;YACX,gBAAgB;YAChB,kBAAkB;YAClB,iBAAiB;YACjB,WAAW;YACX,mBAAmB;YACnB,aAAa;YACb,aAAa;SACd;KACF;IACD,QAAQ,EAAE;QACR,UAAU,EAAE,k0BAAk0B;QAC90B,QAAQ,EAAE;YACR,KAAK,EAAE,QAAQ;YACf,aAAa,EAAE,QAAQ;YACvB,SAAS,EAAE,QAAQ;YACnB,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,QAAQ;YACxB,iBAAiB,EAAE,QAAQ;YAC3B,eAAe,EAAE,QAAQ;YACzB,mBAAmB,EAAE,QAAQ;YAC7B,mBAAmB,EAAE,QAAQ;YAC7B,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;YAC1B,mBAAmB,EAAE,QAAQ;YAC7B,gBAAgB,EAAE,QAAQ;YAC1B,uBAAuB,EAAE,QAAQ;YACjC,aAAa,EAAE,QAAQ;YACvB,mBAAmB,EAAE,QAAQ;YAC7B,cAAc,EAAE,QAAQ;YACxB,SAAS,EAAE,QAAQ;YACnB,eAAe,EAAE,QAAQ;SAC1B;QACD,cAAc,EAAE;YACd,WAAW,EAAE,QAAQ;SACtB;QACD,OAAO,EAAE;YACP,YAAY,EAAE,gBAAgB;YAC9B,qBAAqB,EAAE,uBAAuB;YAC9C,YAAY,EAAE,aAAa;YAC3B,kBAAkB,EAAE,mBAAmB;YACvC,cAAc,EAAE,eAAe;SAChC;KACF;IACD,SAAS,EAAE;QACT,UAAU,EAAE,sjDAAsjD;QAClkD,SAAS,EAAE,2BAA2B;QACtC,MAAM,EAAE,wBAAwB;QAChC,oBAAoB,EAAE,kCAAkC;QACxD,uBAAuB,EAAE,IAAI;QAC7B,yBAAyB,EAAE,sBAAsB;QACjD,6BAA6B,EAAE,uBAAuB;QACtD,qBAAqB,EAAE,gCAAgC;KACxD;IACD,aAAa,EAAE;QACb,UAAU,EAAE,wZAAwZ;QACpa,oBAAoB,EAAE,EAAE;KACzB;CACO,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** 5-segment unicode gauge plus the exact ratio — "▰▰▰▱▱ 3/5" — so a count
2
+ * reads as a gauge, not a number the reader has to divide. Mirrors the
3
+ * server's progressMeter (dispatch_workflow.go): non-zero progress always
4
+ * lights at least one segment, and total <= 0 degrades to the plain count. */
5
+ export declare function meter(n: number, total: number): string;
6
+ /** Display width of a string in terminal columns. Zero-width joiners,
7
+ * variation selectors, and combining marks count 0; wide glyphs count 2
8
+ * (see isWide). `.length` counts UTF-16 code units instead and misaligns
9
+ * emoji cells: "⏳" is length 1 but 2 columns, "✏️" length 3 but 2 columns. */
10
+ export declare function displayWidth(s: string): number;
11
+ /** Padded-column terminal table: header line, rule, one line per row. Column
12
+ * width = widest cell in that column, measured in display columns so emoji
13
+ * status cells stay aligned; short rows render missing cells empty. */
14
+ export declare function renderTable(headers: string[], rows: string[][]): string[];
15
+ //# sourceMappingURL=term-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"term-render.d.ts","sourceRoot":"","sources":["../src/term-render.ts"],"names":[],"mappings":"AAIA;;;+EAG+E;AAC/E,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOtD;AAmBD;;;+EAG+E;AAC/E,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAQD;;wEAEwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAKzE"}
@@ -0,0 +1,61 @@
1
+ // Pure terminal-rendering helpers for the CLI's human (non-`--json`) output.
2
+ // Graphical-first: a meter or an aligned table is judged in a glance where a
3
+ // prose line has to be read. No I/O, no deps — callers print the lines.
4
+ /** 5-segment unicode gauge plus the exact ratio — "▰▰▰▱▱ 3/5" — so a count
5
+ * reads as a gauge, not a number the reader has to divide. Mirrors the
6
+ * server's progressMeter (dispatch_workflow.go): non-zero progress always
7
+ * lights at least one segment, and total <= 0 degrades to the plain count. */
8
+ export function meter(n, total) {
9
+ if (total <= 0)
10
+ return String(n);
11
+ const clamped = Math.min(Math.max(n, 0), total);
12
+ const segments = 5;
13
+ let filled = Math.floor((clamped * segments) / total);
14
+ if (clamped > 0 && filled === 0)
15
+ filled = 1;
16
+ return "▰".repeat(filled) + "▱".repeat(segments - filled) + ` ${clamped}/${total}`;
17
+ }
18
+ /** Approximate terminal display width of one code point: 2 columns for CJK and
19
+ * the emoji blocks our tables actually use (status dots, badges), 1 otherwise.
20
+ * Not a full Unicode width table — the goal is aligned status/emoji cells
21
+ * without a dependency, and these ranges cover every glyph the CLI emits. */
22
+ function isWide(cp) {
23
+ return ((cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo
24
+ (cp >= 0x2e80 && cp <= 0xa4cf) || // CJK radicals … Yi
25
+ (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul syllables
26
+ (cp >= 0xf900 && cp <= 0xfaff) || // CJK compatibility ideographs
27
+ (cp >= 0xff00 && cp <= 0xff60) || // fullwidth forms
28
+ (cp >= 0x2600 && cp <= 0x27bf) || // misc symbols + dingbats (✅ ✏ ⚪ …)
29
+ (cp >= 0x2300 && cp <= 0x23ff) || // misc technical (⏳ ⏸ ⏭ …)
30
+ (cp >= 0x1f000 && cp <= 0x1faff) // astral emoji (🔴 📥 🚧 …)
31
+ );
32
+ }
33
+ /** Display width of a string in terminal columns. Zero-width joiners,
34
+ * variation selectors, and combining marks count 0; wide glyphs count 2
35
+ * (see isWide). `.length` counts UTF-16 code units instead and misaligns
36
+ * emoji cells: "⏳" is length 1 but 2 columns, "✏️" length 3 but 2 columns. */
37
+ export function displayWidth(s) {
38
+ let w = 0;
39
+ for (const ch of s) {
40
+ const cp = ch.codePointAt(0);
41
+ if (cp === 0x200d || cp === 0xfe0f || (cp >= 0x0300 && cp <= 0x036f))
42
+ continue;
43
+ w += isWide(cp) ? 2 : 1;
44
+ }
45
+ return w;
46
+ }
47
+ /** Pad to `width` display columns (padEnd pads UTF-16 units and over/under-pads
48
+ * emoji cells). */
49
+ function padDisplay(s, width) {
50
+ return s + " ".repeat(Math.max(0, width - displayWidth(s)));
51
+ }
52
+ /** Padded-column terminal table: header line, rule, one line per row. Column
53
+ * width = widest cell in that column, measured in display columns so emoji
54
+ * status cells stay aligned; short rows render missing cells empty. */
55
+ export function renderTable(headers, rows) {
56
+ const all = [headers, ...rows];
57
+ const widths = headers.map((_, c) => Math.max(...all.map((r) => displayWidth(r[c] ?? ""))));
58
+ const line = (r) => headers.map((_, c) => padDisplay(r[c] ?? "", widths[c])).join(" ").trimEnd();
59
+ return [line(headers), widths.map((w) => "─".repeat(w)).join(" "), ...rows.map(line)];
60
+ }
61
+ //# sourceMappingURL=term-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"term-render.js","sourceRoot":"","sources":["../src/term-render.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.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "CLI tool for RenaissShipFlow - AI-powered project management automation",
5
5
  "type": "module",
6
6
  "bin": {