formwork-kit 0.1.0__tar.gz → 0.2.1__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 → formwork_kit-0.2.1}/FORMWORK.md +44 -29
- formwork_kit-0.2.1/PKG-INFO +505 -0
- formwork_kit-0.2.1/README.md +476 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/COSTS.md +15 -15
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/adapters/claude-code/README.md +2 -2
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/adapters/codex/README.md +2 -2
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/adapters/cursor/README.md +2 -2
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/adapters/gemini-cli/README.md +3 -3
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/build +9 -0
- formwork_kit-0.2.1/formwork/check/checks/standing-current +256 -0
- formwork_kit-0.2.1/formwork/check/checks/style-pointed +163 -0
- formwork_kit-0.2.1/formwork/check/checks/work-paired +203 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/a-decision-hides-in-a-subfolder/docs/decisions/2026/0002-second-page-size.md +6 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/a-decision-hides-in-a-subfolder/docs/standing.md +29 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/a-decision-is-newer-than-the-brief/docs/decisions/0002-second-page-size.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/a-decision-is-newer-than-the-brief/docs/standing.md +30 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/a-round-record-has-no-date/docs/rounds/page-size/record.md +10 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/a-round-record-has-no-date/docs/standing.md +29 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/the-brief-carries-no-date/docs/standing.md +25 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/the-brief-is-only-an-example/docs/standing.md +35 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-fail/the-template-was-never-filled-in/docs/standing.md +24 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/a-quoted-diff-is-not-an-empty-bullet/docs/standing.md +37 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/filled-in-and-ahead-of-the-record/docs/decisions/0001-one-page-size.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/filled-in-and-ahead-of-the-record/docs/rounds/page-size/record.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/filled-in-and-ahead-of-the-record/docs/standing.md +30 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/filled-in-and-nothing-else-recorded/docs/standing.md +29 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/no-standing-brief-here/README.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/standing-current/must-pass/no-standing-brief-here/docs/notes.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/a-role-in-a-subfolder/.claude/agents/team/writer.md +7 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/a-role-in-a-subfolder/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/a-word-that-merely-contains-it/.claude/agents/writer.md +8 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/a-word-that-merely-contains-it/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/one-runtime-was-left-behind/.claude/agents/writer.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/one-runtime-was-left-behind/.gemini/agents/writer.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/one-runtime-was-left-behind/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/the-pointer-went-missing/.claude/agents/tester.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/the-pointer-went-missing/.claude/agents/writer.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-fail/the-pointer-went-missing/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/a-readme-among-the-roles/.claude/agents/README.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/a-readme-among-the-roles/.claude/agents/writer.md +9 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/a-readme-among-the-roles/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/every-role-points-at-it/.claude/agents/tester.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/every-role-points-at-it/.claude/agents/writer.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/every-role-points-at-it/.codex/agents/writer.toml +7 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/every-role-points-at-it/.gemini/agents/writer.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/every-role-points-at-it/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/no-style-page-here/.claude/agents/writer.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/style-pointed/must-pass/nothing-generated-yet/formwork/style.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/a-nested-status-hides-the-real-one/docs/briefs/0001-slow-login.md +8 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/a-report-for-nothing/docs/briefs/0001-slow-login.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/a-report-for-nothing/docs/reports/0001-slow-login.md +15 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/a-report-for-nothing/docs/reports/0009-a-brief-nobody-wrote.md +15 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/a-status-nobody-can-read/docs/briefs/0002-something.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/finished-and-left-no-report/docs/briefs/0001-slow-login.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/finished-and-left-no-report/docs/reports/README.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/the-report-is-empty/docs/briefs/0001-slow-login.md +10 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/the-report-is-empty/docs/reports/0001-slow-login.md +0 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/two-briefs-one-number/docs/briefs/0003-first-thing.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/two-briefs-one-number/docs/briefs/0003-second-thing.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/two-reports-one-number/docs/briefs/0001-slow-login.md +10 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/two-reports-one-number/docs/reports/0001-a-second-answer.md +3 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-fail/two-reports-one-number/docs/reports/0001-slow-login.md +3 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/a-round-is-one-brief-like-any-other/docs/briefs/0001-storage-shape.md +9 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/a-round-is-one-brief-like-any-other/docs/reports/0001-storage-shape.md +7 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/a-round-is-one-brief-like-any-other/docs/rounds/storage-shape/predictions.md +5 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/a-round-is-one-brief-like-any-other/docs/rounds/storage-shape/round.md +11 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/finished-work-has-its-report/docs/briefs/0001-slow-login.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/finished-work-has-its-report/docs/briefs/0002-second-page-size.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/finished-work-has-its-report/docs/reports/0001-slow-login.md +15 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/no-briefs-folder/README.md +1 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/work-still-open-is-fine/docs/briefs/0001-slow-login.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/work-still-open-is-fine/docs/briefs/0002-printing.md +18 -0
- formwork_kit-0.2.1/formwork/check/fixtures/work-paired/must-pass/work-still-open-is-fine/docs/reports/0001-slow-login.md +15 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/first-run.md +42 -22
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/fw +21 -2
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/glossary.md +26 -5
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/install +66 -1
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/limits.md +84 -1
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/loop.md +41 -6
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/HOW-TO-ADD-A-ROLE.md +3 -3
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/method/architect.md +12 -12
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/method/challenger.md +8 -8
- formwork_kit-0.2.1/formwork/roles/method/director.md +244 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/method/lead.md +153 -20
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/method/record-keeper.md +17 -13
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/method/researcher.md +5 -5
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/method/reviewer.md +9 -9
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/accessibility.md +18 -18
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/ai.md +5 -5
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/analyst.md +11 -11
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/backend.md +26 -26
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/brainstormer.md +8 -8
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/data.md +11 -11
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/devops.md +15 -15
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/frontend.md +13 -13
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/integrations.md +10 -10
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/legal.md +9 -9
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/marketing.md +8 -8
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/mobile.md +9 -9
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/performance.md +7 -7
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/product.md +8 -8
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/security.md +17 -17
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/sre.md +11 -11
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/tester.md +8 -8
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/user-researcher.md +4 -4
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/ux.md +6 -6
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/visual.md +9 -9
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/packs/writer.md +6 -6
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/round.md +29 -5
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/rules/core.md +9 -9
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/rules/full.md +45 -26
- formwork_kit-0.2.1/formwork/setup +691 -0
- formwork_kit-0.2.1/formwork/style.md +113 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/templates/brief.md +33 -2
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/templates/decision.md +5 -5
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/templates/predictions.md +2 -4
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/templates/report.md +9 -3
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/templates/round.md +1 -1
- formwork_kit-0.2.1/formwork/templates/standing.md +84 -0
- formwork_kit-0.2.1/formwork/test_install.py +289 -0
- formwork_kit-0.2.1/formwork/test_setup.py +353 -0
- formwork_kit-0.2.1/formwork/threads.md +231 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/troubleshooting.md +15 -6
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork_cli/__init__.py +4 -0
- formwork_kit-0.2.1/formwork_cli/__main__.py +19 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/pyproject.toml +1 -1
- formwork_kit-0.1.0/PKG-INFO +0 -308
- formwork_kit-0.1.0/README.md +0 -279
- formwork_kit-0.1.0/formwork/test_install.py +0 -165
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/.gitignore +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/LICENSE +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/adapters/claude-code/settings.json +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/config-shape +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/decision-ids +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/doc-links +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/generated-current +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/guard-wired +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/kit-integrity +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/predictions-first +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/role-shape +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/checks/rule-labels +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/config-shape/must-fail/documents-a-section-that-does-not-exist/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/config-shape/must-fail/documents-a-section-that-does-not-exist/formwork/guide.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/config-shape/must-fail/rules-as-a-switchboard/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/config-shape/must-pass/layers-kept-apart/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-fail/a-placeholder-shipped/docs/decisions/0003-still-pending.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-fail/superseded-by-nothing/docs/decisions/0002-old.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-fail/two-decisions-one-number/docs/decisions/0007-first.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-fail/two-decisions-one-number/docs/decisions/0007-second.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0001-the-first.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0002-the-second.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-pass/clean-numbering/docs/decisions/0003-the-third.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/decision-ids/must-pass/nothing-recorded-yet/docs/decisions/README.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/doc-links/must-fail/never-written/index.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/doc-links/must-fail/renamed-file/architecture-notes.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/doc-links/must-fail/renamed-file/guide.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/doc-links/must-pass/links-resolve/architecture-notes.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/doc-links/must-pass/links-resolve/guide.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.claude/agents/sample.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.codex/agents/sample.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/.gemini/agents/sample.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/formwork/build +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-fail/a-generated-file-was-edited/formwork/roles/method/sample.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.claude/agents/sample.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.codex/agents/sample.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/generated-and-current/.gemini/agents/sample.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/generated-and-current/formwork/build +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/generated-and-current/formwork/roles/method/sample.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/generated-current/must-pass/nothing-is-generated-here/README.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/guard-wired/must-fail/declared-but-no-file/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/guard-wired/must-fail/file-but-not-wired/.claude/settings.json +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/guard-wired/must-fail/file-but-not-wired/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/guard-wired/must-pass/declared-and-wired/.claude/settings.json +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/guard-wired/must-pass/declared-and-wired/.formwork.toml +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/guard-wired/must-pass/nothing-declared/README.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/kit-integrity/must-fail/a-check-went-missing/formwork/check/checks/still-here +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/kit-integrity/must-fail/a-check-went-missing/state/fingerprints.txt +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/kit-integrity/must-fail/a-guard-was-altered/formwork/guard/git-boundary +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/kit-integrity/must-fail/a-guard-was-altered/state/fingerprints.txt +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/kit-integrity/must-pass/everything-matches/formwork/guard/git-boundary +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/kit-integrity/must-pass/everything-matches/state/fingerprints.txt +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/architect.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/researcher.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-fail/argued-with-no-predictions/docs/rounds/0004-the-storage-question/round.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-pass/a-round-that-has-not-argued-yet/docs/rounds/0006-not-started/round.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-pass/no-rounds-at-all/docs/README.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/architect.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/predictions.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/predictions-first/must-pass/predictions-on-record/docs/rounds/0005-the-shape-of-a-brief/researcher.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-fail/claims-a-grant-binds-everywhere/formwork/roles/README.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-fail/claims-a-grant-binds-everywhere/formwork/roles/complete.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-fail/missing-a-section/formwork/roles/vague.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-fail/spawn-without-being-lead/formwork/roles/eager.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-fail/two-roles-one-job/formwork/roles/first.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-fail/two-roles-one-job/formwork/roles/second.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/role-shape/must-pass/well-formed/formwork/roles/complete.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/rule-labels/must-fail/claims-enforcement-that-does-not-exist/formwork/rules/core.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/rule-labels/must-fail/no-catches/formwork/rules/core.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/rule-labels/must-fail/unlabelled/formwork/rules/core.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/fixtures/rule-labels/must-pass/well-formed/formwork/rules/core.md +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/run +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/check/test_gate.py +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/guard/git-boundary +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/guard/protected-files +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/guard/quality-gate +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/guard/test_boundary.py +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/guard/test_protection.py +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/guard/test_quality_gate.py +0 -0
- {formwork_kit-0.1.0 → formwork_kit-0.2.1}/formwork/roles/TEMPLATE.md +0 -0
|
@@ -12,16 +12,13 @@ Everything is one loop. Only the size changes.
|
|
|
12
12
|
BRIEF → WORK → CHECK → REPORT → STOP → you say go → BRIEF …
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
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 | — |
|
|
15
|
+
**The agent halts at STOP and waits for you**, however small the job was.
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
Five sizes run this way, from a task of minutes to a milestone of months. The
|
|
18
|
+
sizes, and how to pick one, are in [`formwork/loop.md`](formwork/loop.md).
|
|
19
|
+
|
|
20
|
+
Work is handed down from a planning conversation and reported back up by you.
|
|
21
|
+
That part is in [`formwork/threads.md`](formwork/threads.md).
|
|
25
22
|
|
|
26
23
|
---
|
|
27
24
|
|
|
@@ -39,10 +36,14 @@ These do not ask you. They refuse.
|
|
|
39
36
|
| A declared runtime is actually wired up | `formwork/check/checks/guard-wired` |
|
|
40
37
|
| The agent does not quietly alter the kit's own files | `formwork/guard/protected-files` |
|
|
41
38
|
| A turn does not end while the aggregate is red | `formwork/guard/quality-gate` |
|
|
39
|
+
| The standing brief is not older than the newest decision | `formwork/check/checks/standing-current` |
|
|
40
|
+
| Work marked finished left a report behind | `formwork/check/checks/work-paired` |
|
|
41
|
+
| Every generated role names the style page | `formwork/check/checks/style-pointed` |
|
|
42
42
|
|
|
43
43
|
> [!NOTE]
|
|
44
|
-
> **The
|
|
45
|
-
> genuinely stuck turn is not trapped for ever. Change it with `gate_budget`.
|
|
44
|
+
> **The turn-end gate refuses three times in a session, then stands aside**, so
|
|
45
|
+
> a genuinely stuck turn is not trapped for ever. Change it with `gate_budget`.
|
|
46
|
+
> The rows below it are checks, and none of them has a budget.
|
|
46
47
|
|
|
47
48
|
Run them:
|
|
48
49
|
|
|
@@ -60,10 +61,10 @@ instead: `formwork/fw check`, `formwork/fw demo`, `formwork/fw roles`. Run
|
|
|
60
61
|
|
|
61
62
|
## What is advice
|
|
62
63
|
|
|
63
|
-
Everything else. **
|
|
64
|
+
Everything else. **47 rules**, in two files.
|
|
64
65
|
|
|
65
|
-
- `formwork/rules/core.md`
|
|
66
|
-
- `formwork/rules/full.md`
|
|
66
|
+
- `formwork/rules/core.md` holds 13. You meet these every day.
|
|
67
|
+
- `formwork/rules/full.md` holds 34. Read one when you hit the situation.
|
|
67
68
|
|
|
68
69
|
> [!TIP]
|
|
69
70
|
> Every rule says what it catches. None of them tells you a story, because the
|
|
@@ -89,7 +90,7 @@ A rule you follow without understanding gets dropped quietly later anyway.
|
|
|
89
90
|
|
|
90
91
|
## Settings
|
|
91
92
|
|
|
92
|
-
|
|
93
|
+
One file, `.formwork.toml`, and the installer writes it for you:
|
|
93
94
|
|
|
94
95
|
```toml
|
|
95
96
|
[bindings]
|
|
@@ -98,17 +99,27 @@ runtime = "claude-code" # which tool you use
|
|
|
98
99
|
[strength]
|
|
99
100
|
git_boundary = "block" # block | warn | off
|
|
100
101
|
protect_files = "block" # block | warn | off
|
|
102
|
+
aggregate_gate = "block" # the turn-end gate
|
|
103
|
+
gate_budget = 3 # refusals before it stands aside
|
|
101
104
|
```
|
|
102
105
|
|
|
103
|
-
`[strength]` tunes how hard the enforced guards
|
|
104
|
-
|
|
106
|
+
`[bindings]` is your setup. `[strength]` tunes how hard the enforced guards
|
|
107
|
+
bite. There is no third section: see above.
|
|
105
108
|
|
|
106
|
-
**
|
|
109
|
+
**The last two lines appear only once you change them.** They have working
|
|
110
|
+
defaults, so a fresh file is shorter than this.
|
|
107
111
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
**You do not have to write any of it by hand.** `formwork setup` asks a few
|
|
113
|
+
questions once, shows you everything it is about to do, and writes it only if
|
|
114
|
+
you say yes:
|
|
115
|
+
|
|
116
|
+
- `docs/style.md`, from how you said you want to be spoken to
|
|
117
|
+
- `docs/standing.md`, seeded with what you are building and what is next
|
|
118
|
+
- `docs/decisions/`, `docs/briefs/`, `docs/reports/`, started and explained
|
|
119
|
+
- the `[strength]` values, including `gate_budget`
|
|
120
|
+
|
|
121
|
+
It never overwrites a file you already have, and it never touches
|
|
122
|
+
`[bindings]`, which the installer worked out by looking at your project.
|
|
112
123
|
|
|
113
124
|
For one session only:
|
|
114
125
|
|
|
@@ -122,7 +133,7 @@ FORMWORK_GATE=off
|
|
|
122
133
|
|
|
123
134
|
## Your team
|
|
124
135
|
|
|
125
|
-
`formwork/roles/` holds
|
|
136
|
+
`formwork/roles/` holds 28 roles. Seven run the method. Twenty-one do the work,
|
|
126
137
|
grouped into packs.
|
|
127
138
|
|
|
128
139
|
**All of them are available. There is no switch yet**, and this page says so
|
|
@@ -131,6 +142,9 @@ rather than describing one that does not exist.
|
|
|
131
142
|
Adding your own is copying `TEMPLATE.md`, filling in five sections and four
|
|
132
143
|
frontmatter fields. A role missing any of them does not load.
|
|
133
144
|
|
|
145
|
+
**How they talk to you** is one page, [`formwork/style.md`](formwork/style.md),
|
|
146
|
+
pointed at from every generated role. Your own `docs/style.md` overrides it.
|
|
147
|
+
|
|
134
148
|
The installer generates them for your runtime. To regenerate after an edit:
|
|
135
149
|
|
|
136
150
|
```
|
|
@@ -155,9 +169,9 @@ trusting any of this further than it deserves.
|
|
|
155
169
|
**A check that refuses rather than advises.** Most tooling tells you something
|
|
156
170
|
is wrong and lets the work continue. This stops the turn.
|
|
157
171
|
|
|
158
|
-
**Rules about what counts as evidence.** A figure
|
|
159
|
-
|
|
160
|
-
|
|
172
|
+
**Rules about what counts as evidence.** A figure arrives with the command
|
|
173
|
+
behind it. A gap is named rather than filled. A check nobody has watched fail
|
|
174
|
+
is not treated as proof of anything.
|
|
161
175
|
|
|
162
176
|
Both came out of real use. Neither has been tried by anybody else yet, and the
|
|
163
177
|
kit would rather say that than imply a crowd that does not exist.
|
|
@@ -177,6 +191,7 @@ would establish the rest.
|
|
|
177
191
|
[`formwork/first-run.md`](formwork/first-run.md). Fifteen minutes, on your own
|
|
178
192
|
project.
|
|
179
193
|
|
|
180
|
-
Then [`formwork/loop.md`](formwork/loop.md) for the working loop,
|
|
181
|
-
[`formwork/
|
|
182
|
-
|
|
194
|
+
Then [`formwork/loop.md`](formwork/loop.md) for the working loop,
|
|
195
|
+
[`formwork/threads.md`](formwork/threads.md) for how work starts and where the
|
|
196
|
+
plan lives between conversations, and [`formwork/round.md`](formwork/round.md)
|
|
197
|
+
when a decision is expensive enough to be worth a round.
|
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: formwork-kit
|
|
3
|
+
Version: 0.2.1
|
|
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
|
|
61
|
+
$ formwork setup && formwork check
|
|
62
|
+
GATE: green. 12 check(s), each shown to reject the wrong and accept the right.
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
<div align="center">
|
|
66
|
+
|
|
67
|
+
[Which agent you use](#which-agent-you-use-changes-what-you-get) ·
|
|
68
|
+
[Install](#install) · [Your first turn](#your-first-turn) ·
|
|
69
|
+
[Settings](#settings) · [What is inside](#what-is-inside) ·
|
|
70
|
+
[What it will not pretend](#what-this-will-not-pretend) ·
|
|
71
|
+
[Version one](#this-is-version-one) ·
|
|
72
|
+
[Where to go next](#where-to-go-next)
|
|
73
|
+
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Ideas do not die at the idea
|
|
79
|
+
|
|
80
|
+
They die at what comes next.
|
|
81
|
+
|
|
82
|
+
You need someone to find the holes in your plan. Someone who knows what breaks
|
|
83
|
+
at 3am, what a screen should do, what the small print means. You need your
|
|
84
|
+
choices written down so you are not arguing about them again next month. Most
|
|
85
|
+
of all you need someone who will tell you no.
|
|
86
|
+
|
|
87
|
+
That used to mean hiring people. People cost money. Hiring takes time.
|
|
88
|
+
|
|
89
|
+
**Now it is a folder you copy into your project.**
|
|
90
|
+
|
|
91
|
+
Twenty eight roles, already written. A director, a lead, a challenger, a
|
|
92
|
+
researcher, a reviewer. Engineers for the back end, the front end, phones,
|
|
93
|
+
data, servers and safety. A designer, a writer, a product person, a marketer.
|
|
94
|
+
Someone who tells you when to call a real lawyer.
|
|
95
|
+
|
|
96
|
+
Nobody to hire. Nobody to wait for. They are in the folder.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Who it is for
|
|
101
|
+
|
|
102
|
+
**Anyone building something with an AI agent.**
|
|
103
|
+
|
|
104
|
+
**New to this?** The team, the order of work, the notes and the rules all
|
|
105
|
+
arrive working. You bring the idea.
|
|
106
|
+
|
|
107
|
+
**Done it many times?** Now it sits where your agents can read it, and some of
|
|
108
|
+
it they cannot ignore. Delete the rules you disagree with. Rewrite any role you
|
|
109
|
+
know better.
|
|
110
|
+
|
|
111
|
+
**Expert in one thing?** Your role file will be thinner than you are. Replace
|
|
112
|
+
it. Everything else keeps working around it.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## What you get
|
|
117
|
+
|
|
118
|
+
**A way of working.** You say what you want. The agent works. The checks run.
|
|
119
|
+
It tells you what it did, then stops and waits for you.
|
|
120
|
+
|
|
121
|
+
**Notes that stay put.** Choices get a number and a page in your repository,
|
|
122
|
+
instead of living in a chat you will close and lose.
|
|
123
|
+
|
|
124
|
+
**Rules your agent cannot ignore.** Not tips. Real refusals.
|
|
125
|
+
|
|
126
|
+
```console
|
|
127
|
+
you: commit this for me
|
|
128
|
+
agent: REFUSED by the version-control boundary: git commit changes
|
|
129
|
+
the repository.
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Nobody read you a rule. You watched it work.
|
|
133
|
+
|
|
134
|
+
> [!IMPORTANT]
|
|
135
|
+
> That is the whole idea. You think about what you are building. The kit holds
|
|
136
|
+
> everything else.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Which agent you use changes what you get
|
|
141
|
+
|
|
142
|
+
Read this before installing. It decides whether your first `formwork check`
|
|
143
|
+
comes back green.
|
|
144
|
+
|
|
145
|
+
| Agent | Can it stop a command? |
|
|
146
|
+
|---|---|
|
|
147
|
+
| **Claude Code** | Yes. Seen doing it |
|
|
148
|
+
| **Codex** | It should. Nobody has tried |
|
|
149
|
+
| **Cursor** | It should. Nobody has tried |
|
|
150
|
+
| **Gemini CLI** | It should. Nobody has tried |
|
|
151
|
+
|
|
152
|
+
**On Claude Code everything below works as written.**
|
|
153
|
+
|
|
154
|
+
**On the other three, the install finishes and `formwork check` comes back
|
|
155
|
+
red**, because the file that hooks the guards into your agent does not exist
|
|
156
|
+
yet and you have to write it. Your agent's page in `formwork/adapters/` says
|
|
157
|
+
exactly what goes in it. **Red is the honest answer there: nothing is guarding
|
|
158
|
+
you yet.**
|
|
159
|
+
|
|
160
|
+
Everything else works on all four from the start: the roles, the rules, the
|
|
161
|
+
checks, the templates, the loop.
|
|
162
|
+
|
|
163
|
+
**Setting one of those three up is the most useful thing anybody can do for
|
|
164
|
+
this project.** [CONTRIBUTING.md](CONTRIBUTING.md) says what to send back.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Install
|
|
169
|
+
|
|
170
|
+
| You need | Check it |
|
|
171
|
+
|---|---|
|
|
172
|
+
| **Python 3.8 or newer** | `python3 --version` |
|
|
173
|
+
| **git** | `git --version` |
|
|
174
|
+
| **An AI coding agent** | Claude Code, Codex, Cursor or Gemini CLI |
|
|
175
|
+
|
|
176
|
+
**Two ways in. They end in the same place.**
|
|
177
|
+
|
|
178
|
+
### 1. As a package
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
pipx install formwork-kit
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
pipx puts the `formwork` command on your path and keeps it in its own
|
|
185
|
+
environment, away from your project's packages.
|
|
186
|
+
|
|
187
|
+
> [!IMPORTANT]
|
|
188
|
+
> **If you used plain `pip` instead, `formwork` will say `command not found`.**
|
|
189
|
+
> It installed fine. pip put the command in a folder your shell does not
|
|
190
|
+
> search. You do not have to fix anything: put `python3 -m formwork_cli` in
|
|
191
|
+
> front of every command below and they all work.
|
|
192
|
+
>
|
|
193
|
+
> ```
|
|
194
|
+
> python3 -m formwork_cli init
|
|
195
|
+
> ```
|
|
196
|
+
|
|
197
|
+
Then, in your project:
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
cd /your/project
|
|
201
|
+
formwork init
|
|
202
|
+
formwork install --runtime claude-code # or codex, cursor, gemini-cli
|
|
203
|
+
formwork setup
|
|
204
|
+
formwork check
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**That last line should say green on Claude Code**, and red on the other three
|
|
208
|
+
until you write the hook file, as above.
|
|
209
|
+
|
|
210
|
+
Leave `--runtime` off and it finds your agent itself. When you have more than
|
|
211
|
+
one set up, or none yet, it stops and tells you to name one.
|
|
212
|
+
|
|
213
|
+
> [!TIP]
|
|
214
|
+
> **Would you rather be walked through it?**
|
|
215
|
+
> [`formwork/first-run.md`](formwork/first-run.md) is the same five commands
|
|
216
|
+
> with somebody explaining each one: what it writes, what the exit codes mean,
|
|
217
|
+
> what to do when your agent cannot block, and a first piece of real work at
|
|
218
|
+
> the end. About fifteen minutes.
|
|
219
|
+
|
|
220
|
+
<details>
|
|
221
|
+
<summary><b>Other ways to install the package, and what to do when the command is not found</b></summary>
|
|
222
|
+
|
|
223
|
+
<br>
|
|
224
|
+
|
|
225
|
+
**In a virtual environment**, where the command lives inside it:
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
python3 -m venv .venv
|
|
229
|
+
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
230
|
+
python3 -m pip install formwork-kit
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**With pip directly, say `python3 -m pip install formwork-kit`.** Typing `pip`
|
|
234
|
+
or `pip3` can reach a different Python than the one you run, and then the
|
|
235
|
+
package installs somewhere your `python3` never looks.
|
|
236
|
+
|
|
237
|
+
**If `formwork` says `command not found`,** it installed fine and the command
|
|
238
|
+
landed in a folder your shell does not search. You do not have to fix your
|
|
239
|
+
path. Either of these works instead:
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
python3 -m formwork_cli check the same command, run through Python
|
|
243
|
+
formwork/fw check the kit's own command, needs no install
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The second one only works after `formwork init`, because that is what puts the
|
|
247
|
+
kit in your project. If you never got that far, use the first one, or install
|
|
248
|
+
with pipx and start again.
|
|
249
|
+
|
|
250
|
+
</details>
|
|
251
|
+
|
|
252
|
+
### 2. As files, with nothing installed
|
|
253
|
+
|
|
254
|
+
**There is no package to install and nothing to import.** The kit is text files
|
|
255
|
+
and small Python programs, and it runs from where it sits.
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
git clone https://github.com/makariim/formwork.git the-kit
|
|
259
|
+
cp -R the-kit/formwork the-kit/FORMWORK.md /your/project/
|
|
260
|
+
|
|
261
|
+
cd /your/project
|
|
262
|
+
formwork/fw install --runtime claude-code # or codex, cursor, gemini-cli
|
|
263
|
+
formwork/fw setup
|
|
264
|
+
formwork/fw check
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
The copy is the whole kit, so you can delete `the-kit` afterwards. There is no
|
|
268
|
+
`init` step here, because copying the folder in **is** the init step.
|
|
269
|
+
|
|
270
|
+
`formwork check` becomes `formwork/fw check`, and the same for `install`,
|
|
271
|
+
`setup`, `demo`, `roles`, `record` and `test`. Run `formwork/fw` on its own for
|
|
272
|
+
the list. `where` and `version` belong to the installed command only.
|
|
273
|
+
|
|
274
|
+
### What each step does
|
|
275
|
+
|
|
276
|
+
| | |
|
|
277
|
+
|---|---|
|
|
278
|
+
| `init` | puts `formwork/` and `FORMWORK.md` into your project |
|
|
279
|
+
| `install` | wires the guards into your agent, writes your role files. Add `--runtime <name>` when it cannot tell |
|
|
280
|
+
| `setup` | asks eleven questions once, then writes your style file, your standing brief, and the folders for decisions, briefs and reports |
|
|
281
|
+
| `check` | runs all twelve checks and says green or red |
|
|
282
|
+
|
|
283
|
+
**What it touches.** It adds `formwork/` and `FORMWORK.md`, writes
|
|
284
|
+
`.formwork.toml`, writes your agent's settings file keeping anything already
|
|
285
|
+
there, generates one role file per role into your agent's folder, and puts one
|
|
286
|
+
file in `~/.formwork/` holding a fingerprint of each file that enforces a
|
|
287
|
+
rule.
|
|
288
|
+
|
|
289
|
+
| System | Does it work? |
|
|
290
|
+
|---|---|
|
|
291
|
+
| **macOS** | Yes. Built and used here |
|
|
292
|
+
| **Linux** | Should do. Nobody has tried. **Try it and tell us** |
|
|
293
|
+
| **Windows** | The command installs. The guards assume a unix shell and nobody has run them there |
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
## Your first turn
|
|
298
|
+
|
|
299
|
+
The kit is files, and your agent reads files. So the first turn is you telling
|
|
300
|
+
it to. Four that cover most of it:
|
|
301
|
+
|
|
302
|
+
**Starting something new**
|
|
303
|
+
|
|
304
|
+
> Read `FORMWORK.md` and `formwork/first-run.md`. Then use the director role to
|
|
305
|
+
> write me a brief for a command line tool that renames photos by the date they
|
|
306
|
+
> were taken. Size the brief to the work. Do not build anything yet.
|
|
307
|
+
|
|
308
|
+
*The **director** is the role that holds the plan and writes the briefs. It
|
|
309
|
+
never builds anything.*
|
|
310
|
+
|
|
311
|
+
**Picking up a project that already exists**
|
|
312
|
+
|
|
313
|
+
> Read `FORMWORK.md`, then `docs/standing.md`. Tell me where we are in four
|
|
314
|
+
> lines, and what you think the next piece of work is.
|
|
315
|
+
|
|
316
|
+
*`docs/standing.md` is the **standing brief**, the one file that says where the
|
|
317
|
+
project stands. `formwork setup` starts it for you. It is what stops every new
|
|
318
|
+
window beginning with you retelling the whole story.*
|
|
319
|
+
|
|
320
|
+
**Handing over one piece of work**
|
|
321
|
+
|
|
322
|
+
> Here is the brief. [paste it] Do only what it says, nothing next to it. Check
|
|
323
|
+
> your work with `formwork check`, tell me what you did, and stop there.
|
|
324
|
+
|
|
325
|
+
**Asking one role for an opinion**
|
|
326
|
+
|
|
327
|
+
> Use the security role. Read `formwork/guard/` and tell me what an attacker
|
|
328
|
+
> would try first.
|
|
329
|
+
|
|
330
|
+
**Then it stops and waits for you.** That is the shape, and it is the part
|
|
331
|
+
people are surprised by. It does not carry on to the next thing because the
|
|
332
|
+
next thing is obvious.
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## Settings
|
|
337
|
+
|
|
338
|
+
One file, `.formwork.toml`, in your project. The installer writes it and
|
|
339
|
+
`formwork setup` fills it in by asking you.
|
|
340
|
+
|
|
341
|
+
```toml
|
|
342
|
+
[bindings]
|
|
343
|
+
runtime = "claude-code" # which agent you use
|
|
344
|
+
|
|
345
|
+
[strength]
|
|
346
|
+
git_boundary = "block" # block | warn | off
|
|
347
|
+
protect_files = "block"
|
|
348
|
+
aggregate_gate = "block"
|
|
349
|
+
gate_budget = 3
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**Your file will be shorter than that**, and nothing is wrong. The installer
|
|
353
|
+
writes the first two `[strength]` keys. The other two have working defaults, so
|
|
354
|
+
they only appear once you change them. Adding them by hand works too.
|
|
355
|
+
|
|
356
|
+
| When you would change something | What to change |
|
|
357
|
+
|---|---|
|
|
358
|
+
| you moved to a different agent | `runtime` |
|
|
359
|
+
| a guard keeps stopping work you meant | that key to `warn`. It runs, and tells you |
|
|
360
|
+
| you are only trying the kit out | that key to `off` |
|
|
361
|
+
| a genuinely stuck turn keeps being refused | `gate_budget`, how many refusals before the gate stands aside |
|
|
362
|
+
|
|
363
|
+
**For one session only**, without editing anything:
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
FORMWORK_GIT_BOUNDARY=off
|
|
367
|
+
FORMWORK_PROTECT_FILES=warn
|
|
368
|
+
FORMWORK_GATE=off
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**Rules are not configured here.** There is no `[rules]` section and adding one
|
|
372
|
+
fails a check. You drop a rule by deleting it from `formwork/rules/core.md`.
|
|
373
|
+
[`FORMWORK.md`](FORMWORK.md) says why it works that way.
|
|
374
|
+
|
|
375
|
+
**How the agents talk to you is not in this file.** That is
|
|
376
|
+
[`formwork/style.md`](formwork/style.md), and your own `docs/style.md` written
|
|
377
|
+
in your own words, which beats it. Every role points at both.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## What is inside
|
|
382
|
+
|
|
383
|
+
| | | count it yourself |
|
|
384
|
+
|---|---|---|
|
|
385
|
+
| **3 guards** | small programs that refuse. Two stop a command, one stops a turn ending | `ls formwork/guard \| grep -v test_` |
|
|
386
|
+
| **12 checks** | small programs that read your project and say green or red | `ls formwork/check/checks \| wc -l` |
|
|
387
|
+
| **28 roles** | one file each, saying what that job does and where it stops | `ls formwork/roles/*/*.md \| wc -l` |
|
|
388
|
+
| **47 rules** | 13 you meet daily, 34 for when you need them | `grep -c '^### ' formwork/rules/*.md` |
|
|
389
|
+
| **356 tests** | every guard and check, proved able to fail | `formwork test` |
|
|
390
|
+
|
|
391
|
+
It is all text files and small programs. You can read every line. Nothing is
|
|
392
|
+
hidden. Nothing is sent anywhere.
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Every check has been watched failing
|
|
397
|
+
|
|
398
|
+
A check nobody has seen fail proves nothing.
|
|
399
|
+
|
|
400
|
+
So each check ships test cases of both kinds: at least one it must reject, at
|
|
401
|
+
least one it must accept. It has to tell them apart. Watch it yourself with
|
|
402
|
+
`formwork demo`.
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## What this will not pretend
|
|
407
|
+
|
|
408
|
+
Every number here comes with the command that made it. Anything unmeasured says
|
|
409
|
+
so in capitals rather than guessing. There are three:
|
|
410
|
+
|
|
411
|
+
| | |
|
|
412
|
+
|---|---|
|
|
413
|
+
| **What a round costs in money** | never measured. [`COSTS.md`](formwork/COSTS.md) says NOT ESTABLISHED instead of guessing |
|
|
414
|
+
| **Whether the guards stop a determined agent** | they do not. [`limits.md`](formwork/limits.md) lists every route anybody has found |
|
|
415
|
+
| **Whether three of the four agents work** | nobody has tried them. Said once already, near the top, because it changes what you get |
|
|
416
|
+
|
|
417
|
+
> [!WARNING]
|
|
418
|
+
> The guards stop the ordinary path, not a clever one. If you need real safety,
|
|
419
|
+
> use a sandbox.
|
|
420
|
+
|
|
421
|
+
Every time this kit failed on the person who wrote it, the failure went into
|
|
422
|
+
[`docs/dogfood.md`](docs/dogfood.md) instead of being quietly patched. That page
|
|
423
|
+
is the best reason to trust the rest.
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## This is version one
|
|
428
|
+
|
|
429
|
+
What is here is built and tested. What is not here, and is not being worked on
|
|
430
|
+
today:
|
|
431
|
+
|
|
432
|
+
| | |
|
|
433
|
+
|---|---|
|
|
434
|
+
| **Skills** | one word for a common job, instead of a paragraph. Considered, not started |
|
|
435
|
+
| **A model per role** | pick the model and effort level for each role. Only Claude Code is known to allow it. Nobody has checked the other three, so this would be one agent out of four until somebody does |
|
|
436
|
+
| **Teams** | more than one person on the same standing brief. Today the method says one director at a time, and nobody has tried two |
|
|
437
|
+
| **Roles invented on the fly** | asked for by somebody who tried the kit. It cuts across the check that stops two roles owning one job, so it stays a question we have not settled |
|
|
438
|
+
|
|
439
|
+
None of these is promised. They are written down so you can see the edge of
|
|
440
|
+
what is here.
|
|
441
|
+
|
|
442
|
+
Version one is not a draft. It is what one person built, used, and broke on
|
|
443
|
+
purpose. **NOT ESTABLISHED: whether any of it works for more than one person.**
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## Where to go next
|
|
448
|
+
|
|
449
|
+
**[`formwork/first-run.md`](formwork/first-run.md)**. It walks you through the
|
|
450
|
+
install, makes you watch a guard refuse something, and has you do one small
|
|
451
|
+
real piece of work. On your own project, not a pretend one. About fifteen
|
|
452
|
+
minutes.
|
|
453
|
+
|
|
454
|
+
**Then [`FORMWORK.md`](FORMWORK.md)**, the whole method on one page. It reads
|
|
455
|
+
better after you have run it once than before.
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## Everything else
|
|
460
|
+
|
|
461
|
+
**While you work**
|
|
462
|
+
|
|
463
|
+
| | |
|
|
464
|
+
|---|---|
|
|
465
|
+
| [`loop.md`](formwork/loop.md) | how one job goes, start to finish |
|
|
466
|
+
| [`threads.md`](formwork/threads.md) | how work starts, and where the plan lives between conversations |
|
|
467
|
+
| [`style.md`](formwork/style.md) | how the agents talk to you, and how to change it |
|
|
468
|
+
| [`round.md`](formwork/round.md) | how to run a round, and when it is worth it |
|
|
469
|
+
| [`templates/`](formwork/templates/) | brief, predictions, report, decision, round, standing brief |
|
|
470
|
+
| [`roles/`](formwork/roles/) | the roles, and how to write your own |
|
|
471
|
+
| [`rules/`](formwork/rules/) | the rules, each saying what it catches |
|
|
472
|
+
|
|
473
|
+
**When you need it**
|
|
474
|
+
|
|
475
|
+
| | |
|
|
476
|
+
|---|---|
|
|
477
|
+
| [`troubleshooting.md`](formwork/troubleshooting.md) | every error message and what to do |
|
|
478
|
+
| [`glossary.md`](formwork/glossary.md) | every word we use, in plain language |
|
|
479
|
+
| [`limits.md`](formwork/limits.md) | what this kit cannot do |
|
|
480
|
+
| [`COSTS.md`](formwork/COSTS.md) | what it costs, and the number nobody has |
|
|
481
|
+
| [`FAQ.md`](FAQ.md) | questions people ask |
|
|
482
|
+
|
|
483
|
+
**How it was built**
|
|
484
|
+
|
|
485
|
+
| | |
|
|
486
|
+
|---|---|
|
|
487
|
+
| [`docs/`](docs/) | the survey, the design, and what broke |
|
|
488
|
+
| [`docs/dogfood.md`](docs/dogfood.md) | the kit failing on its own author, written down |
|
|
489
|
+
| [`RELEASING.md`](RELEASING.md) | for the maintainer |
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
## Contributing
|
|
494
|
+
|
|
495
|
+
Forks are the point. The most useful thing you can send is a command that got
|
|
496
|
+
past a guard, or one that was stopped when it should not have been.
|
|
497
|
+
|
|
498
|
+
[CONTRIBUTING.md](CONTRIBUTING.md) has the rest, and
|
|
499
|
+
[SECURITY.md](SECURITY.md) is for anything you would rather not post in public.
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Licence
|
|
504
|
+
|
|
505
|
+
MIT. See [LICENSE](LICENSE).
|