Skip to content

v0.33.0

Choose a tag to compare

@github-actions github-actions released this 28 Jun 07:22
· 404 commits to main since this release

[0.33.0] - 2026-06-28

Added — render guided to the end: preview + post-render git disposition (PLAN-render-finish-ux)

  • /harness-maker:make and /hm:make now guide the user past "files written" to a git
    decision. A new git_disposition module + harness-maker git-status / git-ignore-roots
    CLI subcommands own the testable mechanics (git-state detection + idempotent gitignore);
    the slash command owns the AskUserQuestion and the git commit — the CLI never commits
    (ADR-001).
  • The git decision is neutral (no recommended option) and inferred from live git state
    every run, never persisted
    , so re-renders never re-nag: a committed harness offers to stage
    only newly-rendered files; an ignored harness is silent (ADR-002/004). Detection spans all
    selected target roots
    (.claude/ + .cursor//.codex//.agents//AGENTS.md), minus churn.
  • Re-rendering over an existing .claude/ now shows a --dry-run preview (NEW/REPLACE/KEEP/
    MERGE) → confirm → apply
    ; a fresh install applies directly. No git worktree is used — backup
    • reconcile cover overwrite safety and keep non-git installs working (ADR-003).
  • Fresh-install structural-health is severity-aware: quiet when clean, loud only on P0/P1
    (ADR-005). git check-ignore is probed with check=False (it returns rc=1 when NOT ignored);
    git-ignore-roots fails loudly on a non-work-tree / unwritten .gitignore.
  • README (en/ko) + docs/HOW-IT-WORKS (en/ko) document the render pipeline + git decision (ADR-006).

Boundary tests (advisory)

Layer 1 of PLAN-test-fidelity-gap. Pure parser checks; advisory only.

Status: ✅ PASS

============================= test session starts ==============================
platform linux -- Python 3.12.13, pytest-9.0.3, pluggy-1.6.0
rootdir: /home/runner/work/harness-maker/harness-maker
configfile: pyproject.toml
plugins: respx-0.23.1, anyio-4.13.0, asyncio-1.3.0
asyncio: mode=Mode.STRICT, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function
collected 50 items

tests/integration/test_boundary_codex_toml.py ............               [ 24%]
tests/integration/test_boundary_cursor_mdc.py .......                    [ 38%]
tests/integration/test_boundary_harness_yaml.py ........                 [ 54%]
tests/integration/test_boundary_hooks_json.py .........                  [ 72%]
tests/integration/test_boundary_meta.py .......                          [ 86%]
tests/integration/test_boundary_settings_json.py .......                 [100%]

============================== 50 passed in 3.75s ==============================