@ngocsangairvds/vsaf 5.3.0 → 5.3.1
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.
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
name: sdlc-build-headless
|
|
2
|
-
description: 'Sub-flow: headless Implement → Test Gate (engine-driven, provider-agnostic, one test-case per loop iteration)'
|
|
2
|
+
description: 'Sub-flow: headless Implement → Env Preflight → Test Gate (engine-driven, provider-agnostic, one test-case per loop iteration)'
|
|
3
3
|
provider: claude
|
|
4
4
|
model: sonnet
|
|
5
5
|
nodes:
|
|
6
6
|
- id: impl-prereq
|
|
7
|
-
description: Implement 1/
|
|
7
|
+
description: Implement 1/4 — enumerate test cases into a progress checklist
|
|
8
8
|
model: sonnet
|
|
9
9
|
workspace: false
|
|
10
10
|
timeout: 600000
|
|
@@ -23,7 +23,7 @@ nodes:
|
|
|
23
23
|
This checklist is the single source of truth for the implementation loop that follows.
|
|
24
24
|
|
|
25
25
|
- id: impl-loop
|
|
26
|
-
description: Implement 2/
|
|
26
|
+
description: Implement 2/4 — TDD one test case per iteration until all are checked
|
|
27
27
|
model: sonnet
|
|
28
28
|
workspace: false
|
|
29
29
|
timeout: 2400000
|
|
@@ -38,7 +38,8 @@ nodes:
|
|
|
38
38
|
2. If every case is already checked `- [x]`, output exactly `<promise>IMPL_COMPLETE</promise>`
|
|
39
39
|
and stop.
|
|
40
40
|
3. Otherwise, for that one case: write/adjust its test (RED), implement the minimal code
|
|
41
|
-
to make it pass (GREEN), keep the change scoped to this case.
|
|
41
|
+
to make it pass (GREEN), keep the change scoped to this case. If a prior test is now
|
|
42
|
+
failing, fix it first.
|
|
42
43
|
4. Tick that line to `- [x]` in `$ARTIFACTS_DIR/impl-progress.md` and append a one-line
|
|
43
44
|
note of what you did.
|
|
44
45
|
5. Report the case id you completed. Do NOT emit the completion signal unless ALL cases
|
|
@@ -51,17 +52,74 @@ nodes:
|
|
|
51
52
|
interactive: false
|
|
52
53
|
max_iterations: 40
|
|
53
54
|
|
|
54
|
-
- id:
|
|
55
|
-
description: Implement 3/
|
|
55
|
+
- id: env-preflight
|
|
56
|
+
description: Implement 3/4 — verify + prepare the test toolchain (auto-install if missing)
|
|
56
57
|
workspace: false
|
|
57
58
|
depends_on:
|
|
58
59
|
- impl-loop
|
|
59
60
|
bash: |
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
echo "[vsaf] env-preflight: verifying test toolchain…"
|
|
62
|
+
NO_INSTALL="${VSAF_NO_AUTO_INSTALL:-0}"
|
|
63
|
+
ENV_FILE="$ARTIFACTS_DIR/vsaf-env.sh"
|
|
64
|
+
: > "$ENV_FILE"
|
|
65
|
+
pkg_install() { # $1 brew formula, $2 apt pkg, $3 label
|
|
66
|
+
if [ "$NO_INSTALL" = "1" ]; then
|
|
67
|
+
echo "[vsaf] MISSING $3 — auto-install disabled (VSAF_NO_AUTO_INSTALL=1); install it manually."; return 1; fi
|
|
68
|
+
if command -v brew >/dev/null 2>&1; then echo "[vsaf] installing $3 via brew ($1)…"; brew install "$1";
|
|
69
|
+
elif command -v apt-get >/dev/null 2>&1; then echo "[vsaf] installing $3 via apt-get ($2)…"; sudo apt-get update -y && sudo apt-get install -y $2;
|
|
70
|
+
else echo "[vsaf] no package manager (brew/apt) to install $3 — install manually."; return 1; fi
|
|
71
|
+
}
|
|
72
|
+
pick_jdk() { # echo a JAVA_HOME whose java >= 11
|
|
73
|
+
for c in "$JAVA_HOME" \
|
|
74
|
+
"$(/usr/libexec/java_home -v 21 2>/dev/null)" \
|
|
75
|
+
"$(/usr/libexec/java_home -v 17 2>/dev/null)" \
|
|
76
|
+
"$(/usr/libexec/java_home -v 11 2>/dev/null)" \
|
|
77
|
+
/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home \
|
|
78
|
+
/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home \
|
|
79
|
+
/opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk/Contents/Home \
|
|
80
|
+
"$(dirname "$(dirname "$(command -v java 2>/dev/null)")")"; do
|
|
81
|
+
[ -n "$c" ] && [ -x "$c/bin/java" ] || continue
|
|
82
|
+
v=$("$c/bin/java" -version 2>&1 | head -1 | sed -E 's/.*version "([0-9]+).*/\1/')
|
|
83
|
+
if [ "$v" -ge 11 ] 2>/dev/null; then echo "$c"; return 0; fi
|
|
84
|
+
done
|
|
85
|
+
return 1
|
|
86
|
+
}
|
|
87
|
+
if [ -f pom.xml ] || [ -f mvnw ]; then
|
|
88
|
+
echo "[vsaf] project type: Maven"
|
|
89
|
+
[ -f mvnw ] && chmod +x mvnw 2>/dev/null
|
|
90
|
+
command -v java >/dev/null 2>&1 || pkg_install openjdk openjdk-17-jdk JDK
|
|
91
|
+
JH="$(pick_jdk)"
|
|
92
|
+
if [ -n "$JH" ]; then echo "export JAVA_HOME=\"$JH\"" >> "$ENV_FILE"; echo "[vsaf] JAVA_HOME → $JH"; else echo "[vsaf] WARN: no JDK>=11 resolvable"; fi
|
|
93
|
+
if [ -f mvnw ] && [ ! -f .mvn/wrapper/maven-wrapper.jar ]; then
|
|
94
|
+
echo "[vsaf] maven-wrapper.jar missing; will fall back to system mvn"
|
|
95
|
+
command -v mvn >/dev/null 2>&1 || pkg_install maven maven Maven
|
|
96
|
+
fi
|
|
97
|
+
elif [ -f build.gradle ] || [ -f build.gradle.kts ] || [ -f gradlew ]; then
|
|
98
|
+
echo "[vsaf] project type: Gradle"
|
|
99
|
+
[ -f gradlew ] && chmod +x gradlew 2>/dev/null
|
|
100
|
+
command -v java >/dev/null 2>&1 || pkg_install openjdk openjdk-17-jdk JDK
|
|
101
|
+
JH="$(pick_jdk)"; [ -n "$JH" ] && echo "export JAVA_HOME=\"$JH\"" >> "$ENV_FILE"
|
|
102
|
+
elif [ -f package.json ]; then
|
|
103
|
+
echo "[vsaf] project type: Node"; command -v npm >/dev/null 2>&1 || pkg_install node nodejs Node
|
|
104
|
+
elif [ -f requirements.txt ] || [ -f pyproject.toml ]; then
|
|
105
|
+
echo "[vsaf] project type: Python"; command -v python3 >/dev/null 2>&1 || pkg_install python python3 Python
|
|
106
|
+
else
|
|
107
|
+
echo "[vsaf] env-preflight: no known project markers; skipping"
|
|
108
|
+
fi
|
|
109
|
+
echo "[vsaf] env-preflight done"
|
|
110
|
+
|
|
111
|
+
- id: test-gate
|
|
112
|
+
description: Implement 4/4 — run the project test suite
|
|
113
|
+
workspace: false
|
|
114
|
+
depends_on:
|
|
115
|
+
- env-preflight
|
|
116
|
+
bash: |
|
|
117
|
+
[ -f "$ARTIFACTS_DIR/vsaf-env.sh" ] && . "$ARTIFACTS_DIR/vsaf-env.sh"
|
|
118
|
+
if [ -f mvnw ] && [ -f .mvn/wrapper/maven-wrapper.jar ]; then ./mvnw -q test 2>&1
|
|
119
|
+
elif command -v mvn >/dev/null 2>&1 && [ -f pom.xml ]; then mvn -q test 2>&1
|
|
62
120
|
elif [ -f gradlew ]; then ./gradlew test 2>&1
|
|
63
121
|
elif [ -f package.json ]; then npm test 2>&1
|
|
64
|
-
else echo "[vsaf] no
|
|
122
|
+
else echo "[vsaf] no runnable test runner (mvnw+wrapper / mvn / gradlew / package.json)"; exit 1; fi
|
|
65
123
|
loop:
|
|
66
124
|
on_fail: impl-loop
|
|
67
125
|
max_retries: 3
|
|
@@ -39,16 +39,73 @@ nodes:
|
|
|
39
39
|
depends_on:
|
|
40
40
|
- implement-impact
|
|
41
41
|
command: sdlc-implement-build-run
|
|
42
|
+
- id: env-preflight
|
|
43
|
+
description: Env Preflight — verify + prepare the test toolchain (auto-install if missing)
|
|
44
|
+
workspace: false
|
|
45
|
+
depends_on:
|
|
46
|
+
- implement-build-run
|
|
47
|
+
bash: |
|
|
48
|
+
echo "[vsaf] env-preflight: verifying test toolchain…"
|
|
49
|
+
NO_INSTALL="${VSAF_NO_AUTO_INSTALL:-0}"
|
|
50
|
+
ENV_FILE="$ARTIFACTS_DIR/vsaf-env.sh"
|
|
51
|
+
: > "$ENV_FILE"
|
|
52
|
+
pkg_install() { # $1 brew formula, $2 apt pkg, $3 label
|
|
53
|
+
if [ "$NO_INSTALL" = "1" ]; then
|
|
54
|
+
echo "[vsaf] MISSING $3 — auto-install disabled (VSAF_NO_AUTO_INSTALL=1); install it manually."; return 1; fi
|
|
55
|
+
if command -v brew >/dev/null 2>&1; then echo "[vsaf] installing $3 via brew ($1)…"; brew install "$1";
|
|
56
|
+
elif command -v apt-get >/dev/null 2>&1; then echo "[vsaf] installing $3 via apt-get ($2)…"; sudo apt-get update -y && sudo apt-get install -y $2;
|
|
57
|
+
else echo "[vsaf] no package manager (brew/apt) to install $3 — install manually."; return 1; fi
|
|
58
|
+
}
|
|
59
|
+
pick_jdk() { # echo a JAVA_HOME whose java >= 11
|
|
60
|
+
for c in "$JAVA_HOME" \
|
|
61
|
+
"$(/usr/libexec/java_home -v 21 2>/dev/null)" \
|
|
62
|
+
"$(/usr/libexec/java_home -v 17 2>/dev/null)" \
|
|
63
|
+
"$(/usr/libexec/java_home -v 11 2>/dev/null)" \
|
|
64
|
+
/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home \
|
|
65
|
+
/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home \
|
|
66
|
+
/opt/homebrew/opt/openjdk@11/libexec/openjdk.jdk/Contents/Home \
|
|
67
|
+
"$(dirname "$(dirname "$(command -v java 2>/dev/null)")")"; do
|
|
68
|
+
[ -n "$c" ] && [ -x "$c/bin/java" ] || continue
|
|
69
|
+
v=$("$c/bin/java" -version 2>&1 | head -1 | sed -E 's/.*version "([0-9]+).*/\1/')
|
|
70
|
+
if [ "$v" -ge 11 ] 2>/dev/null; then echo "$c"; return 0; fi
|
|
71
|
+
done
|
|
72
|
+
return 1
|
|
73
|
+
}
|
|
74
|
+
if [ -f pom.xml ] || [ -f mvnw ]; then
|
|
75
|
+
echo "[vsaf] project type: Maven"
|
|
76
|
+
[ -f mvnw ] && chmod +x mvnw 2>/dev/null
|
|
77
|
+
command -v java >/dev/null 2>&1 || pkg_install openjdk openjdk-17-jdk JDK
|
|
78
|
+
JH="$(pick_jdk)"
|
|
79
|
+
if [ -n "$JH" ]; then echo "export JAVA_HOME=\"$JH\"" >> "$ENV_FILE"; echo "[vsaf] JAVA_HOME → $JH"; else echo "[vsaf] WARN: no JDK>=11 resolvable"; fi
|
|
80
|
+
if [ -f mvnw ] && [ ! -f .mvn/wrapper/maven-wrapper.jar ]; then
|
|
81
|
+
echo "[vsaf] maven-wrapper.jar missing; will fall back to system mvn"
|
|
82
|
+
command -v mvn >/dev/null 2>&1 || pkg_install maven maven Maven
|
|
83
|
+
fi
|
|
84
|
+
elif [ -f build.gradle ] || [ -f build.gradle.kts ] || [ -f gradlew ]; then
|
|
85
|
+
echo "[vsaf] project type: Gradle"
|
|
86
|
+
[ -f gradlew ] && chmod +x gradlew 2>/dev/null
|
|
87
|
+
command -v java >/dev/null 2>&1 || pkg_install openjdk openjdk-17-jdk JDK
|
|
88
|
+
JH="$(pick_jdk)"; [ -n "$JH" ] && echo "export JAVA_HOME=\"$JH\"" >> "$ENV_FILE"
|
|
89
|
+
elif [ -f package.json ]; then
|
|
90
|
+
echo "[vsaf] project type: Node"; command -v npm >/dev/null 2>&1 || pkg_install node nodejs Node
|
|
91
|
+
elif [ -f requirements.txt ] || [ -f pyproject.toml ]; then
|
|
92
|
+
echo "[vsaf] project type: Python"; command -v python3 >/dev/null 2>&1 || pkg_install python python3 Python
|
|
93
|
+
else
|
|
94
|
+
echo "[vsaf] env-preflight: no known project markers; skipping"
|
|
95
|
+
fi
|
|
96
|
+
echo "[vsaf] env-preflight done"
|
|
97
|
+
|
|
42
98
|
- id: test-gate
|
|
43
99
|
description: Test Gate — automated tests
|
|
44
100
|
bash: |
|
|
45
|
-
|
|
46
|
-
|
|
101
|
+
[ -f "$ARTIFACTS_DIR/vsaf-env.sh" ] && . "$ARTIFACTS_DIR/vsaf-env.sh"
|
|
102
|
+
if [ -f mvnw ] && [ -f .mvn/wrapper/maven-wrapper.jar ]; then ./mvnw -q test 2>&1
|
|
103
|
+
elif command -v mvn >/dev/null 2>&1 && [ -f pom.xml ]; then mvn -q test 2>&1
|
|
47
104
|
elif [ -f gradlew ]; then ./gradlew test 2>&1
|
|
48
105
|
elif [ -f package.json ]; then npm test 2>&1
|
|
49
|
-
else echo "[vsaf] no
|
|
106
|
+
else echo "[vsaf] no runnable test runner (mvnw+wrapper / mvn / gradlew / package.json)"; exit 1; fi
|
|
50
107
|
depends_on:
|
|
51
|
-
-
|
|
108
|
+
- env-preflight
|
|
52
109
|
loop:
|
|
53
110
|
on_fail: implement-debug
|
|
54
111
|
max_retries: 3
|