agentplugged 1.3.0 → 2.0.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 (277) hide show
  1. package/README.md +11 -4
  2. package/dist/agent-commands.js +20432 -35457
  3. package/dist/bin.js +2 -3
  4. package/dist/boundary-rules.js +1 -0
  5. package/dist/boundary-rules2.js +52 -0
  6. package/dist/cli.js +7 -3
  7. package/dist/commit-documents.js +81 -0
  8. package/dist/dist.js +22729 -0
  9. package/dist/dist2.js +9 -0
  10. package/dist/esm.js +8 -16
  11. package/dist/forge-follow.js +6 -7
  12. package/dist/grammars/LICENSE-tree-sitter-wasm +21 -0
  13. package/dist/grammars/LICENSE-web-tree-sitter +21 -0
  14. package/dist/grammars/tree-sitter-go.wasm +0 -0
  15. package/dist/grammars/tree-sitter-java.wasm +0 -0
  16. package/dist/grammars/tree-sitter-javascript.wasm +0 -0
  17. package/dist/grammars/tree-sitter-php.wasm +0 -0
  18. package/dist/grammars/tree-sitter-python.wasm +0 -0
  19. package/dist/grammars/tree-sitter-rust.wasm +0 -0
  20. package/dist/grammars/tree-sitter-tsx.wasm +0 -0
  21. package/dist/grammars/tree-sitter-typescript.wasm +0 -0
  22. package/dist/grammars/web-tree-sitter.wasm +0 -0
  23. package/dist/hash.js +11594 -5733
  24. package/dist/helpers.js +271 -519
  25. package/dist/launcher-env.js +1 -2
  26. package/dist/launcher.js +4 -5
  27. package/dist/libsodium-wrappers.js +2 -4
  28. package/dist/libsodium-wrappers2.js +2 -4
  29. package/dist/main.js +10502 -2787
  30. package/dist/map-cache.js +8096 -0
  31. package/dist/map-update.js +16593 -0
  32. package/dist/map-update2.js +1 -0
  33. package/dist/method/agents/alex/SKILL.md +13 -29
  34. package/dist/method/agents/alex/agent.yaml +3 -3
  35. package/dist/method/agents/basile/SKILL.md +44 -0
  36. package/dist/method/agents/basile/agent.yaml +69 -0
  37. package/dist/method/agents/chloe/SKILL.md +12 -25
  38. package/dist/method/agents/chloe/agent.yaml +3 -3
  39. package/dist/method/agents/ethan/SKILL.md +8 -9
  40. package/dist/method/agents/ethan/agent.yaml +9 -8
  41. package/dist/method/agents/hugo/SKILL.md +8 -8
  42. package/dist/method/agents/hugo/agent.yaml +9 -8
  43. package/dist/method/agents/iris/SKILL.md +11 -17
  44. package/dist/method/agents/iris/agent.yaml +4 -7
  45. package/dist/method/agents/izzy/SKILL.md +68 -91
  46. package/dist/method/agents/izzy/agent.yaml +8 -15
  47. package/dist/method/agents/jade/SKILL.md +7 -9
  48. package/dist/method/agents/jade/agent.yaml +9 -8
  49. package/dist/method/agents/julien/SKILL.md +38 -58
  50. package/dist/method/agents/lina/SKILL.md +7 -9
  51. package/dist/method/agents/lina/agent.yaml +9 -8
  52. package/dist/method/agents/lou/SKILL.md +4 -11
  53. package/dist/method/agents/lou/agent.yaml +2 -2
  54. package/dist/method/agents/maya/SKILL.md +12 -19
  55. package/dist/method/agents/maya/agent.yaml +2 -4
  56. package/dist/method/agents/milo/SKILL.md +21 -32
  57. package/dist/method/agents/noah/SKILL.md +105 -63
  58. package/dist/method/agents/noah/agent.yaml +15 -35
  59. package/dist/method/agents/noah/evals/routes.yaml +238 -0
  60. package/dist/method/agents/noah/references/decisions.md +59 -121
  61. package/dist/method/agents/noah/references/environment.md +25 -70
  62. package/dist/method/agents/noah/references/facts.md +22 -11
  63. package/dist/method/agents/noah/references/journey.md +26 -78
  64. package/dist/method/agents/noah/references/team.md +67 -190
  65. package/dist/method/agents/omar/SKILL.md +14 -30
  66. package/dist/method/agents/omar/agent.yaml +12 -6
  67. package/dist/method/agents/quentin/SKILL.md +7 -15
  68. package/dist/method/agents/quentin/agent.yaml +4 -2
  69. package/dist/method/agents/sam/SKILL.md +6 -8
  70. package/dist/method/agents/sam/agent.yaml +9 -8
  71. package/dist/method/agents/stella/SKILL.md +6 -14
  72. package/dist/method/agents/stella/agent.yaml +1 -1
  73. package/dist/method/agents/tess/SKILL.md +7 -14
  74. package/dist/method/agents/tess/agent.yaml +2 -2
  75. package/dist/method/agents/zoe/SKILL.md +9 -21
  76. package/dist/method/doctor.yaml +553 -13
  77. package/dist/method/models.yaml +12 -0
  78. package/dist/method/skills/acceptance-qa/SKILL.md +1 -1
  79. package/dist/method/skills/acceptance-qa/references/run.md +24 -32
  80. package/dist/method/skills/acceptance-qa/references/scenarios.md +16 -19
  81. package/dist/method/skills/acceptance-qa/references/verdicts.md +10 -16
  82. package/dist/method/skills/api-e2e-tests/SKILL.md +46 -46
  83. package/dist/method/skills/audit-pillars/SKILL.md +13 -10
  84. package/dist/method/skills/audit-pillars/references/demo.md +35 -0
  85. package/dist/method/skills/audit-pillars/references/pillars.md +40 -0
  86. package/dist/method/skills/audit-pillars/references/tech-debt.md +38 -0
  87. package/dist/method/skills/chain-stories/SKILL.md +5 -4
  88. package/dist/method/skills/chain-stories/references/merge-order.md +23 -0
  89. package/dist/method/skills/check-readiness/SKILL.md +1 -1
  90. package/dist/method/skills/check-requirements/SKILL.md +37 -72
  91. package/dist/method/skills/check-requirements/references/engine-proofs.md +16 -23
  92. package/dist/method/skills/check-requirements/references/proofs-and-gaps.md +22 -37
  93. package/dist/method/skills/critique-deliverable/SKILL.md +3 -3
  94. package/dist/method/skills/critique-deliverable/references/choose.md +12 -21
  95. package/dist/method/skills/critique-deliverable/references/format.md +14 -20
  96. package/dist/method/skills/critique-deliverable/references/gestures.md +14 -21
  97. package/dist/method/skills/critique-deliverable/references/judgment.md +4 -9
  98. package/dist/method/skills/critique-deliverable/references/methods.md +21 -0
  99. package/dist/method/skills/critique-deliverable/references/reconcile.md +6 -11
  100. package/dist/method/skills/deep-research/SKILL.md +16 -24
  101. package/dist/method/skills/deep-research/references/candidates.md +13 -25
  102. package/dist/method/skills/deep-research/references/external.md +15 -34
  103. package/dist/method/skills/deep-research/references/page-format.md +16 -42
  104. package/dist/method/skills/deep-research/references/types.md +16 -27
  105. package/dist/method/skills/develop-story/SKILL.md +56 -189
  106. package/dist/method/skills/develop-story/references/acceptance-tests.md +18 -71
  107. package/dist/method/skills/develop-story/references/quick-lane.md +20 -0
  108. package/dist/method/skills/diagnose-bug/SKILL.md +42 -53
  109. package/dist/method/skills/diagnose-bug/references/hypotheses.md +1 -2
  110. package/dist/method/skills/generate-knowledge-base/SKILL.md +57 -226
  111. package/dist/method/skills/generate-knowledge-base/assets/index-template.md +6 -15
  112. package/dist/method/skills/generate-knowledge-base/assets/page-template.md +11 -24
  113. package/dist/method/skills/generate-knowledge-base/references/living-docs.md +25 -64
  114. package/dist/method/skills/generate-knowledge-base/references/reuse-map.md +9 -18
  115. package/dist/method/skills/ideation/SKILL.md +16 -23
  116. package/dist/method/skills/ideation/references/close.md +18 -14
  117. package/dist/method/skills/ideation/references/converge.md +11 -21
  118. package/dist/method/skills/ideation/references/stances.md +13 -17
  119. package/dist/method/skills/ideation/references/techniques.md +20 -0
  120. package/dist/method/skills/improve-code/SKILL.md +42 -54
  121. package/dist/method/skills/pitch/SKILL.md +16 -19
  122. package/dist/method/skills/pitch/references/deck.md +15 -18
  123. package/dist/method/skills/pitch/references/design-implementation.md +13 -21
  124. package/dist/method/skills/pitch/references/design.md +21 -0
  125. package/dist/method/skills/pitch/references/story.md +13 -18
  126. package/dist/method/skills/plan-sprint/SKILL.md +50 -151
  127. package/dist/method/skills/plan-sprint/references/rituals.md +40 -0
  128. package/dist/method/skills/prepare-go-live/SKILL.md +59 -0
  129. package/dist/method/skills/resolve-merge-conflict/SKILL.md +40 -65
  130. package/dist/method/skills/review-after-launch/SKILL.md +56 -0
  131. package/dist/method/skills/review-story/SKILL.md +44 -72
  132. package/dist/method/skills/review-story/references/amend-story.md +8 -13
  133. package/dist/method/skills/review-story/references/export.md +7 -17
  134. package/dist/method/skills/review-story/references/free-review.md +9 -20
  135. package/dist/method/skills/review-story/references/judge.md +25 -37
  136. package/dist/method/skills/review-story/references/tests.md +29 -0
  137. package/dist/method/skills/run-acceptance/SKILL.md +58 -0
  138. package/dist/method/skills/run-acceptance/references/template.md +39 -0
  139. package/dist/method/skills/run-retrospective/SKILL.md +50 -189
  140. package/dist/method/skills/security-review-architecture/SKILL.md +46 -109
  141. package/dist/method/skills/security-review-architecture/references/spec-review.md +27 -38
  142. package/dist/method/skills/setup-ci/SKILL.md +46 -109
  143. package/dist/method/skills/setup-ci/assets/access-check.mjs +116 -0
  144. package/dist/method/skills/setup-ci/assets/security-github.yml +41 -0
  145. package/dist/method/skills/setup-ci/assets/security-gitlab.yml +22 -0
  146. package/dist/method/skills/setup-ci/assets/stack-dotnet-github.yml +118 -0
  147. package/dist/method/skills/setup-ci/assets/stack-dotnet-gitlab.yml +63 -0
  148. package/dist/method/skills/setup-ci/assets/stack-go-github.yml +118 -0
  149. package/dist/method/skills/setup-ci/assets/stack-go-gitlab.yml +63 -0
  150. package/dist/method/skills/setup-ci/assets/stack-jvm-gradle-github.yml +134 -0
  151. package/dist/method/skills/setup-ci/assets/stack-jvm-gradle-gitlab.yml +71 -0
  152. package/dist/method/skills/setup-ci/assets/stack-jvm-maven-github.yml +133 -0
  153. package/dist/method/skills/setup-ci/assets/stack-jvm-maven-gitlab.yml +70 -0
  154. package/dist/method/skills/setup-ci/assets/stack-python-github.yml +123 -0
  155. package/dist/method/skills/setup-ci/assets/stack-python-gitlab.yml +68 -0
  156. package/dist/method/skills/setup-ci/assets/stack-rust-github.yml +107 -0
  157. package/dist/method/skills/setup-ci/assets/stack-rust-gitlab.yml +64 -0
  158. package/dist/method/skills/setup-ci/references/security.md +39 -0
  159. package/dist/method/skills/setup-ci/references/stacks.md +22 -0
  160. package/dist/method/skills/split-into-stories/SKILL.md +59 -192
  161. package/dist/method/skills/split-into-stories/assets/story.md.tmpl +15 -4
  162. package/dist/method/skills/strategy/SKILL.md +20 -25
  163. package/dist/method/skills/strategy/references/costs.md +12 -26
  164. package/dist/method/skills/strategy/references/gestures.md +12 -21
  165. package/dist/method/skills/strategy/references/innovate.md +19 -37
  166. package/dist/method/skills/strategy/references/solve.md +19 -32
  167. package/dist/method/skills/test-idea/SKILL.md +5 -5
  168. package/dist/method/skills/test-idea/assets/prfaq-template.md +1 -1
  169. package/dist/method/skills/test-idea/references/faq.md +12 -29
  170. package/dist/method/skills/test-idea/references/forge.md +19 -30
  171. package/dist/method/skills/test-idea/references/personas.md +16 -19
  172. package/dist/method/skills/test-idea/references/prfaq.md +31 -31
  173. package/dist/method/skills/workshop/SKILL.md +10 -16
  174. package/dist/method/skills/workshop/references/create.md +28 -45
  175. package/dist/method/skills/workshop/references/customize.md +17 -42
  176. package/dist/method/skills/workshop/references/evaluate.md +11 -42
  177. package/dist/method/skills/workshop/references/rules.md +17 -26
  178. package/dist/method/skills/write-architecture/SKILL.md +62 -220
  179. package/dist/method/skills/write-architecture/references/guard.md +12 -27
  180. package/dist/method/skills/write-architecture/references/self-check.md +22 -38
  181. package/dist/method/skills/write-brand/SKILL.md +2 -2
  182. package/dist/method/skills/write-brand/references/identity.md +21 -22
  183. package/dist/method/skills/write-brand/references/platform.md +13 -20
  184. package/dist/method/skills/write-brand/references/rules.md +16 -22
  185. package/dist/method/skills/write-brief/SKILL.md +55 -149
  186. package/dist/method/skills/write-brief/assets/brief-template.md +7 -5
  187. package/dist/method/skills/write-brief/references/brief-checklist.md +18 -30
  188. package/dist/method/skills/write-content/SKILL.md +53 -210
  189. package/dist/method/skills/write-content/references/content-checklist.md +32 -50
  190. package/dist/method/skills/write-positioning/SKILL.md +53 -197
  191. package/dist/method/skills/write-positioning/references/positioning-checklist.md +15 -41
  192. package/dist/method/skills/write-positioning/references/seo-checklist.md +26 -51
  193. package/dist/method/skills/write-prd/SKILL.md +52 -179
  194. package/dist/method/skills/write-prd/references/prd-checklist.md +25 -54
  195. package/dist/method/skills/write-sales/SKILL.md +48 -212
  196. package/dist/method/skills/write-sales/references/before-you-send.md +21 -49
  197. package/dist/method/skills/write-sales/references/sales-checklist.md +19 -69
  198. package/dist/method/skills/write-spec/references/spec-guide.md +20 -23
  199. package/dist/method/skills/write-ux-spec/SKILL.md +57 -168
  200. package/dist/method/skills/write-ux-spec/references/accessibility-check.md +13 -72
  201. package/dist/method/skills/write-ux-spec/references/mockups.md +6 -68
  202. package/dist/method/skills/write-ux-spec/references/tokens-and-sketches.md +8 -81
  203. package/dist/method/skills/write-ux-spec/references/ux-checklist.md +12 -67
  204. package/dist/product-root.js +96 -20743
  205. package/dist/project-command.js +776 -0
  206. package/dist/project-command2.js +1 -0
  207. package/dist/read-command.js +19 -0
  208. package/dist/rolldown-runtime.js +1 -2
  209. package/dist/sheet-command.js +58 -0
  210. package/dist/webauthn-verify.js +3 -5
  211. package/package.json +13 -11
  212. package/dist/method/agents/noah/references/conduct.md +0 -102
  213. package/dist/method/skills/api-e2e-tests/references/frameworks.md +0 -58
  214. package/dist/method/skills/api-e2e-tests/references/generate.md +0 -67
  215. package/dist/method/skills/audit-pillars/references/accessibility.md +0 -13
  216. package/dist/method/skills/audit-pillars/references/architecture.md +0 -13
  217. package/dist/method/skills/audit-pillars/references/dependencies.md +0 -13
  218. package/dist/method/skills/audit-pillars/references/format.md +0 -20
  219. package/dist/method/skills/audit-pillars/references/interface.md +0 -13
  220. package/dist/method/skills/audit-pillars/references/method.md +0 -33
  221. package/dist/method/skills/audit-pillars/references/performance.md +0 -17
  222. package/dist/method/skills/audit-pillars/references/quality.md +0 -11
  223. package/dist/method/skills/audit-pillars/references/security.md +0 -13
  224. package/dist/method/skills/audit-pillars/references/tests.md +0 -17
  225. package/dist/method/skills/critique-deliverable/references/assumption-audit.md +0 -11
  226. package/dist/method/skills/critique-deliverable/references/compare-existing.md +0 -13
  227. package/dist/method/skills/critique-deliverable/references/devils-advocate.md +0 -13
  228. package/dist/method/skills/critique-deliverable/references/divergence.md +0 -15
  229. package/dist/method/skills/critique-deliverable/references/domain-expert.md +0 -14
  230. package/dist/method/skills/critique-deliverable/references/extreme-user.md +0 -13
  231. package/dist/method/skills/critique-deliverable/references/failure-modes.md +0 -13
  232. package/dist/method/skills/critique-deliverable/references/first-principles.md +0 -12
  233. package/dist/method/skills/critique-deliverable/references/inversion.md +0 -13
  234. package/dist/method/skills/critique-deliverable/references/pre-mortem.md +0 -12
  235. package/dist/method/skills/critique-deliverable/references/red-team.md +0 -12
  236. package/dist/method/skills/critique-deliverable/references/reframe.md +0 -12
  237. package/dist/method/skills/critique-deliverable/references/second-order.md +0 -12
  238. package/dist/method/skills/critique-deliverable/references/socratic.md +0 -15
  239. package/dist/method/skills/critique-deliverable/references/steelman.md +0 -13
  240. package/dist/method/skills/critique-deliverable/references/subtraction.md +0 -12
  241. package/dist/method/skills/develop-story/references/self-check.md +0 -46
  242. package/dist/method/skills/generate-knowledge-base/references/kb-checklist.md +0 -49
  243. package/dist/method/skills/generate-knowledge-base/references/repository-scan.md +0 -48
  244. package/dist/method/skills/ideation/references/choose.md +0 -21
  245. package/dist/method/skills/ideation/references/gestures.md +0 -15
  246. package/dist/method/skills/ideation/references/techniques-borrowed.md +0 -8
  247. package/dist/method/skills/ideation/references/techniques-deep.md +0 -12
  248. package/dist/method/skills/ideation/references/techniques-frames.md +0 -12
  249. package/dist/method/skills/ideation/references/techniques-futures.md +0 -8
  250. package/dist/method/skills/ideation/references/techniques-limits.md +0 -9
  251. package/dist/method/skills/ideation/references/techniques-people.md +0 -7
  252. package/dist/method/skills/ideation/references/techniques-sparks.md +0 -10
  253. package/dist/method/skills/ideation/references/techniques-together.md +0 -11
  254. package/dist/method/skills/order-merges/SKILL.md +0 -71
  255. package/dist/method/skills/pitch/references/deck-types.md +0 -17
  256. package/dist/method/skills/pitch/references/design-methods.md +0 -45
  257. package/dist/method/skills/pitch/references/design-thinking.md +0 -28
  258. package/dist/method/skills/pitch/references/story-frameworks.md +0 -39
  259. package/dist/method/skills/quick-lane/SKILL.md +0 -143
  260. package/dist/method/skills/review-tests/SKILL.md +0 -32
  261. package/dist/method/skills/review-tests/references/check.md +0 -25
  262. package/dist/method/skills/review-tests/references/grid.md +0 -27
  263. package/dist/method/skills/round-table/SKILL.md +0 -31
  264. package/dist/method/skills/round-table/evals/cases.yaml +0 -27
  265. package/dist/method/skills/round-table/references/cast.md +0 -14
  266. package/dist/method/skills/round-table/references/gestures.md +0 -24
  267. package/dist/method/skills/round-table/references/guests.md +0 -17
  268. package/dist/method/skills/round-table/references/independence.md +0 -21
  269. package/dist/method/skills/round-table/references/rooms.md +0 -29
  270. package/dist/method/skills/round-table/references/three-views.md +0 -17
  271. package/dist/method/skills/round-table/references/turns.md +0 -19
  272. package/dist/method/skills/strategy/references/innovate-frameworks.md +0 -48
  273. package/dist/method/skills/strategy/references/solve-methods.md +0 -45
  274. package/dist/method/skills/test-idea/references/bets.md +0 -14
  275. package/dist/method/skills/test-idea/references/concept.md +0 -24
  276. package/dist/method/skills/test-idea/references/verdict.md +0 -26
  277. package/dist/method/skills/workshop/references/analyze.md +0 -36
