From Project Harness
Detects repo languages, frameworks, task runners, distribution shape, and CI surface, then scaffolds or updates a repo-level harness: justfile, GitHub Actions CI/dist workflows, .gitignore/.gitattributes support files, and local state under .local/harness/. Use when the task involves: (1) Bootstrapping a new or existing repo with a standardized command surface, (2) Creating or updating a justfile with build, test, lint, fmt, ci, dev, or dist recipes, (3) Scaffolding GitHub Actions CI or distribution workflows, (4) Configuring .gitignore, .gitattributes, or Git LFS for a project, (5) Standardizing or updating a project command surface without rewriting build system internals, or (6) Any task requiring repo-level harness scaffolding or project command surface management.
How this skill is triggered — by the user, by Claude, or both
Slash command
/project-harness:project-harnessThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill creates or updates a repo-wide command harness without trying to
assets/gitattributes-baseline.tplassets/just-committed-dist.just.tplassets/just-cross-os-dist.just.tplassets/just-general.just.tplassets/just-local-dist.just.tplassets/just-no-example.just.tplassets/workflow-ci-direct-component-paths.yml.tplassets/workflow-ci-direct-split.yml.tplassets/workflow-ci-direct.yml.tplassets/workflow-ci-just.yml.tplassets/workflow-release-assets-cross-os.yml.tplassets/workflow-release-cross-os.yml.tplreferences/ci-workflows.mdreferences/detection.mdreferences/distribution-strategies.mdreferences/docker-workspaces.mdreferences/existing-files.mdreferences/extrapolation-protocol.mdreferences/generic-harnesses.mdreferences/language-compiled.mdThis skill creates or updates a repo-wide command harness without trying to rewrite the repo's package manifests, lockfiles, or build internals.
It is meant to answer questions like:
dist/ stay local, be committed, be tracked with Git LFS, or come only from CI?just ci, mirror commands directly, or stay off until the repo is better defined?lint, test, and build jobs?This skill owns the repo-level wrapper surface:
justfile.github/workflows/ci.yml.github/workflows/release-cross-os.ymlgithooks/pre-push when the selected architecture uses committed dist outputs.gitignore additions related to .local/ and dist/.gitattributes managed section with broad text/EOL and binary defaults, plus dist/** Git LFS tracking when selected.local/harness/state.json.local/harness/render/* candidate filesThis skill does not rewrite:
Cargo.tomlpackage.jsonpyproject.tomlpom.xmlgo.modThis skill also does not own governance enforcement such as required checks,
CODEOWNERS reconciliation, or branch/ruleset policy. Keep those in a governance
tooling surface such as gitops-workflow.
Repo-owned Git hooks are a local convenience overlay, not the authoritative enforcement surface. Keep CI and branch governance authoritative even when this skill emits githooks/pre-push and a hooks-install recipe.
The generated justfile is a user interface, not just a dump of commands.
WHEN this skill generates a public recipe THEN you SHALL place a one-line description comment directly above it. WHEN the recipe is scoped to a component, platform, or distribution surface THEN you SHALL name that scope in the description. WHEN the repo has non-obvious operational surfaces such as packaging, dist refresh, hooks, or Docker workflows THEN you SHOULD add a short header comment block with two or three example invocations. You SHALL NOT rely on bare labels such as "Run linters" or "Build the project" when the repo surface is specific enough to describe more precisely.
Preferred description style:
just --listGood examples:
# Install dependencies, tooling, and local prerequisites for normal development# Compile only crates/mpcr in the default build profile# Compile release outputs and stage them into dist/ for local packaging# Remove staged dist payloads without touching source filesWeak examples:
# Run linters# Build the project# Cleanpython <skills-file-root>/scripts/project_harness.py detect /path/to/repo --pretty
general, local-dist, committed-dist, or cross-os-distnone, git, git-lfs, or artifactsnone, just, or direct--ci-layout split as an opt-in contributor-scale overlaynone by default, with --change-detection git-diff as an opt-in build-lane overlay for split direct CIpython <skills-file-root>/scripts/project_harness.py render /path/to/repo --pretty
python <skills-file-root>/scripts/project_harness.py update /path/to/repo --pretty
update writes managed files by default. Use render when you want a dry preview.
python <skills-file-root>/scripts/project_harness.py bootstrap /path/to/repo
python <skills-file-root>/scripts/project_harness.py run /path/to/repo test
python <skills-file-root>/scripts/project_harness.py doctor /path/to/repo --pretty
Detect and mirror it first.
Examples:
just recipesbuild, release, and dist staging candidatesAlso generate recipe descriptions that explain what each recipe does, not just its canonical name.
Do not fail. Generate a minimal canonical harness with placeholder recipes and a comment block that explains what to replace.
Default behavior for no-example repos:
justfilenone unless setup is truly obviousgeneral unless the repo already shows binary/dist intent.local/harness/state.jsonLoad <skills-file-root>/references/generic-harnesses.md for the full no-example policy.
Load <skills-file-root>/references/extrapolation-protocol.md when you need the
full detect -> infer -> render -> stop protocol for partially explicit repos.
Use three separate questions.
general: command wrapper only, no dist sectionlocal-dist: stage artifacts into ignored dist/committed-dist: keep dist/ in git for clone-and-run workflowscross-os-dist: stage per-platform outputs into dist/<os>-<arch>/none: there is no committed dist story yetgit: keep dist/ in normal git historygit-lfs: keep dist/ committed but move payloads out of normal git blobsartifacts: prefer CI artifacts or release assets instead of committed outputsThe generated cross-OS workflow is an artifact-oriented overlay. For true
GitHub Release assets, start from
<skills-file-root>/assets/workflow-release-assets-cross-os.yml.tpl.
none: do not generate CI yetjust: CI installs toolchains plus just, runs just bootstrap, then just cidirect: CI installs toolchains, runs bootstrap steps directly, then explicit checks; contributor-heavy repos may opt into stable lint, test, and build jobsUse direct for monorepos, matrices, or polyglot repos.
Use just for smaller repos where just ci should stay the source of truth.
Use split direct CI only when a repo explicitly opts into it and stable per-job checks are more valuable than preserving a single ci check surface.
Keep change detection at none unless the repo has an expensive, distinct build lane worth gating. The generated git-diff overlay currently targets split direct CI only.
Keep path filters manual and explicit; do not infer them unless the repo truly has stable ownership boundaries.
Load <skills-file-root>/references/ci-workflows.md for workflow quality rules,
runner notes, contributor-scale guidance, governance handoff notes, and open-source versus private-repo tradeoffs.
When examples do not match the repo exactly:
none when the safety boundary is unclearManaged files are overwritten only when absent or already marked as managed.
Unmanaged targets are never force-merged blindly; candidate files are written
instead under .local/harness/render/.
.gitattributes is managed by section instead of by whole file.
WHEN this skill updates .gitattributes THEN you SHALL preserve human-authored rules outside the project-harness managed section.
WHEN .gitattributes already exists without a project-harness section THEN you SHALL insert the managed section after leading comments and blank lines so later repo-specific rules can override the baseline.
WHEN .gitattributes already contains a project-harness section THEN you SHALL replace only that section.
Load <skills-file-root>/references/existing-files.md before changing a repo
with an existing justfile, workflow set, or custom dist layout.
Load these only when relevant:
<skills-file-root>/references/detection.md<skills-file-root>/references/selection.md<skills-file-root>/references/distribution-strategies.md<skills-file-root>/references/generic-harnesses.md<skills-file-root>/references/extrapolation-protocol.md<skills-file-root>/references/scenarios.md<skills-file-root>/references/ci-workflows.md<skills-file-root>/references/existing-files.md<skills-file-root>/references/docker-workspaces.md<skills-file-root>/references/makefile-migration.md<skills-file-root>/references/state-and-recovery.md<skills-file-root>/references/language-rust.md<skills-file-root>/references/language-python.md<skills-file-root>/references/language-javascript.md<skills-file-root>/references/language-compiled.md<skills-file-root>/references/language-other.mdOperational templates:
<skills-file-root>/assets/just-general.just.tpl<skills-file-root>/assets/just-local-dist.just.tpl<skills-file-root>/assets/just-committed-dist.just.tpl<skills-file-root>/assets/just-cross-os-dist.just.tpl<skills-file-root>/assets/workflow-ci-just.yml.tpl<skills-file-root>/assets/workflow-ci-direct.yml.tpl<skills-file-root>/assets/workflow-ci-direct-split.yml.tpl<skills-file-root>/assets/workflow-release-cross-os.yml.tplGeneralized examples:
<skills-file-root>/assets/just-no-example.just.tpl<skills-file-root>/assets/workflow-ci-direct-component-paths.yml.tpl<skills-file-root>/assets/workflow-release-assets-cross-os.yml.tpl<skills-file-root>/assets/gitattributes-baseline.tpl<skills-file-root>/scripts/project_harness.py<skills-file-root>/scripts/validate_skill.py<skills-file-root>/scripts/selftest_project_harness.pypython <skills-file-root>/scripts/validate_skill.py <skills-file-root> --pretty
python <skills-file-root>/scripts/validate_skill.py <skills-file-root> --pretty --smoke
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub devguyrash/agent-tooling --plugin project-harness