{"id":50978312,"url":"https://github.com/wwwhynot3/skilt","last_synced_at":"2026-06-19T11:03:52.594Z","repository":{"id":361857521,"uuid":"1255929965","full_name":"wwwhynot3/skilt","owner":"wwwhynot3","description":"Profile-driven gstack skill switching for Codex, Claude Code, and OpenCode.","archived":false,"fork":false,"pushed_at":"2026-06-01T14:27:25.000Z","size":49,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-01T16:11:43.008Z","etag":null,"topics":["agent-tools","ai-tools","automation","bash","cli","developer-tools","gstack","productivity"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wwwhynot3.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-01T09:54:30.000Z","updated_at":"2026-06-01T14:39:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/wwwhynot3/skilt","commit_stats":null,"previous_names":["wwwhynot3/skilt"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/wwwhynot3/skilt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwwhynot3%2Fskilt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwwhynot3%2Fskilt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwwhynot3%2Fskilt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwwhynot3%2Fskilt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wwwhynot3","download_url":"https://codeload.github.com/wwwhynot3/skilt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wwwhynot3%2Fskilt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34528144,"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-19T02:00:06.005Z","response_time":61,"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-tools","ai-tools","automation","bash","cli","developer-tools","gstack","productivity"],"created_at":"2026-06-19T11:03:52.037Z","updated_at":"2026-06-19T11:03:52.589Z","avatar_url":"https://github.com/wwwhynot3.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# skilt\n\n[中文文档](./README.zh-CN.md)\n\n`skilt` is a small Bash CLI for toggling **gstack skill visibility** across multiple coding agents. Instead of editing the real gstack skill source, it moves each agent-visible entry between an enabled directory and a disabled directory. That makes profile switching fast, reversible, and safe.\n\nIt is designed for machines that run more than one coding agent, or for users who want different skill sets for different workflows such as backend development, GUI work, or release operations.\n\n## Introduction\n\nWhen every installed skill is always visible, agent capability lists grow, prompt context gets noisier, and workflow-specific tools become harder to manage. `skilt` solves that with a simple configuration model:\n\n- `skills.tsv` defines the global skill inventory.\n- `modules.tsv` groups skills by function.\n- `profiles.tsv` groups modules by role or project stage.\n- `agents.tsv` maps logical skills to concrete agent directories and naming styles.\n\nThis lets you say:\n\n- \"use my backend profile\"\n- \"turn off iOS skills for Codex only\"\n- \"preview a release profile without moving any files\"\n\n## Features\n\n- Multi-agent support for Codex, Claude Code, and OpenCode\n- Profile-driven skill switching\n- Module-level and single-skill toggles\n- Dry-run previews before any filesystem move\n- Config validation with install consistency checks\n- No mutation of gstack source skills\n\n## Install\n\n### Requirements\n\n- Bash\n- Standard Unix tools: `awk`, `grep`, `find`, `mv`, `sort`\n- A local gstack skill install, typically at `~/gstack/.agents/skills`\n\n### Clone and run\n\n```bash\ngit clone \u003cyour-repo-url\u003e skilt\ncd skilt\nchmod +x skilt\n./skilt status\n```\n\n### Install to custom directories\n\nIf you want a standalone installed command instead of running from the clone:\n\n```bash\n./scripts/install-skilt.sh --bin-dir ~/scripts --config-dir ~/.config/skilt\n~/scripts/skilt status\n```\n\nThis installs:\n\n- a wrapper at `\u003cbin-dir\u003e/skilt`\n- the real runtime at `\u003cconfig-dir\u003e/skilt/skilt`\n- the bundled config at `\u003cconfig-dir\u003e/skilt/gstack-skill-config`\n\nIf `--bin-dir` or `--config-dir` is omitted, the installer prompts for it.\n\n### Optional: add to PATH\n\n```bash\nmkdir -p ~/.local/bin\nln -sf \"$(pwd)/skilt\" ~/.local/bin/skilt\nskilt status\n```\n\n### Optional: custom config or skill roots\n\nIf your config directory or gstack install is not in the default location:\n\n```bash\nexport SKILT_CONFIG_DIR=/path/to/gstack-skill-config\nexport SKILT_GSTACK_SKILLS_DIR=/path/to/gstack/.agents/skills\n```\n\n## Uninstall\n\nIf you want all configured skills restored before removing the tool:\n\n```bash\n./skilt all-on\n```\n\nThen remove the binary link or repository clone:\n\n```bash\nrm -f ~/.local/bin/skilt\nrm -rf /path/to/skilt\n```\n\nIf you used the installer, remove both the wrapper and installed runtime:\n\n```bash\nrm -f /path/to/bin/skilt\nrm -rf /path/to/config-root/skilt\n```\n\n`skilt` does not uninstall or modify gstack itself.\n\n## Usage\n\n### Quick examples\n\n```bash\n./skilt status\n./skilt count\n./skilt diff\n./skilt use backend-indie -n\n./skilt use backend-indie\n./skilt off ios\n./skilt on design-html\n./skilt off design -a claude\n./skilt on web-qa -a codex\n./skilt doctor\n```\n\n### Commands\n\n| Command | What it does |\n| --- | --- |\n| `status [-a agent]` | Show enabled and disabled roots and counts |\n| `count [-a agent]` | Show configured totals and per-agent enabled/disabled totals |\n| `diff [-a agent]` | Compare config vs local install and print current enabled/disabled skill names |\n| `use \u003cprofile\u003e [-a agent] [-n]` | Apply a profile by enabling only its required skills |\n| `on \u003cmodule\\|skill\u003e [-a agent] [-n]` | Enable a module or a single skill |\n| `off \u003cmodule\\|skill\u003e [-a agent] [-n]` | Disable a module or a single skill |\n| `all-on [-a agent] [-n]` | Enable all configured skills |\n| `all-off [-a agent] [-n]` | Disable all configured skills |\n| `reset [-a agent] [-n]` | Alias for `all-on` |\n| `doctor` | Validate config structure and local install state |\n| `list agents\\|modules\\|profiles\\|skills` | Print configured entities |\n\n### Dry-run mode\n\nUse `-n` or `--dry-run` to preview moves:\n\n```bash\n./skilt use gui-stage -n\n./skilt off design -a codex -n\n```\n\nDry-run prints the planned `mv` operations and does not change the filesystem.\n\n### Target a single agent\n\n```bash\n./skilt use backend-indie -a codex\n./skilt off design -a claude\n./skilt on web-qa -a opencode\n```\n\n## Architecture\n\n### High-level flow\n\n```mermaid\nflowchart TD\n    A[gstack skill install] --\u003e B[skills.tsv]\n    B --\u003e C[modules.tsv]\n    C --\u003e D[profiles.tsv]\n    D --\u003e E[skilt command]\n    F[agents.tsv] --\u003e E\n    E --\u003e G[enabled root]\n    E --\u003e H[disabled root]\n```\n\n### Runtime model\n\n`skilt` treats the filesystem entry point as the control plane. A logical skill name is resolved from profile to module to skill, then mapped into an agent-specific entry name and moved between enabled and disabled roots.\n\n```mermaid\nflowchart LR\n    P[profile] --\u003e M[module]\n    M --\u003e S[skill]\n    S --\u003e N[agent naming rule]\n    N --\u003e E[enabled entry]\n    N --\u003e D[disabled entry]\n```\n\n### Real directory behavior\n\n```text\nCodex\n  ~/.codex/skills/gstack-investigate\n  \u003c-\u003e ~/.codex/skills.disabled/gstack/gstack-investigate\n\nClaude Code\n  ~/.claude/skills/investigate\n  \u003c-\u003e ~/.claude/skills.disabled/gstack/investigate\n\nOpenCode\n  ~/.config/opencode/skills/gstack-investigate\n  \u003c-\u003e ~/.config/opencode/skills.disabled/gstack/gstack-investigate\n```\n\n### Why this is safe\n\n- It moves only visible entry points.\n- It does not edit `SKILL.md` contents.\n- It does not rewrite gstack source directories.\n- It can preview changes before applying them.\n- It is easy to reverse with `all-on` or `reset`.\n\n## Configuration Model\n\nAll configuration lives in [`gstack-skill-config/`](./gstack-skill-config/).\n\n### `agents.tsv`\n\nDefines where each agent reads enabled skills from, where disabled skills are stored, and how logical names map to actual entries.\n\n```text\ncodex   ~/.codex/skills                    ~/.codex/skills.disabled/gstack             gstack-prefix\nclaude  ~/.claude/skills                   ~/.claude/skills.disabled/gstack            plain\nopencode ~/.config/opencode/skills         ~/.config/opencode/skills.disabled/gstack   gstack-prefix\n```\n\nEntry styles:\n\n- `gstack-prefix`: `investigate -\u003e gstack-investigate`\n- `plain`: `investigate -\u003e investigate`\n\n### `skills.tsv`\n\nDefines the full known skill inventory. This is the source of truth for bulk operations such as `all-on`, `all-off`, `count`, and `diff`.\n\n### `modules.tsv`\n\nMaps a functional module to one or more skills.\n\n```text\ndesign      design-html\ndesign      design-review\ncore-debug  investigate\n```\n\nEach skill also has an implicit self-module, so `./skilt on design-html` works even if `design-html` only appears under a broader module.\n\n### `profiles.tsv`\n\nMaps a role or stage profile to one or more modules.\n\n```text\nbackend-indie   core-debug\nbackend-indie   product\ngui-stage       design\nrelease-stage   deploy\n```\n\nApplying a profile enables the skills required by that profile and disables the rest of the configured inventory.\n\n## Repository Layout\n\n```text\n.\n├── skilt\n├── scripts/\n│   └── test-skilt.sh\n├── gstack-skill-config/\n│   ├── agents.tsv\n│   ├── skills.tsv\n│   ├── modules.tsv\n│   ├── profiles.tsv\n│   └── README.md\n├── gstack_introduce.md\n└── AGENTS.md\n```\n\n## Validation and Testing\n\n### Run the regression suite\n\n```bash\n./scripts/test-skilt.sh\n```\n\nThe test script builds isolated temporary fixtures and verifies:\n\n- profile application\n- module and skill toggles\n- dry-run behavior\n- full reset behavior\n- `doctor` warnings and failures\n- `count` and `diff` output shape\n\n### Run config checks\n\n```bash\n./skilt doctor\n```\n\n`doctor` checks:\n\n- duplicate skills in `skills.tsv`\n- unknown skill references in `modules.tsv`\n- unknown module references in `profiles.tsv`\n- installed skills missing from config\n- configured skills missing from local install\n- skills that only have an implicit self-module\n- enabled/disabled conflicts for the same agent entry\n\n## Typical Workflows\n\n### Backend-focused session\n\n```bash\n./skilt use backend-indie\n```\n\n### GUI-focused session\n\n```bash\n./skilt use gui-stage\n```\n\n### Release preparation\n\n```bash\n./skilt use release-stage -n\n./skilt doctor\n./skilt use release-stage\n```\n\n## Design Notes\n\nThis project is intentionally small. The main script:\n\n- parses config with `awk`\n- filters configured entities with `sort`, `grep`, and shell loops\n- expands agent-specific paths\n- resolves profile and module membership\n- moves entries with `mv`\n\nThat small surface area is deliberate. The tool is easy to audit, easy to test, and easy to adapt for new agents.\n\n## Related Files\n\n- Contributor guide: [`AGENTS.md`](./AGENTS.md)\n- Config usage notes: [`gstack-skill-config/README.md`](./gstack-skill-config/README.md)\n- Background notes: [`gstack_introduce.md`](./gstack_introduce.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwwwhynot3%2Fskilt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwwwhynot3%2Fskilt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwwwhynot3%2Fskilt/lists"}