@@ -1,121 +1,58 @@
1
1
  ---
2
2
  name: setup-ci
3
- description: Set up the product's base CI (lint, tests, build, audit) for its forge, never over an existing one, for the creator to merge. Run by Omar.
3
+ description: Set up the product's base CI (lint, tests, build, audit) for its forge, never over an existing one; the creator merges it. Run by Omar.
4
4
  metadata:
5
5
  agent: omar
6
6
  phase: build
7
7
  ---
8
8
  # Set up the CI
9
9
 
10
- > **The creator's Git workflow, not the method's.** Read `git` in `state.next` or `state.get` before you act: the branch a story lands on is `git.branches.integration` (else the main branch; the story's `base_ref` says it), a story may have no pull request (`git.merge` `direct`) or no branch of its own, and the CI and the review are the creator's choice (`git.ci` `none`, `git.review` false). Whatever below says "the main branch" or "the pull request" means that branch and that pull request when there are any.
11
-
12
- The CI is what lets the creator see only green pull requests. Each check it runs is one name the
13
- engine reads back (`story ci`, `story.ci`): a failed check sends the story to its developer, who
14
- fixes it on the same branch. This skill writes that CI once, from the method's templates, and
15
- leaves it to the product: the engine never writes it again.
16
-
17
- This skill belongs to Omar. Run it as Omar, with `agent: omar` in every MCP call. Work in the
18
- creator's language; keep commands, file names and check names as they are.
19
-
20
- - **Inputs:** the product's `package.json` and lock file, `.nvmrc` when there is one, the
21
- architecture and the test strategy (`.agentplugged/docs/`), the runbook when it exists.
22
- - **Output:** `.github/workflows/ci.yml` (GitHub) or `.gitlab-ci.yml` (GitLab), delivered in a
23
- branch of its own, pushed for the creator to open and merge, and its description in the runbook.
24
- - The CI comes before the first story of the build: `state.next` proposes this skill then
25
- (`setup_ci`), even though Omar's own phase is the delivery.
26
-
27
- Follow the steps in order. Each one ends with what it must have produced.
28
-
29
- ## Step 1 — Check where the product stands
30
-
31
- 1. Call `agent.status` (`working`, task "CI setup").
32
- 2. Call `state.get`: `phase.current` should be `build` (or null when the profile has no phases).
33
- In an earlier phase, say which phase is current and stop.
34
- 3. Look for an existing CI: `.github/workflows/*.yml`, `.gitlab-ci.yml`, or another system's file
35
- at the repository's top (`.circleci/`, `azure-pipelines.yml`, `Jenkinsfile`…). When one
36
- exists, never replace it: compare it with the four checks below, propose what is missing to
37
- the creator, and go to Step 4. `npx agentplugged ci setup` lists, as `Not checked by the CI`, the
38
- test scripts (`test:api`, `test:integration`, `test:e2e`) the CI does not run: add them to the
39
- `test` job (skill `api-e2e-tests`, reference `ci`).
40
-
41
- **Produces:** the phase confirmed, and whether a CI already exists.
42
-
43
- ## Step 2 — Generate the workflow
44
-
45
- 1. Run `npx agentplugged ci setup` at the repository's top. The forge is `ci.forge` in
46
- `.agentplugged/method.yaml` when set, else the `origin` remote's host (`github.com`,
47
- `gitlab.com`, or a host starting with `github.` or `gitlab.`). When neither says it (a forge
48
- hosted under another name), ask the creator which one, then run
49
- `npx agentplugged ci setup --forge github` (or `--forge gitlab`), and propose to set
50
- `ci: { forge: … }` in `method.yaml` so that reading the CI finds it too.
51
- 2. Read what it says: the file written, the stack it recognised (pnpm, npm, yarn, or other), and
52
- every `TODO` left. It writes nothing when a CI exists (`exists`).
53
-
54
- The workflow has four jobs, one check each, named `lint`, `test`, `build` and `audit`. Each one
55
- installs the dependencies as locked and runs the product's own script (`lint`, then `typecheck`
56
- when it exists; `test`, then `test:api`, `test:integration` and `test:e2e` when it has them; `build`), or the package manager's audit of high-severity advisories.
57
-
58
- **Produces:** the workflow file, and the list of TODOs.
59
-
60
- ## Step 3 — Complete what the template could not guess
61
-
62
- 1. Read the file whole. Each `TODO` comment is followed by a step that fails on purpose: replace
63
- both with the real command — the script the product lacks, or the toolchain of a stack the
64
- template does not know (from the architecture: language, version, package manager).
65
- 2. Keep one job per check and keep their names: the engine reports failed checks by name.
66
- 3. Never weaken a check to make it pass: no `continue-on-error`, no `allow_failure`, no
67
- `|| true`, no skipped test. A check that cannot pass yet is a `decision` checkpoint for the
68
- creator, never a silent green.
69
- 4. Refer to secrets by name only (`${{ secrets.NAME }}`, `$NAME`), never by value. The base CI
70
- needs none.
71
-
72
- **Produces:** a workflow without a `TODO`, each check meaningful.
73
-
74
- ## Step 4 — Deliver it
75
-
76
- 1. Create a branch of its own (`ci/base-workflows`), commit the workflow there and push that
77
- branch by its name (`git push origin ci/base-workflows`: never the main branch, never
78
- forced). Never run `gh` or `glab` yourself: no pull request by hand, no CI or repository
79
- setting (the engine delivers it). The creator types no command either:
80
- the engine delivers it once they approve.
81
- - When the product has no remote repository yet (no `origin`), ask the creator for it first
82
- (`guard.creator_action`, `forge_repo_create` {forge, name}: private by default), then,
83
- for the main branch that was never pushed, `forge_push_main` {}. Each is a request the
84
- creator approves in the chat, confirming the action ("yes, create the private repository
85
- shop on GitHub"); the engine does it with the forge's tool they connected.
86
- - Then ask for the merge: `guard.creator_action`, `forge_merge_ci` {branch:
87
- `ci/base-workflows`}. The engine opens the pull request (its title and text are fixed)
88
- when there is none, and merges it on the commit the creator saw, if only the CI's files and
89
- the product's documentation changed in the branch and the branch is at the remote exactly as
90
- it was read. Present the request as it asks: the repository, the branch and the commit it
91
- names; never merge anything yourself.
92
- 2. Describe the pipeline in `.agentplugged/docs/runbook.md` (create it with its YAML header when
93
- it does not exist: `id`, `kind: note`, `owner: omar`, `links`): each check, what it proves,
94
- and what to do when it fails. Run `npx agentplugged docs check` and fix what it reports.
95
-
96
- **Produces:** the branch of the CI, pushed, and the runbook updated.
97
-
98
- ## Step 5 — Report
99
-
100
- 1. Call `story.result`: `complete`, a summary naming the workflow, its checks and the
101
- branch, your assumptions (a script you inferred, a version you chose), the open questions and
102
- the conflicts. `partial` when a TODO is left, saying which.
103
- 2. Call `agent.status` (`idle`).
104
- 3. Tell the creator what the engine did once they approved the merge (`executed` in the
105
- result): from then on, every story's pull request runs these checks, and a failed one goes
106
- back to its developer. When a request answers `FORGE_GESTURE_FAILED`, say what it says
107
- (the forge's tool not logged in, a branch not pushed, a remote ahead of the main branch…):
108
- the creator fixes it, you ask again.
109
- Then hand back to Noah, who proposes what comes next; the creator decides (without Noah, the
110
- creator picks the next agent).
10
+ > **The creator's Git workflow, not the method's.** Read `git` in `state.next` or `state.get`: stories land on `git.branches.integration` (else the main branch), may have no pull request (`git.merge` `direct`), and the CI is the creator's choice (`git.ci` `none`). "The main branch" and "the pull request" below mean those.
11
+
12
+ ## Overview
13
+
14
+ - **Step:** before the first story of the build (`state.next` proposes it, `setup_ci`), as Omar
15
+ (`agent: omar` in every MCP call). A failed check (`story.ci`) sends the story to its developer.
16
+ - **Produces:** `.github/workflows/ci.yml` or `.gitlab-ci.yml` from the templates in `assets/`, in a
17
+ branch of its own for the creator to merge; its description in `.agentplugged/docs/runbook.md`.
18
+ - **Reads:** `package.json`, the lock file, `.nvmrc`.
19
+ - **Validation point:** the creator action `forge_merge_ci` (step 4).
20
+
21
+ ## Steps
22
+
23
+ 1. **Start.** `agent.status` (`working`). `state.get`: `phase.current` should be `build` (or null);
24
+ earlier: stop. An existing CI (`.github/workflows/`, `.gitlab-ci.yml`,
25
+ `.circleci/`, `azure-pipelines.yml`, `Jenkinsfile`…) is never replaced: compare it with the four
26
+ checks, propose what is missing, go to step 4. `npx agentplugged ci setup` lists as `Not checked
27
+ by the CI` the test scripts (`test:api`, `test:integration`, `test:e2e`) it skips: add them to
28
+ the `test` job (skill `api-e2e-tests`, reference `ci`).
29
+ 2. **Generate.** `npx agentplugged ci setup`. Forge: `ci.forge` in `.agentplugged/method.yaml`, else
30
+ the `origin` host; if neither says it, ask, run `--forge github|gitlab`, propose setting
31
+ `ci: { forge: … }`. Read every `TODO`. Four jobs named `lint`, `test`,
32
+ `build`, `audit`, running the product's own scripts and the package manager's audit; `security.yml` adds `secrets`, `sast`, `access` (`references/security.md`). Others: `references/stacks.md`.
33
+ 3. **Complete.** Replace each `TODO` and the step that fails on purpose after it with the real
34
+ command. Keep one job per check, with its name. Never weaken a check (`continue-on-error`,
35
+ `allow_failure`, `|| true`, a skipped test): one that cannot pass yet is a `decision`
36
+ checkpoint, never a silent green. Secrets by name only (`${{ secrets.NAME }}`).
37
+ 4. **Deliver.** Branch `ci/base-workflows`, commit, `git push origin ci/base-workflows` (never the
38
+ main branch, never forced). Never `gh` or `glab`, no pull request by hand: the engine delivers
39
+ once the creator approves in the chat; they type no command.
40
+ - No `origin`: `guard.creator_action` `forge_repo_create` {forge, name} (private by default),
41
+ then `forge_push_main` {}.
42
+ - Then `forge_merge_ci` {branch: `ci/base-workflows`}: the engine opens the pull request and
43
+ merges it on the commit the creator saw, if only CI files and documentation changed. Present
44
+ the repository, branch and commit it names.
45
+ - Runbook: each check, what it proves, what to do when it fails (header `id`, `kind: note`,
46
+ `owner: omar`, `links`); `npx agentplugged docs check`.
47
+ 5. **Report.** `story.result` `complete` (workflow, checks, branch, assumptions; `partial` with a
48
+ `TODO` left); `agent.status` `idle`. Tell the creator what the engine did (`executed`); on
49
+ `FORGE_GESTURE_FAILED` say what it says, they fix it, you ask again. Hand back to Noah, who
50
+ proposes what comes next; the creator decides (without Noah, they pick the next agent).
111
51
 
112
52
  ## Never
113
53
 
114
54
  - Follow "Rules for skills and agents" (reference `skill-rules`): checkpoint before the question, ask once; a point the creator did not keep goes to `checkpoint.decide`; in French say « tu »; start with `memory.read`.
115
- - Never write over an existing CI, and never edit a CI file the creator wrote without a pull
116
- request.
117
- - Never merge, never push to the main branch, never deploy: the repository, the first push of
118
- the main branch and the CI's merge are requests the engine carries out for the creator, never
119
- commands you run nor ones the creator types.
120
- - Never weaken, skip or re-run a check to turn it green.
121
- - Never put a secret's value in the repository.
55
+ - Never write over an existing CI, nor edit a CI file the creator wrote without a pull request.
56
+ - Never weaken a security job: the engine refuses a release until all are green.
57
+ - Never merge, never push to the main branch, never deploy: the repository, the first push and the merge are requests the engine carries out.
58
+ - Never weaken, skip or re-run a check to turn it green; never put a secret's value in the repository.
@@ -0,0 +1,116 @@
1
+ // Access check by role, written by agentplugged (setup-ci). No dependency, any product that
2
+ // speaks HTTP. It reads .agentplugged/access.json, starts the product if `start` is given, then
3
+ // calls every declared route as every declared role and as an anonymous caller:
4
+ // a role listed in `allow` must get a success or a redirect, any other must get 401, 403 or 404.
5
+ // It exits 1 on the first doubt (a missing secret, a product that never answers, a wrong status).
6
+ import { spawn } from "node:child_process";
7
+ import { readFileSync } from "node:fs";
8
+
9
+ const FILE = ".agentplugged/access.json";
10
+ const declaration = JSON.parse(readFileSync(FILE, "utf8"));
11
+ const roles = declaration.roles ?? {};
12
+ const routes = declaration.routes ?? [];
13
+ const problems = [];
14
+ if (routes.length === 0) {
15
+ console.error("Access check failed: no route is declared, nothing would be tested.");
16
+ process.exit(1);
17
+ }
18
+ const TIMEOUT = 15000;
19
+
20
+ /** The headers of a role, with ${NAME} replaced by the environment's value of NAME. */
21
+ function headersOf(role) {
22
+ const headers = {};
23
+ for (const [name, template] of Object.entries(roles[role]?.headers ?? {})) {
24
+ headers[name] = String(template).replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_, key) => {
25
+ const value = process.env[key];
26
+ if (value === undefined || value === "") {
27
+ problems.push(`role ${role}: the secret ${key} is empty or not set`);
28
+ return "";
29
+ }
30
+ return value;
31
+ });
32
+ }
33
+ return headers;
34
+ }
35
+
36
+ const pause = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
37
+
38
+ async function waitForProduct() {
39
+ for (let attempt = 0; attempt < 60; attempt += 1) {
40
+ try {
41
+ await fetch(declaration.base_url, {
42
+ redirect: "manual",
43
+ signal: AbortSignal.timeout(TIMEOUT),
44
+ });
45
+ return true;
46
+ } catch {
47
+ await pause(1000);
48
+ }
49
+ }
50
+ return false;
51
+ }
52
+
53
+ let child;
54
+ if (declaration.start) {
55
+ child = spawn(declaration.start, { shell: true, stdio: "inherit", detached: true });
56
+ }
57
+ const stop = () => {
58
+ if (child?.pid === undefined) return;
59
+ try {
60
+ process.kill(-child.pid);
61
+ } catch {
62
+ child.kill();
63
+ }
64
+ };
65
+
66
+ try {
67
+ if (!(await waitForProduct())) {
68
+ problems.push(`the product does not answer at ${declaration.base_url} after 60 seconds`);
69
+ } else {
70
+ const callers = [...Object.keys(roles), "anonymous"];
71
+ for (const route of routes) {
72
+ for (const caller of callers) {
73
+ const allowed = route.allow.includes(caller);
74
+ let status;
75
+ try {
76
+ const response = await fetch(new URL(route.path, declaration.base_url), {
77
+ method: route.method,
78
+ headers: caller === "anonymous" ? {} : headersOf(caller),
79
+ redirect: "manual",
80
+ signal: AbortSignal.timeout(TIMEOUT),
81
+ });
82
+ status = response.status;
83
+ } catch (error) {
84
+ problems.push(`${route.method} ${route.path} as ${caller}: ${error.message}`);
85
+ continue;
86
+ }
87
+ // A redirect (to a login page) refuses a caller, and never proves access.
88
+ const refused =
89
+ status === 401 || status === 403 || status === 404 || (status >= 300 && status < 400);
90
+ const reached = status >= 200 && status < 300;
91
+ if (allowed && !reached) {
92
+ problems.push(
93
+ `${route.method} ${route.path}: ${caller} should be allowed, got ${status}`,
94
+ );
95
+ }
96
+ if (!allowed && !refused) {
97
+ problems.push(
98
+ `${route.method} ${route.path}: ${caller} should be refused, got ${status}`,
99
+ );
100
+ }
101
+ }
102
+ }
103
+ }
104
+ } finally {
105
+ stop();
106
+ }
107
+
108
+ if (problems.length > 0) {
109
+ console.error(`Access check failed (${problems.length}):`);
110
+ for (const problem of [...new Set(problems)]) console.error(` - ${problem}`);
111
+ process.exit(1);
112
+ }
113
+ console.log(
114
+ `Access check passed: ${routes.length} routes, ${Object.keys(roles).length + 1} callers.`,
115
+ );
116
+ process.exit(0);
@@ -0,0 +1,41 @@
1
+ # Generated by agentplugged (setup-ci) from the method's template: yours to edit.
2
+ # Three deterministic security checks, one job each: `secrets` (gitleaks), `sast` (semgrep, its
3
+ # default rules, no account) and `access` (a request per role and route declared in
4
+ # .agentplugged/access.json). The engine reads these jobs for the commit before it puts the
5
+ # product into production: a job that failed, was skipped or was removed holds the release.
6
+ # Never weaken one (`continue-on-error`, `|| true`, an `if:`): fix what it found.
7
+ {{header}}
8
+ name: Security
9
+
10
+ on:
11
+ pull_request:
12
+ push:
13
+ branches: [{{main_branch}}]
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ concurrency:
19
+ group: security-${{ github.ref }}
20
+ cancel-in-progress: true
21
+
22
+ jobs:
23
+ secrets:
24
+ name: secrets
25
+ runs-on: {{runs_on}}
26
+ timeout-minutes: 15
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+ with:
30
+ fetch-depth: 0
31
+ - run: 'docker run --rm -v "$PWD:/repo" --entrypoint sh zricethezav/gitleaks:v8.21.2 -c "git config --global --add safe.directory /repo && gitleaks detect --source /repo --redact --no-banner"'
32
+
33
+ sast:
34
+ name: sast
35
+ runs-on: {{runs_on}}
36
+ timeout-minutes: 20
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+ - run: 'docker run --rm -v "$PWD:/src" -w /src semgrep/semgrep:1.97.0 semgrep scan --config p/default --error --metrics=off'
40
+
41
+ {{access_job}}
@@ -0,0 +1,22 @@
1
+ secrets:
2
+ stage: check
3
+ image:
4
+ name: zricethezav/gitleaks:v8.21.2
5
+ entrypoint: [""]
6
+ variables:
7
+ GIT_DEPTH: "0"
8
+ before_script: []
9
+ script:
10
+ - 'git config --global --add safe.directory "$CI_PROJECT_DIR"'
11
+ - 'gitleaks detect --source . --redact --no-banner'
12
+
13
+ sast:
14
+ stage: check
15
+ image:
16
+ name: semgrep/semgrep:1.97.0
17
+ entrypoint: [""]
18
+ before_script: []
19
+ script:
20
+ - 'semgrep scan --config p/default --error --metrics=off'
21
+
22
+ {{access_job}}
@@ -0,0 +1,118 @@
1
+ # Base CI for .NET (dotnet test, dotnet format, vulnerable packages): a template of the method, advice only.
2
+ # Yours to edit or to leave: decline it and nothing else changes. It makes no call to the method;
3
+ # every tool below is the ecosystem's own and free.
4
+ # One job per check of the pull request (lint, test, build, audit). A failed job keeps its logs and
5
+ # reports in `reports/` as a CI artifact. Adjust versions and paths to your product.
6
+ name: CI
7
+
8
+ on:
9
+ pull_request:
10
+ push:
11
+ branches: [main]
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: ci-${{ github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ defaults:
21
+ run:
22
+ shell: bash
23
+
24
+ jobs:
25
+ lint:
26
+ name: lint
27
+ runs-on: ubuntu-latest
28
+ timeout-minutes: 15
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+ - uses: actions/setup-dotnet@v4
32
+ with:
33
+ dotnet-version: "8.0.x"
34
+ - name: lint
35
+ run: |
36
+ mkdir -p reports
37
+ dotnet restore 2>&1 | tee -a reports/lint.txt
38
+ dotnet format --verify-no-changes --no-restore 2>&1 | tee -a reports/lint.txt
39
+ - name: Keep the evidence
40
+ if: failure()
41
+ uses: actions/upload-artifact@v4
42
+ with:
43
+ name: lint-evidence
44
+ path: |
45
+ reports/
46
+ if-no-files-found: ignore
47
+ retention-days: 14
48
+
49
+ test:
50
+ name: test
51
+ runs-on: ubuntu-latest
52
+ timeout-minutes: 30
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ - uses: actions/setup-dotnet@v4
56
+ with:
57
+ dotnet-version: "8.0.x"
58
+ - name: test
59
+ run: |
60
+ mkdir -p reports
61
+ dotnet test --logger "trx;LogFileName=test.trx" --results-directory reports 2>&1 | tee -a reports/test.txt
62
+ - name: Keep the evidence
63
+ if: failure()
64
+ uses: actions/upload-artifact@v4
65
+ with:
66
+ name: test-evidence
67
+ path: |
68
+ reports/
69
+ if-no-files-found: ignore
70
+ retention-days: 14
71
+
72
+ build:
73
+ name: build
74
+ runs-on: ubuntu-latest
75
+ timeout-minutes: 15
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+ - uses: actions/setup-dotnet@v4
79
+ with:
80
+ dotnet-version: "8.0.x"
81
+ - name: build
82
+ run: |
83
+ mkdir -p reports
84
+ dotnet build -c Release 2>&1 | tee -a reports/build.txt
85
+ - name: Keep the evidence
86
+ if: failure()
87
+ uses: actions/upload-artifact@v4
88
+ with:
89
+ name: build-evidence
90
+ path: |
91
+ reports/
92
+ if-no-files-found: ignore
93
+ retention-days: 14
94
+
95
+ audit:
96
+ name: audit
97
+ runs-on: ubuntu-latest
98
+ timeout-minutes: 10
99
+ steps:
100
+ - uses: actions/checkout@v4
101
+ - uses: actions/setup-dotnet@v4
102
+ with:
103
+ dotnet-version: "8.0.x"
104
+ - name: audit
105
+ run: |
106
+ mkdir -p reports
107
+ dotnet restore 2>&1 | tee -a reports/audit.txt
108
+ dotnet list package --vulnerable --include-transitive 2>&1 | tee reports/audit.txt
109
+ if grep -q 'has the following vulnerable packages' reports/audit.txt; then exit 1; fi
110
+ - name: Keep the evidence
111
+ if: failure()
112
+ uses: actions/upload-artifact@v4
113
+ with:
114
+ name: audit-evidence
115
+ path: |
116
+ reports/
117
+ if-no-files-found: ignore
118
+ retention-days: 14
@@ -0,0 +1,63 @@
1
+ # Base CI for .NET (dotnet test, dotnet format, vulnerable packages): a template of the method, advice only.
2
+ # Yours to edit or to leave: decline it and nothing else changes. It makes no call to the method;
3
+ # every tool below is the ecosystem's own and free.
4
+ # One job per check of the merge request (lint, test, build, audit). A failed job keeps its logs and
5
+ # reports in `reports/` as a CI artifact. Adjust versions and paths to your product.
6
+ image: mcr.microsoft.com/dotnet/sdk:8.0
7
+
8
+ stages:
9
+ - check
10
+
11
+ default:
12
+ timeout: 30 minutes
13
+
14
+ lint:
15
+ stage: check
16
+ script:
17
+ - set -o pipefail
18
+ - mkdir -p reports
19
+ - 'dotnet restore 2>&1 | tee -a reports/lint.txt'
20
+ - 'dotnet format --verify-no-changes --no-restore 2>&1 | tee -a reports/lint.txt'
21
+ artifacts:
22
+ when: on_failure
23
+ expire_in: 2 weeks
24
+ paths:
25
+ - reports/
26
+
27
+ test:
28
+ stage: check
29
+ script:
30
+ - set -o pipefail
31
+ - mkdir -p reports
32
+ - 'dotnet test --logger "trx;LogFileName=test.trx" --results-directory reports 2>&1 | tee -a reports/test.txt'
33
+ artifacts:
34
+ when: on_failure
35
+ expire_in: 2 weeks
36
+ paths:
37
+ - reports/
38
+
39
+ build:
40
+ stage: check
41
+ script:
42
+ - set -o pipefail
43
+ - mkdir -p reports
44
+ - 'dotnet build -c Release 2>&1 | tee -a reports/build.txt'
45
+ artifacts:
46
+ when: on_failure
47
+ expire_in: 2 weeks
48
+ paths:
49
+ - reports/
50
+
51
+ audit:
52
+ stage: check
53
+ script:
54
+ - set -o pipefail
55
+ - mkdir -p reports
56
+ - 'dotnet restore 2>&1 | tee -a reports/audit.txt'
57
+ - 'dotnet list package --vulnerable --include-transitive 2>&1 | tee reports/audit.txt'
58
+ - 'if grep -q ''has the following vulnerable packages'' reports/audit.txt; then exit 1; fi'
59
+ artifacts:
60
+ when: on_failure
61
+ expire_in: 2 weeks
62
+ paths:
63
+ - reports/
@@ -0,0 +1,118 @@
1
+ # Base CI for Go (go test, go vet, govulncheck): a template of the method, advice only.
2
+ # Yours to edit or to leave: decline it and nothing else changes. It makes no call to the method;
3
+ # every tool below is the ecosystem's own and free.
4
+ # One job per check of the pull request (lint, test, build, audit). A failed job keeps its logs and
5
+ # reports in `reports/` as a CI artifact. Adjust versions and paths to your product.
6
+ name: CI
7
+
8
+ on:
9
+ pull_request:
10
+ push:
11
+ branches: [main]
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ concurrency:
17
+ group: ci-${{ github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ defaults:
21
+ run:
22
+ shell: bash
23
+
24
+ jobs:
25
+ lint:
26
+ name: lint
27
+ runs-on: ubuntu-latest
28
+ timeout-minutes: 15
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+ - uses: actions/setup-go@v5
32
+ with:
33
+ go-version-file: go.mod
34
+ - name: lint
35
+ run: |
36
+ mkdir -p reports
37
+ go vet ./... 2>&1 | tee -a reports/lint.txt
38
+ gofmt -l . | tee -a reports/lint.txt
39
+ test -z "$(gofmt -l .)"
40
+ - name: Keep the evidence
41
+ if: failure()
42
+ uses: actions/upload-artifact@v4
43
+ with:
44
+ name: lint-evidence
45
+ path: |
46
+ reports/
47
+ if-no-files-found: ignore
48
+ retention-days: 14
49
+
50
+ test:
51
+ name: test
52
+ runs-on: ubuntu-latest
53
+ timeout-minutes: 30
54
+ steps:
55
+ - uses: actions/checkout@v4
56
+ - uses: actions/setup-go@v5
57
+ with:
58
+ go-version-file: go.mod
59
+ - name: test
60
+ run: |
61
+ mkdir -p reports
62
+ go test ./... 2>&1 | tee -a reports/test.txt
63
+ - name: Keep the evidence
64
+ if: failure()
65
+ uses: actions/upload-artifact@v4
66
+ with:
67
+ name: test-evidence
68
+ path: |
69
+ reports/
70
+ if-no-files-found: ignore
71
+ retention-days: 14
72
+
73
+ build:
74
+ name: build
75
+ runs-on: ubuntu-latest
76
+ timeout-minutes: 15
77
+ steps:
78
+ - uses: actions/checkout@v4
79
+ - uses: actions/setup-go@v5
80
+ with:
81
+ go-version-file: go.mod
82
+ - name: build
83
+ run: |
84
+ mkdir -p reports
85
+ go build ./... 2>&1 | tee -a reports/build.txt
86
+ - name: Keep the evidence
87
+ if: failure()
88
+ uses: actions/upload-artifact@v4
89
+ with:
90
+ name: build-evidence
91
+ path: |
92
+ reports/
93
+ if-no-files-found: ignore
94
+ retention-days: 14
95
+
96
+ audit:
97
+ name: audit
98
+ runs-on: ubuntu-latest
99
+ timeout-minutes: 10
100
+ steps:
101
+ - uses: actions/checkout@v4
102
+ - uses: actions/setup-go@v5
103
+ with:
104
+ go-version-file: go.mod
105
+ - name: audit
106
+ run: |
107
+ mkdir -p reports
108
+ go install golang.org/x/vuln/cmd/govulncheck@v1.1.4 2>&1 | tee -a reports/audit.txt
109
+ $(go env GOPATH)/bin/govulncheck ./... 2>&1 | tee -a reports/audit.txt
110
+ - name: Keep the evidence
111
+ if: failure()
112
+ uses: actions/upload-artifact@v4
113
+ with:
114
+ name: audit-evidence
115
+ path: |
116
+ reports/
117
+ if-no-files-found: ignore
118
+ retention-days: 14