{"id":50740305,"url":"https://github.com/dotoricode/tink-harness","last_synced_at":"2026-06-10T17:00:26.451Z","repository":{"id":359308503,"uuid":"1245390574","full_name":"dotoricode/tink-harness","owner":"dotoricode","description":"Self-growing harnesses for Claude Code.","archived":false,"fork":false,"pushed_at":"2026-06-07T12:27:27.000Z","size":19707,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T14:15:12.043Z","etag":null,"topics":["agent-harness","agentic-coding","ai-agents","automation","claude-code","cli","code-agents","developer-tools","hooks","llm","skills","workflow-automation"],"latest_commit_sha":null,"homepage":"https://github.com/dotoricode/tink-harness#readme","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dotoricode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-21T07:16:37.000Z","updated_at":"2026-06-07T12:27:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/dotoricode/tink-harness","commit_stats":null,"previous_names":["dotoricode/tink-harness"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dotoricode/tink-harness","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotoricode%2Ftink-harness","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotoricode%2Ftink-harness/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotoricode%2Ftink-harness/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotoricode%2Ftink-harness/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dotoricode","download_url":"https://codeload.github.com/dotoricode/tink-harness/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotoricode%2Ftink-harness/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34071660,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-harness","agentic-coding","ai-agents","automation","claude-code","cli","code-agents","developer-tools","hooks","llm","skills","workflow-automation"],"created_at":"2026-06-10T17:00:16.627Z","updated_at":"2026-06-10T17:00:26.438Z","avatar_url":"https://github.com/dotoricode.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/assets/hero.gif\" alt=\"Tink Hero Banner\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n\u003ch1\u003e\n  \u003cstrong\u003eTink\u003c/strong\u003e\n\u003c/h1\u003e\n\n\u003cp\u003eA small harness layer for Claude Code and Codex\u003c/p\u003e\n\n\u003cp\u003e\n  Tink helps Claude Code or Codex choose the right harness, keep run state visible, and improve the harness set as you work.\n\u003c/p\u003e\n\n\u003cp\u003e\n  \u003cem\u003eTink is \u003cstrong\u003eknit\u003c/strong\u003e in reverse: untying tangled workflows and knitting better ones back together. It also nods to Tinker Bell, the small helper at your side.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\n  \u003ca href=\"https://github.com/dotoricode/tink-harness/releases/tag/v1.9.1\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/dotoricode/tink-harness?label=release\u0026color=2ea44f\" alt=\"GitHub release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/tink-harness\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/tink-harness?label=npm\u0026color=cb3837\" alt=\"npm version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/dotoricode/tink-harness/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/dotoricode/tink-harness/ci.yml?branch=main\u0026label=ci\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/dotoricode/tink-harness/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/dotoricode/tink-harness\" alt=\"License\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/dotoricode/tink-harness/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/dotoricode/tink-harness?style=social\" alt=\"GitHub stars\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp\u003e\u003cstrong\u003eLatest package:\u003c/strong\u003e v1.9.1 - Adds harness health summaries with graph, timeline, scoring, lifecycle states, and a static local report. See \u003ca href=\"CHANGELOG.md\"\u003eCHANGELOG\u003c/a\u003e for release history.\u003c/p\u003e\n\n**English** · [한국어](README.ko.md) · [Changelog](CHANGELOG.md)\n\n---\n\n## Why I made this\n\nNew coding harnesses show up almost every day. Many of them are genuinely useful.\n\nAt first, I tried them one by one and kept the ones that fit me. But the more I mixed them, the more my environment got tangled. Resetting everything again and again was tiring, so I ended up falling back to a skill-based workflow that I could understand and control.\n\nThen I used Hermes Agent for a while. What stayed with me was the way it gets better through use: repeated work turns into reusable skills, mistakes become memory, and the system slowly adapts to the person using it.\n\nTink started from a simple question:\n\n\u003e Could Claude Code or Codex grow with me in the same way?\n\nNot by adding a big framework. Not by running more agents. Just by helping Claude or Codex choose the right harness for the current task, create one when nothing fits, and improve the set over time.\n\n## Install\n\nClaude Code plugin install:\n\n```text\n/plugin marketplace add dotoricode/tink-harness\n```\n\n```text\n/plugin install tink@tink-harness\n```\n\n```text\n/reload-plugins\n```\n\n```text\n/tink:setup\n```\n\nStandalone compatibility installer:\n\n```bash\nnpx tink-harness@latest install\n```\n\nStandalone installer auto-detects `LANG` (English fallback). Pass `--lang=en|ko|zh` to override.\n\nCodex skill install:\n\n```bash\nnpx tink-harness@latest install\n```\n\nDuring install, select `Codex` when asked which agent surface to install. You can select both `Claude Code` and `Codex` in the same run. Then open Codex and use `$tink:cast \u003ctask\u003e`.\n\nFor repo-local smoke testing, fix the target with `CODEX_HOME`:\n\n```bash\nset CODEX_HOME=%CD%/.codex\nnpx tink-harness@latest install --yes\n```\n\n## Update\n\nClaude Code plugin users:\n\n```text\n/plugin marketplace update tink-harness\n```\n\n```text\n/plugin update tink@tink-harness\n```\n\n```text\n/reload-plugins\n```\n\nIf update does not find the latest version, uninstall and install again:\n\n```text\n/plugin uninstall tink@tink-harness\n```\n\n```text\n/plugin install tink@tink-harness\n```\n\nTo update an existing standalone install (keeps user-modified files):\n\n```bash\nnpx tink-harness@latest update\n```\n\nFor Codex:\n\n```bash\nnpx tink-harness@latest update\n```\n\nDuring update, select the installed agent surface you want to refresh.\n\nIf `CODEX_HOME` is not set, Codex skills default to `%USERPROFILE%\\.codex` on Windows and `~/.codex` on macOS/Linux.\n\n### Advanced options\n\nInteractive install/update includes an **Advanced options** step. These options used to require CLI flags, but now they are visible in the wizard:\n\n- `Preview only (--dry-run)`: use this first when you want to see the exact files Tink would write, preserve, or remove. It does not change files.\n- `Overwrite user-modified files (--force)`: use this only when an install is broken and you want official templates to replace local edits. Normal updates keep user-modified files.\n- `Clean Codex picker (--clean-codex-picker)`: use this when you are switching a repo to Codex-only Tink and Codex shows duplicate `Source Command Tink ...` entries. It is not shown for mixed Claude Code + Codex installs.\n\nThe package already exposes a `tink-harness` binary. If your package manager has installed that binary on your `PATH`, you can run `tink-harness update`. If not, keep using `npx tink-harness@latest update`. A shorter direct-command path is tracked in the planned work docs so it can be verified across macOS and Windows before the README examples switch over.\n\nTo quickly verify the updated install, see `docs/update-verification-recipe.md` or `docs/update-verification-recipe.ko.md`.\n\nIf an update looks stale or incomplete, see `docs/update-troubleshooting.md` or `docs/update-troubleshooting.ko.md`.\n\n## Commands\n\nTink keeps the command surface small.\n\nTink is plugin-first in Claude Code. Commands are namespaced under `tink`, so the public surface stays `/tink:*` and avoids generic command conflicts. In Codex, Tink installs matching `$tink:*` skills for autocomplete: `$tink:cast`, `$tink:verify`, `$tink:list`, `$tink:frog`, `$tink:weave`, `$tink:setup`, and `$tink:update`. Legacy `$tink cast` style prompts still work, but `$tink:*` is the preferred spelling.\n\n### `/tink:cast` / `$tink:cast`\n\n**cast** means to place the first loops on the needle (코잡기, Cast on). In knitting, casting on is the very first step — it sets the foundation for everything that follows.\n\nIn Tink, `cast` is the main path. It reads the task, chooses or drafts the right harness, runs a quick internal sanity check, creates `.tink/current/` as the visible workbench, and starts the first safe step after approval.\n\nUse it when the task is more than a quick answer.\n\nFor bigger or fuzzier work, `cast` can expose more of the agent's thinking as files without adding new commands. Ambiguous ideas can start with `requirements-interview`, broad plans with `plan-consensus`, long runs with `goal-checkpoint`, and safe handoffs with `delegation-brief`. These are reusable harnesses selected by `/tink:cast` or `$tink:cast`, not separate CLI workflows.\n\n### `/tink:verify` / `$tink:verify`\n\n`verify` runs the checks promised in `.tink/current/contract.json`.\n\nTink now writes a small task contract for non-trivial runs: what kind of work this is, what must be true when it is done, what is forbidden, and which commands or manual checks prove it. `/tink:verify` uses that contract instead of relying on a vague \"looks done\" claim.\n\nUse it before release, publish, deploy, public PR, or any task where evidence matters.\n\n### `/tink:frog` / `$tink:frog`\n\n**frog** means to rip out stitches (풀시오, Frogging). In knitting, frogging unravels rows that went wrong — the name comes from the sound of pulling out yarn, \"rip it, rip it.\"\n\nIn Tink, `frog` looks for harnesses that are unused, overlapping, too broad, or no longer worth their context cost. It proposes cleanup, but does not delete without approval.\n\nUse it when the harness set starts to feel noisy.\n\n### `/tink:weave` / `$tink:weave`\n\n**weave** means to weave in the ends (실오라기 정리, Weave in). In knitting, weaving in secures the loose threads left after finishing, giving the work its final shape.\n\nIn Tink, `weave` improves an existing harness using real use, failures, and corrections. It should make the next run clearer, safer, or easier to verify.\n\nUse it when a harness is useful but slightly wrong.\n\n### Other commands\n\n- `/tink:setup` / `$tink:setup`: choose language, install scope, git tracking, and hook policy.\n- `/tink:list` / `$tink:list`: inspect available harnesses and recent usage signals.\n- `/tink:update` / `$tink:update`: detect install source and show the safe update command.\n\n## How it works\n\nTink uses files you can inspect:\n\n- `.tink/harnesses/`: reusable task harnesses\n- `.tink/rules/`: a small rule graph that chooses only relevant harnesses, checks, and opt-in guard candidates\n- `.tink/schemas/`: structured file schemas, including the current run contract\n- `.tink/current/`: the current run state\n- `.tink/runs/`: compact records from finished, blocked, canceled, or replaced runs\n- `.tink/maintenance/`: verification, friction, and weave signals that help repeated failures become approved improvements\n- `.tink/memory/`: approved mistakes, preferences, and lessons\n\nTink can also read those records into a harness health summary. The summary shows which harnesses were used, where checks failed or got blocked, which harnesses often appear together, and which ones may deserve a weave improvement, frog cleanup review, merge review, dormant archive review, or more observation. It also includes an explainable candidate score, lifecycle state, graph relationships, and recent run timeline. It only prepares suggestions. Tink does not edit, merge, archive, delete, save memory, or update rules without the same explicit approval gates as the rest of Tink.\n\nThe installed read-only helpers can generate that JSON summary and turn it into a local HTML report:\n\n```bash\nnode .tink/tools/generate-harness-lifecycle-summary.mjs\nnode .tink/tools/render-harness-health-report.mjs\n```\n\nThe report is a static dashboard-style page with a graph overview, recent run timeline, and one card per harness. It does not start a server, watch files, create a hidden cache, or add a public `tink index` command.\n\nWhen selected, current-run artifacts may also include `.tink/current/goals.json` for goal checkpoints or `.tink/current/delegation.md` for handoff packets. Tink prepares those briefs as visible state; it does not start workers, tmux panes, or worktrees unless a separate approved workflow does so.\n\nThe rule graph stays small on purpose. Tink loads matching mandatory rules first, retrieves only relevant optional rules by task facts or keywords, and records loaded rule ids by phase so the same guidance is not repeated in one run.\n\nDesign notes live in `docs/`. The compatibility baseline is `docs/compatibility-policy.md`: every new slice should consider Claude Code and Codex, plus macOS and Windows. Repo signal behavior is described in `docs/repo-signals.md` or `docs/repo-signals.ko.md`. The lightweight graph-rule adoption plan is `docs/graph-rule-adoption-plan.ko.md`. Harness health summaries are described in `docs/harness-lifecycle-signals.md` or `docs/harness-lifecycle-signals.ko.md`. External context safety is described in `docs/mcp-safe-profile.md` and `docs/external-context-policy.md`. To read or review `.tink/current/` state, start with `docs/work-state.md` or `docs/work-state.ko.md`. Update confidence is still documented in `docs/phase-5-update-confidence.md` or `docs/phase-5-update-confidence.ko.md`. Context efficiency docs live in `docs/context-budget-ledger.md`, `docs/context-budget-ledger.ko.md`, `docs/context-metrics-evaluator.md`, `docs/context-metrics-evaluator.ko.md`, `docs/context-run-history-rollup.md`, `docs/context-run-history-rollup.ko.md`, `docs/context-threshold-status.md`, `docs/context-threshold-status.ko.md`, `docs/context-run-record-policy.md`, and `docs/context-run-record-policy.ko.md`. The planned work-unit list is `docs/planned-work-units.md` or `docs/planned-work-units.ko.md`, with details in the verification evidence, memory decision, context change, and update diagnosis docs. The broader Korean idea audit and roadmap is `docs/tink-idea-implementation-plan.ko.md`.\n\nThe important rule is approval.\n\nTink may suggest a harness, a memory entry, a cleanup, or an improvement. Before each run is committed, Tink runs one quick sanity check and surfaces a proposal only when something important is at stake. Low-risk steps let you continue with recorded assumptions; irreversible or externally visible actions (publish, deploy, deletions, broad changes) require explicit approval. Saving anything reusable — a new harness, a memory entry, a `.claude/` workflow file — always needs its own separate approval; approving the current run does not authorize saves that future installs would inherit.\n\n## What Tink is not\n\nTink is not:\n\n- a coding agent\n- a workflow engine\n- a multi-agent runtime\n- a prompt library\n- a replacement for Claude Code or Codex\n\nIt is a small harness layer for Claude Code or Codex.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotoricode%2Ftink-harness","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdotoricode%2Ftink-harness","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotoricode%2Ftink-harness/lists"}