formwork-kit 0.1.0__tar.gz
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.
- formwork_kit-0.1.0/.gitignore +30 -0
- formwork_kit-0.1.0/FORMWORK.md +182 -0
- formwork_kit-0.1.0/LICENSE +21 -0
- formwork_kit-0.1.0/PKG-INFO +308 -0
- formwork_kit-0.1.0/README.md +279 -0
- formwork_kit-0.1.0/formwork/COSTS.md +111 -0
- formwork_kit-0.1.0/formwork/adapters/claude-code/README.md +53 -0
- formwork_kit-0.1.0/formwork/adapters/claude-code/settings.json +46 -0
- formwork_kit-0.1.0/formwork/adapters/codex/README.md +43 -0
- formwork_kit-0.1.0/formwork/adapters/cursor/README.md +45 -0
- formwork_kit-0.1.0/formwork/adapters/gemini-cli/README.md +47 -0
- formwork_kit-0.1.0/formwork/build +410 -0
- formwork_kit-0.1.0/formwork/check/checks/config-shape +123 -0
- formwork_kit-0.1.0/formwork/check/checks/decision-ids +159 -0
- formwork_kit-0.1.0/formwork/check/checks/doc-links +133 -0
- formwork_kit-0.1.0/formwork/check/checks/generated-current +74 -0
- formwork_kit-0.1.0/formwork/check/checks/guard-wired +139 -0
- formwork_kit-0.1.0/formwork/check/checks/kit-integrity +199 -0
- formwork_kit-0.1.0/formwork/check/checks/predictions-first +127 -0
- formwork_kit-0.1.0/formwork/check/checks/role-shape +172 -0
- formwork_kit-0.1.0/formwork/check/checks/rule-labels +135 -0
- formwork_kit-0.1.0/formwork/check/fixtures/config-shape/must-fail/documents-a-section-that-does-not-exist/.formwork.toml +5 -0
- formwork_kit-0.1.0/formwork/check/fixtures/config-shape/must-fail/documents-a-section-that-does-not-exist/formwork/guide.md +13 -0
- formwork_kit-0.1.0/formwork/check/fixtures/config-shape/must-fail/rules-as-a-switchboard/.formwork.toml +8 -0
- formwork_kit-0.1.0/formwork/check/fixtures/config-shape/must-pass/layers-kept-apart/.formwork.toml +5 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-fail/a-placeholder-shipped/docs/decisions/0003-still-pending.md +7 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-fail/superseded-by-nothing/docs/decisions/0002-old.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-fail/two-decisions-one-number/docs/decisions/0007-first.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-fail/two-decisions-one-number/docs/decisions/0007-second.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0001-the-first.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0002-the-second.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0003-the-third.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/decision-ids/must-pass/nothing-recorded-yet/docs/decisions/README.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/doc-links/must-fail/never-written/index.md +7 -0
- formwork_kit-0.1.0/formwork/check/fixtures/doc-links/must-fail/renamed-file/architecture-notes.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/doc-links/must-fail/renamed-file/guide.md +8 -0
- formwork_kit-0.1.0/formwork/check/fixtures/doc-links/must-pass/links-resolve/architecture-notes.md +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/doc-links/must-pass/links-resolve/guide.md +5 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.claude/agents/sample.md +22 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.codex/agents/sample.toml +22 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.formwork.toml +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.gemini/agents/sample.md +23 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/formwork/build +349 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/formwork/roles/method/sample.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.claude/agents/sample.md +20 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.codex/agents/sample.toml +22 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.formwork.toml +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.gemini/agents/sample.md +23 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/generated-and-current/formwork/build +349 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/generated-and-current/formwork/roles/method/sample.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/generated-current/must-pass/nothing-is-generated-here/README.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/guard-wired/must-fail/declared-but-no-file/.formwork.toml +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/guard-wired/must-fail/file-but-not-wired/.claude/settings.json +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/guard-wired/must-fail/file-but-not-wired/.formwork.toml +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/guard-wired/must-pass/declared-and-wired/.claude/settings.json +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/guard-wired/must-pass/declared-and-wired/.formwork.toml +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/guard-wired/must-pass/nothing-declared/README.md +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/kit-integrity/must-fail/a-check-went-missing/formwork/check/checks/still-here +2 -0
- formwork_kit-0.1.0/formwork/check/fixtures/kit-integrity/must-fail/a-check-went-missing/state/fingerprints.txt +2 -0
- formwork_kit-0.1.0/formwork/check/fixtures/kit-integrity/must-fail/a-guard-was-altered/formwork/guard/git-boundary +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/kit-integrity/must-fail/a-guard-was-altered/state/fingerprints.txt +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/kit-integrity/must-pass/everything-matches/formwork/guard/git-boundary +2 -0
- formwork_kit-0.1.0/formwork/check/fixtures/kit-integrity/must-pass/everything-matches/state/fingerprints.txt +1 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/architect.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/researcher.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/round.md +4 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-pass/a-round-that-has-not-argued-yet/docs/rounds/0006-not-started/round.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-pass/no-rounds-at-all/docs/README.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/architect.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/predictions.md +4 -0
- formwork_kit-0.1.0/formwork/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/researcher.md +3 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-fail/claims-a-grant-binds-everywhere/formwork/roles/README.md +6 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-fail/claims-a-grant-binds-everywhere/formwork/roles/complete.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-fail/missing-a-section/formwork/roles/vague.md +16 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-fail/spawn-without-being-lead/formwork/roles/eager.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-fail/two-roles-one-job/formwork/roles/first.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-fail/two-roles-one-job/formwork/roles/second.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/role-shape/must-pass/well-formed/formwork/roles/complete.md +18 -0
- formwork_kit-0.1.0/formwork/check/fixtures/rule-labels/must-fail/claims-enforcement-that-does-not-exist/formwork/rules/core.md +9 -0
- formwork_kit-0.1.0/formwork/check/fixtures/rule-labels/must-fail/no-catches/formwork/rules/core.md +9 -0
- formwork_kit-0.1.0/formwork/check/fixtures/rule-labels/must-fail/unlabelled/formwork/rules/core.md +7 -0
- formwork_kit-0.1.0/formwork/check/fixtures/rule-labels/must-pass/well-formed/formwork/rules/core.md +10 -0
- formwork_kit-0.1.0/formwork/check/run +340 -0
- formwork_kit-0.1.0/formwork/check/test_gate.py +222 -0
- formwork_kit-0.1.0/formwork/first-run.md +204 -0
- formwork_kit-0.1.0/formwork/fw +121 -0
- formwork_kit-0.1.0/formwork/glossary.md +160 -0
- formwork_kit-0.1.0/formwork/guard/git-boundary +627 -0
- formwork_kit-0.1.0/formwork/guard/protected-files +748 -0
- formwork_kit-0.1.0/formwork/guard/quality-gate +260 -0
- formwork_kit-0.1.0/formwork/guard/test_boundary.py +273 -0
- formwork_kit-0.1.0/formwork/guard/test_protection.py +254 -0
- formwork_kit-0.1.0/formwork/guard/test_quality_gate.py +156 -0
- formwork_kit-0.1.0/formwork/install +395 -0
- formwork_kit-0.1.0/formwork/limits.md +141 -0
- formwork_kit-0.1.0/formwork/loop.md +82 -0
- formwork_kit-0.1.0/formwork/roles/HOW-TO-ADD-A-ROLE.md +105 -0
- formwork_kit-0.1.0/formwork/roles/TEMPLATE.md +26 -0
- formwork_kit-0.1.0/formwork/roles/method/architect.md +269 -0
- formwork_kit-0.1.0/formwork/roles/method/challenger.md +243 -0
- formwork_kit-0.1.0/formwork/roles/method/lead.md +280 -0
- formwork_kit-0.1.0/formwork/roles/method/record-keeper.md +206 -0
- formwork_kit-0.1.0/formwork/roles/method/researcher.md +246 -0
- formwork_kit-0.1.0/formwork/roles/method/reviewer.md +207 -0
- formwork_kit-0.1.0/formwork/roles/packs/accessibility.md +236 -0
- formwork_kit-0.1.0/formwork/roles/packs/ai.md +248 -0
- formwork_kit-0.1.0/formwork/roles/packs/analyst.md +233 -0
- formwork_kit-0.1.0/formwork/roles/packs/backend.md +425 -0
- formwork_kit-0.1.0/formwork/roles/packs/brainstormer.md +190 -0
- formwork_kit-0.1.0/formwork/roles/packs/data.md +212 -0
- formwork_kit-0.1.0/formwork/roles/packs/devops.md +203 -0
- formwork_kit-0.1.0/formwork/roles/packs/frontend.md +224 -0
- formwork_kit-0.1.0/formwork/roles/packs/integrations.md +215 -0
- formwork_kit-0.1.0/formwork/roles/packs/legal.md +251 -0
- formwork_kit-0.1.0/formwork/roles/packs/marketing.md +206 -0
- formwork_kit-0.1.0/formwork/roles/packs/mobile.md +202 -0
- formwork_kit-0.1.0/formwork/roles/packs/performance.md +192 -0
- formwork_kit-0.1.0/formwork/roles/packs/product.md +217 -0
- formwork_kit-0.1.0/formwork/roles/packs/security.md +267 -0
- formwork_kit-0.1.0/formwork/roles/packs/sre.md +203 -0
- formwork_kit-0.1.0/formwork/roles/packs/tester.md +246 -0
- formwork_kit-0.1.0/formwork/roles/packs/user-researcher.md +218 -0
- formwork_kit-0.1.0/formwork/roles/packs/ux.md +205 -0
- formwork_kit-0.1.0/formwork/roles/packs/visual.md +199 -0
- formwork_kit-0.1.0/formwork/roles/packs/writer.md +198 -0
- formwork_kit-0.1.0/formwork/round.md +131 -0
- formwork_kit-0.1.0/formwork/rules/core.md +195 -0
- formwork_kit-0.1.0/formwork/rules/full.md +493 -0
- formwork_kit-0.1.0/formwork/templates/brief.md +68 -0
- formwork_kit-0.1.0/formwork/templates/decision.md +93 -0
- formwork_kit-0.1.0/formwork/templates/predictions.md +54 -0
- formwork_kit-0.1.0/formwork/templates/report.md +52 -0
- formwork_kit-0.1.0/formwork/templates/round.md +77 -0
- formwork_kit-0.1.0/formwork/test_install.py +165 -0
- formwork_kit-0.1.0/formwork/troubleshooting.md +247 -0
- formwork_kit-0.1.0/formwork_cli/__init__.py +326 -0
- formwork_kit-0.1.0/pyproject.toml +57 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# macOS
|
|
2
|
+
.DS_Store
|
|
3
|
+
|
|
4
|
+
# The denylist lives outside this repository and is never committed. A file
|
|
5
|
+
# that cannot be committed cannot be published by accident. These guards are
|
|
6
|
+
# the second line of defence, not the first.
|
|
7
|
+
|
|
8
|
+
# Python
|
|
9
|
+
__pycache__/
|
|
10
|
+
*.pyc
|
|
11
|
+
|
|
12
|
+
# Working documents are kept outside this repository.
|
|
13
|
+
# plan.md planning history (K0 decision 9)
|
|
14
|
+
# inventory.md the mechanism inventory (K0 decision 10)
|
|
15
|
+
# Both are inputs to K3, K4 and K5, not parts of the kit. These guards stop a
|
|
16
|
+
# copy slipping back in.
|
|
17
|
+
plan.md
|
|
18
|
+
docs/plan.md
|
|
19
|
+
inventory.md
|
|
20
|
+
docs/inventory.md
|
|
21
|
+
|
|
22
|
+
# The scanners live outside this repository too. They are build-time only:
|
|
23
|
+
# they describe the private material they compare against, and that
|
|
24
|
+
# description is itself a disclosure. Guard, not first line of defence.
|
|
25
|
+
tools/
|
|
26
|
+
|
|
27
|
+
# Build artefacts. Made by `python3 -m build`, never committed.
|
|
28
|
+
dist/
|
|
29
|
+
build/
|
|
30
|
+
*.egg-info/
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Formwork
|
|
2
|
+
|
|
3
|
+
A way of running a project with coding agents.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The loop
|
|
8
|
+
|
|
9
|
+
Everything is one loop. Only the size changes.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
BRIEF → WORK → CHECK → REPORT → STOP → you say go → BRIEF …
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Size | How long | The brief is | The report is |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| task | minutes | one line | files changed, check result |
|
|
18
|
+
| checkpoint | one sitting | six headings | the full list |
|
|
19
|
+
| round | hours to days | a question per role | a round record |
|
|
20
|
+
| phase | weeks | what it settles | one document |
|
|
21
|
+
| milestone | months | a direction | — |
|
|
22
|
+
|
|
23
|
+
Each one answers four questions: what it produces, what must be true before it
|
|
24
|
+
starts, who says go, and **what would tell us it failed.**
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## What is blocked
|
|
29
|
+
|
|
30
|
+
These do not ask you. They refuse.
|
|
31
|
+
|
|
32
|
+
| Rule | Enforced by |
|
|
33
|
+
|---|---|
|
|
34
|
+
| The agent never writes to version control | `formwork/guard/git-boundary` |
|
|
35
|
+
| One command runs every check | `formwork check` |
|
|
36
|
+
| Every check ships with an input that breaks it | `formwork check` |
|
|
37
|
+
| Every rule is labelled, and names a real check | `formwork/check/checks/rule-labels` |
|
|
38
|
+
| Documents link only to files that exist | `formwork/check/checks/doc-links` |
|
|
39
|
+
| A declared runtime is actually wired up | `formwork/check/checks/guard-wired` |
|
|
40
|
+
| The agent does not quietly alter the kit's own files | `formwork/guard/protected-files` |
|
|
41
|
+
| A turn does not end while the aggregate is red | `formwork/guard/quality-gate` |
|
|
42
|
+
|
|
43
|
+
> [!NOTE]
|
|
44
|
+
> **The last one refuses three times in a session, then stands aside**, so a
|
|
45
|
+
> genuinely stuck turn is not trapped for ever. Change it with `gate_budget`.
|
|
46
|
+
|
|
47
|
+
Run them:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
formwork check everything, on your project
|
|
51
|
+
formwork demo watch each check refuse a broken input
|
|
52
|
+
formwork check --list what exists
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**If you did not install the command**, every one of these works by path
|
|
56
|
+
instead: `formwork/fw check`, `formwork/fw demo`, `formwork/fw roles`. Run
|
|
57
|
+
`formwork/fw` on its own to see the list.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## What is advice
|
|
62
|
+
|
|
63
|
+
Everything else. **46 rules**, in two files.
|
|
64
|
+
|
|
65
|
+
- `formwork/rules/core.md` — 13. You meet these every day.
|
|
66
|
+
- `formwork/rules/full.md` — 33. Read one when you hit the situation it covers.
|
|
67
|
+
|
|
68
|
+
> [!TIP]
|
|
69
|
+
> Every rule says what it catches. None of them tells you a story, because the
|
|
70
|
+
> stories belong to somebody else's project.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Some of this will look like fussiness
|
|
75
|
+
|
|
76
|
+
Several of these rules were learned from failures you have not had.
|
|
77
|
+
|
|
78
|
+
Each one states what it catches. **If you never hit that, delete it** from
|
|
79
|
+
`formwork/rules/core.md`, so losing a rule is a line in your version control
|
|
80
|
+
with your name on it.
|
|
81
|
+
|
|
82
|
+
There is no `[rules]` switch in `.formwork.toml`, and a check refuses one if you
|
|
83
|
+
add it. A rule switched off in a settings file disappears quietly. A rule
|
|
84
|
+
deleted from the rules file does not.
|
|
85
|
+
|
|
86
|
+
A rule you follow without understanding gets dropped quietly later anyway.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Settings
|
|
91
|
+
|
|
92
|
+
This is the whole file, and the installer writes it for you:
|
|
93
|
+
|
|
94
|
+
```toml
|
|
95
|
+
[bindings]
|
|
96
|
+
runtime = "claude-code" # which tool you use
|
|
97
|
+
|
|
98
|
+
[strength]
|
|
99
|
+
git_boundary = "block" # block | warn | off
|
|
100
|
+
protect_files = "block" # block | warn | off
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`[strength]` tunes how hard the enforced guards bite. `[bindings]` is your
|
|
104
|
+
setup. There is no third section: see above.
|
|
105
|
+
|
|
106
|
+
**Two more keys exist and both live in `[strength]`:**
|
|
107
|
+
|
|
108
|
+
```toml
|
|
109
|
+
aggregate_gate = "block" # block | warn | off. The turn-end gate
|
|
110
|
+
gate_budget = 3 # how many times it refuses before standing aside
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
For one session only:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
FORMWORK_GIT_BOUNDARY=off
|
|
117
|
+
FORMWORK_PROTECT_FILES=warn
|
|
118
|
+
FORMWORK_GATE=off
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Your team
|
|
124
|
+
|
|
125
|
+
`formwork/roles/` holds 27 roles. Six run the method. Twenty-one do the work,
|
|
126
|
+
grouped into packs.
|
|
127
|
+
|
|
128
|
+
**All of them are available. There is no switch yet**, and this page says so
|
|
129
|
+
rather than describing one that does not exist.
|
|
130
|
+
|
|
131
|
+
Adding your own is copying `TEMPLATE.md`, filling in five sections and four
|
|
132
|
+
frontmatter fields. A role missing any of them does not load.
|
|
133
|
+
|
|
134
|
+
The installer generates them for your runtime. To regenerate after an edit:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
formwork roles
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## What it cannot do
|
|
143
|
+
|
|
144
|
+
The guards are pattern matching over a command line. They stop the ordinary
|
|
145
|
+
path and not a determined one.
|
|
146
|
+
|
|
147
|
+
[`formwork/limits.md`](formwork/limits.md) lists exactly what got past an audit, what
|
|
148
|
+
was closed afterwards, and what cannot be closed this way. Read it before
|
|
149
|
+
trusting any of this further than it deserves.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Two things here you will not find elsewhere
|
|
154
|
+
|
|
155
|
+
**A check that refuses rather than advises.** Most tooling tells you something
|
|
156
|
+
is wrong and lets the work continue. This stops the turn.
|
|
157
|
+
|
|
158
|
+
**Rules about what counts as evidence.** A figure is reported together with the
|
|
159
|
+
command behind it. Anything unmeasured says so in capitals. A check that nobody has
|
|
160
|
+
watched fail is not treated as proof of anything.
|
|
161
|
+
|
|
162
|
+
Both came out of real use. Neither has been tried by anybody else yet, and the
|
|
163
|
+
kit would rather say that than imply a crowd that does not exist.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## What it costs
|
|
168
|
+
|
|
169
|
+
Nobody has measured what one round costs in money. Not once. `formwork/COSTS.md`
|
|
170
|
+
says so plainly, gives the part that can be measured for free, and says what
|
|
171
|
+
would establish the rest.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Where to start
|
|
176
|
+
|
|
177
|
+
[`formwork/first-run.md`](formwork/first-run.md). Fifteen minutes, on your own
|
|
178
|
+
project.
|
|
179
|
+
|
|
180
|
+
Then [`formwork/loop.md`](formwork/loop.md) for the working loop, and
|
|
181
|
+
[`formwork/round.md`](formwork/round.md) when a decision is expensive enough to
|
|
182
|
+
be worth a round.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Muhammad Elsherif
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: formwork-kit
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: You bring the idea. It brings the whole team. Rules your coding agent cannot ignore.
|
|
5
|
+
Project-URL: Homepage, https://github.com/makariim/formwork
|
|
6
|
+
Project-URL: Source, https://github.com/makariim/formwork
|
|
7
|
+
Project-URL: Issues, https://github.com/makariim/formwork/issues
|
|
8
|
+
Author: Muhammad Elsherif
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: agents,ai,claude,coding-agent,project-management
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
27
|
+
Requires-Python: >=3.8
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
<div align="center">
|
|
31
|
+
|
|
32
|
+
<picture>
|
|
33
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.svg">
|
|
34
|
+
<img src="assets/logo-light.svg" width="96" alt="">
|
|
35
|
+
</picture>
|
|
36
|
+
|
|
37
|
+
# Formwork
|
|
38
|
+
|
|
39
|
+
**You bring the idea. It brings the whole team.**
|
|
40
|
+
|
|
41
|
+
*Not a typo. Builders use formwork to hold a shape until it can stand on its
|
|
42
|
+
own. Projects never had that. Now they do.*
|
|
43
|
+
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
<div align="center">
|
|
51
|
+
|
|
52
|
+
| A team | A way of working | Rules that refuse |
|
|
53
|
+
|:--:|:--:|:--:|
|
|
54
|
+
| everyone a project needs | brief, work, check, report, stop | some mistakes cannot happen |
|
|
55
|
+
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
```console
|
|
59
|
+
$ pipx install formwork-kit
|
|
60
|
+
$ formwork init && formwork install --runtime claude-code
|
|
61
|
+
$ formwork check
|
|
62
|
+
GATE: green. 9 check(s), each shown to reject the wrong and accept the right.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Ideas do not die at the idea
|
|
68
|
+
|
|
69
|
+
They die at what comes next.
|
|
70
|
+
|
|
71
|
+
You need someone to find the holes in your plan. Someone who knows what breaks
|
|
72
|
+
at 3am, what a screen should do, what the small print means. You need your
|
|
73
|
+
choices written down so you are not arguing about them again next month. Most
|
|
74
|
+
of all you need someone who will tell you no.
|
|
75
|
+
|
|
76
|
+
That used to mean hiring people. People cost money. Hiring takes time.
|
|
77
|
+
|
|
78
|
+
**Now it is a folder you copy into your project.**
|
|
79
|
+
|
|
80
|
+
Twenty seven roles, already written. A lead, a challenger, an architect, a
|
|
81
|
+
researcher, a reviewer. Engineers for the back end, the front end, phones,
|
|
82
|
+
data, servers and safety. A designer, a writer, a product person, a marketer.
|
|
83
|
+
Someone who tells you when to call a real lawyer.
|
|
84
|
+
|
|
85
|
+
Nobody to hire. Nobody to wait for. They are in the folder.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Who it is for
|
|
90
|
+
|
|
91
|
+
**Anyone building something with an AI agent.**
|
|
92
|
+
|
|
93
|
+
**New to this?** The team, the order of work, the notes and the rules all
|
|
94
|
+
arrive working. You bring the idea.
|
|
95
|
+
|
|
96
|
+
**Done it many times?** Now it sits where your agents can read it, and some of
|
|
97
|
+
it they cannot ignore. Delete the rules you disagree with. Rewrite any role you
|
|
98
|
+
know better.
|
|
99
|
+
|
|
100
|
+
**Expert in one thing?** Your role file will be thinner than you are. Replace
|
|
101
|
+
it. Everything else keeps working around it.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## What you get
|
|
106
|
+
|
|
107
|
+
**A way of working.** You say what you want. The agent works. The checks run.
|
|
108
|
+
It tells you what it did, then stops and waits for you.
|
|
109
|
+
|
|
110
|
+
**Notes that write themselves.** Choices get a number and a page, instead of
|
|
111
|
+
living in a chat you will close and lose.
|
|
112
|
+
|
|
113
|
+
**Rules your agent cannot ignore.** Not tips. Real refusals.
|
|
114
|
+
|
|
115
|
+
```console
|
|
116
|
+
you: commit this for me
|
|
117
|
+
agent: REFUSED by the version-control boundary: git commit changes
|
|
118
|
+
the repository.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Nobody read you a rule. You watched it work.
|
|
122
|
+
|
|
123
|
+
> [!IMPORTANT]
|
|
124
|
+
> That is the whole idea. You think about what you are building. The kit holds
|
|
125
|
+
> everything else.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Install
|
|
130
|
+
|
|
131
|
+
| You need | Check it |
|
|
132
|
+
|---|---|
|
|
133
|
+
| **Python 3.8 or newer** | `python3 --version` |
|
|
134
|
+
| **git** | `git --version` |
|
|
135
|
+
| **An AI coding agent** | Claude Code, Codex, Cursor or Gemini CLI |
|
|
136
|
+
|
|
137
|
+
No packages, no setup. The kit is text files and small Python programs.
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
pipx install formwork-kit
|
|
141
|
+
|
|
142
|
+
cd /your/project
|
|
143
|
+
formwork init
|
|
144
|
+
formwork install --runtime claude-code
|
|
145
|
+
formwork check
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
That last line should say green.
|
|
149
|
+
|
|
150
|
+
`init` puts `formwork/` and `FORMWORK.md` in your project. `install` wires the
|
|
151
|
+
guards into your agent and writes your role files. Type `formwork` on its own
|
|
152
|
+
to see the rest.
|
|
153
|
+
|
|
154
|
+
> [!TIP]
|
|
155
|
+
> **Use pipx, not pip.** Plain pip works, but often puts the command somewhere
|
|
156
|
+
> your shell does not look, and you get `command not found` with no clue why.
|
|
157
|
+
|
|
158
|
+
**Or install nothing.** The kit is just files:
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
git clone https://github.com/makariim/formwork.git the-kit
|
|
162
|
+
cp -R the-kit/formwork the-kit/FORMWORK.md /your/project/
|
|
163
|
+
|
|
164
|
+
cd /your/project
|
|
165
|
+
formwork/fw install --runtime claude-code
|
|
166
|
+
formwork/fw check
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**What it touches.** It adds `formwork/` and `FORMWORK.md`, writes your agent's
|
|
170
|
+
settings file keeping anything already there, and puts one file in
|
|
171
|
+
`~/.formwork/` holding a fingerprint of each file that enforces a rule.
|
|
172
|
+
|
|
173
|
+
| System | Does it work? |
|
|
174
|
+
|---|---|
|
|
175
|
+
| **macOS** | Yes. Built and used here |
|
|
176
|
+
| **Linux** | Should do. Nobody has tried. **Try it and tell us** |
|
|
177
|
+
| **Windows** | The command installs. The guards assume a unix shell and nobody has run them there |
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## What is inside
|
|
182
|
+
|
|
183
|
+
| | | count it yourself |
|
|
184
|
+
|---|---|---|
|
|
185
|
+
| **3 guards** | small programs that refuse. Two stop a command, one stops a turn ending | `ls formwork/guard \| grep -v test_` |
|
|
186
|
+
| **9 checks** | small programs that read your project and say green or red | `ls formwork/check/checks \| wc -l` |
|
|
187
|
+
| **27 roles** | one file each, saying what that job does and where it stops | `ls formwork/roles/*/*.md \| wc -l` |
|
|
188
|
+
| **46 rules** | 13 you meet daily, 33 for when you need them | `grep -c '^### ' formwork/rules/*.md` |
|
|
189
|
+
| **295 tests** | every guard and check, proved able to fail | `formwork test` |
|
|
190
|
+
|
|
191
|
+
It is all text files and small programs. You can read every line. Nothing is
|
|
192
|
+
hidden. Nothing is sent anywhere.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Every check has been watched failing
|
|
197
|
+
|
|
198
|
+
A check nobody has seen fail proves nothing.
|
|
199
|
+
|
|
200
|
+
So each check ships test cases of both kinds: at least one it must reject, at
|
|
201
|
+
least one it must accept. It has to tell them apart. Watch it yourself with
|
|
202
|
+
`formwork demo`.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Which agents work
|
|
207
|
+
|
|
208
|
+
| Agent | Can it stop a command? |
|
|
209
|
+
|---|---|
|
|
210
|
+
| **Claude Code** | Yes. Seen doing it |
|
|
211
|
+
| **Codex** | It should. Nobody has tried |
|
|
212
|
+
| **Cursor** | It should. Nobody has tried |
|
|
213
|
+
| **Gemini CLI** | It should. Nobody has tried |
|
|
214
|
+
|
|
215
|
+
> [!NOTE]
|
|
216
|
+
> For the three nobody has tried, `formwork check` stays red until you write
|
|
217
|
+
> the hook file yourself. Your agent's page in `formwork/adapters/` says what
|
|
218
|
+
> goes in it. **Red is the right answer there: nothing is guarding you yet.**
|
|
219
|
+
|
|
220
|
+
**Those three are the easiest way to help.** Set one up, ask your agent to
|
|
221
|
+
commit something, and tell us what happened. Either answer is useful.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## What this will not pretend
|
|
226
|
+
|
|
227
|
+
Every number here comes with the command that made it. Anything unmeasured says
|
|
228
|
+
so in capitals rather than guessing. There are three:
|
|
229
|
+
|
|
230
|
+
| | |
|
|
231
|
+
|---|---|
|
|
232
|
+
| **What a round costs in money** | never measured. [`COSTS.md`](formwork/COSTS.md) says NOT ESTABLISHED instead of guessing |
|
|
233
|
+
| **Whether the guards stop a determined agent** | they do not. [`limits.md`](formwork/limits.md) lists every way around them |
|
|
234
|
+
| **Whether three of the four agents work** | nobody has tried them |
|
|
235
|
+
|
|
236
|
+
> [!WARNING]
|
|
237
|
+
> The guards stop the ordinary path, not a clever one. If you need real safety,
|
|
238
|
+
> use a sandbox.
|
|
239
|
+
|
|
240
|
+
Every time this kit failed on the person who wrote it, the failure went into
|
|
241
|
+
[`docs/dogfood.md`](docs/dogfood.md) instead of being quietly patched. That page
|
|
242
|
+
is the best reason to trust the rest.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Where to start
|
|
247
|
+
|
|
248
|
+
[`formwork/first-run.md`](formwork/first-run.md). Seven short steps, on your
|
|
249
|
+
own project. No tutorial. No pretend example.
|
|
250
|
+
|
|
251
|
+
It should take about fifteen minutes. Nobody has timed the part you do, and the
|
|
252
|
+
page says so.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## The rest
|
|
257
|
+
|
|
258
|
+
**Start here**
|
|
259
|
+
|
|
260
|
+
| | |
|
|
261
|
+
|---|---|
|
|
262
|
+
| [`formwork/first-run.md`](formwork/first-run.md) | seven short steps, on your own project |
|
|
263
|
+
| [`FORMWORK.md`](FORMWORK.md) | the whole method on one page. Read it after your first run |
|
|
264
|
+
|
|
265
|
+
**While you work**
|
|
266
|
+
|
|
267
|
+
| | |
|
|
268
|
+
|---|---|
|
|
269
|
+
| [`loop.md`](formwork/loop.md) | how one job goes, start to finish |
|
|
270
|
+
| [`round.md`](formwork/round.md) | how to run a round, and when it is worth it |
|
|
271
|
+
| [`templates/`](formwork/templates/) | brief, predictions, report, decision, round |
|
|
272
|
+
| [`roles/`](formwork/roles/) | the roles, and how to write your own |
|
|
273
|
+
| [`rules/`](formwork/rules/) | the rules, each saying what it catches |
|
|
274
|
+
|
|
275
|
+
**When you need it**
|
|
276
|
+
|
|
277
|
+
| | |
|
|
278
|
+
|---|---|
|
|
279
|
+
| [`troubleshooting.md`](formwork/troubleshooting.md) | every error message and what to do |
|
|
280
|
+
| [`glossary.md`](formwork/glossary.md) | every word we use, in plain language |
|
|
281
|
+
| [`limits.md`](formwork/limits.md) | what this kit cannot do |
|
|
282
|
+
| [`COSTS.md`](formwork/COSTS.md) | what it costs, and the number nobody has |
|
|
283
|
+
| [`FAQ.md`](FAQ.md) | questions people ask |
|
|
284
|
+
|
|
285
|
+
**How it was built**
|
|
286
|
+
|
|
287
|
+
| | |
|
|
288
|
+
|---|---|
|
|
289
|
+
| [`docs/`](docs/) | the survey, the design, and what broke |
|
|
290
|
+
| [`docs/dogfood.md`](docs/dogfood.md) | the kit failing on its own author, written down |
|
|
291
|
+
| [`RELEASING.md`](RELEASING.md) | for the maintainer |
|
|
292
|
+
|
|
293
|
+
## Contributing
|
|
294
|
+
|
|
295
|
+
Forks are the point. What helps most, in order:
|
|
296
|
+
|
|
297
|
+
- **A command that got past a guard.** One line, no fix needed
|
|
298
|
+
- **A normal command that was wrongly stopped.** Just as useful
|
|
299
|
+
- **A report from an untried agent**, whether it worked or not
|
|
300
|
+
- **A new role** the twenty seven do not cover
|
|
301
|
+
|
|
302
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and [SECURITY.md](SECURITY.md).
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Licence
|
|
307
|
+
|
|
308
|
+
MIT. See [LICENSE](LICENSE).
|