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.
|
|
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",
|
package/hooks/safety-spine.mjs
CHANGED
|
@@ -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
|
|
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