shapeup-sdlc 3.18.1 → 3.18.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "shapeup-sdlc-plugin",
3
3
  "displayName": "ShapeUp SDLC Plugin",
4
- "version": "3.18.1",
4
+ "version": "3.18.2",
5
5
  "description": "Shape Up SDLC harness for Claude Code: shaping, intake, orient, scope-mapping, building (T0-verified, sandboxed, scope-contracted), evaluation and QA skills orchestrated by a tech-lead.",
6
6
  "author": {
7
7
  "name": "Liberty Nguyen",
@@ -106,14 +106,21 @@ function tokens(segment) {
106
106
  * The program names answer it. Arguments are never recorded — they are where a secret, a token or a
107
107
  * private path would be — and a basename says which tool ran without saying where it lives.
108
108
  *
109
+ * A `\`-continued line is joined to the one before it FIRST, before any segment split — a shell
110
+ * reads `cmd \<newline> --flag x` as one logical line, and so must this. Splitting on the bare
111
+ * newline first (measured, live) read a multi-line `init run` as one "program" per physical line —
112
+ * `node`, then `--slug`, then `--auto-level`, each a flag misread as an executable — which is how
113
+ * a real dispatch and a garbled one produced the same "clean, permitted" shape in the ledger.
114
+ *
109
115
  * @param {string} command - The raw Bash command.
110
116
  * @returns {(string|null)} Program basenames joined by " | ", in order, duplicates kept; null when
111
117
  * no segment yields one.
112
118
  */
113
119
  export function programsOf(command) {
114
120
  if (!command || typeof command !== "string") return null;
121
+ const joined = command.replace(/\\[ \t]*\n/g, " ");
115
122
  const names = [];
116
- for (const segment of command.split(/\s*(?:\|\||&&|;|\||\n)\s*/).filter(Boolean)) {
123
+ for (const segment of joined.split(/\s*(?:\|\||&&|;|\||\n)\s*/).filter(Boolean)) {
117
124
  const first = commandTokens(segment)[0];
118
125
  if (!first) continue;
119
126
  const base = first.replace(/^["']|["']$/g, "").split("/").pop();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shapeup-sdlc",
3
- "version": "3.18.1",
3
+ "version": "3.18.2",
4
4
  "description": "Shape Up for coding agents \u2014 with gates the agent can't talk its way past. Harness for Claude Code.",
5
5
  "bin": {
6
6
  "shapeup-sdlc": "bin/init.mjs"