@hybridlabor-api/aos 4.8.0 → 4.10.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 (186) hide show
  1. package/.agents/{agents.md → AGENTS.md} +3 -1
  2. package/.agents/nodes.json +3 -1
  3. package/.agents/vendor-manifest.json +23 -1
  4. package/.claude/agents/godmode-media-eventtech.md +1 -1
  5. package/.claude/hooks/conventional-commits.mjs +125 -0
  6. package/.claude/hooks/env-file-protection.mjs +105 -0
  7. package/.claude/hooks/go-gate.mjs +101 -81
  8. package/.claude/hooks/memb-inject.mjs +29 -1
  9. package/.claude/settings.json +13 -0
  10. package/.claude/workflows/startcycle-dispatch.mjs +23 -1
  11. package/.opencode/agents/godmode-media-eventtech.md +1 -1
  12. package/.opencode/plugins/bdb-aos.js +31 -4
  13. package/CLAUDE.md +0 -571
  14. package/README.de.md +1 -1
  15. package/README.md +1 -1
  16. package/README.pt.md +1 -1
  17. package/THIRD_PARTY_NOTICES.md +126 -0
  18. package/bin/aos-doctor.mjs +1 -1
  19. package/docs/skills_table.md +1 -1
  20. package/installer.js +187 -55
  21. package/package.json +7 -3
  22. package/packages/aos-cli/README.md +80 -0
  23. package/packages/aos-cli/bin/aos-cli.mjs +134 -0
  24. package/packages/aos-cli/core-skills.json +12 -0
  25. package/packages/aos-cli/extensions/aos.ts +321 -0
  26. package/packages/aos-cli/package-lock.json +1923 -0
  27. package/packages/aos-cli/package.json +29 -0
  28. package/packages/aos-cli/scripts/check-theme.mjs +63 -0
  29. package/packages/aos-cli/themes/aos.json +97 -0
  30. package/scripts/build-plugin-manifest.mjs +131 -0
  31. package/scripts/validate-skills.mjs +81 -6
  32. package/skills/basic/ao-orchestrator/SKILL.md +116 -0
  33. package/skills/basic/bdb-eventagency-skill/SKILL.md +252 -0
  34. package/skills/basic/bdb-shipping-skill/SKILL.md +161 -0
  35. package/skills/basic/godmode-eventtech/SKILL.md +4 -1
  36. package/skills/global_config/agenttrail/SKILL.md +6 -1
  37. package/skills/global_config/aos-project-init/SKILL.md +2 -0
  38. package/skills/global_config/aos-project-init/assets/AGENTS.template.md +1 -1
  39. package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +1 -1
  40. package/skills/global_config/aos-setup/SKILL.md +1 -1
  41. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +1 -1
  42. package/skills/global_config/ask-tim/SKILL.md +7 -7
  43. package/skills/global_config/bash-script-generator/SKILL.md +201 -0
  44. package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
  45. package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
  46. package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
  47. package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
  48. package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
  49. package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
  50. package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
  51. package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
  52. package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
  53. package/skills/global_config/bash-script-validator/SKILL.md +249 -0
  54. package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
  55. package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
  56. package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
  57. package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
  58. package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
  59. package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
  60. package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
  61. package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
  62. package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
  63. package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
  64. package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
  65. package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
  66. package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
  67. package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
  68. package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
  69. package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
  70. package/skills/global_config/ci-pipeline/SKILL.md +135 -0
  71. package/skills/global_config/deja-memory/SKILL.md +3 -1
  72. package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
  73. package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
  74. package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
  75. package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
  76. package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
  77. package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
  78. package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
  79. package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
  80. package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
  81. package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
  82. package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
  83. package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
  84. package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
  85. package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
  86. package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
  87. package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
  88. package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
  89. package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
  90. package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
  91. package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
  92. package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
  93. package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
  94. package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
  95. package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
  96. package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
  97. package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
  98. package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
  99. package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
  100. package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
  101. package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
  102. package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
  103. package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
  104. package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
  105. package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
  106. package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
  107. package/skills/global_config/github-actions-generator/SKILL.md +353 -0
  108. package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
  109. package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
  110. package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
  111. package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
  112. package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
  113. package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
  114. package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
  115. package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
  116. package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
  117. package/skills/global_config/github-actions-generator/examples/README.md +147 -0
  118. package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
  119. package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
  120. package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
  121. package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
  122. package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
  123. package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
  124. package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
  125. package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
  126. package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
  127. package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
  128. package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
  129. package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
  130. package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
  131. package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
  132. package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
  133. package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
  134. package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
  135. package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
  136. package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
  137. package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
  138. package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
  139. package/skills/global_config/github-actions-templates/SKILL.md +7 -0
  140. package/skills/global_config/github-actions-validator/SKILL.md +576 -0
  141. package/skills/global_config/github-actions-validator/examples/README.md +88 -0
  142. package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
  143. package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
  144. package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
  145. package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
  146. package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
  147. package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
  148. package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
  149. package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
  150. package/skills/global_config/github-actions-validator/references/runners.md +317 -0
  151. package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
  152. package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
  153. package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
  154. package/skills/global_config/makefile-generator/SKILL.md +614 -0
  155. package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
  156. package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
  157. package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
  158. package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
  159. package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
  160. package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
  161. package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
  162. package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
  163. package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
  164. package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
  165. package/skills/global_config/makefile-validator/SKILL.md +244 -0
  166. package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
  167. package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
  168. package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
  169. package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
  170. package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
  171. package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
  172. package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
  173. package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
  174. package/skills/global_config/plan-canvas/SKILL.md +9 -2
  175. package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/ui.js +10 -2
  176. package/skills/global_config/plan-canvas/scripts/plan-canvas.js +1 -1
  177. package/skills/global_config/read-the-damn-docs/SKILL.md +175 -0
  178. package/skills/global_config/requesting-code-review/SKILL.md +98 -0
  179. package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
  180. package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
  181. package/skills/global_config/verification-before-completion/SKILL.md +123 -0
  182. package/skills/global_config/writing-plans/SKILL.md +126 -46
  183. package/skills/global_config/writing-plans-legacy/SKILL.md +152 -0
  184. package/.claude/CLAUDE.md +0 -12
  185. package/mcps/RhinoMCP/docs/content/docs/getting-started/gemini.md +0 -61
  186. /package/{GEMINI.md → RULES.md} +0 -0
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Regression test suite for scripts/validate_workflow.sh
4
+ #
5
+ # Covers:
6
+ # - P0: no false-success when actionlint is missing and act cannot validate target
7
+ # - P1: advisory policy checks (SHA pinning, permissions, script injection, OIDC)
8
+ #
9
+
10
+ set -euo pipefail
11
+
12
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
+ readonly SCRIPT_DIR
14
+ SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
15
+ readonly SKILL_DIR
16
+ VALIDATOR_SOURCE="$SKILL_DIR/scripts/validate_workflow.sh"
17
+ readonly VALIDATOR_SOURCE
18
+
19
+ TMP_ROOT="$(mktemp -d)"
20
+ cleanup() {
21
+ rm -rf "$TMP_ROOT"
22
+ }
23
+ trap cleanup EXIT
24
+
25
+ PASS=0
26
+ FAIL=0
27
+ OUTPUT=""
28
+ EXIT_CODE=0
29
+
30
+ pass() { echo " PASS: $1"; PASS=$((PASS + 1)); }
31
+ fail() { echo " FAIL: $1"; FAIL=$((FAIL + 1)); }
32
+
33
+ new_sandbox() {
34
+ SANDBOX="$(mktemp -d "$TMP_ROOT/case-XXXXXX")"
35
+
36
+ mkdir -p "$SANDBOX/skill/scripts/.tools"
37
+ mkdir -p "$SANDBOX/repo/.github/workflows"
38
+ mkdir -p "$SANDBOX/repo/examples"
39
+ mkdir -p "$SANDBOX/bin"
40
+
41
+ cp "$VALIDATOR_SOURCE" "$SANDBOX/skill/scripts/validate_workflow.sh"
42
+ chmod +x "$SANDBOX/skill/scripts/validate_workflow.sh"
43
+
44
+ cat > "$SANDBOX/bin/docker" <<'EOF'
45
+ #!/usr/bin/env bash
46
+ if [[ "${1:-}" == "info" ]]; then
47
+ exit "${DOCKER_INFO_STUB_EXIT:-0}"
48
+ fi
49
+ exit 0
50
+ EOF
51
+ chmod +x "$SANDBOX/bin/docker"
52
+ }
53
+
54
+ create_act_stub() {
55
+ cat > "$SANDBOX/skill/scripts/.tools/act" <<'EOF'
56
+ #!/usr/bin/env bash
57
+ if [[ "$*" == *"--list"* ]]; then
58
+ exit "${ACT_LIST_STUB_EXIT:-0}"
59
+ fi
60
+ if [[ "$*" == *"--dryrun"* ]]; then
61
+ exit "${ACT_DRYRUN_STUB_EXIT:-0}"
62
+ fi
63
+ exit "${ACT_STUB_EXIT:-0}"
64
+ EOF
65
+ chmod +x "$SANDBOX/skill/scripts/.tools/act"
66
+ }
67
+
68
+ create_actionlint_stub() {
69
+ cat > "$SANDBOX/skill/scripts/.tools/actionlint" <<'EOF'
70
+ #!/usr/bin/env bash
71
+ exit "${ACTIONLINT_STUB_EXIT:-0}"
72
+ EOF
73
+ chmod +x "$SANDBOX/skill/scripts/.tools/actionlint"
74
+ }
75
+
76
+ run_validator() {
77
+ local -a args=("$@")
78
+ OUTPUT=""
79
+ EXIT_CODE=0
80
+ OUTPUT=$(
81
+ cd "$SANDBOX/repo" && \
82
+ PATH="$SANDBOX/bin:$PATH" bash "$SANDBOX/skill/scripts/validate_workflow.sh" "${args[@]}" 2>&1
83
+ ) || EXIT_CODE=$?
84
+ }
85
+
86
+ assert_exit() {
87
+ local label="$1"
88
+ local expected="$2"
89
+ if [[ "$EXIT_CODE" -eq "$expected" ]]; then
90
+ pass "$label (exit $EXIT_CODE)"
91
+ else
92
+ fail "$label (expected exit $expected, got $EXIT_CODE)"
93
+ echo "$OUTPUT" | sed 's/^/ /'
94
+ fi
95
+ }
96
+
97
+ assert_contains() {
98
+ local label="$1"
99
+ local pattern="$2"
100
+ if echo "$OUTPUT" | grep -qE "$pattern"; then
101
+ pass "$label"
102
+ else
103
+ fail "$label (pattern not found: $pattern)"
104
+ echo "$OUTPUT" | sed 's/^/ /'
105
+ fi
106
+ }
107
+
108
+ assert_not_contains() {
109
+ local label="$1"
110
+ local pattern="$2"
111
+ if echo "$OUTPUT" | grep -qE "$pattern"; then
112
+ fail "$label (unexpected pattern found: $pattern)"
113
+ echo "$OUTPUT" | sed 's/^/ /'
114
+ else
115
+ pass "$label"
116
+ fi
117
+ }
118
+
119
+ echo "Running github-actions-validator regression tests..."
120
+ echo ""
121
+
122
+ echo "[P0] actionlint missing + target outside .github/workflows must fail"
123
+ new_sandbox
124
+ create_act_stub
125
+ cat > "$SANDBOX/repo/examples/outside.yml" <<'EOF'
126
+ name: Outside
127
+ on: push
128
+ jobs:
129
+ build:
130
+ runs-on: ubuntu-latest
131
+ steps:
132
+ - run: echo hi
133
+ EOF
134
+ run_validator "$SANDBOX/repo/examples/outside.yml"
135
+ if [[ "$EXIT_CODE" -ne 0 ]]; then
136
+ pass "returns non-zero when no effective validator executed"
137
+ else
138
+ fail "returns non-zero when no effective validator executed (expected non-zero, got 0)"
139
+ echo "$OUTPUT" | sed 's/^/ /'
140
+ fi
141
+ assert_contains "reports skipped act path" "act validation skipped"
142
+ assert_contains "reports no effective validator" "No effective validator executed|No validator executed; refusing to report success"
143
+
144
+ echo ""
145
+ echo "[P0] actionlint run + act skip should still pass"
146
+ new_sandbox
147
+ create_act_stub
148
+ create_actionlint_stub
149
+ cat > "$SANDBOX/repo/examples/outside.yml" <<'EOF'
150
+ name: Outside
151
+ on: push
152
+ jobs:
153
+ build:
154
+ runs-on: ubuntu-latest
155
+ steps:
156
+ - run: echo hi
157
+ EOF
158
+ run_validator "$SANDBOX/repo/examples/outside.yml"
159
+ assert_exit "passes when actionlint runs and act skips unsupported target" 0
160
+ assert_contains "shows actionlint success" "actionlint validation passed"
161
+ assert_contains "shows act skip message" "act validation skipped: target file is outside \\.github/workflows"
162
+
163
+ echo ""
164
+ echo "[P0] fallback to act-only still works for real workflow paths"
165
+ new_sandbox
166
+ create_act_stub
167
+ cat > "$SANDBOX/repo/.github/workflows/ci.yml" <<'EOF'
168
+ name: CI
169
+ on: push
170
+ jobs:
171
+ build:
172
+ runs-on: ubuntu-latest
173
+ steps:
174
+ - run: echo hi
175
+ EOF
176
+ run_validator "$SANDBOX/repo/.github/workflows/ci.yml"
177
+ assert_exit "passes in act-only fallback mode for workflow under .github/workflows" 0
178
+ assert_contains "warns about actionlint fallback" "actionlint not found\\. Falling back to act-only validation"
179
+ assert_contains "act dry-run success is reported" "act validation passed"
180
+
181
+ echo ""
182
+ echo "[P1] policy checks report hardening warnings (advisory)"
183
+ new_sandbox
184
+ create_actionlint_stub
185
+ cat > "$SANDBOX/repo/examples/policy-bad.yml" <<'EOF'
186
+ name: Policy Bad
187
+ on: pull_request
188
+ jobs:
189
+ release:
190
+ runs-on: ubuntu-latest
191
+ steps:
192
+ - uses: docker/build-push-action@v6
193
+ - uses: aws-actions/configure-aws-credentials@v4
194
+ - name: Unsafe run usage
195
+ run: echo "${{ github.event.pull_request.title }}"
196
+ EOF
197
+ run_validator --lint-only --policy-checks "$SANDBOX/repo/examples/policy-bad.yml"
198
+ assert_exit "policy warnings do not change exit code" 0
199
+ assert_contains "warns for unpinned third-party action" "third-party action is not SHA pinned: docker/build-push-action@v6"
200
+ assert_contains "warns for missing permissions" "missing explicit permissions block"
201
+ assert_contains "warns for script injection pattern" "potential script injection risk in run step"
202
+ assert_contains "warns for missing id-token with OIDC action" "OIDC-related action but does not declare id-token: write"
203
+ assert_contains "prints policy warning summary" "Security policy warnings:"
204
+
205
+ echo ""
206
+ echo "[P1] policy checks accept hardened workflow"
207
+ new_sandbox
208
+ create_actionlint_stub
209
+ cat > "$SANDBOX/repo/examples/policy-good.yml" <<'EOF'
210
+ name: Policy Good
211
+ on: pull_request
212
+ permissions:
213
+ contents: read
214
+ id-token: write
215
+ jobs:
216
+ release:
217
+ runs-on: ubuntu-latest
218
+ steps:
219
+ - uses: docker/build-push-action@0123456789abcdef0123456789abcdef01234567
220
+ - uses: aws-actions/configure-aws-credentials@0123456789abcdef0123456789abcdef01234567
221
+ - name: Safe run usage
222
+ env:
223
+ PR_TITLE: ${{ github.event.pull_request.title }}
224
+ run: echo "$PR_TITLE"
225
+ EOF
226
+ run_validator --lint-only --policy-checks "$SANDBOX/repo/examples/policy-good.yml"
227
+ assert_exit "hardened workflow remains successful" 0
228
+ assert_contains "prints clean policy summary" "No security policy warnings found"
229
+ assert_not_contains "does not print warning summary when clean" "Security policy warnings:"
230
+
231
+ echo ""
232
+ echo "Test summary: PASS=$PASS FAIL=$FAIL"
233
+ if [[ "$FAIL" -ne 0 ]]; then
234
+ exit 1
235
+ fi
236
+
237
+ echo "All tests passed."