harnessed 4.3.0 → 4.5.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/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  // package.json
2
2
  var package_default = {
3
- version: "4.3.0"};
3
+ version: "4.5.0"};
4
4
 
5
5
  // src/index.ts
6
6
  var VERSION = package_default.version;
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/index.ts"],"names":[],"mappings":";AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OAgGb,CAAA;;;AC7FO,IAAM,UAAU,eAAA,CAAI","file":"index.mjs","sourcesContent":["{\n \"name\": \"harnessed\",\n \"version\": \"4.3.0\",\n \"description\": \"AI coding harness package manager + composition orchestrator\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"author\": \"easyinplay\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/easyinplay/harnessed.git\"\n },\n \"homepage\": \"https://github.com/easyinplay/harnessed#readme\",\n \"bugs\": \"https://github.com/easyinplay/harnessed/issues\",\n \"keywords\": [\n \"claude-code\",\n \"ai-harness\",\n \"package-manager\",\n \"composition\",\n \"skill-pack\",\n \"mcp\",\n \"orchestrator\"\n ],\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"packageManager\": \"pnpm@10.12.0\",\n \"bin\": {\n \"harnessed\": \"./dist/cli.mjs\"\n },\n \"main\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./schemas\": {\n \"types\": \"./dist/schemas/index.d.ts\",\n \"import\": \"./dist/schemas/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"manifests\",\n \"messages\",\n \"workflows\",\n \"routing\",\n \"config-templates\",\n \"schemas\",\n \"README.md\",\n \"LICENSE\",\n \"NOTICE\",\n \"THIRD-PARTY-NOTICES.md\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsc --noEmit && tsup\",\n \"build:schema\": \"node ./scripts/build-schema.mjs\",\n \"validate:schema\": \"node ./scripts/validate-schema.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run --passWithNoTests\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage --passWithNoTests\",\n \"bench\": \"vitest bench --run\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"format\": \"biome format --write .\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.3.142\",\n \"@clack/prompts\": \"^0.10.1\",\n \"@sinclair/typebox\": \"^0.34.49\",\n \"ajv\": \"^8.20.0\",\n \"ajv-errors\": \"^3.0.0\",\n \"ajv-formats\": \"^3.0.1\",\n \"commander\": \"^13.0.0\",\n \"diff\": \"^9.0.0\",\n \"expr-eval\": \"^2.0.2\",\n \"picocolors\": \"^1.1.1\",\n \"proper-lockfile\": \"^4.1.2\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.0.0\",\n \"@types/node\": \"^22.10.0\",\n \"@types/proper-lockfile\": \"^4.1.4\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.0.0\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"esbuild\"\n ]\n }\n}\n","// Main library entry — re-exports public APIs.\n// phase 1.1 batch 1: skeleton only; schema validator wired in batch 2 (T3+).\n\nimport pkg from '../package.json' with { type: 'json' }\n\nexport const VERSION = pkg.version\n"]}
1
+ {"version":3,"sources":["../package.json","../src/index.ts"],"names":[],"mappings":";AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OAkGb,CAAA;;;AC/FO,IAAM,UAAU,eAAA,CAAI","file":"index.mjs","sourcesContent":["{\n \"name\": \"harnessed\",\n \"version\": \"4.5.0\",\n \"description\": \"AI coding harness package manager + composition orchestrator\",\n \"type\": \"module\",\n \"license\": \"Apache-2.0\",\n \"author\": \"easyinplay\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/easyinplay/harnessed.git\"\n },\n \"homepage\": \"https://github.com/easyinplay/harnessed#readme\",\n \"bugs\": \"https://github.com/easyinplay/harnessed/issues\",\n \"keywords\": [\n \"claude-code\",\n \"ai-harness\",\n \"package-manager\",\n \"composition\",\n \"skill-pack\",\n \"mcp\",\n \"orchestrator\"\n ],\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"packageManager\": \"pnpm@10.12.0\",\n \"bin\": {\n \"harnessed\": \"./dist/cli.mjs\",\n \"harnessed-inject-state\": \"./bin/harnessed-inject-state.mjs\"\n },\n \"main\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.mjs\"\n },\n \"./schemas\": {\n \"types\": \"./dist/schemas/index.d.ts\",\n \"import\": \"./dist/schemas/index.mjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"manifests\",\n \"messages\",\n \"workflows\",\n \"routing\",\n \"config-templates\",\n \"schemas\",\n \"README.md\",\n \"LICENSE\",\n \"NOTICE\",\n \"THIRD-PARTY-NOTICES.md\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsc --noEmit && tsup\",\n \"build:schema\": \"node ./scripts/build-schema.mjs\",\n \"validate:schema\": \"node ./scripts/validate-schema.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run --passWithNoTests\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage --passWithNoTests\",\n \"bench\": \"vitest bench --run\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"format\": \"biome format --write .\"\n },\n \"dependencies\": {\n \"@anthropic-ai/claude-agent-sdk\": \"0.3.142\",\n \"@clack/prompts\": \"^0.10.1\",\n \"@sinclair/typebox\": \"^0.34.49\",\n \"ajv\": \"^8.20.0\",\n \"ajv-errors\": \"^3.0.0\",\n \"ajv-formats\": \"^3.0.1\",\n \"commander\": \"^13.0.0\",\n \"diff\": \"^9.0.0\",\n \"expr-eval\": \"^2.0.2\",\n \"picocolors\": \"^1.1.1\",\n \"proper-lockfile\": \"^4.1.2\",\n \"yaml\": \"^2.9.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.0.0\",\n \"@types/node\": \"^22.10.0\",\n \"@types/proper-lockfile\": \"^4.1.4\",\n \"@vitest/coverage-v8\": \"^4.0.0\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.6.0\",\n \"vitest\": \"^4.0.0\"\n },\n \"pnpm\": {\n \"onlyBuiltDependencies\": [\n \"esbuild\"\n ]\n }\n}\n","// Main library entry — re-exports public APIs.\n// phase 1.1 batch 1: skeleton only; schema validator wired in batch 2 (T3+).\n\nimport pkg from '../package.json' with { type: 'json' }\n\nexport const VERSION = pkg.version\n"]}
@@ -0,0 +1,46 @@
1
+ # yaml-language-server: $schema=../../schemas/manifest.v1.schema.json
2
+ # OPT-IN catalog manifest — lives in manifests/optional/ so `install-base` (which
3
+ # globs only manifests/tools + manifests/skill-packs) never pulls it into the base
4
+ # profile, and `harnessed install <name>` (tools + skill-packs only) never installs
5
+ # it. CodeGraph ships its own installer; harnessed catalogs + detects only.
6
+ apiVersion: harnessed/v1
7
+ kind: Manifest
8
+ metadata:
9
+ name: codegraph
10
+ display_name: CodeGraph
11
+ description: Pre-indexed code knowledge graph (semantic index) for Claude Code — fewer tokens/tool-calls. Opt-in, self-installed.
12
+ upstream:
13
+ source: codegraph
14
+ homepage: https://colbymchenry.github.io/codegraph/
15
+ repository: https://github.com/colbymchenry/codegraph.git
16
+ license: MIT
17
+ notice: |
18
+ CodeGraph by colbymchenry (MIT, 100% local). Optional semantic code index —
19
+ harnessed catalogs + detects only; CodeGraph self-installs via its own CLI
20
+ (`codegraph install` wires its MCP server into Claude Code). Not vendored.
21
+ spec:
22
+ type: cli-npm
23
+ component_type: cli-binary
24
+ category: search
25
+ install_type: npm
26
+ install:
27
+ method: npm-cli
28
+ cmd: "npm i -g @colbymchenry/codegraph && codegraph install --yes"
29
+ npm_version: ^1.0.0
30
+ idempotent_check: "command -v codegraph"
31
+ verify:
32
+ cmd: "codegraph status"
33
+ timeout_ms: 10000
34
+ expected_exit_code: 0
35
+ uninstall:
36
+ cmd: "codegraph uninstall --yes"
37
+ upstream_health:
38
+ stability: stable
39
+ last_check: "2026-06-13"
40
+ last_known_good_version: "1.0.0"
41
+ fallback_action: warn
42
+ signed_by: easyinplay
43
+ platforms:
44
+ - linux
45
+ - darwin
46
+ - win32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "harnessed",
3
- "version": "4.3.0",
3
+ "version": "4.5.0",
4
4
  "description": "AI coding harness package manager + composition orchestrator",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -25,7 +25,8 @@
