@vaubaan/harness 0.0.0-stage → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +5 -0
  3. package/README.md +307 -2
  4. package/dist/agents/coding.agent.md +182 -0
  5. package/dist/agents/merge.agent.md +139 -0
  6. package/dist/agents/planning.agent.md +194 -0
  7. package/dist/agents/review.agent.md +176 -0
  8. package/dist/cli/index.d.ts +1 -0
  9. package/dist/cli/index.js +2924 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/commands/clean-code.cmd.md +26 -0
  12. package/dist/commands/decision.cmd.md +19 -0
  13. package/dist/commands/doc-audit.cmd.md +24 -0
  14. package/dist/commands/drift.cmd.md +18 -0
  15. package/dist/commands/handbook.cmd.md +21 -0
  16. package/dist/commands/readme.cmd.md +19 -0
  17. package/dist/commands/spec.cmd.md +20 -0
  18. package/dist/commands/test-plan.cmd.md +22 -0
  19. package/dist/commands/workflow.cmd.md +19 -0
  20. package/dist/index.d.ts +36 -0
  21. package/dist/index.js +1706 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/init.d.ts +42 -0
  24. package/dist/init.js +1088 -0
  25. package/dist/init.js.map +1 -0
  26. package/dist/linters/index.d.ts +43 -0
  27. package/dist/linters/index.js +727 -0
  28. package/dist/linters/index.js.map +1 -0
  29. package/dist/parser/index.d.ts +247 -0
  30. package/dist/parser/index.js +114 -0
  31. package/dist/parser/index.js.map +1 -0
  32. package/dist/render-B9_kNtQc.d.ts +50 -0
  33. package/dist/render.d.ts +3 -0
  34. package/dist/render.js +572 -0
  35. package/dist/render.js.map +1 -0
  36. package/dist/skills/clean-code-guardian.skill.md +391 -0
  37. package/dist/skills/decision-record-writer.skill.md +166 -0
  38. package/dist/skills/doc-audit.skill.md +257 -0
  39. package/dist/skills/drift-detector.skill.md +173 -0
  40. package/dist/skills/handbook-writer.skill.md +185 -0
  41. package/dist/skills/readme-writer.skill.md +131 -0
  42. package/dist/skills/spec-writer.skill.md +165 -0
  43. package/dist/skills/test-plan-writer.skill.md +179 -0
  44. package/dist/skills/workflow-writer.skill.md +168 -0
  45. package/dist/templates/code-quality.md.tmpl +57 -0
  46. package/dist/templates/coding-workflow.md.tmpl +88 -0
  47. package/dist/templates/decision.md.tmpl +60 -0
  48. package/dist/templates/e2e-tests.md.tmpl +62 -0
  49. package/dist/templates/handbook.md.tmpl +58 -0
  50. package/dist/templates/integration-tests.md.tmpl +50 -0
  51. package/dist/templates/readme.md.tmpl +51 -0
  52. package/dist/templates/spec.md.tmpl +64 -0
  53. package/package.json +82 -4
