@apptoolkit/harness 0.0.0-stage → 1.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 +57 -2
- package/dist/apptoolkit-harness-1.0.0.tgz +0 -0
- package/dist/bun/apptoolkit-harness-1.0.0.tgz +0 -0
- package/dist/bun/native/LICENSE +21 -0
- package/dist/bun/native/README.md +33 -0
- package/dist/bun/native/harness +4 -0
- package/dist/bun/native/payload/HARNESS.md +21 -0
- package/dist/bun/native/payload/author-style/README.md +56 -0
- package/dist/bun/native/payload/author-style/biome-core.json +57 -0
- package/dist/bun/native/payload/author-style/biome-react.json +9 -0
- package/dist/bun/native/payload/author-style/biome-sql.json +9 -0
- package/dist/bun/native/payload/author-style/bun.lock +37 -0
- package/dist/bun/native/payload/author-style/check.llm.md +17 -0
- package/dist/bun/native/payload/author-style/check.test.llm.md +17 -0
- package/dist/bun/native/payload/author-style/check.test.ts +238 -0
- package/dist/bun/native/payload/author-style/check.ts +181 -0
- package/dist/bun/native/payload/author-style/member-spacing.test.ts +172 -0
- package/dist/bun/native/payload/author-style/member-spacing.ts +106 -0
- package/dist/bun/native/payload/author-style/package.json +18 -0
- package/dist/bun/native/payload/author-style/plugins/class-member-order.grit +133 -0
- package/dist/bun/native/payload/author-style/plugins/event-handler-names.grit +110 -0
- package/dist/bun/native/payload/author-style/plugins/explicit-arrow-body.grit +15 -0
- package/dist/bun/native/payload/author-style/plugins/explicit-source-constructs.grit +10 -0
- package/dist/bun/native/payload/author-style/plugins/react-arrow-body.grit +85 -0
- package/dist/bun/native/payload/author-style/plugins/sql-style.grit +125 -0
- package/dist/bun/native/payload/author-style/react-module.llm.md +17 -0
- package/dist/bun/native/payload/author-style/react-module.test.ts +150 -0
- package/dist/bun/native/payload/author-style/react-module.ts +255 -0
- package/dist/bun/native/payload/author-style/source-policy.llm.md +17 -0
- package/dist/bun/native/payload/author-style/source-policy.test.ts +70 -0
- package/dist/bun/native/payload/author-style/source-policy.ts +215 -0
- package/dist/bun/native/payload/author-style/spacing.llm.md +17 -0
- package/dist/bun/native/payload/author-style/spacing.test.ts +174 -0
- package/dist/bun/native/payload/author-style/spacing.ts +211 -0
- package/dist/bun/native/payload/harness/POLICY.md +33 -0
- package/dist/bun/native/payload/harness/PROJECT.md +26 -0
- package/dist/bun/native/payload/harness/REVIEW.md +17 -0
- package/dist/bun/native/payload/harness/TEMPLATES.md +20 -0
- package/dist/bun/native/payload/harness/WORKFLOWS.md +65 -0
- package/dist/bun/native/payload/harness/runtime/ZOD-LICENSE +21 -0
- package/dist/bun/native/payload/harness/runtime/harness.mjs +104 -0
- package/dist/bun/native/payload/harness/services/README.md +26 -0
- package/dist/bun/native/payload/harness/services/penpot.json +7 -0
- package/dist/bun/native/payload/harness/services/plane.json +9 -0
- package/dist/bun/native/payload/harness/workflows/W01.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W02.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W03.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W04.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W05.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W06.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W07.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W08.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W09.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W10.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W11.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W12.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W13.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W14.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W15.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W16.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W17.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W18.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W19.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W20.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W21.md +15 -0
- package/dist/bun/native/payload/harness/workflows/W22.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W23.md +21 -0
- package/dist/bun/native/payload/harness/workflows/W24.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W25.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W26.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W27.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W28.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W29.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W30.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W31.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W32.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W33.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W34.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W35.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W36.md +13 -0
- package/dist/bun/native/payload/harness/workflows/W37.md +13 -0
- package/dist/bun/npm/LICENSE +21 -0
- package/dist/bun/npm/README.md +33 -0
- package/dist/bun/npm/harness.js +104 -0
- package/dist/bun/npm/package.json +23 -0
- package/dist/bun/npm/payload/HARNESS.md +21 -0
- package/dist/bun/npm/payload/author-style/README.md +56 -0
- package/dist/bun/npm/payload/author-style/biome-core.json +57 -0
- package/dist/bun/npm/payload/author-style/biome-react.json +9 -0
- package/dist/bun/npm/payload/author-style/biome-sql.json +9 -0
- package/dist/bun/npm/payload/author-style/bun.lock +37 -0
- package/dist/bun/npm/payload/author-style/check.llm.md +17 -0
- package/dist/bun/npm/payload/author-style/check.test.llm.md +17 -0
- package/dist/bun/npm/payload/author-style/check.test.ts +238 -0
- package/dist/bun/npm/payload/author-style/check.ts +181 -0
- package/dist/bun/npm/payload/author-style/member-spacing.test.ts +172 -0
- package/dist/bun/npm/payload/author-style/member-spacing.ts +106 -0
- package/dist/bun/npm/payload/author-style/package.json +18 -0
- package/dist/bun/npm/payload/author-style/plugins/class-member-order.grit +133 -0
- package/dist/bun/npm/payload/author-style/plugins/event-handler-names.grit +110 -0
- package/dist/bun/npm/payload/author-style/plugins/explicit-arrow-body.grit +15 -0
- package/dist/bun/npm/payload/author-style/plugins/explicit-source-constructs.grit +10 -0
- package/dist/bun/npm/payload/author-style/plugins/react-arrow-body.grit +85 -0
- package/dist/bun/npm/payload/author-style/plugins/sql-style.grit +125 -0
- package/dist/bun/npm/payload/author-style/react-module.llm.md +17 -0
- package/dist/bun/npm/payload/author-style/react-module.test.ts +150 -0
- package/dist/bun/npm/payload/author-style/react-module.ts +255 -0
- package/dist/bun/npm/payload/author-style/source-policy.llm.md +17 -0
- package/dist/bun/npm/payload/author-style/source-policy.test.ts +70 -0
- package/dist/bun/npm/payload/author-style/source-policy.ts +215 -0
- package/dist/bun/npm/payload/author-style/spacing.llm.md +17 -0
- package/dist/bun/npm/payload/author-style/spacing.test.ts +174 -0
- package/dist/bun/npm/payload/author-style/spacing.ts +211 -0
- package/dist/bun/npm/payload/harness/POLICY.md +33 -0
- package/dist/bun/npm/payload/harness/PROJECT.md +26 -0
- package/dist/bun/npm/payload/harness/REVIEW.md +17 -0
- package/dist/bun/npm/payload/harness/TEMPLATES.md +20 -0
- package/dist/bun/npm/payload/harness/WORKFLOWS.md +65 -0
- package/dist/bun/npm/payload/harness/runtime/ZOD-LICENSE +21 -0
- package/dist/bun/npm/payload/harness/runtime/harness.mjs +104 -0
- package/dist/bun/npm/payload/harness/services/README.md +26 -0
- package/dist/bun/npm/payload/harness/services/penpot.json +7 -0
- package/dist/bun/npm/payload/harness/services/plane.json +9 -0
- package/dist/bun/npm/payload/harness/workflows/W01.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W02.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W03.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W04.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W05.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W06.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W07.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W08.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W09.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W10.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W11.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W12.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W13.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W14.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W15.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W16.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W17.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W18.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W19.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W20.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W21.md +15 -0
- package/dist/bun/npm/payload/harness/workflows/W22.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W23.md +21 -0
- package/dist/bun/npm/payload/harness/workflows/W24.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W25.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W26.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W27.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W28.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W29.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W30.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W31.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W32.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W33.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W34.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W35.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W36.md +13 -0
- package/dist/bun/npm/payload/harness/workflows/W37.md +13 -0
- package/dist/npm/LICENSE +21 -0
- package/dist/npm/README.md +30 -0
- package/dist/npm/harness.js +104 -0
- package/dist/npm/package.json +25 -0
- package/dist/npm/payload/HARNESS.md +21 -0
- package/dist/npm/payload/author-style/README.md +56 -0
- package/dist/npm/payload/author-style/biome-core.json +57 -0
- package/dist/npm/payload/author-style/biome-react.json +9 -0
- package/dist/npm/payload/author-style/biome-sql.json +9 -0
- package/dist/npm/payload/author-style/check.llm.md +17 -0
- package/dist/npm/payload/author-style/check.test.llm.md +17 -0
- package/dist/npm/payload/author-style/check.test.ts +224 -0
- package/dist/npm/payload/author-style/check.ts +179 -0
- package/dist/npm/payload/author-style/member-spacing.test.ts +172 -0
- package/dist/npm/payload/author-style/member-spacing.ts +106 -0
- package/dist/npm/payload/author-style/package-lock.json +180 -0
- package/dist/npm/payload/author-style/package.json +17 -0
- package/dist/npm/payload/author-style/plugins/class-member-order.grit +133 -0
- package/dist/npm/payload/author-style/plugins/event-handler-names.grit +110 -0
- package/dist/npm/payload/author-style/plugins/explicit-arrow-body.grit +15 -0
- package/dist/npm/payload/author-style/plugins/explicit-source-constructs.grit +10 -0
- package/dist/npm/payload/author-style/plugins/react-arrow-body.grit +85 -0
- package/dist/npm/payload/author-style/plugins/sql-style.grit +125 -0
- package/dist/npm/payload/author-style/react-module.llm.md +17 -0
- package/dist/npm/payload/author-style/react-module.test.ts +150 -0
- package/dist/npm/payload/author-style/react-module.ts +255 -0
- package/dist/npm/payload/author-style/source-policy.llm.md +17 -0
- package/dist/npm/payload/author-style/source-policy.test.ts +70 -0
- package/dist/npm/payload/author-style/source-policy.ts +215 -0
- package/dist/npm/payload/author-style/spacing.llm.md +17 -0
- package/dist/npm/payload/author-style/spacing.test.ts +174 -0
- package/dist/npm/payload/author-style/spacing.ts +211 -0
- package/dist/npm/payload/harness/POLICY.md +33 -0
- package/dist/npm/payload/harness/PROJECT.md +26 -0
- package/dist/npm/payload/harness/REVIEW.md +17 -0
- package/dist/npm/payload/harness/TEMPLATES.md +20 -0
- package/dist/npm/payload/harness/WORKFLOWS.md +65 -0
- package/dist/npm/payload/harness/runtime/ZOD-LICENSE +21 -0
- package/dist/npm/payload/harness/runtime/harness.mjs +104 -0
- package/dist/npm/payload/harness/services/README.md +26 -0
- package/dist/npm/payload/harness/services/penpot.json +7 -0
- package/dist/npm/payload/harness/services/plane.json +9 -0
- package/dist/npm/payload/harness/workflows/W01.md +13 -0
- package/dist/npm/payload/harness/workflows/W02.md +13 -0
- package/dist/npm/payload/harness/workflows/W03.md +13 -0
- package/dist/npm/payload/harness/workflows/W04.md +13 -0
- package/dist/npm/payload/harness/workflows/W05.md +13 -0
- package/dist/npm/payload/harness/workflows/W06.md +13 -0
- package/dist/npm/payload/harness/workflows/W07.md +13 -0
- package/dist/npm/payload/harness/workflows/W08.md +13 -0
- package/dist/npm/payload/harness/workflows/W09.md +13 -0
- package/dist/npm/payload/harness/workflows/W10.md +13 -0
- package/dist/npm/payload/harness/workflows/W11.md +13 -0
- package/dist/npm/payload/harness/workflows/W12.md +13 -0
- package/dist/npm/payload/harness/workflows/W13.md +13 -0
- package/dist/npm/payload/harness/workflows/W14.md +13 -0
- package/dist/npm/payload/harness/workflows/W15.md +13 -0
- package/dist/npm/payload/harness/workflows/W16.md +13 -0
- package/dist/npm/payload/harness/workflows/W17.md +13 -0
- package/dist/npm/payload/harness/workflows/W18.md +13 -0
- package/dist/npm/payload/harness/workflows/W19.md +13 -0
- package/dist/npm/payload/harness/workflows/W20.md +13 -0
- package/dist/npm/payload/harness/workflows/W21.md +15 -0
- package/dist/npm/payload/harness/workflows/W22.md +13 -0
- package/dist/npm/payload/harness/workflows/W23.md +21 -0
- package/dist/npm/payload/harness/workflows/W24.md +13 -0
- package/dist/npm/payload/harness/workflows/W25.md +13 -0
- package/dist/npm/payload/harness/workflows/W26.md +13 -0
- package/dist/npm/payload/harness/workflows/W27.md +13 -0
- package/dist/npm/payload/harness/workflows/W28.md +13 -0
- package/dist/npm/payload/harness/workflows/W29.md +13 -0
- package/dist/npm/payload/harness/workflows/W30.md +13 -0
- package/dist/npm/payload/harness/workflows/W31.md +13 -0
- package/dist/npm/payload/harness/workflows/W32.md +13 -0
- package/dist/npm/payload/harness/workflows/W33.md +13 -0
- package/dist/npm/payload/harness/workflows/W34.md +13 -0
- package/dist/npm/payload/harness/workflows/W35.md +13 -0
- package/dist/npm/payload/harness/workflows/W36.md +13 -0
- package/dist/npm/payload/harness/workflows/W37.md +13 -0
- package/package.json +35 -4
package/README.md
CHANGED
|
@@ -1,3 +1,58 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Model-agnostic working practice source archive
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The user approved the common policy and all 37 workflow families. Start with the [tool and technology audit](llm/HARNESS-TOOL-AUDIT.md), [workflow catalog](llm/HARNESS-FLOWS-REVIEW.md) and [accepted user decisions](docs/harness-user-decisions.md).
|
|
4
|
+
|
|
5
|
+
The [personal code style profile](src/author-style/README.md) includes the recovered writing rules, independent Biome installation and commands for verifying edited TypeScript.
|
|
6
|
+
|
|
7
|
+
The product source is in [`src/harness/`](src/harness/), the author style source is in [`src/author-style/`](src/author-style/) and the acquisition utilities are in [`src/acquisition/`](src/acquisition/). The [development and local installation guide](docs/harness-release-verification.md#first-installation-in-this-repository) explains how to try the unpublished package in this repository. The [`llm/` catalog](llm/README.md) also documents the development commands.
|
|
8
|
+
|
|
9
|
+
Develop and build with Bun. The npm artifact runs through `npx` or `bunx`, and `rtk proxy bun run build:harness:native` compiles the installer into a host executable for direct use.
|
|
10
|
+
|
|
11
|
+
This workspace collects the original rules, writing guidance, workflows, prompts, tooling, project knowledge, and historical evidence from the user's selected projects. The first phase preserves raw material. Synthesis is a later phase.
|
|
12
|
+
|
|
13
|
+
- [Intake and decisions](docs/intake.md)
|
|
14
|
+
- [Raw acquisition index](raw/2026-11-04/README.md)
|
|
15
|
+
- [Coverage and limitations](docs/coverage.md)
|
|
16
|
+
- [Proposed gradual processing plan](docs/processing-plan.md)
|
|
17
|
+
- [Derived coverage workspace](processing/README.md)
|
|
18
|
+
- [Completed stage 1 coverage](docs/stage1-coverage.md)
|
|
19
|
+
- [Stage 2 writing and communication pilot](docs/stage2-pilot.md)
|
|
20
|
+
- [Stage 2 second extraction batch](docs/stage2-batch2.md)
|
|
21
|
+
- [Stage 2 third extraction batch](docs/stage2-batch3.md)
|
|
22
|
+
- [Stage 2 fourth extraction batch](docs/stage2-batch4.md)
|
|
23
|
+
- [Stage 2 fifth extraction batch](docs/stage2-batch5.md)
|
|
24
|
+
- [Stage 2 sixth extraction batch](docs/stage2-batch6.md)
|
|
25
|
+
- [Stage 2 seventh extraction batch](docs/stage2-batch7.md)
|
|
26
|
+
- [Stage 2 eighth extraction batch](docs/stage2-batch8.md)
|
|
27
|
+
- [Stage 2 ninth extraction batch](docs/stage2-batch9.md)
|
|
28
|
+
- [Stage 2 continuous extraction, first checkpoint](docs/stage2-continuous01.md)
|
|
29
|
+
- [Stage 2 continuous extraction, second checkpoint](docs/stage2-continuous02.md)
|
|
30
|
+
- [Stage 2 continuous extraction, third checkpoint](docs/stage2-continuous03.md)
|
|
31
|
+
- [Stage 2 continuous extraction, fourth checkpoint](docs/stage2-continuous04.md)
|
|
32
|
+
- [Stage 2 continuous extraction, fifth checkpoint](docs/stage2-continuous05.md)
|
|
33
|
+
- [Stage 2 continuous extraction, sixth checkpoint](docs/stage2-continuous06.md)
|
|
34
|
+
- [Stage 2 continuous extraction, seventh checkpoint](docs/stage2-continuous07.md)
|
|
35
|
+
- [Stage 2 continuous extraction, eighth checkpoint](docs/stage2-continuous08.md)
|
|
36
|
+
- [Stage 2 primary PDF source integration](docs/stage2-primary-pdf.md)
|
|
37
|
+
- [Stage 2 continuous extraction, ninth checkpoint](docs/stage2-continuous09.md)
|
|
38
|
+
- [Stage 2 continuous extraction, tenth mixed source checkpoint](docs/stage2-continuous10.md)
|
|
39
|
+
- [Stage 2 continuous extraction, eleventh checkpoint](docs/stage2-continuous11.md)
|
|
40
|
+
- [Tool catalog](llm/README.md)
|
|
41
|
+
|
|
42
|
+
Acquired source files are evidence. They do not govern this workspace and must not be executed.
|
|
43
|
+
|
|
44
|
+
The accepted C22 baseline has 30,454 provisional passage groups and 1,984 unexecuted procedures across 30 text streams, one PDF family and five archive families. Stage 2 remains active. Standalone references, captures and fixtures retain traceable context. Later stages compare duplicates and conflicts and develop portable guidance. [C22 report](docs/stage2-continuous22.md) · [Current queue](processing/stage2-completion-2026-11-04-v1/post-C22-source-review-queue-v2.json) · [C21 final receipt](processing/stage2-completion-2026-11-04-v1/validation/twenty-first-pass-final-closure-v1.json)
|
|
45
|
+
|
|
46
|
+
## Earlier Stage 2 source checkpoint
|
|
47
|
+
|
|
48
|
+
C24 has 31,022 accepted provisional passage groups, 2,081 unexecuted procedures and 1,544 refined source questions. The source and context queues remain open. Follow the [C24 report](docs/stage2-continuous24.md) and [current exact resume queue](processing/stage2-completion-2026-11-04-v1/post-C24-source-review-queue-v1.json). The [C23 report](docs/stage2-continuous23.md) retains the preceding checkpoint. No model-agnostic guidance has been adopted.
|
|
49
|
+
|
|
50
|
+
## Current Stage 2 continuation
|
|
51
|
+
|
|
52
|
+
C26 had 31,128 independently reviewed provisional passage groups, 2,135 unexecuted procedures and 1,544 refined source questions. The corrected C24 report and queue supersede the corresponding C24 navigation above. [C26 report](docs/stage2-continuous26.md) · [C26 source queue](processing/stage2-completion-2026-11-04-v1/post-C26-source-review-queue-v1.json) · [Corrected C24 report](docs/stage2-continuous24-v2.md) · [Corrected C24 queue](processing/stage2-completion-2026-11-04-v1/post-C24-source-review-queue-v2.json)
|
|
53
|
+
|
|
54
|
+
C62 has 130,975 independently reviewed provisional groups, 13,744 unexecuted procedures, 1,558 refined source questions and 962 separately typed source contexts. Stage 2 remains open. [C62 report](docs/stage2-continuous62.md) · [Current source queue](processing/stage2-completion-2026-11-04-v1/post-C62-source-review-queue-v1.json) · [C61 report](docs/stage2-continuous61.md)
|
|
55
|
+
|
|
56
|
+
## Current Stage 2 scope
|
|
57
|
+
|
|
58
|
+
The user narrowed Stage 2 to an inventory of their decisions and mechanisms for working with LLMs. Start with the focused inventory and its source links. C62 remains the last accepted broader source checkpoint and supplies archival evidence. [Focused LLM working practices](docs/intake.md#focused-llm-working-practices) · [C62 report](docs/stage2-continuous62.md)
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AppToolkit contributors
|
|
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,33 @@
|
|
|
1
|
+
# AppToolkit Harness
|
|
2
|
+
|
|
3
|
+
AppToolkit Harness installs project guidance, deterministic verification tools and 37 reusable engineering workflows for Codex, Claude Code and OpenCode. It supports new projects, existing repositories and a shared harness for related repositories.
|
|
4
|
+
|
|
5
|
+
Use macOS or Linux with Bun 1.4.2 or later, or Node.js 24 or later with npm. Use Git for versioned projects and RTK for project tooling. Run the installer from the target directory using one of these commands.
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
rtk proxy bunx --bun @apptoolkit/harness install
|
|
9
|
+
rtk proxy npx @apptoolkit/harness install
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
`bunx --bun` selects Bun even when Node.js is absent. Plain `bunx` also works when Node.js is on `PATH`.
|
|
13
|
+
|
|
14
|
+
Review the proposed files, then select which agents, repositories and optional services to configure. Open the same directory in your agent and run `$apptoolkit init` in Codex or `/apptoolkit init` in Claude Code or OpenCode. The installed `llm/HARNESS.md` is the shared entry point.
|
|
15
|
+
|
|
16
|
+
In a directory of related repositories, start the agent in the parent directory. The central harness keeps shared decisions and scoped repository context. Use `$apptoolkit add repo <path>` or `/apptoolkit add repo <path>` after cloning another repository. Repositories can keep their own guidance and toolchain.
|
|
17
|
+
|
|
18
|
+
To preview an installation in a noninteractive session, inspect the target and supply the explicit choices.
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
rtk proxy bunx --bun @apptoolkit/harness inspect --root /absolute/workspace --json
|
|
22
|
+
rtk proxy bunx --bun @apptoolkit/harness install --root /absolute/workspace --hosts codex,claude,opencode --local --repo-mode .=local --plan --json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use `--yes` in place of `--plan` to apply a reviewed noninteractive plan. Select the workspace mode separately from each Git repository's generated files. Local mode uses the repository's `info/exclude` metadata for the planned files. Use `--repo-mode <path>=local|versioned` for each selected Git repository.
|
|
26
|
+
|
|
27
|
+
Use `rtk proxy bunx --bun @apptoolkit/harness@latest update --plan --json` or `rtk proxy npx @apptoolkit/harness@latest update --plan --json` to preview a release update. The updater checks managed files against the installation receipt. Resolve reported conflicts before applying the update. Keep project decisions in the installed local profile, and review the affected paths and version before applying.
|
|
28
|
+
|
|
29
|
+
Plane and Penpot are separate opt-ins. To make a provider available after installation, preview an update with `--enable-service plane` or `--enable-service penpot`, apply it, and complete the project connection through `init`. The installed runbooks explain instance setup, private credentials, authorization and readiness checks. Snapshot verification requires a versioned harness and project-level opt-in. Use Bun to install the isolated Biome dependency before first using the author style profile.
|
|
30
|
+
|
|
31
|
+
The installed local CLI reads the workflow index, retrieves one workflow at a time and checks Markdown against a local document policy. See `llm/HARNESS.md` for the exact commands. The agent records which operations are configured and which were verified in the current environment.
|
|
32
|
+
|
|
33
|
+
Distributed under the MIT license.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# AppToolkit Harness
|
|
2
|
+
|
|
3
|
+
Use this index when adopting a project or opening a fresh agent session. Resolve the project, read its applicable rules, and open the smallest workflow that matches the request.
|
|
4
|
+
|
|
5
|
+
| Need | Start here |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| Find the procedure for a natural request | [Workflow index](harness/WORKFLOWS.md) |
|
|
8
|
+
| Start a new feature or an unresolved change | [W16 Feature definition](harness/workflows/W16.md) |
|
|
9
|
+
| Adopt, initialize or update this installation | [W20 Adoption](harness/workflows/W20.md) |
|
|
10
|
+
| Resolve repositories, services and project conventions | [Project guide](harness/PROJECT.md) |
|
|
11
|
+
| Check permissions, engineering rules and learning | [Operating policy](harness/POLICY.md) |
|
|
12
|
+
| Audit a claim or independently review code | [Independent review](harness/REVIEW.md) |
|
|
13
|
+
| Prepare a decision, work unit or checkpoint | [Templates](harness/TEMPLATES.md) |
|
|
14
|
+
| Verify coverage against an explicit source inventory | [W23 Verification](harness/workflows/W23.md) |
|
|
15
|
+
| Verify authored TypeScript without a compatible project Biome configuration | [Style tools](author-style/README.md) |
|
|
16
|
+
|
|
17
|
+
Begin with the installed workspace and project records for the active root. Apply the nearest repository guidance as well as shared decisions relevant to that repository. Use source maps to locate the relevant sections. For a natural request such as “Give me my pending list” or “Dame mi lista de pendientes”, open only [W01](harness/workflows/W01.md), resolve its target and use the project's authorized sources.
|
|
18
|
+
|
|
19
|
+
Run `rtk proxy bun --no-env-file llm/harness/runtime/harness.mjs context llm/HARNESS.md` from the installation root to list heading locators without returning the body. If only Node.js is available, replace `bun --no-env-file` with `node` in installed runtime commands. Add `--section line:1` with the locator reported for the desired heading. An exact title or anchor also works when unique. Select a line locator for repeated titles. The reader opens regular project-relative Markdown files, rejects protected locations and symbolic links, and returns a bounded section with its source line range.
|
|
20
|
+
|
|
21
|
+
Open an indexed workflow directly with `rtk proxy bunx --bun @apptoolkit/harness workflow W01` or `rtk proxy npx @apptoolkit/harness workflow W01`. Use [W21](harness/workflows/W21.md) to plan local source-map protection and [W23](harness/workflows/W23.md) to check a fresh LCOV report.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Personal code style
|
|
2
|
+
|
|
3
|
+
Use this profile whenever an agent writes or changes authored TypeScript in a project without an applicable Biome configuration. It supplies a pinned Biome dependency, configuration, structural lint rules and a small TypeScript parser supplement. The tool reads only the explicitly selected source files for its supplementary checks and never writes target files.
|
|
4
|
+
|
|
5
|
+
- [Writing rules](#writing-rules): Read before editing code.
|
|
6
|
+
- [Deterministic checks](#deterministic-checks): Select an appropriate profile.
|
|
7
|
+
- [Install and run](#install-and-run): Run after each code edit batch and before handoff. See the [checker map](check.llm.md) when maintaining the tool.
|
|
8
|
+
- [Evidence and precedence](#evidence-and-precedence): Determine what is personal, historical or specific to a project.
|
|
9
|
+
|
|
10
|
+
## Writing rules
|
|
11
|
+
|
|
12
|
+
1. Write code in execution order. Name intermediate values when nesting hides decisions. Use explicit guards and braces, keep related steps together and separate preparation, reads, decisions, writes and returns when they serve different purposes. Keep a simple expression concise.
|
|
13
|
+
2. Define domain contracts before behavior. Keep a schema and its inferred types together and validate untrusted data before it enters domain logic. Reuse the accepted validation contract. Ask before adding Zod to a target that does not have it. Use explicit projections at public boundaries.
|
|
14
|
+
3. Keep transport and framework adapters focused. Separate domain decisions from persistence and wire explicit dependencies. Preserve the project's established class, module or functional organization. In classes, order static properties and methods before the constructor and instance properties and methods after it. Put private or protected members before public members in the corresponding group. Prefer constructor parameter properties for retained values and keep related operations in workflow order.
|
|
15
|
+
4. Use descriptive names and structure to explain behavior. Preserve rationale in the project's decision, ticket or review record. Keep a cause and useful context when operations fail. Prove guards, recovery and failure behavior through focused tests. Do not copy historical workarounds or weaken types to make checks pass.
|
|
16
|
+
5. Scope component rules to reusable React components. Prefer a named PascalCase `const`, explicit `FC` props and a default export when compatible with local rules. Keep props near their component and keep inline event callbacks to a single simple call. Use descriptive local `handle…` names. Treat framework entry points, generic components and library-owned wrappers according to their actual contract.
|
|
17
|
+
|
|
18
|
+
## Deterministic checks
|
|
19
|
+
|
|
20
|
+
| Area | Enforcement |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| Format | Biome uses two spaces, LF, a 120-column line width, single quotes in TypeScript, double quotes in JSX, semicolons, trailing commas and parenthesized arrow parameters. |
|
|
23
|
+
| Structure | Biome and the bundled Grit plugins check braces, explicit class accessibility, supported member-order inversions, multiline or branching arrow bodies and increment/decrement operators. The TypeScript supplement checks statement phase boundaries and class member separation, keeping overloads grouped. |
|
|
24
|
+
| Types and source | Biome rejects explicit `any`, non-null assertions, selected suppression directives and configured unsafe type patterns. Grit rejects explicit `unknown` type nodes. The TypeScript supplement checks double assertions, explanatory comments and top-level inferred types derived directly from a same-file schema via a recognized Zod import. It preserves parsed TypeScript reference directives and exact SQL markers before supported tagged templates. |
|
|
25
|
+
| `react` | Includes the common checks plus selected JSX components, exports, `FC` typing, inline event call shape and local event names. It recognizes direct imported React `memo` and `forwardRef`. Select reusable component files. Other wrappers, arbitrary aliases and semantic event binding still need review. |
|
|
26
|
+
| `sql` | Includes the common checks plus a lexical check for supported templates with a direct `sql` tag. Select it only where the project's `sql` tag is PostgreSQL. It does not resolve aliases or parse the SQL dialect. Unsupported fragments remain outside the check. |
|
|
27
|
+
|
|
28
|
+
Keep the native type checker, focused behavior tests, independent technical audit and separate code review. Static checks do not prove meaningful names, correct schema ownership, safe public exposure, awaited authorization, rejection handling, transaction semantics or test adequacy. A successful check reports a result for the selected files and patterns. It does not establish whole-project coverage.
|
|
29
|
+
|
|
30
|
+
## Install and run
|
|
31
|
+
|
|
32
|
+
Use the installed `llm/author-style/` directory in the adopting project. Keep its package manifest and `bun.lock` together. Run these commands from the adopting project's root with RTK and Bun 1.4.2 or later.
|
|
33
|
+
|
|
34
|
+
```text
|
|
35
|
+
rtk proxy bun install --cwd llm/author-style --frozen-lockfile --ignore-scripts
|
|
36
|
+
rtk proxy bun run --cwd llm/author-style check --root /absolute/project path/to/changed.ts
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The Bun install command installs the isolated verifier and its platform binary inside `llm/author-style/`. Keep the application's own dependencies, lockfile and package manager. Use explicit paths under the actual project root. Quote paths containing spaces and pass `--` before paths beginning with a hyphen. Supported inputs are `.ts`, `.tsx`, `.mts` and `.cts`. A selection can include new and existing files. The verifier reads the whole selected file, so keep inherited violations separate and do not reformat unrelated code. The command rejects symlinks, known generated or dependency directories, generated headers and out-of-root paths.
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
rtk proxy bun run --cwd llm/author-style check --root /absolute/project --profile react src/Panel.tsx
|
|
43
|
+
rtk proxy bun run --cwd llm/author-style check --root /absolute/project --profile sql src/queries.ts
|
|
44
|
+
rtk proxy bun run --cwd llm/author-style check --root /absolute/project --lint-only src/service.ts
|
|
45
|
+
rtk proxy bun run --cwd llm/author-style test
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
For an existing project, follow its own rules and tools first. The verifier refuses a selected file when it finds a native `biome.json` or `biome.jsonc` in its directory or an ancestor. If another formatter is authoritative and its lint policy is compatible, select `--lint-only` to omit personal formatting and spacing. If the existing lint policy conflicts, follow the project and record the difference. The verifier does not select or replace an ESLint, Prettier or other configuration on its own. Native Biome warnings, including an oversized selected file, cause a failed check. A native failure prevents the supplementary checks from running. Resolve the reported cause and rerun the same selection.
|
|
49
|
+
|
|
50
|
+
Record the selected paths and result in the normal verification evidence. Add this instruction to the adopting agent's entry point or shared verification instructions. Every agent should run the same command after a code edit batch and before delivery. The package installs no editor, Git, CI or model-specific hook.
|
|
51
|
+
|
|
52
|
+
> After each code edit batch and before handoff, run the project's applicable Biome checks. When no applicable Biome configuration exists, run the compatible profile in `llm/author-style/README.md` on the edited TypeScript files. Use the project's established formatter and lint policy first. Record the result with the other verification evidence.
|
|
53
|
+
|
|
54
|
+
## Evidence and precedence
|
|
55
|
+
|
|
56
|
+
Use the target project rules where established. Document and test a mechanical correction before changing a shared rule.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"plugins": [
|
|
4
|
+
"./plugins/class-member-order.grit",
|
|
5
|
+
"./plugins/explicit-arrow-body.grit",
|
|
6
|
+
"./plugins/explicit-source-constructs.grit"
|
|
7
|
+
],
|
|
8
|
+
"formatter": {
|
|
9
|
+
"indentStyle": "space",
|
|
10
|
+
"indentWidth": 2,
|
|
11
|
+
"lineEnding": "lf",
|
|
12
|
+
"lineWidth": 120
|
|
13
|
+
},
|
|
14
|
+
"javascript": {
|
|
15
|
+
"formatter": {
|
|
16
|
+
"quoteStyle": "single",
|
|
17
|
+
"jsxQuoteStyle": "double",
|
|
18
|
+
"quoteProperties": "asNeeded",
|
|
19
|
+
"trailingCommas": "all",
|
|
20
|
+
"semicolons": "always",
|
|
21
|
+
"arrowParentheses": "always",
|
|
22
|
+
"bracketSameLine": false,
|
|
23
|
+
"bracketSpacing": true
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"assist": {
|
|
27
|
+
"enabled": false
|
|
28
|
+
},
|
|
29
|
+
"linter": {
|
|
30
|
+
"rules": {
|
|
31
|
+
"recommended": false,
|
|
32
|
+
"correctness": {
|
|
33
|
+
"noUnusedImports": "error",
|
|
34
|
+
"noUnusedPrivateClassMembers": "error",
|
|
35
|
+
"noUnusedVariables": "error"
|
|
36
|
+
},
|
|
37
|
+
"nursery": {
|
|
38
|
+
"noFloatingPromises": "error",
|
|
39
|
+
"noMisusedPromises": "error",
|
|
40
|
+
"noUnsafeTypeAssertion": "error"
|
|
41
|
+
},
|
|
42
|
+
"style": {
|
|
43
|
+
"noNonNullAssertion": "error",
|
|
44
|
+
"useBlockStatements": "error",
|
|
45
|
+
"useConsistentMemberAccessibility": {
|
|
46
|
+
"level": "error",
|
|
47
|
+
"options": { "accessibility": "explicit" }
|
|
48
|
+
},
|
|
49
|
+
"useImportType": "error"
|
|
50
|
+
},
|
|
51
|
+
"suspicious": {
|
|
52
|
+
"noExplicitAny": "error",
|
|
53
|
+
"noTsIgnore": "error"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 2,
|
|
3
|
+
"configVersion": 0,
|
|
4
|
+
"workspaces": {
|
|
5
|
+
"": {
|
|
6
|
+
"name": "harness-author-style",
|
|
7
|
+
"devDependencies": {
|
|
8
|
+
"@biomejs/biome": "2.5.15",
|
|
9
|
+
"typescript": "5.9.3",
|
|
10
|
+
"zod": "4.6.7",
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
"packages": {
|
|
15
|
+
"@biomejs/biome": ["@biomejs/biome@2.5.15", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.15", "@biomejs/cli-darwin-x64": "2.5.15", "@biomejs/cli-linux-arm64": "2.5.15", "@biomejs/cli-linux-arm64-musl": "2.5.15", "@biomejs/cli-linux-x64": "2.5.15", "@biomejs/cli-linux-x64-musl": "2.5.15", "@biomejs/cli-win32-arm64": "2.5.15", "@biomejs/cli-win32-x64": "2.5.15" }, "bin": { "biome": "bin/biome" } }, "sha512-WZTW4slm/pdkh92K6t/3aEN++44JD1PQ7squ7RCMLI1flHGl43DVOIGXvCjHiZgBMO1V4uYxoFNtqrIA4qGuIQ=="],
|
|
16
|
+
|
|
17
|
+
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BZVzFhJ/mUvTLMYbc9x6el0o2Uv5zP7bACYyhFb6fSc1giroXm7PL0a5KqMJ9F+/BnkYRjagD/ROSDVOZ6eapg=="],
|
|
18
|
+
|
|
19
|
+
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.15", "", { "os": "darwin", "cpu": "x64" }, "sha512-V5Kw63V+fVGNFhFrizDxMbGXAzZCh8kYzJpy3GI6gTapWDg7bZK9oYC9CbVgQSEdTnupz0U5Efz8Ev+5vdBBXw=="],
|
|
20
|
+
|
|
21
|
+
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-XaG7P7eeSLYETD3K9grfB0mQmpLQZjygdbsxekWBJAg4am79fGAtRpfRyNnTvXB2fZFNnJZG3nXm7HBat0+VUw=="],
|
|
22
|
+
|
|
23
|
+
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-tGzZUTcJCV7tj5Adh/Gn6nR4MycqA3iohq2LEcrarAgRBkU0h0OKd2UzCRkOsOYOuUGaUJb4YmqRqyy2feGGSw=="],
|
|
24
|
+
|
|
25
|
+
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.15", "", { "os": "linux", "cpu": "x64" }, "sha512-xE4iEW/3LqlYj9GFgGrFsFSH51dEEpUbYWBfeOv0q87WkUDxK2o/HhreSb7qMJqck70RVM6Lg96hgedcAYcOkA=="],
|
|
26
|
+
|
|
27
|
+
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.15", "", { "os": "linux", "cpu": "x64" }, "sha512-IlxUcyxilVGPsE008x13pWdkTbU3nQpP2i9b5UrbOYj6goBkKsRX1XB7yJLcV+O1H9LBchIIm4adOaVLZBX0ZQ=="],
|
|
28
|
+
|
|
29
|
+
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.15", "", { "os": "win32", "cpu": "arm64" }, "sha512-2kPKzhNlm8C+Ru3GcO0Me2ODkCBLrVOUNuyi84RJyWDVKAA4+Kjj3jMjL938lF6BRfvltC4vB2nPY9SvN51Ovg=="],
|
|
30
|
+
|
|
31
|
+
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.15", "", { "os": "win32", "cpu": "x64" }, "sha512-yAzh4UqEImV6Hcy0zjUqNfJAsUhoD64FBQCdTG8Md/Z2wQeVP/ZmJ3XRYAs1g8J9fjTFyl2fCtc5FB5til47+g=="],
|
|
32
|
+
|
|
33
|
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
34
|
+
|
|
35
|
+
"zod": ["zod@4.6.7", "", {}, "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg=="],
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Author style checker map
|
|
2
|
+
|
|
3
|
+
- [Inputs and project authority](#inputs-and-project-authority)
|
|
4
|
+
- [Native and parser checks](#native-and-parser-checks)
|
|
5
|
+
- [Verification and recovery](#verification-and-recovery)
|
|
6
|
+
|
|
7
|
+
## Inputs and project authority
|
|
8
|
+
|
|
9
|
+
Start in `check.ts` at `checkFiles`. The request schema describes the project root, selected files, profile and mode. `targetRelativePath` establishes containment and `configuredBiome` detects local Biome configuration. See [install and run](README.md#install-and-run) for adoption, supported files and exclusions.
|
|
10
|
+
|
|
11
|
+
## Native and parser checks
|
|
12
|
+
|
|
13
|
+
The `configurations` map selects the isolated Biome configuration. The checker uses the locked package, clears `BIOME_BINARY`, and starts Bun without dotenv loading or automatic installs. It propagates the native status. `findSourcePolicyIssues`, `findSpacingIssues`, `findMemberSpacingIssues` and `findReactModuleIssues` inspect the selected source without writing. The [check matrix](README.md#deterministic-checks) lists supported patterns and separate review boundaries.
|
|
14
|
+
|
|
15
|
+
## Verification and recovery
|
|
16
|
+
|
|
17
|
+
`check.test.ts` covers installation layout, native and project authority checks, selected inputs and supplementary results. The individual parser test files cover exact constructs and boundaries. See [install and run](README.md#install-and-run) for the test command. Do not treat a skipped, failed or interrupted check as evidence that selected code passed.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Checker integration test map
|
|
2
|
+
|
|
3
|
+
- [Installed layout and source selection](#installed-layout-and-source-selection)
|
|
4
|
+
- [Native profiles and policy](#native-profiles-and-policy)
|
|
5
|
+
- [Failure paths](#failure-paths)
|
|
6
|
+
|
|
7
|
+
## Installed layout and source selection
|
|
8
|
+
|
|
9
|
+
`runs when the profile is installed under the adopting project llm directory` covers private configuration discovery. `uses the isolated formatter and linter on exact paths outside the harness without writing` covers exact file names, unselected files and byte preservation.
|
|
10
|
+
|
|
11
|
+
## Native profiles and policy
|
|
12
|
+
|
|
13
|
+
`enforces core types, explicit updates, braces, branches and class layout` exercises the real engine and a rejected environment override. `uses the pinned Biome launcher when the target dotenv defines another binary` covers Bun subprocess isolation. `uses separately selected React and tagged SQL checks` distinguishes profile findings from the common configuration.
|
|
14
|
+
|
|
15
|
+
## Failure paths
|
|
16
|
+
|
|
17
|
+
`fails a mixed selection when Biome cannot check an oversized file` protects against partial checks reported as success. `refuses existing configurations, generated files, symlinks and an empty file selection` checks scope and authority. Supplementary parser cases have their own focused test files.
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { cpSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { test } from 'node:test';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
|
|
9
|
+
const checker = fileURLToPath(new URL('check.ts', import.meta.url));
|
|
10
|
+
|
|
11
|
+
function executeFrom(entry: string, root: string, args: string[], env = process.env) {
|
|
12
|
+
const result = spawnSync(process.execPath, [entry, '--root', root, ...args], { encoding: 'utf8', env });
|
|
13
|
+
|
|
14
|
+
if (result.error) {
|
|
15
|
+
throw result.error;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function execute(root: string, ...args: string[]) {
|
|
22
|
+
return executeFrom(checker, root, args);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
test('runs when the profile is installed under the adopting project llm directory', (context) => {
|
|
26
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
27
|
+
|
|
28
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
29
|
+
|
|
30
|
+
const profile = join(root, 'llm', 'author-style');
|
|
31
|
+
|
|
32
|
+
mkdirSync(profile, { recursive: true });
|
|
33
|
+
|
|
34
|
+
const packageDirectory = fileURLToPath(new URL('.', import.meta.url));
|
|
35
|
+
|
|
36
|
+
for (const file of [
|
|
37
|
+
'check.ts',
|
|
38
|
+
'source-policy.ts',
|
|
39
|
+
'spacing.ts',
|
|
40
|
+
'member-spacing.ts',
|
|
41
|
+
'react-module.ts',
|
|
42
|
+
'package.json',
|
|
43
|
+
'biome-core.json',
|
|
44
|
+
'plugins',
|
|
45
|
+
]) {
|
|
46
|
+
cpSync(join(packageDirectory, file), join(profile, file), { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
symlinkSync(join(packageDirectory, 'node_modules'), join(profile, 'node_modules'), 'dir');
|
|
50
|
+
writeFileSync(join(root, 'entry.ts'), 'export const sample = true;\n');
|
|
51
|
+
|
|
52
|
+
const result = executeFrom(join(profile, 'check.ts'), root, ['entry.ts']);
|
|
53
|
+
|
|
54
|
+
assert.equal(result.status, 0, result.stderr);
|
|
55
|
+
assert.match(result.stdout, /Checked 1 file/);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('uses the isolated formatter and linter on exact paths outside the harness without writing', (context) => {
|
|
59
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
60
|
+
|
|
61
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
62
|
+
|
|
63
|
+
const clean = join(root, 'has spaces.ts');
|
|
64
|
+
const poorlyFormatted = "export const label='one'\n";
|
|
65
|
+
|
|
66
|
+
writeFileSync(clean, poorlyFormatted);
|
|
67
|
+
writeFileSync(join(root, 'unselected.ts'), 'export const counter: any = 0;\n');
|
|
68
|
+
|
|
69
|
+
const failure = execute(root, 'has spaces.ts');
|
|
70
|
+
|
|
71
|
+
assert.equal(failure.status, 1);
|
|
72
|
+
assert.match(failure.stderr, /Formatter would have printed/);
|
|
73
|
+
assert.equal(readFileSync(clean, 'utf8'), poorlyFormatted);
|
|
74
|
+
|
|
75
|
+
const lintOnly = execute(root, '--lint-only', 'has spaces.ts');
|
|
76
|
+
|
|
77
|
+
assert.equal(lintOnly.status, 0, lintOnly.stderr);
|
|
78
|
+
|
|
79
|
+
writeFileSync(clean, 'export const label = `line\n// @generated\nline`;\n');
|
|
80
|
+
|
|
81
|
+
const success = execute(root, clean);
|
|
82
|
+
|
|
83
|
+
assert.equal(success.status, 0, success.stderr);
|
|
84
|
+
assert.match(success.stdout, /Checked 1 file/);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('enforces core types, explicit updates, braces, branches and class layout', (context) => {
|
|
88
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
89
|
+
|
|
90
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
91
|
+
|
|
92
|
+
writeFileSync(
|
|
93
|
+
join(root, 'shape.ts'),
|
|
94
|
+
[
|
|
95
|
+
'export class Selection {',
|
|
96
|
+
' public choose(flag: boolean): number {',
|
|
97
|
+
' let count = 1;',
|
|
98
|
+
' if (flag) count++;',
|
|
99
|
+
' return count;',
|
|
100
|
+
' }',
|
|
101
|
+
' public static create(): Selection {',
|
|
102
|
+
' return new Selection();',
|
|
103
|
+
' }',
|
|
104
|
+
'}',
|
|
105
|
+
'export const resolve = (value: boolean): string => (value ? "a" : "b");',
|
|
106
|
+
'export const loose: any = 1;',
|
|
107
|
+
'export const ambiguous: unknown = 2;',
|
|
108
|
+
].join('\n'),
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const result = executeFrom(checker, root, ['--lint-only', 'shape.ts'], {
|
|
112
|
+
...process.env,
|
|
113
|
+
BIOME_BINARY: process.execPath,
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
assert.equal(result.status, 1);
|
|
117
|
+
assert.match(result.stderr, /Use an explicit update/);
|
|
118
|
+
assert.match(result.stderr, /useBlockStatements/);
|
|
119
|
+
assert.match(result.stderr, /explicit return/);
|
|
120
|
+
assert.match(result.stderr, /class member order/i);
|
|
121
|
+
assert.match(result.stderr, /noExplicitAny/);
|
|
122
|
+
assert.match(result.stderr, /Use an explicit domain type/);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('uses the pinned Biome launcher when the target dotenv defines another binary', (context) => {
|
|
126
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
127
|
+
|
|
128
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
129
|
+
|
|
130
|
+
writeFileSync(join(root, '.env'), `BIOME_BINARY=${process.execPath}\n`);
|
|
131
|
+
writeFileSync(join(root, 'entry.ts'), 'export const sample = true;\n');
|
|
132
|
+
|
|
133
|
+
const result = execute(root, 'entry.ts');
|
|
134
|
+
|
|
135
|
+
assert.equal(result.status, 0, result.stderr);
|
|
136
|
+
assert.match(result.stdout, /Checked 1 file/);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
test('uses separately selected React and tagged SQL checks', (context) => {
|
|
140
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
141
|
+
|
|
142
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
143
|
+
|
|
144
|
+
writeFileSync(join(root, 'Panel.tsx'), 'export default function Panel() { return <p>Hello</p>; }\n');
|
|
145
|
+
writeFileSync(join(root, 'Card.tsx'), 'const Card = () => <p>Hello</p>;\nexport default Card;\n');
|
|
146
|
+
writeFileSync(join(root, 'helper.ts'), 'export const UppercaseHelper = () => 1;\n');
|
|
147
|
+
writeFileSync(
|
|
148
|
+
join(root, 'query.ts'),
|
|
149
|
+
'export const find = (sql: (strings: TemplateStringsArray) => string) => sql`select id from records`;\n',
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
const core = execute(root, '--lint-only', 'Panel.tsx', 'query.ts');
|
|
153
|
+
|
|
154
|
+
assert.equal(core.status, 0, core.stderr);
|
|
155
|
+
|
|
156
|
+
const react = execute(root, '--profile', 'react', '--lint-only', 'Panel.tsx');
|
|
157
|
+
|
|
158
|
+
assert.equal(react.status, 1);
|
|
159
|
+
assert.match(react.stderr, /named const component/);
|
|
160
|
+
|
|
161
|
+
const arrow = execute(root, '--profile', 'react', '--lint-only', 'Card.tsx');
|
|
162
|
+
|
|
163
|
+
assert.equal(arrow.status, 1);
|
|
164
|
+
assert.match(arrow.stderr, /Annotate React arrow components/);
|
|
165
|
+
|
|
166
|
+
const helper = execute(root, '--profile', 'react', '--lint-only', 'helper.ts');
|
|
167
|
+
|
|
168
|
+
assert.equal(helper.status, 0, helper.stderr);
|
|
169
|
+
|
|
170
|
+
writeFileSync(
|
|
171
|
+
join(root, 'event.tsx'),
|
|
172
|
+
'export const view = <button onClick={() => { console.log("clicked"); }}>Go</button>;\n',
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
const plainEvent = execute(root, '--lint-only', 'event.tsx');
|
|
176
|
+
|
|
177
|
+
assert.equal(plainEvent.status, 0, plainEvent.stderr);
|
|
178
|
+
|
|
179
|
+
const reactEvent = execute(root, '--profile', 'react', '--lint-only', 'event.tsx');
|
|
180
|
+
|
|
181
|
+
assert.equal(reactEvent.status, 1);
|
|
182
|
+
assert.match(reactEvent.stderr, /inline JSX handler as one call expression/);
|
|
183
|
+
|
|
184
|
+
const sql = execute(root, '--profile', 'sql', '--lint-only', 'query.ts');
|
|
185
|
+
|
|
186
|
+
assert.equal(sql.status, 1);
|
|
187
|
+
assert.match(sql.stderr, /SQL keywords/i);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('fails a mixed selection when Biome cannot check an oversized file', (context) => {
|
|
191
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
192
|
+
|
|
193
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
194
|
+
writeFileSync(join(root, 'small.ts'), 'export const sample = true;\n');
|
|
195
|
+
writeFileSync(join(root, 'large.ts'), `export const sample = '${'a'.repeat(1024 * 1024)}';\n`);
|
|
196
|
+
|
|
197
|
+
const result = execute(root, '--lint-only', 'small.ts', 'large.ts');
|
|
198
|
+
|
|
199
|
+
assert.equal(result.status, 1);
|
|
200
|
+
assert.match(result.stderr, /exceeds the configured maximum/);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('refuses existing configurations, generated files, symlinks and an empty file selection', (context) => {
|
|
204
|
+
const root = mkdtempSync(join(tmpdir(), 'harness-style-'));
|
|
205
|
+
|
|
206
|
+
context.after(() => rmSync(root, { recursive: true, force: true }));
|
|
207
|
+
|
|
208
|
+
mkdirSync(join(root, 'app'));
|
|
209
|
+
writeFileSync(join(root, 'app', 'biome.jsonc'), '{}\n');
|
|
210
|
+
writeFileSync(join(root, 'app', 'module.ts'), 'export const sample = true;\n');
|
|
211
|
+
writeFileSync(join(root, 'generated.ts'), '// @generated\nexport const sample = true;\n');
|
|
212
|
+
symlinkSync(join(root, 'generated.ts'), join(root, 'linked.ts'));
|
|
213
|
+
|
|
214
|
+
const expected = [
|
|
215
|
+
{ files: ['app/module.ts'], message: /project's configured Biome checks/ },
|
|
216
|
+
{ files: ['generated.ts'], message: /instead of a generated artifact/ },
|
|
217
|
+
{ files: ['linked.ts'], message: /instead of a symbolic link/ },
|
|
218
|
+
{ files: ['../outside.ts'], message: /inside/ },
|
|
219
|
+
{ files: [], message: /Supply the files you changed/ },
|
|
220
|
+
];
|
|
221
|
+
|
|
222
|
+
for (const { files, message } of expected) {
|
|
223
|
+
const result = execute(root, ...files);
|
|
224
|
+
|
|
225
|
+
assert.equal(result.status, 1);
|
|
226
|
+
assert.match(result.stderr, message);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const child = join(root, 'app', 'child');
|
|
230
|
+
|
|
231
|
+
mkdirSync(child);
|
|
232
|
+
writeFileSync(join(child, 'module.ts'), 'export const sample = true;\n');
|
|
233
|
+
|
|
234
|
+
const parentConfiguration = execute(child, 'module.ts');
|
|
235
|
+
|
|
236
|
+
assert.equal(parentConfiguration.status, 1);
|
|
237
|
+
assert.match(parentConfiguration.stderr, /project's configured Biome checks/);
|
|
238
|
+
});
|