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.
- package/README.md +11 -4
- package/dist/agent-commands.js +20432 -35457
- package/dist/bin.js +2 -3
- package/dist/boundary-rules.js +1 -0
- package/dist/boundary-rules2.js +52 -0
- package/dist/cli.js +7 -3
- package/dist/commit-documents.js +81 -0
- package/dist/dist.js +22729 -0
- package/dist/dist2.js +9 -0
- package/dist/esm.js +8 -16
- package/dist/forge-follow.js +6 -7
- package/dist/grammars/LICENSE-tree-sitter-wasm +21 -0
- package/dist/grammars/LICENSE-web-tree-sitter +21 -0
- package/dist/grammars/tree-sitter-go.wasm +0 -0
- package/dist/grammars/tree-sitter-java.wasm +0 -0
- package/dist/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/grammars/tree-sitter-php.wasm +0 -0
- package/dist/grammars/tree-sitter-python.wasm +0 -0
- package/dist/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/grammars/web-tree-sitter.wasm +0 -0
- package/dist/hash.js +11594 -5733
- package/dist/helpers.js +271 -519
- package/dist/launcher-env.js +1 -2
- package/dist/launcher.js +4 -5
- package/dist/libsodium-wrappers.js +2 -4
- package/dist/libsodium-wrappers2.js +2 -4
- package/dist/main.js +10502 -2787
- package/dist/map-cache.js +8096 -0
- package/dist/map-update.js +16593 -0
- package/dist/map-update2.js +1 -0
- package/dist/method/agents/alex/SKILL.md +13 -29
- package/dist/method/agents/alex/agent.yaml +3 -3
- package/dist/method/agents/basile/SKILL.md +44 -0
- package/dist/method/agents/basile/agent.yaml +69 -0
- package/dist/method/agents/chloe/SKILL.md +12 -25
- package/dist/method/agents/chloe/agent.yaml +3 -3
- package/dist/method/agents/ethan/SKILL.md +8 -9
- package/dist/method/agents/ethan/agent.yaml +9 -8
- package/dist/method/agents/hugo/SKILL.md +8 -8
- package/dist/method/agents/hugo/agent.yaml +9 -8
- package/dist/method/agents/iris/SKILL.md +11 -17
- package/dist/method/agents/iris/agent.yaml +4 -7
- package/dist/method/agents/izzy/SKILL.md +68 -91
- package/dist/method/agents/izzy/agent.yaml +8 -15
- package/dist/method/agents/jade/SKILL.md +7 -9
- package/dist/method/agents/jade/agent.yaml +9 -8
- package/dist/method/agents/julien/SKILL.md +38 -58
- package/dist/method/agents/lina/SKILL.md +7 -9
- package/dist/method/agents/lina/agent.yaml +9 -8
- package/dist/method/agents/lou/SKILL.md +4 -11
- package/dist/method/agents/lou/agent.yaml +2 -2
- package/dist/method/agents/maya/SKILL.md +12 -19
- package/dist/method/agents/maya/agent.yaml +2 -4
- package/dist/method/agents/milo/SKILL.md +21 -32
- package/dist/method/agents/noah/SKILL.md +105 -63
- package/dist/method/agents/noah/agent.yaml +15 -35
- package/dist/method/agents/noah/evals/routes.yaml +238 -0
- package/dist/method/agents/noah/references/decisions.md +59 -121
- package/dist/method/agents/noah/references/environment.md +25 -70
- package/dist/method/agents/noah/references/facts.md +22 -11
- package/dist/method/agents/noah/references/journey.md +26 -78
- package/dist/method/agents/noah/references/team.md +67 -190
- package/dist/method/agents/omar/SKILL.md +14 -30
- package/dist/method/agents/omar/agent.yaml +12 -6
- package/dist/method/agents/quentin/SKILL.md +7 -15
- package/dist/method/agents/quentin/agent.yaml +4 -2
- package/dist/method/agents/sam/SKILL.md +6 -8
- package/dist/method/agents/sam/agent.yaml +9 -8
- package/dist/method/agents/stella/SKILL.md +6 -14
- package/dist/method/agents/stella/agent.yaml +1 -1
- package/dist/method/agents/tess/SKILL.md +7 -14
- package/dist/method/agents/tess/agent.yaml +2 -2
- package/dist/method/agents/zoe/SKILL.md +9 -21
- package/dist/method/doctor.yaml +553 -13
- package/dist/method/models.yaml +12 -0
- package/dist/method/skills/acceptance-qa/SKILL.md +1 -1
- package/dist/method/skills/acceptance-qa/references/run.md +24 -32
- package/dist/method/skills/acceptance-qa/references/scenarios.md +16 -19
- package/dist/method/skills/acceptance-qa/references/verdicts.md +10 -16
- package/dist/method/skills/api-e2e-tests/SKILL.md +46 -46
- package/dist/method/skills/audit-pillars/SKILL.md +13 -10
- package/dist/method/skills/audit-pillars/references/demo.md +35 -0
- package/dist/method/skills/audit-pillars/references/pillars.md +40 -0
- package/dist/method/skills/audit-pillars/references/tech-debt.md +38 -0
- package/dist/method/skills/chain-stories/SKILL.md +5 -4
- package/dist/method/skills/chain-stories/references/merge-order.md +23 -0
- package/dist/method/skills/check-readiness/SKILL.md +1 -1
- package/dist/method/skills/check-requirements/SKILL.md +37 -72
- package/dist/method/skills/check-requirements/references/engine-proofs.md +16 -23
- package/dist/method/skills/check-requirements/references/proofs-and-gaps.md +22 -37
- package/dist/method/skills/critique-deliverable/SKILL.md +3 -3
- package/dist/method/skills/critique-deliverable/references/choose.md +12 -21
- package/dist/method/skills/critique-deliverable/references/format.md +14 -20
- package/dist/method/skills/critique-deliverable/references/gestures.md +14 -21
- package/dist/method/skills/critique-deliverable/references/judgment.md +4 -9
- package/dist/method/skills/critique-deliverable/references/methods.md +21 -0
- package/dist/method/skills/critique-deliverable/references/reconcile.md +6 -11
- package/dist/method/skills/deep-research/SKILL.md +16 -24
- package/dist/method/skills/deep-research/references/candidates.md +13 -25
- package/dist/method/skills/deep-research/references/external.md +15 -34
- package/dist/method/skills/deep-research/references/page-format.md +16 -42
- package/dist/method/skills/deep-research/references/types.md +16 -27
- package/dist/method/skills/develop-story/SKILL.md +56 -189
- package/dist/method/skills/develop-story/references/acceptance-tests.md +18 -71
- package/dist/method/skills/develop-story/references/quick-lane.md +20 -0
- package/dist/method/skills/diagnose-bug/SKILL.md +42 -53
- package/dist/method/skills/diagnose-bug/references/hypotheses.md +1 -2
- package/dist/method/skills/generate-knowledge-base/SKILL.md +57 -226
- package/dist/method/skills/generate-knowledge-base/assets/index-template.md +6 -15
- package/dist/method/skills/generate-knowledge-base/assets/page-template.md +11 -24
- package/dist/method/skills/generate-knowledge-base/references/living-docs.md +25 -64
- package/dist/method/skills/generate-knowledge-base/references/reuse-map.md +9 -18
- package/dist/method/skills/ideation/SKILL.md +16 -23
- package/dist/method/skills/ideation/references/close.md +18 -14
- package/dist/method/skills/ideation/references/converge.md +11 -21
- package/dist/method/skills/ideation/references/stances.md +13 -17
- package/dist/method/skills/ideation/references/techniques.md +20 -0
- package/dist/method/skills/improve-code/SKILL.md +42 -54
- package/dist/method/skills/pitch/SKILL.md +16 -19
- package/dist/method/skills/pitch/references/deck.md +15 -18
- package/dist/method/skills/pitch/references/design-implementation.md +13 -21
- package/dist/method/skills/pitch/references/design.md +21 -0
- package/dist/method/skills/pitch/references/story.md +13 -18
- package/dist/method/skills/plan-sprint/SKILL.md +50 -151
- package/dist/method/skills/plan-sprint/references/rituals.md +40 -0
- package/dist/method/skills/prepare-go-live/SKILL.md +59 -0
- package/dist/method/skills/resolve-merge-conflict/SKILL.md +40 -65
- package/dist/method/skills/review-after-launch/SKILL.md +56 -0
- package/dist/method/skills/review-story/SKILL.md +44 -72
- package/dist/method/skills/review-story/references/amend-story.md +8 -13
- package/dist/method/skills/review-story/references/export.md +7 -17
- package/dist/method/skills/review-story/references/free-review.md +9 -20
- package/dist/method/skills/review-story/references/judge.md +25 -37
- package/dist/method/skills/review-story/references/tests.md +29 -0
- package/dist/method/skills/run-acceptance/SKILL.md +58 -0
- package/dist/method/skills/run-acceptance/references/template.md +39 -0
- package/dist/method/skills/run-retrospective/SKILL.md +50 -189
- package/dist/method/skills/security-review-architecture/SKILL.md +46 -109
- package/dist/method/skills/security-review-architecture/references/spec-review.md +27 -38
- package/dist/method/skills/setup-ci/SKILL.md +46 -109
- package/dist/method/skills/setup-ci/assets/access-check.mjs +116 -0
- package/dist/method/skills/setup-ci/assets/security-github.yml +41 -0
- package/dist/method/skills/setup-ci/assets/security-gitlab.yml +22 -0
- package/dist/method/skills/setup-ci/assets/stack-dotnet-github.yml +118 -0
- package/dist/method/skills/setup-ci/assets/stack-dotnet-gitlab.yml +63 -0
- package/dist/method/skills/setup-ci/assets/stack-go-github.yml +118 -0
- package/dist/method/skills/setup-ci/assets/stack-go-gitlab.yml +63 -0
- package/dist/method/skills/setup-ci/assets/stack-jvm-gradle-github.yml +134 -0
- package/dist/method/skills/setup-ci/assets/stack-jvm-gradle-gitlab.yml +71 -0
- package/dist/method/skills/setup-ci/assets/stack-jvm-maven-github.yml +133 -0
- package/dist/method/skills/setup-ci/assets/stack-jvm-maven-gitlab.yml +70 -0
- package/dist/method/skills/setup-ci/assets/stack-python-github.yml +123 -0
- package/dist/method/skills/setup-ci/assets/stack-python-gitlab.yml +68 -0
- package/dist/method/skills/setup-ci/assets/stack-rust-github.yml +107 -0
- package/dist/method/skills/setup-ci/assets/stack-rust-gitlab.yml +64 -0
- package/dist/method/skills/setup-ci/references/security.md +39 -0
- package/dist/method/skills/setup-ci/references/stacks.md +22 -0
- package/dist/method/skills/split-into-stories/SKILL.md +59 -192
- package/dist/method/skills/split-into-stories/assets/story.md.tmpl +15 -4
- package/dist/method/skills/strategy/SKILL.md +20 -25
- package/dist/method/skills/strategy/references/costs.md +12 -26
- package/dist/method/skills/strategy/references/gestures.md +12 -21
- package/dist/method/skills/strategy/references/innovate.md +19 -37
- package/dist/method/skills/strategy/references/solve.md +19 -32
- package/dist/method/skills/test-idea/SKILL.md +5 -5
- package/dist/method/skills/test-idea/assets/prfaq-template.md +1 -1
- package/dist/method/skills/test-idea/references/faq.md +12 -29
- package/dist/method/skills/test-idea/references/forge.md +19 -30
- package/dist/method/skills/test-idea/references/personas.md +16 -19
- package/dist/method/skills/test-idea/references/prfaq.md +31 -31
- package/dist/method/skills/workshop/SKILL.md +10 -16
- package/dist/method/skills/workshop/references/create.md +28 -45
- package/dist/method/skills/workshop/references/customize.md +17 -42
- package/dist/method/skills/workshop/references/evaluate.md +11 -42
- package/dist/method/skills/workshop/references/rules.md +17 -26
- package/dist/method/skills/write-architecture/SKILL.md +62 -220
- package/dist/method/skills/write-architecture/references/guard.md +12 -27
- package/dist/method/skills/write-architecture/references/self-check.md +22 -38
- package/dist/method/skills/write-brand/SKILL.md +2 -2
- package/dist/method/skills/write-brand/references/identity.md +21 -22
- package/dist/method/skills/write-brand/references/platform.md +13 -20
- package/dist/method/skills/write-brand/references/rules.md +16 -22
- package/dist/method/skills/write-brief/SKILL.md +55 -149
- package/dist/method/skills/write-brief/assets/brief-template.md +7 -5
- package/dist/method/skills/write-brief/references/brief-checklist.md +18 -30
- package/dist/method/skills/write-content/SKILL.md +53 -210
- package/dist/method/skills/write-content/references/content-checklist.md +32 -50
- package/dist/method/skills/write-positioning/SKILL.md +53 -197
- package/dist/method/skills/write-positioning/references/positioning-checklist.md +15 -41
- package/dist/method/skills/write-positioning/references/seo-checklist.md +26 -51
- package/dist/method/skills/write-prd/SKILL.md +52 -179
- package/dist/method/skills/write-prd/references/prd-checklist.md +25 -54
- package/dist/method/skills/write-sales/SKILL.md +48 -212
- package/dist/method/skills/write-sales/references/before-you-send.md +21 -49
- package/dist/method/skills/write-sales/references/sales-checklist.md +19 -69
- package/dist/method/skills/write-spec/references/spec-guide.md +20 -23
- package/dist/method/skills/write-ux-spec/SKILL.md +57 -168
- package/dist/method/skills/write-ux-spec/references/accessibility-check.md +13 -72
- package/dist/method/skills/write-ux-spec/references/mockups.md +6 -68
- package/dist/method/skills/write-ux-spec/references/tokens-and-sketches.md +8 -81
- package/dist/method/skills/write-ux-spec/references/ux-checklist.md +12 -67
- package/dist/product-root.js +96 -20743
- package/dist/project-command.js +776 -0
- package/dist/project-command2.js +1 -0
- package/dist/read-command.js +19 -0
- package/dist/rolldown-runtime.js +1 -2
- package/dist/sheet-command.js +58 -0
- package/dist/webauthn-verify.js +3 -5
- package/package.json +13 -11
- package/dist/method/agents/noah/references/conduct.md +0 -102
- package/dist/method/skills/api-e2e-tests/references/frameworks.md +0 -58
- package/dist/method/skills/api-e2e-tests/references/generate.md +0 -67
- package/dist/method/skills/audit-pillars/references/accessibility.md +0 -13
- package/dist/method/skills/audit-pillars/references/architecture.md +0 -13
- package/dist/method/skills/audit-pillars/references/dependencies.md +0 -13
- package/dist/method/skills/audit-pillars/references/format.md +0 -20
- package/dist/method/skills/audit-pillars/references/interface.md +0 -13
- package/dist/method/skills/audit-pillars/references/method.md +0 -33
- package/dist/method/skills/audit-pillars/references/performance.md +0 -17
- package/dist/method/skills/audit-pillars/references/quality.md +0 -11
- package/dist/method/skills/audit-pillars/references/security.md +0 -13
- package/dist/method/skills/audit-pillars/references/tests.md +0 -17
- package/dist/method/skills/critique-deliverable/references/assumption-audit.md +0 -11
- package/dist/method/skills/critique-deliverable/references/compare-existing.md +0 -13
- package/dist/method/skills/critique-deliverable/references/devils-advocate.md +0 -13
- package/dist/method/skills/critique-deliverable/references/divergence.md +0 -15
- package/dist/method/skills/critique-deliverable/references/domain-expert.md +0 -14
- package/dist/method/skills/critique-deliverable/references/extreme-user.md +0 -13
- package/dist/method/skills/critique-deliverable/references/failure-modes.md +0 -13
- package/dist/method/skills/critique-deliverable/references/first-principles.md +0 -12
- package/dist/method/skills/critique-deliverable/references/inversion.md +0 -13
- package/dist/method/skills/critique-deliverable/references/pre-mortem.md +0 -12
- package/dist/method/skills/critique-deliverable/references/red-team.md +0 -12
- package/dist/method/skills/critique-deliverable/references/reframe.md +0 -12
- package/dist/method/skills/critique-deliverable/references/second-order.md +0 -12
- package/dist/method/skills/critique-deliverable/references/socratic.md +0 -15
- package/dist/method/skills/critique-deliverable/references/steelman.md +0 -13
- package/dist/method/skills/critique-deliverable/references/subtraction.md +0 -12
- package/dist/method/skills/develop-story/references/self-check.md +0 -46
- package/dist/method/skills/generate-knowledge-base/references/kb-checklist.md +0 -49
- package/dist/method/skills/generate-knowledge-base/references/repository-scan.md +0 -48
- package/dist/method/skills/ideation/references/choose.md +0 -21
- package/dist/method/skills/ideation/references/gestures.md +0 -15
- package/dist/method/skills/ideation/references/techniques-borrowed.md +0 -8
- package/dist/method/skills/ideation/references/techniques-deep.md +0 -12
- package/dist/method/skills/ideation/references/techniques-frames.md +0 -12
- package/dist/method/skills/ideation/references/techniques-futures.md +0 -8
- package/dist/method/skills/ideation/references/techniques-limits.md +0 -9
- package/dist/method/skills/ideation/references/techniques-people.md +0 -7
- package/dist/method/skills/ideation/references/techniques-sparks.md +0 -10
- package/dist/method/skills/ideation/references/techniques-together.md +0 -11
- package/dist/method/skills/order-merges/SKILL.md +0 -71
- package/dist/method/skills/pitch/references/deck-types.md +0 -17
- package/dist/method/skills/pitch/references/design-methods.md +0 -45
- package/dist/method/skills/pitch/references/design-thinking.md +0 -28
- package/dist/method/skills/pitch/references/story-frameworks.md +0 -39
- package/dist/method/skills/quick-lane/SKILL.md +0 -143
- package/dist/method/skills/review-tests/SKILL.md +0 -32
- package/dist/method/skills/review-tests/references/check.md +0 -25
- package/dist/method/skills/review-tests/references/grid.md +0 -27
- package/dist/method/skills/round-table/SKILL.md +0 -31
- package/dist/method/skills/round-table/evals/cases.yaml +0 -27
- package/dist/method/skills/round-table/references/cast.md +0 -14
- package/dist/method/skills/round-table/references/gestures.md +0 -24
- package/dist/method/skills/round-table/references/guests.md +0 -17
- package/dist/method/skills/round-table/references/independence.md +0 -21
- package/dist/method/skills/round-table/references/rooms.md +0 -29
- package/dist/method/skills/round-table/references/three-views.md +0 -17
- package/dist/method/skills/round-table/references/turns.md +0 -19
- package/dist/method/skills/strategy/references/innovate-frameworks.md +0 -48
- package/dist/method/skills/strategy/references/solve-methods.md +0 -45
- package/dist/method/skills/test-idea/references/bets.md +0 -14
- package/dist/method/skills/test-idea/references/concept.md +0 -24
- package/dist/method/skills/test-idea/references/verdict.md +0 -26
- 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
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
`
|
|
50
|
-
|
|
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,
|
|
116
|
-
|
|
117
|
-
- Never merge, never push to the main branch, never deploy: the repository, the first push
|
|
118
|
-
|
|
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
|