[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BV1XYSNPJ9ABC3R3K0N74N":3,"skill-same:01M6BV1XYSNPJ9ABC3R3K0N74N":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":14,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":6,"updatedAt":35,"install":36,"resources":48},"01M6BV1XYSNPJ9ABC3R3K0N74N","setup-ts-deep-modules",null,"Wire dependency-cruiser into a TypeScript repo so each package is a deep module, with implementation hidden in subfolders and reachable only through its entry-point files. User-invoked.","pkking\u002Fdotfiles","pkking","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F2853724?v=4","01M6BTYGKF2NYA1TM9G1XSAE7N","li chaoran","01M6BTYGQW6GANXWW15H8SPDQ2",0,"MIT","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fsetup-ts-deep-modules\u002FSKILL.md",[],[19,20,21,22],"setup","setup ts deep modules","typescript","package","2026-11-10 10:12:30",false,"---\nname: setup-ts-deep-modules\ndescription: Wire dependency-cruiser into a TypeScript repo so each package is a deep module, with implementation hidden in subfolders and reachable only through its entry-point files. User-invoked.\ndisable-model-invocation: true\n---\n\n# Setup TS Deep Modules\n\nMake every package in this repo a **deep module**: a lot of behaviour behind a small interface. A package's public surface is its **entry points** (the files at the package root), and everything in its subfolders is hidden. This skill installs [dependency-cruiser](https:\u002F\u002Fgithub.com\u002Fsverweij\u002Fdependency-cruiser) and the rules that make the entry points the only way in, then proves the rules bite.\n\nFor the vocabulary (deep module, interface, seam, depth), call the Skill tool with \"codebase-design\" and use its language throughout.\n\n## The shape this enforces\n\n```\nsrc\u002Fpackages\u002F\n  \u003Cname>\u002F\n    index.ts        ← an entry point (public). Import this from outside.\n    client.ts       ← another entry point. Packages may expose SEVERAL.\n    lib\u002F            ← implementation: hidden from outside, free to import each other.\n    tests\u002F          ← co-located tests + fixtures (a subfolder, so private).\n```\n\nThe public surface is the package's **root files**, not one designated `index.ts`. By convention implementation lives in `lib\u002F` and tests in `tests\u002F`, giving every package the same two-folder shape. The rule itself is general, though: *anything* in *any* subfolder is private, so you never extend the config to add a folder.\n\nFour rules, all `error`:\n\n1. **Entry-point boundary**: code outside a package (app code or another package) may import only that package's entry points (its root files), never anything in its subfolders.\n2. **Intra-package freedom**: a package's own files import each other freely.\n3. **Tests through the entry points**: files under `\u003Cpkg>\u002Ftests\u002F` may import any package's entry points and their own `tests\u002F` fixtures, but never any package's subfolder internals (not even their own). Integration tests across packages are fine; deep imports are not.\n4. **No cycles**: no dependency cycles.\n\n**Entry points, not a barrel.** Because the public surface is *every* root file, a package can expose several small entry points (`index.ts`, `client.ts`, `server.ts`) instead of funnelling everything through one giant `index.ts`. Barrel files that re-export a whole subtree are discouraged; keep entry points small and hide implementation in subfolders.\n\nLayering (which packages may depend on which) is a *different* concern and is left as a commented stub in the config for this repo to fill in.\n\n## Steps\n\n### 1. Detect the environment\n\n- **Package manager**: `pnpm-lock.yaml` → pnpm, `yarn.lock` → yarn, `bun.lockb` → bun, else npm. Use it for every command below (`pnpm`\u002F`yarn`\u002F`npm run`\u002F`bunx`).\n- **Packages root**: if `src\u002F` exists use `src\u002Fpackages`, else `packages`. Confirm the choice with the user if the repo already has a different obvious convention.\n- **Existing config**: check for a `.dependency-cruiser.*` file. If one exists, do **not** overwrite it: merge the four rules and the options in, and tell the user what you added.\n\n**Done when:** package manager, packages root, and existing-config status are all known.\n\n### 2. Install dependency-cruiser\n\nInstall `dependency-cruiser` as a devDependency with the detected package manager.\n\n**Done when:** `dependency-cruiser` is in `devDependencies`.\n\n### 3. Write the config\n\nCopy [`dependency-cruiser.config.cjs`](.\u002Fdependency-cruiser.config.cjs) to the repo root as `.dependency-cruiser.cjs`. Set `PACKAGES_ROOT` to the root detected in step 1. The rules are path-depth based and extension-agnostic, so nothing else needs adapting.\n\n**Done when:** `.dependency-cruiser.cjs` exists with the correct `PACKAGES_ROOT`, and the four forbidden rules are present.\n\n### 4. Wire it into the checks\n\n- Add a `lint:boundaries` script: `depcruise \u003Cpackages-root>` (or `depcruise src`).\n- Fold it into the repo's umbrella check command, the one that already runs typecheck (e.g. a `check` \u002F `ci` \u002F `validate` script). Do **not** touch `tsconfig` or add path aliases.\n- If there is no umbrella script, add `lint:boundaries` and tell the user to include it in CI.\n\n**Done when:** `lint:boundaries` exists and runs as part of the same command as typecheck.\n\n### 5. Scaffold the example package\n\nCreate a committed `\u003Cpackages-root>\u002Fexample\u002F` as a copy-me template:\n\n- `index.ts` is an entry point. Export one function that delegates to an internal file (so the package is visibly *deep*, not a pass-through).\n- `lib\u002Fimpl.ts`: an internal file in a **subfolder**, imported by `index.ts`, not reachable from outside.\n- `tests\u002Fexample.test.ts` imports **only** `..\u002Findex` (an entry point) and asserts against the public function.\n\nTell the user this is a starter template to copy or delete.\n\n**Done when:** the example package exists, exposes its behaviour through a root entry point, and hides `impl` in a subfolder.\n\n### 6. Prove the rules bite\n\nThis is the completion criterion for the whole skill: a config that doesn't fail on a violation is worthless.\n\n1. Run `lint:boundaries`. It must **pass** on the clean example.\n2. Temporarily add a deep import to `tests\u002Fexample.test.ts` (e.g. `import { thing } from \"..\u002Flib\u002Fimpl\"`). Run `lint:boundaries` again; it must **fail** with `tests-through-entrypoints`.\n3. Revert the deep import. Run once more, and it must **pass**.\n\n**Done when:** you have observed a pass, then a fail on the deep import, then a pass again. If step 2 does not fail, the rules are not wired correctly, so fix before finishing.\n\n### 7. Document the convention\n\nWrite a `README.md` **in the packages folder** (`\u003Cpackages-root>\u002FREADME.md`, next to the packages it governs) covering: the `src\u002Fpackages\u002F\u003Cname>\u002F` layout (entry points at the root, `lib\u002F` for implementation, `tests\u002F` for tests), \"import only through a package's entry points (its root files)\", and how to run `lint:boundaries`. **Discourage barrel files** explicitly: expose several small entry points instead of re-exporting a whole subtree through one index. Keep it to the copy-me snippet plus the four rules in one paragraph each.\n\nThen add a **context pointer** to it from the repo's agent-instructions file (`CLAUDE.md` if present, else `AGENTS.md`, creating `AGENTS.md` if neither exists). One line is enough, e.g. `Packages are deep modules: see [src\u002Fpackages\u002FREADME.md](.\u002Fsrc\u002Fpackages\u002FREADME.md) before adding or importing one.` This is what makes an agent discover the boundary rule instead of tripping over it.\n\n**Done when:** `\u003Cpackages-root>\u002FREADME.md` exists and discourages barrels, and the repo's `CLAUDE.md`\u002F`AGENTS.md` links to it.\n\n## Notes\n\n- The config's `$1` back-references (dependency-cruiser's group matching) are what let a package reach its own internals while outsiders can't. Don't flatten them into separate per-package rules.\n- Public vs private is decided by **depth**: a package's root files are entry points; anything in a subfolder is private. The conventional subfolders are `lib\u002F` (implementation) and `tests\u002F`, but the rule doesn't hardcode them: any subfolder is private, so a new folder never needs a config change. Adding an entry point is just adding a root file (no barrel).\n- Packages are **flat**: one tier of immediate children under the root. A package's internals may nest as deep as you like; a package may not contain another package.\n- Use `.cjs` (not `.js`) so the config's `module.exports` works even in `\"type\": \"module\"` repos.\n","# Setup TS Deep Modules\n\nMake every package in this repo a **deep module**: a lot of behaviour behind a small interface. A package's public surface is its **entry points** (the files at the package root), and everything in its subfolders is hidden. This skill installs [dependency-cruiser](https:\u002F\u002Fgithub.com\u002Fsverweij\u002Fdependency-cruiser) and the rules that make the entry points the only way in, then proves the rules bite.\n\nFor the vocabulary (deep module, interface, seam, depth), call the Skill tool with \"codebase-design\" and use its language throughout.\n\n## The shape this enforces\n\n```\nsrc\u002Fpackages\u002F\n  \u003Cname>\u002F\n    index.ts        ← an entry point (public). Import this from outside.\n    client.ts       ← another entry point. Packages may expose SEVERAL.\n    lib\u002F            ← implementation: hidden from outside, free to import each other.\n    tests\u002F          ← co-located tests + fixtures (a subfolder, so private).\n```\n\nThe public surface is the package's **root files**, not one designated `index.ts`. By convention implementation lives in `lib\u002F` and tests in `tests\u002F`, giving every package the same two-folder shape. The rule itself is general, though: *anything* in *any* subfolder is private, so you never extend the config to add a folder.\n\nFour rules, all `error`:\n\n1. **Entry-point boundary**: code outside a package (app code or another package) may import only that package's entry points (its root files), never anything in its subfolders.\n2. **Intra-package freedom**: a package's own files import each other freely.\n3. **Tests through the entry points**: files under `\u003Cpkg>\u002Ftests\u002F` may import any package's entry points and their own `tests\u002F` fixtures, but never any package's subfolder internals (not even their own). Integration tests across packages are fine; deep imports are not.\n4. **No cycles**: no dependency cycles.\n\n**Entry points, not a barrel.** Because the public surface is *every* root file, a package can expose several small entry points (`index.ts`, `client.ts`, `server.ts`) instead of funnelling everything through one giant `index.ts`. Barrel files that re-export a whole subtree are discouraged; keep entry points small and hide implementation in subfolders.\n\nLayering (which packages may depend on which) is a *different* concern and is left as a commented stub in the config for this repo to fill in.\n\n## Steps\n\n### 1. Detect the environment\n\n- **Package manager**: `pnpm-lock.yaml` → pnpm, `yarn.lock` → yarn, `bun.lockb` → bun, else npm. Use it for every command below (`pnpm`\u002F`yarn`\u002F`npm run`\u002F`bunx`).\n- **Packages root**: if `src\u002F` exists use `src\u002Fpackages`, else `packages`. Confirm the choice with the user if the repo already has a different obvious convention.\n- **Existing config**: check for a `.dependency-cruiser.*` file. If one exists, do **not** overwrite it: merge the four rules and the options in, and tell the user what you added.\n\n**Done when:** package manager, packages root, and existing-config status are all known.\n\n### 2. Install dependency-cruiser\n\nInstall `dependency-cruiser` as a devDependency with the detected package manager.\n\n**Done when:** `dependency-cruiser` is in `devDependencies`.\n\n### 3. Write the config\n\nCopy [`dependency-cruiser.config.cjs`](.\u002Fdependency-cruiser.config.cjs) to the repo root as `.dependency-cruiser.cjs`. Set `PACKAGES_ROOT` to the root detected in step 1. The rules are path-depth based and extension-agnostic, so nothing else needs adapting.\n\n**Done when:** `.dependency-cruiser.cjs` exists with the correct `PACKAGES_ROOT`, and the four forbidden rules are present.\n\n### 4. Wire it into the checks\n\n- Add a `lint:boundaries` script: `depcruise \u003Cpackages-root>` (or `depcruise src`).\n- Fold it into the repo's umbrella check command, the one that already runs typecheck (e.g. a `check` \u002F `ci` \u002F `validate` script). Do **not** touch `tsconfig` or add path aliases.\n- If there is no umbrella script, add `lint:boundaries` and tell the user to include it in CI.\n\n**Done when:** `lint:boundaries` exists and runs as part of the same command as typecheck.\n\n### 5. Scaffold the example package\n\nCreate a committed `\u003Cpackages-root>\u002Fexample\u002F` as a copy-me template:\n\n- `index.ts` is an entry point. Export one function that delegates to an internal file (so the package is visibly *deep*, not a pass-through).\n- `lib\u002Fimpl.ts`: an internal file in a **subfolder**, imported by `index.ts`, not reachable from outside.\n- `tests\u002Fexample.test.ts` imports **only** `..\u002Findex` (an entry point) and asserts against the public function.\n\nTell the user this is a starter template to copy or delete.\n\n**Done when:** the example package exists, exposes its behaviour through a root entry point, and hides `impl` in a subfolder.\n\n### 6. Prove the rules bite\n\nThis is the completion criterion for the whole skill: a config that doesn't fail on a violation is worthless.\n\n1. Run `lint:boundaries`. It must **pass** on the clean example.\n2. Temporarily add a deep import to `tests\u002Fexample.test.ts` (e.g. `import { thing } from \"..\u002Flib\u002Fimpl\"`). Run `lint:boundaries` again; it must **fail** with `tests-through-entrypoints`.\n3. Revert the deep import. Run once more, and it must **pass**.\n\n**Done when:** you have observed a pass, then a fail on the deep import, then a pass again. If step 2 does not fail, the rules are not wired correctly, so fix before finishing.\n\n### 7. Document the convention\n\nWrite a `README.md` **in the packages folder** (`\u003Cpackages-root>\u002FREADME.md`, next to the packages it governs) covering: the `src\u002Fpackages\u002F\u003Cname>\u002F` layout (entry points at the root, `lib\u002F` for implementation, `tests\u002F` for tests), \"import only through a package's entry points (its root files)\", and how to run `lint:boundaries`. **Discourage barrel files** explicitly: expose several small entry points instead of re-exporting a whole subtree through one index. Keep it to the copy-me snippet plus the four rules in one paragraph each.\n\nThen add a **context pointer** to it from the repo's agent-instructions file (`CLAUDE.md` if present, else `AGENTS.md`, creating `AGENTS.md` if neither exists). One line is enough, e.g. `Packages are deep modules: see [src\u002Fpackages\u002FREADME.md](.\u002Fsrc\u002Fpackages\u002FREADME.md) before adding or importing one.` This is what makes an agent discover the boundary rule instead of tripping over it.\n\n**Done when:** `\u003Cpackages-root>\u002FREADME.md` exists and discourages barrels, and the repo's `CLAUDE.md`\u002F`AGENTS.md` links to it.\n\n## Notes\n\n- The config's `$1` back-references (dependency-cruiser's group matching) are what let a package reach its own internals while outsiders can't. Don't flatten them into separate per-package rules.\n- Public vs private is decided by **depth**: a package's root files are entry points; anything in a subfolder is private. The conventional subfolders are `lib\u002F` (implementation) and `tests\u002F`, but the rule doesn't hardcode them: any subfolder is private, so a new folder never needs a config change. Adding an entry point is just adding a root file (no barrel).\n- Packages are **flat**: one tier of immediate children under the root. A package's internals may nest as deep as you like; a package may not contain another package.\n- Use `.cjs` (not `.js`) so the config's `module.exports` works even in `\"type\": \"module\"` repos.\n",{"name":5,"description":7,"disable-model-invocation":28},true,"master","0952986a94cbbf338098cd44c77bb9282287019d","dotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fsetup-ts-deep-modules","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles","https:\u002F\u002Fgithub.com\u002Fpkking","https:\u002F\u002Ffosstodon.org\u002F@pkking","2026-11-14 02:08:08",{"source":8,"skillName":5,"commands":37,"prompt":47,"zipAvailable":28},[38,41,44],{"tool":39,"command":40},"npx","npx skills add pkking\u002Fdotfiles --skill setup-ts-deep-modules",{"tool":42,"command":43},"bunx","bunx skills add pkking\u002Fdotfiles --skill setup-ts-deep-modules",{"tool":45,"command":46},"pnpm","pnpm dlx skills add pkking\u002Fdotfiles --skill setup-ts-deep-modules","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fsetup-ts-deep-modules\u002FSKILL.md",[49,55,61],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"agents\u002Fopenai.yaml","REFERENCE","参考文档",149,"https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fsetup-ts-deep-modules\u002Fagents\u002Fopenai.yaml",{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"dependency-cruiser.config.cjs","SCRIPT","脚本",3712,"https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fsetup-ts-deep-modules\u002Fdependency-cruiser.config.cjs",{"path":62,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":63,"sourceHtmlUrl":64},"REFERENCE.md",7631,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fgithub-actions-plugin\u002Fskills\u002Fgithub-actions-inspection\u002FREFERENCE.md",[66,85,95,106,117,127],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":82,"publishedAt":23},"01M6BV2S7QC2D65HBV50KRXP9P","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fwriting-shape\u002FSKILL.md",[72,77],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[83,84],"writing shape","writing",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":93,"publishedAt":23},"01M6BV2QMHAVE24QQS5YRB91AN","writing-great-skills","Reference for writing and editing skills well — the vocabulary and principles that make a skill predictable.","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fwriting-great-skills\u002FSKILL.md",[91,92],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[94,84],"writing great skills",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":103,"publishedAt":23},"01M6BV2NJCTKZ7FJX22977QKJ9","writing-fragments","Writing, explore: mine raw fragments, no structure yet.","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fwriting-fragments\u002FSKILL.md",[101,102],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[104,84,105],"writing fragments","explore",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":114,"publishedAt":23},"01M6BV2KQFWWPY0C168DF0F8G6","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[112,113],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[115,84,116],"writing for agents","documents",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":125,"publishedAt":23},"01M6BV2J502DC68CS90KSYJEQH","writing-beats","Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fwriting-beats\u002FSKILL.md",[123,124],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},{"categoryNo":78,"categoryName":79,"taxonomyType":80,"taxonomyTypeDesc":81},[126,84],"writing beats",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":23},"01M6BV2G1AHZ1PD656KKQ9148J","wizard","Generate an interactive bash wizard that walks a human through a manual procedure — third-party setup, a one-off migration, an A→B state transition — opening URLs, capturing values, confirming each step, and writing .env files and GitHub Actions secrets.","https:\u002F\u002Fgithub.com\u002Fpkking\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fdotfiles\u002Fdot_config\u002Fskillshare\u002Fskills\u002Fwizard\u002FSKILL.md",[],[129,134,84,135,136,137,138,139,19,140],"Bash","secrets","github actions","actions","state","generate","github"]