From ark-skills
Interactive setup wizard — converges a project onto the ark-skills v2 conventions (OKF knowledge bundle + GitHub-Issues task management + mattpocock issue machinery). Handles greenfield, migration, repair, and healthy states.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ark-skills:ark-onboardThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Interactive setup wizard that converges a project onto the ark-skills **v2 conventions layer**:
Interactive setup wizard that converges a project onto the ark-skills v2 conventions layer:
vault/ (in-bundle tooling under _meta/okf/, index.md declaring okf_version, relative-markdown links),docs/agents/ conventions + frozen legacy trackers), and/to-tickets, /triage) and the consultant's routing destinations (superpowers, gstack, OMC).This skill diagnoses via /ark-health and applies fixes. /ark-health is the source of truth for the invariant definitions — this skill executes the remediations.
Exempt from normal context-discovery — it must work when CLAUDE.md is missing, broken, or incomplete. It creates or repairs CLAUDE.md itself.
| Field | Format | Example |
|---|---|---|
| Project name | any string (header or table) | trading-signal-ai |
| Vault root | path to the OKF bundle, ending / | vault/ |
| Task Management | GitHub Issues via gh (see docs/agents/issue-tracker.md) | — |
Task-prefix / TaskNotes-counter fields are retired (TaskNotes is frozen; task tracking is GitHub Issues).
User runs /ark-onboard
|
v
[1] Check ecosystems (superpowers, gstack, mattpocock, OMC) via /ark-health checks 1–4
|
v
[2] Missing critical ecosystem? --> show install command, PAUSE for user
gstack repo on disk? --> gstack Setup (claude + codex) — see below
|
v
[3] Run state detection (references/state-detection.md)
|
v
[4] Route by state:
No Vault --> Greenfield path (OKF bundle init + conventions)
Non-OKF Vault --> Migration path (OKF-convert + conventions)
Partial --> Repair path (fix failing /ark-health checks)
Healthy --> Show scorecard --> surface upgrades
|
v
[5] Run full /ark-health diagnostic
|
v
[6] Show before/after scorecard + follow-up reminders
Run during Entry-Flow Step 2 when a gstack repo is present on disk. gstack installs per-host (setup --host <name>, one host per skill dir). This project's policy is claude + codex only — installing for gemini or cursor floods that agent's context window (~48% on a fresh session). The host list is deliberate policy, not a default to "improve" toward --host auto.
Guardrail (read before touching ~/.claude/skills/gstack): that directory is gstack's shared runtime root (bin/, browse/dist, gstack-upgrade, ETHOS.md, review/), referenced by 50+ skills. It is NOT a duplicate-platform copy — deleting it breaks every gstack skill. Never delete it; never run setup --host auto (that also targets kiro/droid/opencode).
This block is idempotent and self-repairing: it only runs setup for a host whose install is missing or partial. Confirm first — ask Run gstack setup now? Targets: claude, codex [Y/n] — then execute:
CLAUDE_ROOT="$HOME/.claude/skills/gstack"
CODEX_ROOT="$HOME/.codex/skills/gstack"
GSTACK_REPO=""
[ -d "$CLAUDE_ROOT" ] && GSTACK_REPO="$(cd "$CLAUDE_ROOT" 2>/dev/null && pwd -P || true)"
[ -x "$GSTACK_REPO/setup" ] || GSTACK_REPO="$HOME/.gstack/repos/gstack"
if [ ! -x "$GSTACK_REPO/setup" ]; then
echo "gstack repo not found — install gstack first, then re-run /ark-onboard."
else
if [ ! -x "$CLAUDE_ROOT/bin/gstack-config" ] || [ ! -f "$HOME/.claude/skills/_gstack-command/SKILL.md" ]; then
( cd "$GSTACK_REPO" && ./setup --host claude )
fi
if { command -v codex >/dev/null 2>&1 || [ -d "$HOME/.codex" ]; } && \
{ [ ! -x "$CODEX_ROOT/bin/gstack-config" ] || \
[ -z "$(find -L "$HOME/.codex/skills" -maxdepth 1 -name 'gstack-*' -type d -print -quit 2>/dev/null)" ]; }; then
( cd "$GSTACK_REPO" && ./setup --host codex )
fi
fi
# NEVER --host auto / gemini / cursor.
To remove an over-broad install picked up elsewhere: rm -rf ~/.cursor/skills/gstack ~/.gemini/skills/gstack. /ark-health Check 2-family flags both failure modes.
The greenfield, migration, and repair paths all reuse these three blocks.
Reference: the OKF v0.1 SPEC — https://github.com/GoogleCloudPlatform/knowledge-catalog/blob/main/okf/SPEC.md. OKF is deliberately domain-agnostic: the only hard requirement is a non-empty type: on every non-reserved .md; index.md and log.md are optional reserved files; concept files and subdirectories are arbitrary ("the directory structure is independent of the domain"). Seed the OKF-conformant core first, then add the Ark recommended layer (house style — convention, not OKF-required). The OKF tooling scripts are copied from the ark-skills plugin's own bundle (<plugin>/vault/) — that is tooling, not structure.
Core (OKF-conformant — always):
vault/_meta/okf/: okf_lint.py, okf_cli.py, convert_links.py, normalize_frontmatter.py; and vault/_meta/generate-index.py (from <plugin>/vault/).vault/index.md declaring okf_version: "0.1" in its frontmatter (the SPEC marks this optional; ark tooling + /ark-health Check 11 require it — stricter than spec, intentionally).vault/log.md (the in-bundle work-record mirror; see /vault).vault/_meta/githooks/pre-push + git config core.hooksPath).Ark recommended layer (convention, not OKF-required — default on; offer to skip for a minimal bundle):
vault/{_Templates,_Attachments}, vault/Research, vault/Compiled-Insights.vault/_Templates/ (Research, Compiled-Insight, Service, etc.) and write vault/_meta/vault-schema.md + vault/_meta/taxonomy.md.vault/00-Home.md (navigation MOC). These folders are the Ark house style and the write targets /vault expects (Research/, Compiled-Insights/, _Templates/); an OKF consumer does not require them.Finish (both tiers): python3 vault/_meta/generate-index.py then python3 vault/_meta/okf/okf_lint.py --quiet (must exit 0). The core alone is already conformant; adding the layer keeps it conformant.
Precondition: gh auth status OK and git remote -v points at the GitHub repo.
gh label create ... || gh label edit ...):
needs-triage, needs-info, ready-for-agent, ready-for-human, wontfixepic, story, taskP1, P2, P3consultant, conventions, vault, onboarding (adjust the component set per project)gh label create needs-triage -c "#e99695" -d "Maintainer needs to evaluate" 2>/dev/null || true
gh label create epic -c "#3e4b9e" -d "Parent issue with a task-list body" 2>/dev/null || true
gh label create P1 -c "#b60205" -d "Urgent — do first" 2>/dev/null || true
gh label create consultant -c "#c5def5" -d "ark-consult workflow consultant" 2>/dev/null || true
# …repeat for every label in the four families…
/setup-matt-pocock-skills on the repo (tracker = GitHub; map its 5 canonical triage roles onto the labels above; single-context domain docs). It writes docs/agents/{issue-tracker,triage-labels,domain}.md + an ## Agent skills CLAUDE.md block. Then merge the ark-specific proactive-behavior conventions into docs/agents/issue-tracker.md (the four behaviors, AI disclaimer, log.md dual-write rule).> **FROZEN <date>** — active tracking moved to GitHub Issues banner to the entry doc of vault/TaskNotes/ and vault/Session-Logs/ (no file moves; survivors re-filed as issues manually).Create CLAUDE.md if missing, or add the missing rows. The Project Configuration table:
## Project Configuration
| Topic | Location |
|-------|----------|
| **Obsidian Vault** | `vault/` |
| **Task Management** | GitHub Issues via `gh` CLI — see `docs/agents/issue-tracker.md` for the label families and `gh` crib |
Never add task-prefix / TaskNotes-counter rows (retired). The mattpocock setup (Block B step 2) adds the ## Agent skills block automatically.
CLAUDE.md also carries the ark-managed vault-awareness region: it tells agents to
consult the OKF vault before non-trivial work and to distill via /vault at session end.
It is a managed region owned by /ark-update (vault-awareness in target-profile.yaml),
so seed it by running the convergence once. First resolve $ARK_SKILLS_ROOT (the ark-skills
plugin root) exactly as /ark-update Step 1 does — prefer $CLAUDE_PLUGIN_DIR, else the
.claude-plugin/marketplace.json anchor in CWD, else the newest install under
~/.claude/plugins/cache. Then run the convergence (inserts the block marker-wrapped and
version-stamped from the target profile; idempotent, safe to re-run):
python3 "$ARK_SKILLS_ROOT/skills/ark-update/scripts/migrate.py" \
--project-root "$(pwd)" --skills-root "$ARK_SKILLS_ROOT"
If AGENTS.md exists, mirror the region into it: copy the whole
<!-- ark:begin id=vault-awareness … --> … <!-- ark:end id=vault-awareness --> block
(markers included) from the CLAUDE.md region you just seeded, and append it to AGENTS.md.
Do not create AGENTS.md if it is absent — the managed region converges CLAUDE.md only.
Install the gentle end-of-session reminder that suggests /vault (suggestion-only: it never
writes to the vault and never blocks the stop; it fires at most once per session).
Copy the hook into the project and make it executable:
mkdir -p .claude/hooks
cp "$ARK_SKILLS_ROOT/skills/ark-onboard/assets/ark-vault-reminder-hook.sh" \
.claude/hooks/ark-vault-reminder-hook.sh
chmod +x .claude/hooks/ark-vault-reminder-hook.sh
Register it under hooks.Stop in .claude/settings.json, merging into any existing
Stop array — never clobber hooks already present:
{
"hooks": {
"Stop": [
{ "hooks": [ { "type": "command", "command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/ark-vault-reminder-hook.sh\"" } ] }
]
}
}
If settings.json or its hooks.Stop array is missing, create it; if a Stop array already
exists, append this entry to it (do not overwrite sibling hooks).
Confirm the vault path, then run Block A (OKF init) → Block B (GitHub Issues) → Block C (CLAUDE.md). Then:
python3 -c "import sys;sys.exit(sys.version_info<(3,10))").references/externalize-vault-plan.md. Optional; skip for a simple embedded vault.git init (if needed) + initial commit of the bundle skeleton + CLAUDE.md + docs/agents/./ark-health diagnostic and show the scorecard.An existing vault that is not yet an OKF bundle.
_meta/okf tooling → survey → normalize_frontmatter.py --apply → convert_links.py --apply (wikilinks → relative markdown) → hand-write missing description: values → generate-index.py → okf_lint.py to 0 errors. Add okf_version: "0.1" to index.md.Session-Logs/ and TaskNotes/ trees with banners./ark-health scorecard./ark-health diagnostic.okf_lint.py --quiet.okf_version → add it to index.md.docs/agents/ → re-run /setup-matt-pocock-skills (Block B step 2).references/centralized-vault-repair.md./ark-health; show before/after scorecard.Run /ark-health, show the scorecard, and surface upgrade opportunities (NotebookLM recall if not configured).
/ark-health owns the check definitions; /ark-onboard owns the fixes. If they drift, /ark-health wins.TaskNotes//Session-Logs/ get banners; their content is re-filed as GitHub issues manually, never by a script.okf_cli.py (navigation); task tracking is GitHub Issues./ark-update.npx claudepluginhub helloworldsungin/ark-skills --plugin ark-skillsCreates, edits, and verifies skills using a test-driven development approach with pressure scenarios and subagents.