@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,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngocsangairvds/vsaf",
3
- "version": "5.3.0",
3
+ "version": "5.3.1",
4
4
  "description": "logging step",
5
5
  "main": "packages/core/dist/index.js",
6
6
  "types": "packages/core/dist/index.d.ts",
@@ -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/3 — enumerate test cases into a progress checklist
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/3 — TDD one test case per iteration until all are checked
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: test-gate
55
- description: Implement 3/3run the project test suite
55
+ - id: env-preflight
56
+ description: Implement 3/4verify + prepare the test toolchain (auto-install if missing)
56
57
  workspace: false
57
58
  depends_on:
58
59
  - impl-loop
59
60
  bash: |
60
- if [ -f mvnw ]; then ./mvnw -q test 2>&1
61
- elif [ -f pom.xml ]; then mvn -q test 2>&1
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 recognized test runner (mvnw/pom/gradlew/package.json)"; fi
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
- if [ -f mvnw ]; then ./mvnw -q test 2>&1
46
- elif [ -f pom.xml ]; then mvn -q test 2>&1
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 recognized test runner (mvnw/pom/gradlew/package.json)"; fi
106
+ else echo "[vsaf] no runnable test runner (mvnw+wrapper / mvn / gradlew / package.json)"; exit 1; fi
50
107
  depends_on:
51
- - implement-build-run
108
+ - env-preflight
52
109
  loop:
53
110
  on_fail: implement-debug
54
111
  max_retries: 3