@@ -0,0 +1,88 @@
1
+ ---
2
+ tracks:
3
+ - .github/workflows/*
4
+ - vercel.json
5
+ - package.json
6
+ last_reviewed: <DATE>
7
+ ---
8
+
9
+ # Coding workflow
10
+
11
+ This document describes *how we work* on this project: the CI
12
+ pipeline, the environments, the PR (or direct-push) process, the
13
+ branch model, the commit conventions, and the release
14
+ process.
15
+
16
+ ## 1. CI pipeline
17
+
18
+ | Trigger | Jobs triggered | Typical duration |
19
+ |------------------------------|------------------------------------------|------------------|
20
+ | push to `<MAIN_BRANCH>` | <JOBS_ON_MAIN_PUSH> | <DURATION> |
21
+ | pull_request | <JOBS_ON_PR> | <DURATION> |
22
+ | tag `v*` | <JOBS_ON_TAG> | <DURATION> |
23
+ | schedule | <JOBS_ON_SCHEDULE> | <DURATION> |
24
+
25
+ **Jobs required to merge a PR:** <REQUIRED_JOBS>.
26
+
27
+ **How to force a re-run:** <RERUN_INSTRUCTIONS>.
28
+
29
+ ## 2. Environments
30
+
31
+ | Env | URL | Source branch | Data | Access |
32
+ |----------------|------------------------------|--------------------|--------------------------|-------------------|
33
+ | `prod` | <PROD_URL> | <PROD_BRANCH> | <PROD_DATA> | <PROD_ACCESS> |
34
+ | `staging` | <STAGING_URL> | <STAGING_BRANCH> | <STAGING_DATA> | <STAGING_ACCESS> |
35
+ | `preview` | <PREVIEW_URL_PATTERN> | feature branches | <PREVIEW_DATA> | <PREVIEW_ACCESS> |
36
+ | `local` | <LOCAL_URL> | n/a | <LOCAL_DATA> | dev |
37
+
38
+ Each environment has its own set of variables — see
39
+ <ENV_VARS_REFERENCE>.
40
+
41
+ ## 3. Process: PR or direct-push
42
+
43
+ <PR_OR_DIRECT_PUSH_DECLARATION>
44
+
45
+ ### If PR
46
+
47
+ - Creation: <PR_CREATION_RULES>
48
+ - Review: <REVIEW_RULES>
49
+ - Merge: <MERGE_RULES>
50
+
51
+ ### If direct-push
52
+
53
+ - Branches allowed for direct-push: <DIRECT_PUSH_BRANCHES>
54
+ - Safeguards: <DIRECT_PUSH_GUARDS>
55
+
56
+ ## 4. Branch model
57
+
58
+ - **Model:** <TRUNK_BASED | GITFLOW | GITHUB_FLOW | OTHER>
59
+ - **Main branch:** `<MAIN_BRANCH>`
60
+ - **Staging branch (if distinct):** `<STAGING_BRANCH>`
61
+ - **Feature naming convention:** `<FEATURE_BRANCH_PATTERN>`
62
+ - **Max lifetime of a feature branch:** <MAX_LIFETIME>
63
+
64
+ ## 5. Commit / merge conventions
65
+
66
+ - **Message format:** <COMMIT_MESSAGE_FORMAT>
67
+ - **Conventional commits?** <YES_NO_DETAILS>
68
+ - **Squash, rebase or merge?** <MERGE_STRATEGY>
69
+ - **Signing required?** <SIGNING_POLICY>
70
+
71
+ ## 6. Release
72
+
73
+ - **Who can trigger a release:** <RELEASE_AUTHORITY>
74
+ - **How we tag:** <TAGGING_PROCESS>
75
+ - **Versioning:** <VERSIONING_SCHEME>
76
+ - **Rollback:** <ROLLBACK_PROCESS>
77
+ - **Freeze windows:** <FREEZE_WINDOWS>
78
+ - **Communication:** <RELEASE_NOTES_CHANNEL>
79
+
80
+ ### Minimal release runbook
81
+
82
+ 1. <RELEASE_STEP_1>
83
+ 2. <RELEASE_STEP_2>
84
+ 3. <RELEASE_STEP_N>
85
+
86
+ ### Post-release incident
87
+
88
+ See <INCIDENT_RUNBOOK_REF>.
@@ -0,0 +1,60 @@
1
+ # <DECISION_TITLE>
2
+
3
+ - **Date:** <DATE>
4
+ - **Author:** <AUTHOR>
5
+ - **Status:** <PROPOSED | ACCEPTED | SUPERSEDED | DEPRECATED>
6
+ - **Supersedes:** <PREVIOUS_ADR_SLUG | none>
7
+
8
+ ## Context
9
+
10
+ Describe the situation that makes this decision necessary. What problem
11
+ are we solving? What constraints apply (technical, organizational,
12
+ time-related)? What signals triggered the discussion?
13
+
14
+ This section must be readable on its own: a reader discovering the
15
+ ADR six months later must understand why the question came up.
16
+
17
+ ## Decision
18
+
19
+ State the chosen decision in one to three clear sentences. No
20
+ "we will probably" — it is settled.
21
+
22
+ Then detail the conditions of application: scope, exceptions,
23
+ thresholds, effective dates.
24
+
25
+ ## Consequences
26
+
27
+ List the expected effects of the decision, positive **and** negative.
28
+
29
+ **Positive:**
30
+
31
+ - <POSITIVE_CONSEQUENCE_1>
32
+ - <POSITIVE_CONSEQUENCE_N>
33
+
34
+ **Negative:**
35
+
36
+ - <NEGATIVE_CONSEQUENCE_1>
37
+ - <NEGATIVE_CONSEQUENCE_N>
38
+
39
+ **Neutral / to watch:**
40
+
41
+ - <NEUTRAL_CONSEQUENCE_1>
42
+
43
+ ## Rejected alternatives
44
+
45
+ List the options seriously considered that were not chosen,
46
+ with the reason for rejecting each one. This section is as important
47
+ as the decision itself — it avoids re-debating the same
48
+ alternatives later.
49
+
50
+ ### Alternative A — <ALTERNATIVE_A_NAME>
51
+
52
+ <DESCRIPTION_A>
53
+
54
+ Rejected because: <REJECTION_REASON_A>.
55
+
56
+ ### Alternative B — <ALTERNATIVE_B_NAME>
57
+
58
+ <DESCRIPTION_B>
59
+
60
+ Rejected because: <REJECTION_REASON_B>.
@@ -0,0 +1,62 @@
1
+ ---
2
+ tracks:
3
+ - <E2E_TEST_DIR_OR_FILE_1>
4
+ - <E2E_TEST_DIR_OR_FILE_2>
5
+ last_reviewed: <DATE>
6
+ ---
7
+
8
+ # E2E test plan
9
+
10
+ ## Scope
11
+
12
+ E2E tests verify the **complete** system against real dependencies
13
+ (or a staging environment faithful to prod). We distinguish:
14
+
15
+ - **Golden paths**: the main user journeys that must
16
+ pass on every release. Exhaustive coverage required.
17
+ - **Edge cases**: less frequent but high-value scenarios
18
+ (errors, permissions, boundary states). Selective coverage.
19
+
20
+ Anything that can be validated in local integration (see
21
+ [integration-tests.md](./integration-tests.md)) **must** be —
22
+ E2E tests are expensive, we reserve them for journeys that cannot
23
+ be validated otherwise.
24
+
25
+ ## Stack
26
+
27
+ - **E2E runner:** <E2E_RUNNER>
28
+ - **Drivers:** <BROWSER_OR_API_DRIVER>
29
+ - **Target environment:** <ENV_TARGET>
30
+ - **Reporting:** <REPORT_TOOL>
31
+
32
+ ## Fixture conventions
33
+
34
+ - **E2E organization:** each scenario runs in an isolated
35
+ fixture (`<E2E_ORG_NAMING_CONVENTION>`) to avoid
36
+ interference between parallel runs.
37
+ - **Naming:** <FIXTURE_NAMING_RULE>
38
+ - **Seed data:** <SEED_STRATEGY>
39
+ - **Authentication:** <AUTH_STRATEGY>
40
+
41
+ ## Sweeper / cleanup
42
+
43
+ E2E fixtures inevitably leave artifacts behind (created orgs,
44
+ uploaded files, in-flight jobs). The sweeper:
45
+
46
+ - **Cadence:** <SWEEPER_FREQUENCY>
47
+ - **Purge criterion:** <PURGE_CRITERIA>
48
+ - **Logs:** <SWEEPER_LOG_LOCATION>
49
+ - **Dry-run mode:** <DRY_RUN_SWITCH>
50
+
51
+ ## Covered scenarios
52
+
53
+ | ID | Scenario | Category | Linked spec | Test file |
54
+ |--------|-----------------------------------|-----------------|----------------------|----------------------------|
55
+ | E2E-01 | <SCENARIO_1_NAME> | golden | [[<SPEC_NAME_1>]] | <TEST_FILE_PATH_1> |
56
+ | E2E-02 | <SCENARIO_2_NAME> | edge | [[<SPEC_NAME_2>]] | <TEST_FILE_PATH_2> |
57
+ | E2E-NN | <SCENARIO_N_NAME> | golden | edge | [[<SPEC_NAME_N>]] | <TEST_FILE_PATH_N> |
58
+
59
+ ## Known gaps
60
+
61
+ - <GAP_1> — <REASON> — <TRACKING_REF>
62
+ - <GAP_N> — ...
@@ -0,0 +1,58 @@
1
+ ---
2
+ tracks:
3
+ - <RELEVANT_CODE_PATH_1>
4
+ - <RELEVANT_CODE_PATH_2>
5
+ last_reviewed: <DATE>
6
+ ---
7
+
8
+ # <FEATURE_NAME> — handbook
9
+
10
+ ## Overview
11
+
12
+ Describe in one paragraph what this feature / module *actually* does
13
+ in the code, as opposed to the spec, which describes *what we
14
+ want*. Explicitly mention the files or directories involved.
15
+
16
+ The `tracks:` frontmatter above lists the code files this
17
+ handbook depends on. The `frontmatter-tracks` linter and the
18
+ `drift-detector` skill rely on it to flag drifts.
19
+
20
+ ## How it works
21
+
22
+ Explain the internals, cross-linking to the code
23
+ files (`[<path/to/file.ext>](../../<path/to/file.ext>)`). Cover:
24
+
25
+ - The main entry point and its contract.
26
+ - The control or data flow through the modules listed
27
+ in `tracks:`.
28
+ - The data structures / entities handled.
29
+ - The implicit assumptions that are not visible in the spec.
30
+
31
+ ### <SUB_TOPIC_1>
32
+
33
+ <DESCRIPTION_1>
34
+
35
+ ### <SUB_TOPIC_2>
36
+
37
+ <DESCRIPTION_2>
38
+
39
+ ## How to use it
40
+
41
+ If the feature exposes an API (function, endpoint, CLI), give a
42
+ minimal invocation example. Mention the prerequisites (env
43
+ variables, initial state, dependencies).
44
+
45
+ ```
46
+ <USAGE_EXAMPLE>
47
+ ```
48
+
49
+ ## How to debug
50
+
51
+ List the typical failures and their diagnosis.
52
+
53
+ - **Symptom:** <SYMPTOM_1> — **Likely cause:** <CAUSE_1> —
54
+ **Fix:** <FIX_1>.
55
+ - **Symptom:** <SYMPTOM_2> — ...
56
+
57
+ Also mention: where to look at the logs, which flags to enable for
58
+ verbose output, which tests reproduce the bug fastest.
@@ -0,0 +1,50 @@
1
+ ---
2
+ tracks:
3
+ - <TEST_DIR_OR_FILE_1>
4
+ - <TEST_DIR_OR_FILE_2>
5
+ last_reviewed: <DATE>
6
+ ---
7
+
8
+ # Integration test plan
9
+
10
+ ## Scope
11
+
12
+ Define what is tested in integration **vs** unit **vs** e2e:
13
+
14
+ - **Unit**: isolated, no real I/O, next to the code (`*.test.<ext>`).
15
+ Not documented here.
16
+ - **Integration**: several modules assembled, real I/O against
17
+ local dependencies (ephemeral DB, service mocked at the network
18
+ level, temporary filesystem). This is the scope of this document.
19
+ - **E2E**: complete system against real or staging dependencies,
20
+ walking through a user journey. Documented in
21
+ [e2e-tests.md](./e2e-tests.md).
22
+
23
+ Specify here the boundaries specific to the current project.
24
+
25
+ ## Test stack
26
+
27
+ - **Runner:** <TEST_RUNNER>
28
+ - **Assertions:** <ASSERTION_LIB>
29
+ - **Fixtures:** <FIXTURE_STRATEGY>
30
+ - **Setup / teardown:** <SETUP_TEARDOWN>
31
+ - **Data:** <DATA_STRATEGY>
32
+
33
+ ## Covered scenarios
34
+
35
+ | ID | Scenario | Linked spec | Test file |
36
+ |-------|-------------------------------------|-------------------------|------------------------------------|
37
+ | IT-01 | <SCENARIO_1_NAME> | [[<SPEC_NAME_1>]] | <TEST_FILE_PATH_1> |
38
+ | IT-02 | <SCENARIO_2_NAME> | [[<SPEC_NAME_2>]] | <TEST_FILE_PATH_2> |
39
+ | IT-NN | <SCENARIO_N_NAME> | [[<SPEC_NAME_N>]] | <TEST_FILE_PATH_N> |
40
+
41
+ Each scenario must cross-link the spec it verifies (syntax
42
+ `[[spec-name]]`) — the `cross-link` linter uses it.
43
+
44
+ ## Known gaps
45
+
46
+ Explicitly list the areas not covered in integration, with a
47
+ risk estimate and a pointer to the tracking ticket, if any.
48
+
49
+ - <GAP_1> — risk <LOW | MEDIUM | HIGH> — <TRACKING_REF>
50
+ - <GAP_N> — ...
@@ -0,0 +1,51 @@
1
+ # <PROJECT_NAME>
2
+
3
+ > <ONE_LINE_PITCH>
4
+
5
+ ## What is this
6
+
7
+ <ONE_PARAGRAPH_DESCRIPTION>
8
+
9
+ Describe in one paragraph what the project does, who it is for, and
10
+ what its value proposition is. Stay factual; no marketing.
11
+
12
+ ## Quick start
13
+
14
+ ### Install
15
+
16
+ ```
17
+ <INSTALL_COMMAND>
18
+ ```
19
+
20
+ ### Run
21
+
22
+ ```
23
+ <RUN_COMMAND>
24
+ ```
25
+
26
+ <OPTIONAL_FIRST_USE_EXAMPLE>
27
+
28
+ ## Documentation
29
+
30
+ The project maintains six documentation pillars:
31
+
32
+ - [Spec](docs/spec/) — theoretical vision: what we want.
33
+ - [Decisions](docs/decisions/) — ADRs: what we decided and why.
34
+ - [Handbook](docs/handbook/) — implementation docs: how it actually
35
+ works.
36
+ - [Tests](docs/tests/) — test plans (integration + e2e).
37
+ - [Workflow](docs/workflow/coding-workflow.md) — CI, env variants, PR
38
+ process, branches, release.
39
+ - This README — entry point.
40
+
41
+ ## Contributing
42
+
43
+ <CONTRIBUTING_POINTER>
44
+
45
+ See [docs/workflow/coding-workflow.md](docs/workflow/coding-workflow.md)
46
+ for the commit conventions, the branch model, and the release
47
+ process.
48
+
49
+ ## License
50
+
51
+ <LICENSE_NAME> — see [LICENSE](./LICENSE).
@@ -0,0 +1,64 @@
1
+ # <SUBSYSTEM_NAME> — spec
2
+
3
+ > **Status:** <DRAFT | REVIEW | STABLE>
4
+ >
5
+ > <ONE_PARAGRAPH_FRAMING>
6
+ >
7
+ > Describe in a few lines what this subsystem covers, why
8
+ > it exists, and how it fits with the other pieces of the project.
9
+
10
+ ## 0. Vocabulary
11
+
12
+ List the <N> keywords this subsystem reasons about. Define
13
+ each one in one to three lines, without reference to any specific technology.
14
+
15
+ | Term | Definition |
16
+ |-----------------|---------------------------------------------------------------------|
17
+ | <TERM_1> | <DEFINITION_1> |
18
+ | <TERM_2> | <DEFINITION_2> |
19
+ | <TERM_N> | <DEFINITION_N> |
20
+
21
+ ## 1. Vision
22
+
23
+ Articulate in 3 to 7 points what this subsystem **must** be. Stay
24
+ abstract — this is the "what", not the "how".
25
+
26
+ 1. <VISION_POINT_1>
27
+ 2. <VISION_POINT_2>
28
+ 3. <VISION_POINT_N>
29
+
30
+ ## 2. Out of scope
31
+
32
+ Explicitly list what the subsystem does **not** do. This
33
+ section is as important as the vision: it closes doors.
34
+
35
+ - <NON_GOAL_1>
36
+ - <NON_GOAL_2>
37
+ - <NON_GOAL_N>
38
+
39
+ ## 3. Domain
40
+
41
+ ### 3.1 Entities
42
+
43
+ List the main entities and their relationships. Stay at the
44
+ conceptual level — no table schema, no function signature.
45
+
46
+ ### 3.2 Invariants
47
+
48
+ List the properties that must hold true at all times.
49
+
50
+ - <INVARIANT_1>
51
+ - <INVARIANT_N>
52
+
53
+ ## 4. <FREE_SECTION_TITLE>
54
+
55
+ Free sections for the rest of the spec: usage flows, conceptual
56
+ interface contracts, acceptance criteria, etc.
57
+
58
+ ## N. Open decisions
59
+
60
+ List the questions not yet settled, with a pointer to the ADR
61
+ that will close them once they are.
62
+
63
+ - <OPEN_QUESTION_1>
64
+ - <OPEN_QUESTION_N>
package/package.json CHANGED
@@ -1,6 +1,84 @@
1
1
  {
2
2
  "name": "@vaubaan/harness",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.3.2",
4
+ "description": "Project conventions as code for Claude Code, Codex and OpenCode — skills, agents, commands and linters",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "author": "Vaubaan",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/vaubaan/harness.git"
11
+ },
12
+ "homepage": "https://github.com/vaubaan/harness#readme",
13
+ "bugs": "https://github.com/vaubaan/harness/issues",
14
+ "publishConfig": {
15
+ "registry": "https://registry.npmjs.org/",
16
+ "access": "public"
17
+ },
18
+ "engines": {
19
+ "node": ">=20"
20
+ },
21
+ "bin": {
22
+ "vaubaan-harness": "dist/cli/index.js"
23
+ },
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/index.js"
28
+ },
29
+ "./render": {
30
+ "types": "./dist/render.d.ts",
31
+ "import": "./dist/render.js"
32
+ },
33
+ "./linters": {
34
+ "types": "./dist/linters/index.d.ts",
35
+ "import": "./dist/linters/index.js"
36
+ },
37
+ "./parser": {
38
+ "types": "./dist/parser/index.d.ts",
39
+ "import": "./dist/parser/index.js"
40
+ },
41
+ "./init": {
42
+ "types": "./dist/init.d.ts",
43
+ "import": "./dist/init.js"
44
+ }
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "README.md",
49
+ "LICENSE",
50
+ "NOTICE"
51
+ ],
52
+ "scripts": {
53
+ "build": "tsup && node scripts/copy-content.mjs",
54
+ "dev": "tsup --watch",
55
+ "typecheck": "tsc --noEmit",
56
+ "lint": "biome check .",
57
+ "lint:fix": "biome check --write .",
58
+ "format": "biome format --write .",
59
+ "test": "vitest run",
60
+ "test:watch": "vitest",
61
+ "test:coverage": "vitest run --coverage",
62
+ "lint:harness": "node dist/cli/index.js lint --cwd .",
63
+ "ci": "npm run typecheck && npm run lint && npm run test && npm run build && npm run lint:harness",
64
+ "prepare": "husky"
65
+ },
66
+ "dependencies": {
67
+ "commander": "^12.1.0",
68
+ "cosmiconfig": "^9.0.2",
69
+ "fast-glob": "^3.3.2",
70
+ "gray-matter": "^4.0.3",
71
+ "yaml": "^2.5.1",
72
+ "zod": "^3.23.8"
73
+ },
74
+ "devDependencies": {
75
+ "@biomejs/biome": "^1.9.4",
76
+ "@types/node": "^22.7.5",
77
+ "@vitest/coverage-v8": "^2.1.2",
78
+ "execa": "^9.4.0",
79
+ "husky": "^9.1.7",
80
+ "tsup": "^8.3.0",
81
+ "typescript": "^5.6.3",
82
+ "vitest": "^2.1.2"
83
+ }
84
+ }