25
25
  },
26
26
  "packageManager": "pnpm@10.12.0",
27
27
  "bin": {
28
- "harnessed": "./dist/cli.mjs"
28
+ "harnessed": "./dist/cli.mjs",
29
+ "harnessed-inject-state": "./bin/harnessed-inject-state.mjs"
29
30
  },
30
31
  "main": "./dist/index.mjs",
31
32
  "types": "./dist/index.d.ts",
@@ -43,6 +44,7 @@
43
44
  },
44
45
  "files": [
45
46
  "dist",
47
+ "bin",
46
48
  "manifests",
47
49
  "messages",
48
50
  "workflows",
@@ -243,6 +243,15 @@ capabilities:
243
243
  fires_when:
244
244
  - subtask.needs_library_docs == true
245
245
 
246
+ codegraph:
247
+ impl: mcp
248
+ cmd: codegraph_explore
249
+ since: v7.0
250
+ category: tool-mcp
251
+ description: 语义代码索引 (symbol/call-graph query; opt-in self-installed, fewer tool-calls)
252
+ fires_when:
253
+ - subtask.type in ['code_navigation', 'symbol_lookup', 'call_graph']
254
+
246
255
  tavily-mcp:
247
256
  impl: mcp
248
257
  cmd: tavily_search
@@ -574,6 +583,14 @@ capabilities:
574
583
  description: cc-handoff Ideation→Onboarding + Plan→Execute + file-ownership-strict 跨 CC instance 协议
575
584
  discipline_ref: workflows/disciplines/protocols.yaml
576
585
 
586
+ doc-discipline:
587
+ impl: harnessed-bundled
588
+ cmd: '<not-applicable-behavioral>'
589
+ since: v6.0
590
+ category: behavioral
591
+ description: STATE digest <100L halt + one-fact-per-file + overview-pointer-no-inline-narrative + transient-archive + status-from-artifacts + responsibility-one-home (6 rules)
592
+ discipline_ref: workflows/disciplines/doc-discipline.yaml
593
+
577
594
  # ============================================================================
578
595
  # Bucket 7 — gstack 33 optional registry-only (D-12 NEW v3)
579
596
  # ============================================================================
@@ -806,6 +823,15 @@ capabilities:
806
823
  fires_when:
807
824
  - phase.stage == 'verify' AND phase.is_release_candidate == true
808
825
 
826
+ release-preflight:
827
+ impl: harnessed-bundled
828
+ cmd: harnessed release-preflight
829
+ since: v7.0
830
+ category: tool-cli
831
+ description: 只读发布就绪门 (CHANGELOG/version/git-clean/tag; PR ready != release ready)
832
+ fires_when:
833
+ - phase.stage == 'ship'
834
+
809
835
  setup-deploy:
810
836
  impl: gstack
811
837
  install_type: user-skill
@@ -0,0 +1,49 @@
1
+ # workflows/disciplines/doc-discipline.yaml
2
+ # 文档纪律 — bundled discipline (STATE digest line-limit + one-fact-per-file +
3
+ # overview-pointer-no-inline-narrative + transient-consume-then-archive +
4
+ # status-derived-from-artifacts + responsibility-matrix-one-home)
5
+ # Phase v6.0 T11.1 — 7th L0 Discipline Substrate per D-09
6
+ # Codifies CLAUDE.md 文档纪律 section (三层渐进式结构 + 反腐防膨胀铁律)
7
+
8
+ schema_version: harnessed.discipline.v1
9
+ discipline: doc
10
+ enforcement_layer: commit
11
+ auto_enforce: true
12
+
13
+ rules:
14
+ - id: state-digest-line-limit
15
+ description: STATE.md >100 lines triggers halt; override via `HARNESSED_ALLOW_LONG_STATE=1`
16
+ enforcement: halt
17
+ trigger: "phase.type == 'commit' AND changed_files contains '.planning/STATE.md'"
18
+ check_method: external-cmd
19
+ # No auto_fix_cmd — halt rules do not auto-fix; override is env-based in TS
20
+
21
+ - id: one-fact-per-file
22
+ description: Decision docs must be single-topic; duplicate fact spread across files violates one-fact-per-file
23
+ enforcement: warn
24
+ trigger: "phase.type == 'commit' AND changed_files matches '\\.planning/'"
25
+ check_method: heuristic
26
+
27
+ - id: overview-pointer-no-inline-narrative
28
+ description: ROADMAP/overview docs must not inline closing narrative (叙事进 SUMMARY, not ROADMAP)
29
+ enforcement: warn
30
+ trigger: "phase.type == 'commit' AND changed_files matches 'ROADMAP\\.md|STATE\\.md'"
31
+ check_method: heuristic
32
+
33
+ - id: transient-consume-then-archive
34
+ description: HANDOFF and other transient artifacts must be archived after consumption, not accumulated at .planning/ root
35
+ enforcement: warn
36
+ trigger: "phase.type == 'commit' AND changed_files matches 'HANDOFF'"
37
+ check_method: heuristic
38
+
39
+ - id: status-derived-from-artifacts
40
+ description: Phase status must derive from VERIFICATION artifacts + test results, not hand-maintained booleans in STATE/ROADMAP
41
+ enforcement: warn
42
+ trigger: "phase.type == 'commit' AND changed_files contains '.planning/STATE.md'"
43
+ check_method: heuristic
44
+
45
+ - id: responsibility-matrix-one-home
46
+ description: Each fact has exactly one home per responsibility matrix (decision→ADR, requirement→REQUIREMENTS, etc.); cross-file duplication is a violation
47
+ enforcement: info
48
+ trigger: "phase.type == 'commit' AND changed_files matches '\\.planning/'"
49
+ check_method: heuristic
@@ -92,6 +92,13 @@ triggers:
92
92
  invokes:
93
93
  - capability: code-simplifier
94
94
 
95
+ # Phase 21 NEW — Stage ⑤ Ship master → ship-preflight always (release-readiness gate)
96
+ ship-preflight-always:
97
+ description: /ship master → /ship-preflight 总 fire (read-only release-readiness gate)。
98
+ fires_when: "phase.stage == 'ship'"
99
+ invokes:
100
+ - capability: release-preflight
101
+
95
102
  # v3.2.0 NEW — /auto super-master Phase 0.5 understanding check gate
96
103
  auto-research-unclear:
97
104
  description: |
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: ship
3
+ description: |
4
+ Stage ⑤ Ship master orchestrator — the release stage after Verify. ship-preflight
5
+ 必跑串行 (release-readiness gate) → 委派 PR/deploy 给 gstack /ship → publish 留
6
+ publish.yml CI (tag push 触发)。schema_version: harnessed.workflow.v3 with delegates_to
7
+ (1 sub: preflight serial order 1) + disciplines_applied (6 default) + tools_available
8
+ (release-preflight + ship + planning-with-files)。Triggered by `/ship` (bare per ADR 0030)
9
+ or `harnessed ship` after `harnessed verify`. Deploy boundary = TAG-READY (no push/publish/tag).
10
+ trigger_phrases:
11
+ - "ship"
12
+ - "发布阶段"
13
+ - "stage 5 ship"
14
+ - "release stage"
15
+ - "send it"
16
+ ---
17
+
18
+ # ship master orchestrator (v3) — Stage ⑤
19
+
20
+ ## Overview
21
+
22
+ The 5th stage, after Verify. harnessed has the pieces (a release-preflight gate, gstack
23
+ `/ship`, `publish.yml` CI) — this master orchestrates them into one repeatable release path,
24
+ the way comet (archive), Trellis (finish-work), and Claude-Harness (`/harness-release`) each
25
+ close their loop.
26
+
27
+ | order/mode | sub | when fires |
28
+ | ---------- | --- | ---------- |
29
+ | 1 (serial) | `preflight` | always when stage=='ship' — read-only release-readiness gate |
30
+
31
+ After preflight passes, the master delegates PR + deploy to gstack `/ship` (composition —
32
+ harnessed does not reimplement it), and the actual `npm publish` + GitHub release happen in
33
+ `publish.yml` CI on tag push.
34
+
35
+ ## Process
36
+
37
+ 1. **preflight (always)** — run `harnessed release-preflight`. If any check fails (most often
38
+ an empty `## [Unreleased]`), STOP and document the release / clean the tree first.
39
+ 2. **PR / deploy (delegate)** — invoke gstack `/ship` for PR creation + pre-land review.
40
+ 3. **publish (CI)** — push the `v<version>` tag (with explicit user approval) → `publish.yml`
41
+ runs `npm publish` + creates the GitHub release.
42
+
43
+ ## Boundary (important)
44
+
45
+ This stage stops at **tag-ready**. It never pushes to the remote, never publishes to npm, and
46
+ never creates a git tag on its own. Those are CI + explicit-approval actions, by design —
47
+ "PR ready != release ready", and "release ready != already published".
@@ -0,0 +1,37 @@
1
+ # workflows/ship/auto/workflow.yaml — Phase 21 (v7.0 follow-on)
2
+ #
3
+ # Stage ⑤ Ship master orchestrator — the release stage after Verify. Closes the
4
+ # ship-stage gap vs comet (archive) / Trellis (finish-work) / Claude-Harness
5
+ # (/harness-release). Composition, not reimplementation:
6
+ # ship-preflight (serial, always) → delegate PR/deploy to gstack /ship → publish
7
+ # stays in publish.yml CI on tag push.
8
+ #
9
+ # Deploy boundary = TAG-READY. This stage never pushes, publishes, or creates a tag.
10
+ #
11
+ # Master invariant (WorkflowSchemaV3 + check-workflow-schema K9):
12
+ # - phases 缺省 (master only has delegates_to[])
13
+ # - serial mode 必带 explicit order
14
+ #
15
+ # Sister refs:
16
+ # - workflows/ship/preflight/workflow.yaml — the preflight sub
17
+ # - workflows/judgments/stage-routing.yaml — ship-preflight-always trigger
18
+ # - workflows/capabilities.yaml — release-preflight + ship (gstack) + planning-with-files
19
+
20
+ schema_version: harnessed.workflow.v3
21
+ workflow: ship
22
+ description: |
23
+ Stage ⑤ Ship master orchestrator — release stage after Verify. ship-preflight 必跑串行
24
+ (release-readiness gate) → 委派 PR/deploy 给 gstack /ship → publish 留 publish.yml CI
25
+ (tag push 触发)。Deploy 边界 = tag-ready;本 stage 不 push/publish/创建 tag。
26
+ Triggered by `/ship` (bare per ADR 0030 namespace policy) after `harnessed verify`.
27
+
28
+ disciplines_applied: [karpathy, output-style, language, operational, priority, protocols]
29
+ tools_available:
30
+ - release-preflight
31
+ - ship
32
+ - planning-with-files
33
+
34
+ delegates_to:
35
+ - sub: preflight
36
+ mode: serial
37
+ order: 1
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: ship-preflight
3
+ description: |
4
+ Stage ⑤.a Ship sub — release-preflight gate. Runs `harnessed release-preflight`
5
+ (read-only: CHANGELOG [Unreleased] non-empty + version + git-clean + tag-absent).
6
+ A failing gate blocks shipping. Nothing is pushed/published/tagged here.
7
+ trigger_phrases:
8
+ - "release preflight"
9
+ - "release ready"
10
+ - "ship preflight"
11
+ - "发布就绪检查"
12
+ ---
13
+
14
+ # ship-preflight (Stage ⑤.a)
15
+
16
+ ## Overview
17
+
18
+ The machine-checkable "PR ready != release ready" gate. Runs the harnessed-native
19
+ `harnessed release-preflight` command, which inspects (read-only) whether the repo is
20
+ ready to tag a release:
21
+
22
+ | check | passes when |
23
+ | ----- | ----------- |
24
+ | `changelog` | `## [Unreleased]` has entries (this release is documented) |
25
+ | `version` | `package.json` has a valid semver |
26
+ | `git-clean` | the working tree has no uncommitted changes |
27
+ | `tag-absent` | a `v<version>` tag does NOT already exist |
28
+
29
+ ## Process
30
+
31
+ 1. Run `harnessed release-preflight`.
32
+ 2. If any check fails, STOP — surface the `fix:` hints and do not proceed to PR/tag.
33
+ - Empty `[Unreleased]` is the most common failure: document the release first.
34
+ 3. If all pass, the repo is **tag-ready**. The ship master continues to PR/deploy.
35
+
36
+ ## Boundary
37
+
38
+ This gate is READ-ONLY. It never pushes, publishes, or creates a tag. The actual
39
+ `npm publish` + GitHub release happen in `publish.yml` CI when a `v<version>` tag is
40
+ pushed (with explicit user approval).
@@ -0,0 +1,29 @@
1
+ # workflows/ship/preflight/workflow.yaml — Phase 21 (v7.0 follow-on)
2
+ #
3
+ # Stage ⑤.a Ship sub-workflow — release-preflight gate ("PR ready != release ready").
4
+ # Read-only: checks CHANGELOG [Unreleased] / version / git-clean / tag-absence via
5
+ # `harnessed release-preflight`. Mutates nothing — publish stays in publish.yml CI.
6
+ #
7
+ # Sister refs:
8
+ # - workflows/judgments/stage-routing.yaml ship-preflight-always trigger
9
+ # - workflows/capabilities.yaml — release-preflight (harnessed-bundled CLI gate)
10
+ # - src/cli/lib/release-preflight.ts collectPreflight
11
+
12
+ schema_version: harnessed.workflow.v3
13
+ workflow: ship-preflight
14
+ description: |
15
+ Stage ⑤.a release-preflight gate — runs `harnessed release-preflight` (read-only:
16
+ CHANGELOG [Unreleased] non-empty + package.json version + git working tree clean +
17
+ v<version> tag absent). A failing gate BLOCKS shipping until the release is documented
18
+ and the tree is clean. Nothing is pushed, published, or tagged here.
19
+
20
+ disciplines_applied: [karpathy, output-style, language, operational, priority, protocols]
21
+ tools_available: [release-preflight]
22
+
23
+ phases:
24
+ - id: 01-release-preflight
25
+ name: release-preflight (read-only release-readiness gate; blocks on any failure)
26
+ upstream: harnessed
27
+ capability: '{{ capabilities.release-preflight.cmd }}'
28
+ model: haiku
29
+ max_iterations: 1