General-purpose coding policy for Baruch's AI agents
74
93%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Medium
Suggest reviewing before use
Process steps in order. Do not skip ahead.
Convert a legacy tile.json plugin to the plugin.json form and reconcile the leftover terminology. The deterministic mechanics live in a script; the prose reconciliation in Step 2 is the judgment this skill owns.
Run the deterministic migration from the repo root:
CP=.tessl/plugins/jbaruch/coding-policy; [ -d "$CP" ] || CP="$HOME/$CP"; [ -d "$CP" ] || case "$(git config --get remote.origin.url)" in git@github.com:jbaruch/coding-policy|git@github.com:jbaruch/coding-policy.git|https://github.com/jbaruch/coding-policy|https://github.com/jbaruch/coding-policy.git|ssh://git@github.com/jbaruch/coding-policy|ssh://git@github.com/jbaruch/coding-policy.git) CP=. ;; *) echo "coding-policy plugin not found: run tessl install jbaruch/coding-policy" >&2; exit 1 ;; esac
bash "$CP/skills/migrate-to-plugin/migrate.sh" .The script detects the manifest state, runs tessl plugin migrate, renames .tileignore → .tesslignore, removes the obsolete tile.json, runs tessl plugin lint, and emits a JSON report with a residual_files list. Contract — inputs, output shape, exit codes — is in the script's top-of-file docstring.
A non-zero exit with no JSON on stdout (exit 2) is a tool or precondition failure — jq/tessl missing, the path is not a directory, tessl plugin migrate produced no manifest, or the residual-file scan could not read the tree. Surface the script's stderr diagnostic and stop; do not proceed.
Otherwise parse stdout and branch on the emitted status:
not-a-plugin (exit 0) — no tile.json or plugin.json here. Report that this is not a tessl plugin directory and finish here.already-migrated (exit 0) — plugin.json already exists, nothing to convert. If residual_tile_refs is 0, finish here; otherwise proceed to Step 2 to reconcile the leftover wording.migrated with lint_ok: false (exit 1) — migration ran but tessl plugin lint failed. Report the lint failure, run tessl plugin lint directly to read it, fix the manifest, then proceed to Step 2.migrated with lint_ok: true (exit 0) — proceed immediately to Step 2.Read each path in the script's residual_files. For every "tile"/"tiles" occurrence, decide rename-vs-keep — the script counts the pattern but makes no judgment.
Rename to plugin wording:
tessl tile <cmd> → tessl plugin <cmd> (the canonical alias)Keep "tile" unchanged — these are live contracts, not prose:
tile.json filename in historical or legacy-format referencesv1/tiles/... REST API routes and any argument bound to that routeIf residual_files is empty, proceed silently to Step 3.
Apply surface sync per rules/context-artifacts.md for any prose touched in Step 2:
README.md rules/skills tables if their wording changedCHANGELOG.md entry describing the migration, matching the repo's release model per rules/context-artifacts.md CHANGELOG HygieneIf Step 2 changed no surfaces, proceed silently. Proceed immediately to Step 4.
Re-run tessl plugin lint and confirm it passes. Report the final state: manifest migrated, .tesslignore renamed, tile.json removed, and the files whose wording was reconciled. Finish here.
.tessl-plugin
hooks
rules
skills
adopt-fork-pr
herdr-foreman
classify
foreman
references
specialists
templates
tests
herdr-standup
migrate-to-plugin
onboard-repo
release
references
tests