@maccesar/aiskills 1.21.1 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +97 -83
  2. package/lib/commands/doctor.js +10 -5
  3. package/lib/config.js +4 -4
  4. package/lib/symlink.js +5 -4
  5. package/package.json +2 -1
  6. package/skills/release/SKILL.md +26 -0
  7. package/skills/release/agents/openai.yaml +6 -0
  8. package/{commands/release.md → skills/release/references/workflow.md} +46 -39
  9. package/skills/technical-demo-videos/SKILL.md +146 -0
  10. package/skills/technical-demo-videos/agents/openai.yaml +4 -0
  11. package/skills/technical-demo-videos/evals/evals.json +62 -0
  12. package/skills/technical-demo-videos/references/audio-timing.md +40 -0
  13. package/skills/technical-demo-videos/references/package-contract.md +33 -0
  14. package/skills/technical-demo-videos/references/publishing-metadata.md +36 -0
  15. package/skills/technical-demo-videos/references/recording-workflow.md +40 -0
  16. package/skills/technical-demo-videos/references/story-direction.md +37 -0
  17. package/skills/technical-demo-videos/references/vertical-social-video.md +24 -0
  18. package/skills/technical-demo-videos/references/vscode-default-profile.md +49 -0
  19. package/skills/technical-demo-videos/references/youtube-master.md +42 -0
  20. package/skills/technical-demo-videos/references/youtube-publishing.md +126 -0
  21. package/skills/technical-demo-videos/scripts/events_to_cues.py +89 -0
  22. package/skills/technical-demo-videos/scripts/normalize_youtube_master.py +210 -0
  23. package/skills/technical-demo-videos/scripts/recording_runtime.py +427 -0
  24. package/skills/technical-demo-videos/scripts/youtube_publish.py +517 -0
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  `aiskills` is a toolkit of curated skills for AI coding assistants. It provides skill files for Claude Code, Gemini CLI, or Codex CLI.
10
10
 
11
- Each skill is a small knowledge package: a `SKILL.md` file with YAML frontmatter plus a set of reference files. When a prompt matches the skill, the assistant reads those files and answers from the source material.
11
+ Each skill is a small knowledge package: a `SKILL.md` file with YAML frontmatter plus optional references, scripts, and invocation policy. Most activate when a prompt matches; sensitive workflows such as `release` can require explicit invocation.
12
12
 
13
13
  ---
14
14
 
@@ -42,20 +42,20 @@ Installed files:
42
42
 
43
43
  ### Which option should I use?
44
44
 
45
- | | Plugin (Option A) | CLI (Option B) |
46
- |---|---|---|
47
- | **Claude Code** | Recommended | Supported |
48
- | **Gemini CLI** | Not available | Supported |
49
- | **Codex CLI** | Not available | Supported |
50
- | **Auto-updates** | Via marketplace | `aiskills update` |
45
+ | | Plugin (Option A) | CLI (Option B) |
46
+ | ---------------- | ----------------- | ----------------- |
47
+ | **Claude Code** | Recommended | Supported |
48
+ | **Gemini CLI** | Not available | Supported |
49
+ | **Codex CLI** | Not available | Supported |
50
+ | **Auto-updates** | Via marketplace | `aiskills update` |
51
51
 
52
52
  ---
53
53
 
54
54
  ## Compatible platforms
55
55
 
56
- | Platform | Status | Installation Path |
57
- | --------------------------------------------------------- | --------- | ------------------- |
58
- | [Claude Code](https://claude.ai/claude-code) | Supported | `~/.claude/skills/` |
56
+ | Platform | Status | Installation Path |
57
+ | --------------------------------------------------------- | --------- | ------------------------------------- |
58
+ | [Claude Code](https://claude.ai/claude-code) | Supported | `~/.claude/skills/` |
59
59
  | [Gemini CLI](https://github.com/google-gemini/gemini-cli) | Supported | `~/.agents/skills/` (auto-discovered) |
60
60
  | [Codex CLI](https://developers.openai.com/codex/cli/) | Supported | `~/.agents/skills/` (auto-discovered) |
61
61
 
@@ -65,35 +65,47 @@ All three platforms use the same Agent Skills format: a `SKILL.md` file with YAM
65
65
 
66
66
  ## Available skills
67
67
 
68
- | Skill | Domain | Source | Reference Files |
69
- | -------------------- | ------------ | ------------------------------------ | --------------- |
70
- | refactoring-ui | Design | "Refactoring UI" by Wathan & Schoger | 7 files |
71
- | humaniza | Writing (es) | Curated Spanish/es-MX style rules | 7 files |
72
- | audit-codebase | Auditing | Evidence-based audit methodology | 2 files |
73
- | vscode-extension-dev | VS Code | VS Code Extension API docs | 14 files |
74
- | stitch-showcase | Design Tools | Google Stitch export workflow | 16 files |
75
- | session-log | Project | Convention + 3 A/B rounds | 2 files |
76
- | seo-launch | Web / SEO | Head tags, share cards, server files | 5 files |
77
- | npm-supply-chain | npm / CI | npm and GitHub changelogs, 2025–2026 | 5 files |
68
+ | Skill | Domain | Source | Reference Files |
69
+ | --------------------- | ---------------- | ------------------------------------- | -------------------- |
70
+ | refactoring-ui | Design | "Refactoring UI" by Wathan & Schoger | 7 files |
71
+ | humaniza | Writing (es) | Curated Spanish/es-MX style rules | 7 files |
72
+ | audit-codebase | Auditing | Evidence-based audit methodology | 2 files |
73
+ | vscode-extension-dev | VS Code | VS Code Extension API docs | 14 files |
74
+ | stitch-showcase | Design Tools | Google Stitch export workflow | 16 files |
75
+ | session-log | Project | Convention + 3 A/B rounds | 2 files |
76
+ | technical-demo-videos | Video Production | Reproducible macOS technical demos | 9 guides + 4 scripts |
77
+ | release | Publishing | Portable, confirmation-gated workflow | 1 file |
78
+ | seo-launch | Web / SEO | Head tags, share cards, server files | 5 files |
79
+ | npm-supply-chain | npm / CI | npm and GitHub changelogs, 2025–2026 | 5 files |
78
80
 
79
81
  Use `aiskills list` to see available skills from the command line. Pull requests are welcome.
80
82
 
81
- ---
83
+ ### Technical demo videos
84
+
85
+ `technical-demo-videos` turns a conversational tutorial idea and a project path into a reviewable storyboard, a permanent recorder, an event log, narration and caption sources, and a verified delivery master. It loads the appropriate framework or domain skills before writing technical claims, prepares VS Code outside the capture, announces every real recording with a clapperboard, uses a fresh disposable project for each take, and keeps all production sources needed to recreate the result. YouTube upload automation and vertical derivatives remain opt-in.
82
86
 
83
- ## Available commands
87
+ Automated YouTube publication requires an explicit channel and playlist choice (including an explicit no-playlist choice), validates both against the authenticated account, and binds execution to a reviewed dry run with a confirmation token.
84
88
 
85
- Slash commands are Claude Code-only. They ship with the plugin (Option A). The CLI distribution (Option B) installs skills only.
89
+ The workstation geometry and temporary-copy directory are configuration, not assumptions baked into the skill. A team can calibrate one profile and reuse the same workflow for a CLI, web app, mobile simulator, build process, or another technical tutorial.
86
90
 
87
- | Command | Purpose |
88
- | ---------- | ------------------------------------------------------------------------------ |
89
- | `/release` | Full release workflow: detect project, bump semver, update CHANGELOG + README, commit, push, tag, GitHub release |
91
+ ---
90
92
 
91
- ### /release
93
+ ## Explicit-only release skill
92
94
 
93
95
  End-to-end release janitor that works across project types: npm, Titanium (`tiapp.xml`), Composer, Cargo, CocoaPods, or versionless (git-tag-only) repos. **Designed for a dirty working tree** — it groups your uncommitted work into semantic commits, then ships the release on top.
94
96
 
97
+ Unlike the other skills, `release` is never supposed to activate merely because a repository looks ready. Name it explicitly:
98
+
99
+ | Platform | Invocation |
100
+ | ----------- | --------------------------------------------------------- |
101
+ | Claude Code | `/release [patch\|minor\|major]` |
102
+ | Codex CLI | `$release [patch\|minor\|major]` |
103
+ | Gemini CLI | `Use the release skill [with a patch\|minor\|major bump]` |
104
+
105
+ Codex carries platform-specific metadata that disables implicit invocation. Claude Code has its own equivalent frontmatter field, but adding it to this universal `SKILL.md` makes Codex reject the skill; the common body therefore enforces the boundary for Claude and Gemini: the prompt must name `release` before the workflow may proceed. Gemini still asks for activation consent. Every platform then stops again at the release plan and requires a second explicit confirmation before any mutation.
106
+
95
107
  When to use it:
96
- - You have weeks of work in the working tree (with maybe a few interim commits you made along the way) and want one command to clean everything into proper semantic commits and ship a release.
108
+ - You have weeks of work in the working tree (with maybe a few interim commits you made along the way) and want one workflow to clean everything into proper semantic commits and ship a release.
97
109
  - You maintain `CHANGELOG.md` in Keep-a-Changelog format and want the `[Unreleased]` section promoted automatically.
98
110
  - You want the bump level inferred from Conventional Commits across both your existing commits and the proposed new ones, with the option to override.
99
111
 
@@ -101,7 +113,8 @@ Example prompts:
101
113
  ```
102
114
  /release
103
115
  /release minor
104
- /release major
116
+ $release major
117
+ Use the release skill with a patch bump
105
118
  ```
106
119
 
107
120
  How it works:
@@ -128,15 +141,16 @@ Language policy (two independent axes):
128
141
  Hard restrictions:
129
142
  - Never `--force-push`, `--amend` published commits, or `--no-verify`.
130
143
  - Aborts on merge conflicts or rebase-in-progress.
131
- - Asks before creating the **first** tag on `main` / `master`.
144
+ - Warns before creating the first tag or GitHub release in a public/internal repository.
132
145
  - Skips push / tag / release gracefully when the repo has no remote or `gh` is not installed.
133
146
 
134
147
  Distribution note:
135
- - Available via the plugin install (Option A above). Slash commands are not distributed by the npm CLI (Option B) because they are a Claude Code feature.
148
+ - The release workflow now ships through both installation options as one Agent Skill. The former Claude-only `commands/release.md` is removed automatically on the next `aiskills update` or `aiskills install`.
149
+ - If npm updates before an enabled Claude marketplace cache, the CLI keeps the old plugin command as the temporary `/release` provider and suppresses the new same-name mirror rather than creating a duplicate. Refresh with `/plugin marketplace update maccesar-aiskills`, run `aiskills install`, then `/reload-plugins` to finish the handoff to the skill.
136
150
 
137
151
  ## How skills work
138
152
 
139
- Skills activate based on what you ask. You can write prompts normally:
153
+ Most skills activate based on what you ask. You can write prompts normally:
140
154
 
141
155
  ```
142
156
  "How do I create better visual hierarchy in this UI?"
@@ -146,7 +160,7 @@ Skills activate based on what you ask. You can write prompts normally:
146
160
 
147
161
  The assistant reads the skill's `SKILL.md`, checks whether the request fits, and then loads the reference files for that skill. That keeps the answer tied to the source material.
148
162
 
149
- You do not need to name a skill explicitly, though you still can if you want to force a specific one.
163
+ You do not normally need to name a skill explicitly. `release` is the deliberate exception because it can commit, tag, push, and publish; invoke it using the platform-specific form documented above.
150
164
 
151
165
  ---
152
166
 
@@ -177,15 +191,15 @@ Example prompts:
177
191
  ```
178
192
 
179
193
  Reference files:
180
- | File | Topics |
181
- | ------------------------ | --------------------------------------------------------------------------------------- |
194
+ | File | Topics |
195
+ | ------------------------ | ---------------------------------------------------------------------------------------- |
182
196
  | 01-foundations.md | Project mindset: feature-first work, scope discipline, defining systems, picking a voice |
183
- | 02-page-mechanics.md | Visual hierarchy, layout, white space, spacing scales, typography |
184
- | 03-visual-treatment.md | Color systems (HSL, shades, greys, contrast), depth and shadows, image handling |
185
- | 04-polish.md | Borders, accents, empty states, decorative defaults, sharpening design intuition |
186
- | 05-motion.md | Motion system, hover/press states, loading patterns, `prefers-reduced-motion` |
187
- | 06-dark-mode.md | Dark mode color tokens, text contrast, shadows, images, theme toggle |
188
- | 07-component-patterns.md | Modals (focus, layout), forms (labels, validation), tables (density, alignment) |
197
+ | 02-page-mechanics.md | Visual hierarchy, layout, white space, spacing scales, typography |
198
+ | 03-visual-treatment.md | Color systems (HSL, shades, greys, contrast), depth and shadows, image handling |
199
+ | 04-polish.md | Borders, accents, empty states, decorative defaults, sharpening design intuition |
200
+ | 05-motion.md | Motion system, hover/press states, loading patterns, `prefers-reduced-motion` |
201
+ | 06-dark-mode.md | Dark mode color tokens, text contrast, shadows, images, theme toggle |
202
+ | 07-component-patterns.md | Modals (focus, layout), forms (labels, validation), tables (density, alignment) |
189
203
 
190
204
  ---
191
205
 
@@ -258,7 +272,7 @@ Example prompts:
258
272
  ```
259
273
 
260
274
  Reference files:
261
- | File | Topics |
275
+ | File | Topics |
262
276
  | ---------------------- | --------------------------------------------------------------------------- |
263
277
  | comprehensive-audit.md | Mandatory principles, 24-area technical scope, 5-phase method, severity |
264
278
  | report-format.md | Executive summary, findings table, decision matrix, correction plan formats |
@@ -297,22 +311,22 @@ Example prompts:
297
311
  ```
298
312
 
299
313
  Reference files:
300
- | File | Topics |
301
- | ---------------------- | ------------------------------------------------------------------------------------------------------------ |
302
- | api-treeview.md | TreeDataProvider, TreeView registration |
303
- | api-webview.md | Webview Panel, CSP/nonce, postMessage, asWebviewUri |
304
- | api-quickpick.md | Simple and async QuickPick with debounced search |
305
- | api-statusbar.md | StatusBarItem, codicons, dynamic updates |
306
- | api-secretstorage.md | Credential manager pattern, onDidChange |
307
- | api-progress.md | withProgress (Notification + Window), cancellation tokens |
314
+ | File | Topics |
315
+ | ---------------------- | ----------------------------------------------------------------------------------------------------------- |
316
+ | api-treeview.md | TreeDataProvider, TreeView registration |
317
+ | api-webview.md | Webview Panel, CSP/nonce, postMessage, asWebviewUri |
318
+ | api-quickpick.md | Simple and async QuickPick with debounced search |
319
+ | api-statusbar.md | StatusBarItem, codicons, dynamic updates |
320
+ | api-secretstorage.md | Credential manager pattern, onDidChange |
321
+ | api-progress.md | withProgress (Notification + Window), cancellation tokens |
308
322
  | api-additional.md | FileSystemWatcher, Disposable cleanup, Diagnostics, OutputChannel, ContextKeys, TextDocumentContentProvider |
309
- | architecture.md | Project structure, layered architecture, testing strategy |
310
- | package-json-schema.md | contributes, activationEvents, engines, scripts, devDependencies |
311
- | publishing.md | vsce, .vscodeignore, CI/CD, Open VSX, versioning |
312
- | lsp.md | LSP client setup, server lifecycle, capabilities, diagnostics |
313
- | notebooks.md | Notebook serializers, controllers, renderers, output mime types |
314
- | debugger.md | DAP: descriptor factory, configuration provider, adapter lifecycle |
315
- | testing.md | Multi-suite test config, workspace fixtures, mocking `vscode`, CI, coverage |
323
+ | architecture.md | Project structure, layered architecture, testing strategy |
324
+ | package-json-schema.md | contributes, activationEvents, engines, scripts, devDependencies |
325
+ | publishing.md | vsce, .vscodeignore, CI/CD, Open VSX, versioning |
326
+ | lsp.md | LSP client setup, server lifecycle, capabilities, diagnostics |
327
+ | notebooks.md | Notebook serializers, controllers, renderers, output mime types |
328
+ | debugger.md | DAP: descriptor factory, configuration provider, adapter lifecycle |
329
+ | testing.md | Multi-suite test config, workspace fixtures, mocking `vscode`, CI, coverage |
316
330
 
317
331
  ---
318
332
 
@@ -322,12 +336,12 @@ Gives a project one predictable place for its working state, so both you and any
322
336
 
323
337
  The convention:
324
338
 
325
- | File | Holds | Loaded at startup |
326
- | --- | --- | --- |
327
- | `status.md` | Where the work stands: half-done things, next step, what's blocked, deployment state, which assistant wrote the note | **No** |
328
- | `requirements.md` | What the system must do, and the acceptance criterion for each item | Yes |
329
- | `decisions.md` | What was chosen and why. Append-only, dated | Yes |
330
- | `context.md` | Documentation map, architecture, conventions, traps, provenance | Yes |
339
+ | File | Holds | Loaded at startup |
340
+ | ----------------- | -------------------------------------------------------------------------------------------------------------------- | ----------------- |
341
+ | `status.md` | Where the work stands: half-done things, next step, what's blocked, deployment state, which assistant wrote the note | **No** |
342
+ | `requirements.md` | What the system must do, and the acceptance criterion for each item | Yes |
343
+ | `decisions.md` | What was chosen and why. Append-only, dated | Yes |
344
+ | `context.md` | Documentation map, architecture, conventions, traps, provenance | Yes |
331
345
 
332
346
  **Why `status.md` is excluded from startup.** Cached context is matched as a prefix — the first byte that differs invalidates everything after it. Status written inside a startup-loaded file means every update throws away the cache for all the stable content behind it. The file you edit most often is the one that must not load at startup.
333
347
 
@@ -357,10 +371,10 @@ What it will not do:
357
371
 
358
372
  Measured behaviour, across three A/B rounds against a no-skill baseline (18 runs, adversarially graded):
359
373
 
360
- | | With skill | Without |
361
- | --- | --- | --- |
362
- | Kept volatile status out of the startup chain | 9 / 9 | 0 / 9 |
363
- | Left the user's broken uncommitted code untouched | yes | no — fixed it unasked |
374
+ | | With skill | Without |
375
+ | ------------------------------------------------- | ---------- | --------------------- |
376
+ | Kept volatile status out of the startup chain | 9 / 9 | 0 / 9 |
377
+ | Left the user's broken uncommitted code untouched | yes | no — fixed it unasked |
364
378
 
365
379
  Token cost is 3–13% higher per run. **Those rounds graded an earlier layout** — a single status file versus an imported memory index — so what they establish is the split itself, not the four filenames. The paths added since (resuming against a stale file, upgrading an earlier install, monorepos, a gitignored `docs/`) have prompts written for them and have not been run. The grading notes, and an explicit account of what is and isn't measured, are in `skills/session-log/evals/`.
366
380
 
@@ -475,13 +489,13 @@ Certificate verification is on by default; `--local` is the explicit opt-out for
475
489
 
476
490
  **Stage 2**, once you approve, installs the tags from a parameterized template, generates the images with ImageMagick, writes `robots.txt` / `sitemap.xml` / `.htaccess`, and re-runs the audit against the live site to verify.
477
491
 
478
- | Reference file | Covers |
479
- | --- | --- |
480
- | `head-tags.md` | title, description, canonical, robots, the Open Graph block, Twitter card, and why the URLs must be absolute |
481
- | `images.md` | og:image 1200×630, SVG favicon, apple-touch-icon, and the ImageMagick commands with the decision behind each flag |
482
- | `server-files.md` | robots.txt, sitemap.xml, .htaccess: canonical domain, compression, split caching, security headers |
483
- | `structured-data.md` | JSON-LD for LocalBusiness, Organization, Article and BreadcrumbList |
484
- | `search-engines.md` | Search Console (Domain vs URL prefix), Bing, submitting the sitemap, validators, busting Facebook's cache |
492
+ | Reference file | Covers |
493
+ | -------------------- | ----------------------------------------------------------------------------------------------------------------- |
494
+ | `head-tags.md` | title, description, canonical, robots, the Open Graph block, Twitter card, and why the URLs must be absolute |
495
+ | `images.md` | og:image 1200×630, SVG favicon, apple-touch-icon, and the ImageMagick commands with the decision behind each flag |
496
+ | `server-files.md` | robots.txt, sitemap.xml, .htaccess: canonical domain, compression, split caching, security headers |
497
+ | `structured-data.md` | JSON-LD for LocalBusiness, Organization, Article and BreadcrumbList |
498
+ | `search-engines.md` | Search Console (Domain vs URL prefix), Bing, submitting the sitemap, validators, busting Facebook's cache |
485
499
 
486
500
  Templates in `assets/`: a parameterized `head.php` for static sites, a `social-meta.blade.php` component for Laravel, a commented `.htaccess`, and a `robots.txt`.
487
501
 
@@ -516,13 +530,13 @@ It reports tokens sitting in `~/.npmrc` or the project `.npmrc`, Actions secrets
516
530
 
517
531
  The badge check earns its place from this repo's own history: three badges asked for `aiskills` while the package publishes as `@maccesar/aiskills`, so shields.io rendered "package not found" instead of an error and the downloads badge hid a real 568/month for months.
518
532
 
519
- | Reference file | Covers |
520
- | --- | --- |
521
- | `authentication.md` | the timeline, session-based login, the three token types, the 2FA-bypass phases with dates, the npmjs.com banner, and which paths remain |
533
+ | Reference file | Covers |
534
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
535
+ | `authentication.md` | the timeline, session-based login, the three token types, the 2FA-bypass phases with dates, the npmjs.com banner, and which paths remain |
522
536
  | `trusted-publishing.md` | the publisher form field by field, `id-token: write`, the Node/npm minimums, provenance, the version guard, and the mistakes that break a registration |
523
- | `install-defaults.md` | npm v12 defaults, `npm approve-scripts`, the committed allowlist, which packages break, and the `ignore-scripts` trap |
524
- | `migration.md` | the once-per-project procedure in order, what only the package owner can do, and the cleanup the old flow leaves behind |
525
- | `verification.md` | the command behind each claim — including why `npm view` reports a stale version and what npmjs.com shows when OIDC worked |
537
+ | `install-defaults.md` | npm v12 defaults, `npm approve-scripts`, the committed allowlist, which packages break, and the `ignore-scripts` trap |
538
+ | `migration.md` | the once-per-project procedure in order, what only the package owner can do, and the cleanup the old flow leaves behind |
539
+ | `verification.md` | the command behind each claim — including why `npm view` reports a stale version and what npmjs.com shows when OIDC worked |
526
540
 
527
541
  `assets/publish.yml` is the workflow template, commented line by line.
528
542
 
@@ -583,9 +597,9 @@ aiskills auto-update --silent # No output (for hooks)
583
597
  ```
584
598
 
585
599
  Options:
586
- | Option | Description |
587
- | ------------- | ------------------------------------ |
588
- | `-s, --silent` | Suppress all output except errors |
600
+ | Option | Description |
601
+ | -------------- | --------------------------------- |
602
+ | `-s, --silent` | Suppress all output except errors |
589
603
 
590
604
  What it does:
591
605
  1. Checks a local cache (`~/.aiskills/last-check.json`) — if already checked today, exits immediately
@@ -75,7 +75,9 @@ export async function doctorCommand() {
75
75
  }
76
76
  }
77
77
  const expectedCommands = COMMANDS.length - pluginCommands.length;
78
- if (pluginCommands.length === COMMANDS.length) {
78
+ if (COMMANDS.length === 0) {
79
+ console.log(` ${CHECK} Slash commands: none (workflows ship as cross-agent skills)`);
80
+ } else if (pluginCommands.length === COMMANDS.length) {
79
81
  console.log(` ${CHECK} Slash commands: all ${COMMANDS.length} served by the marketplace plugin`);
80
82
  } else if (missingCommands.length === 0) {
81
83
  console.log(` ${CHECK} Slash commands: ${expectedCommands}/${expectedCommands} installed in ~/.claude/commands/`);
@@ -113,10 +115,13 @@ export async function doctorCommand() {
113
115
 
114
116
  for (const skill of SKILLS) {
115
117
  // A skill the marketplace plugin provides is *supposed* to have no mirror
116
- // here — the CLI removes it on purpose to avoid a duplicate entry. Counting
117
- // it as missing turns a healthy marketplace install into a wall of errors
118
- // telling the user to run a command that will correctly do nothing.
119
- if (platform.name === 'claude' && pluginProvidesSkill(skill, homeDir)) {
118
+ // here — the CLI removes it on purpose to avoid a duplicate entry. During
119
+ // command-to-skill migrations, a same-name command in an older enabled
120
+ // cache also suppresses the mirror until the marketplace refreshes.
121
+ if (
122
+ platform.name === 'claude' &&
123
+ (pluginProvidesSkill(skill, homeDir) || pluginProvidesCommand(skill, homeDir))
124
+ ) {
120
125
  servedByPlugin.push(skill);
121
126
  continue;
122
127
  }
package/lib/config.js CHANGED
@@ -31,9 +31,11 @@ export const SKILLS = [
31
31
  'humaniza',
32
32
  'npm-supply-chain',
33
33
  'refactoring-ui',
34
+ 'release',
34
35
  'seo-launch',
35
36
  'session-log',
36
37
  'stitch-showcase',
38
+ 'technical-demo-videos',
37
39
  'vscode-extension-dev',
38
40
  ];
39
41
 
@@ -41,12 +43,10 @@ export const SKILLS = [
41
43
  export const LEGACY_SKILLS = [];
42
44
 
43
45
  // Slash commands to install (Claude Code only — copied to ~/.claude/commands/)
44
- export const COMMANDS = [
45
- 'release',
46
- ];
46
+ export const COMMANDS = [];
47
47
 
48
48
  // Legacy commands to remove during updates/uninstall
49
- export const LEGACY_COMMANDS = [];
49
+ export const LEGACY_COMMANDS = ['release'];
50
50
 
51
51
  // Cache/config directory
52
52
  export const getConfigDir = () => path.join(os.homedir(), '.aiskills');
package/lib/symlink.js CHANGED
@@ -83,8 +83,8 @@ async function removePath(path) {
83
83
  * @returns {Promise<boolean>} True if the plugin provides this skill
84
84
  */
85
85
  export async function isClaudePluginSkillInstalled(skillName, baseDir) {
86
- const { pluginProvidesSkill } = await import('./claude-plugin.js');
87
- return pluginProvidesSkill(skillName, baseDir);
86
+ const { pluginProvidesSkill, pluginProvidesCommand } = await import('./claude-plugin.js');
87
+ return pluginProvidesSkill(skillName, baseDir) || pluginProvidesCommand(skillName, baseDir);
88
88
  }
89
89
 
90
90
  /**
@@ -118,8 +118,9 @@ export async function createSkillSymlinks(platformSkillsDir, skills, baseDir) {
118
118
  const useRelative = !!baseDir;
119
119
 
120
120
  for (const skill of skills) {
121
- // Skip Claude when the marketplace plugin already provides this skill;
122
- // clean up any stale symlink left from a previous CLI install.
121
+ // Skip Claude when the marketplace plugin already provides this skill or
122
+ // still provides a same-name legacy command during a command-to-skill
123
+ // migration; clean up any stale symlink left from a previous CLI install.
123
124
  if (isClaudePlatform && await isClaudePluginSkillInstalled(skill, baseDir)) {
124
125
  const stalePath = join(platformSkillsDir, skill);
125
126
  if (existsSync(stalePath)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maccesar/aiskills",
3
- "version": "1.21.1",
3
+ "version": "1.23.0",
4
4
  "description": "AI coding assistant skills for Claude Code, Gemini CLI, and Codex CLI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,6 +20,7 @@
20
20
  "codex",
21
21
  "llm",
22
22
  "agents",
23
+ "release",
23
24
  "refactoring-ui",
24
25
  "design",
25
26
  "ui",
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: release
3
+ description: 'Use only when the user explicitly invokes `$release`, `/release`, or asks to use the release skill by name. Never activate merely because work appears ready or the user discusses releases. Handles the full repository release workflow: semantic commits, semver, CHANGELOG and README updates, confirmation, push, tag, GitHub release, and publication verification.'
4
+ ---
5
+
6
+ # Release
7
+
8
+ Publish a repository only through an explicit, reviewable authorization sequence.
9
+
10
+ ## Invocation boundary
11
+
12
+ This is an explicit-only skill.
13
+
14
+ - Proceed only when the user's current request names `$release`, `/release`, or the `release` skill itself.
15
+ - A generic request that merely discusses releases, versions, tags, publishing, or a repository that looks ready is not an invocation. Stop and tell the user how to invoke the skill.
16
+ - Invoking the skill authorizes read-only analysis and a release plan. It does not authorize commits, tags, pushes, package publication, GitHub releases, merges, or pull requests.
17
+ - Accept an optional `patch`, `minor`, or `major` override from the invocation. Otherwise infer the bump from the repository changes.
18
+
19
+ ## Required workflow
20
+
21
+ 1. Read [references/workflow.md](references/workflow.md) completely before running repository checks.
22
+ 2. Follow its Steps 0–4 in order and present the single confirmation block.
23
+ 3. Stop. Do not perform any mutation until the user explicitly confirms that exact plan.
24
+ 4. After confirmation, follow Step 5 exactly and verify every publication channel triggered by the release.
25
+
26
+ Repository instructions remain authoritative. If they impose stricter release checks or extra synchronized version files, include those requirements in the plan and execution.
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "Release"
3
+ short_description: "Plan, confirm, and publish a repository release"
4
+ default_prompt: "Use $release to prepare and publish this repository after showing me the confirmation plan."
5
+ policy:
6
+ allow_implicit_invocation: false
@@ -1,39 +1,46 @@
1
- ---
2
- allowed-tools: Bash(git:*), Bash(gh:*), Bash(npm version:*), Bash(npm pkg:*), Bash(cat:*), Bash(grep:*), Bash(test:*), Read, Edit, Write, Glob, Grep
3
- description: Full release workflow — detect project, infer semver bump, update CHANGELOG+README, commit, push. Public repos get a tag + GitHub release (asks before the first ever tag or release); private repos skip both by default.
4
- argument-hint: [patch|minor|major] (optional; inferred from semantic commits if omitted)
5
- ---
6
-
7
- ## Context (read-only — collected automatically)
8
-
9
- - Working tree status: !`git status --porcelain`
10
- - Current branch: !`git branch --show-current`
11
- - Last tag: !`git describe --tags --abbrev=0 2>/dev/null || echo "<no tags>"`
12
- - Commits since last tag: !`git log --pretty=format:"%h %s" $(git describe --tags --abbrev=0 2>/dev/null)..HEAD 2>/dev/null || git log --pretty=format:"%h %s"`
13
- - Remote URL: !`git remote get-url origin 2>/dev/null || echo "<no remote>"`
14
- - Recent commit style: !`git log --pretty=format:"%s" -20`
15
- - Has gh CLI: !`command -v gh >/dev/null 2>&1 && echo "yes" || echo "no"`
16
- - Repo visibility (GitHub only): !`gh repo view --json visibility -q .visibility 2>/dev/null || echo "<unknown>"`
17
- - Versioned files present:
18
- - package.json: !`test -f package.json && echo "yes" || echo "no"`
19
- - tiapp.xml: !`test -f tiapp.xml && echo "yes" || echo "no"`
20
- - composer.json: !`test -f composer.json && echo "yes" || echo "no"`
21
- - Cargo.toml: !`test -f Cargo.toml && echo "yes" || echo "no"`
22
- - podspec: !`ls *.podspec 2>/dev/null | head -1 || echo "<none>"`
23
- - CHANGELOG.md present: !`test -f CHANGELOG.md && echo "yes" || echo "no"`
24
- - README.md present: !`test -f README.md && echo "yes" || echo "no"`
25
-
26
- ## Arguments
27
-
28
- `$ARGUMENTS` may contain `patch`, `minor`, or `major` to override the inferred bump. If empty, infer from the commits above.
1
+ # Release workflow
2
+
3
+ <!-- TOC-START -->
4
+ ## Contents
5
+
6
+ - [Read-only context to collect](#read-only-context-to-collect)
7
+ - [Your task](#your-task)
8
+ - [What this skill actually does (read this first)](#what-this-skill-actually-does-read-this-first)
9
+ - [Verbosity discipline](#verbosity-discipline)
10
+ - [Step 0 Lock interaction language (do this BEFORE printing anything)](#step-0--lock-interaction-language-do-this-before-printing-anything)
11
+ - [Step 1 Establish state (silent)](#step-1--establish-state-silent)
12
+ - [Step 2 Infer the bump (silent)](#step-2--infer-the-bump-silent)
13
+ - [Step 3 Compose the CHANGELOG entry (silent)](#step-3--compose-the-changelog-entry-silent)
14
+ - [Language policy (applies to Steps 1–5)](#language-policy-applies-to-steps-15)
15
+ - [Step 4 Present the plan in ONE block and STOP](#step-4--present-the-plan-in-one-block-and-stop)
16
+ - [Step 5 Execute (silent until done)](#step-5--execute-silent-until-done)
17
+ - [Hard restrictions (never violate)](#hard-restrictions-never-violate)
18
+
19
+ <!-- TOC-END -->
20
+
21
+ ## Read-only context to collect
22
+
23
+ Collect this state with read-only tools before planning anything:
24
+
25
+ - Working tree status: `git status --porcelain`
26
+ - Current branch: `git branch --show-current`
27
+ - Last tag: `git describe --tags --abbrev=0`
28
+ - Commits since the last tag, or the full log when no tag exists
29
+ - Remote URL and primary branch
30
+ - Recent commit subjects and conventions
31
+ - Whether `gh` is installed and, for GitHub remotes, repository visibility
32
+ - Presence of `package.json`, `tiapp.xml`, `composer.json`, `Cargo.toml`, a root `*.podspec`, `CHANGELOG.md`, and `README.md`
33
+ - Merge or rebase state and unresolved conflicts
34
+
35
+ The explicit invocation may include `patch`, `minor`, or `major` to override the inferred bump. If none is present, infer it from the work being released.
29
36
 
30
37
  ## Your task
31
38
 
32
39
  Execute the **release workflow** in five strict, ordered steps. **Do not skip Step 4** — it is the user's confirmation gate and is non-negotiable.
33
40
 
34
- ### What this command actually does (read this first)
41
+ ### What this skill actually does (read this first)
35
42
 
36
- `/release` is **not** "make a release commit from already-staged work". It is the full janitor: it takes a project that has been worked on without commits (or with mixed work + a release intent) and turns it into a clean, shipped release.
43
+ The release skill is **not** "make a release commit from already-staged work". It is the full janitor: it takes a project that has been worked on without commits (or with mixed work + a release intent) and turns it into a clean, shipped release.
37
44
 
38
45
  **Working tree dirty is the expected starting state, not an anomaly.** When the user invokes `/release` with 12 modified files since the last tag, what they want is:
39
46
 
@@ -55,9 +62,9 @@ If the working tree is **completely empty** AND there are zero commits since the
55
62
 
56
63
  ### Step 0 — Lock interaction language (do this BEFORE printing anything)
57
64
 
58
- Before you produce any user-facing output, scan the user's last 1–3 messages in this conversation and determine their language. **This file is in English for distribution; that does not mean you respond in English.** Lock that detected language and use it for **every** message you print to the user from this point until the command ends Step 1 summary, Step 2 inferred bump, Step 4 plan preview, Step 5 progress, errors, final report.
65
+ Before you produce any user-facing output, scan the user's last 1–3 messages in this conversation and determine their language. **This file is in English for distribution; that does not mean you respond in English.** Lock that detected language and use it for every message you print to the user until the skill ends: the Step 4 plan, errors, and final report.
59
66
 
60
- If the user has not yet said anything in this session (rare `/release` invoked as the very first message), default to the language of the repo's `README.md`. If that is also unclear, default to English.
67
+ If the user has not yet said anything in this session (rare when the skill is invoked as the first message), default to the language of the repo's `README.md`. If that is also unclear, default to English.
61
68
 
62
69
  If the user switches language mid-flow, switch with them on the next message.
63
70
 
@@ -168,7 +175,7 @@ Apply Conventional Commits rules across that combined set:
168
175
  - Any `feat:` (no breaking) → **minor**
169
176
  - Otherwise → **patch**
170
177
 
171
- `$ARGUMENTS` (`patch` / `minor` / `major`) overrides the inference.
178
+ An explicit invocation override (`patch` / `minor` / `major`) takes precedence over the inference.
172
179
 
173
180
  If there are zero existing commits AND zero proposed commits AND the working tree is clean → abort: "Nothing to release."
174
181
 
@@ -208,7 +215,7 @@ There are **two independent language axes**. Do not mix them.
208
215
 
209
216
  #### Axis 1 — Interaction language (your conversation with the user)
210
217
 
211
- **Always match the user's language.** Detect from the user's last 1–3 messages in this conversation — not from this command file (which is in English for distribution), and not from the project files. If the user has been speaking Spanish, every status summary, plan preview, confirmation prompt, error message, and final report you print **must be in Spanish**. If the user switches mid-flow, switch with them.
218
+ **Always match the user's language.** Detect from the user's last 1–3 messages in this conversation — not from this workflow file (which is in English for distribution), and not from the project files. If the user has been speaking Spanish, every plan preview, confirmation prompt, error message, and final report you print **must be in Spanish**. If the user switches mid-flow, switch with them.
212
219
 
213
220
  This is about what the user **reads on screen**. It does **not** affect what gets written to disk or to GitHub.
214
221
 
@@ -222,7 +229,7 @@ This is about what the user **reads on screen**. It does **not** affect what get
222
229
  2. Classify the prose: Spanish, English, or other.
223
230
  3. Tie-break with `CHANGELOG.md` (recent entries) if README is too short or ambiguous.
224
231
  4. Final tie-break: the recent `git log` subjects.
225
- 5. If everything is ambiguous, default to English and tell the user in the Step 1 summary so they can correct you before Step 4.
232
+ 5. If everything is ambiguous, default to English and surface that assumption in the Step 4 block so the user can correct it before confirming.
226
233
 
227
234
  The detected language applies to **all** of the following:
228
235
 
@@ -284,7 +291,7 @@ CHANGELOG entry:
284
291
  ### Fixed
285
292
  - ...
286
293
 
287
- README updates (gaps found): <one-line per gap, e.g. "add /release row to Available commands table + new section"> ← omit this line if no gaps
294
+ README updates (gaps found): <one-line per gap, e.g. "add the new public skill to the available-skills table"> ← omit this line if no gaps
288
295
  Release commit: bumps <version-file> A.B.C→X.Y.Z (+ <secondary version file> to the same number), inserts CHANGELOG section, applies README updates. Subject: `<exact line>`.
289
296
  Push: release commit to <branch>.
290
297
  Publishing: pushing the tag triggers `<workflow>.yml`, which publishes to <registry>. ← include ONLY when Step 1.9 found a tag-triggered publishing workflow; localize to user's language
@@ -427,9 +434,9 @@ If everything was routine and no merge was requested, the second line is just th
427
434
  - **Never** `--no-verify`, `--no-gpg-sign`, or any hook-skipping flag unless the user explicitly asks.
428
435
  - **Never** delete tags or branches.
429
436
  - **Never** merge to main with anything other than `--ff-only`. If fast-forward is not possible, abort and let the user resolve. Do not fall back to `--no-ff`, `-X theirs`, `-X ours`, or any rebase strategy.
430
- - **Never** proceed past Step 4 without explicit confirmation. The slash command itself is consent to **invoke**, not consent to commit and push.
437
+ - **Never** proceed past Step 4 without explicit confirmation. Explicitly invoking the skill is consent to **plan**, not consent to commit and push.
431
438
  - If the working tree has merge conflicts or rebase-in-progress markers → **abort** with a diagnosis and let the user resolve manually.
432
439
  - If the repo is **public/internal** and has **no prior tag** and/or **no prior GitHub release**, surface a ⚠️ line in the Step 4 plan (one per missing milestone) before creating the first ever tag or release — these are meaningful one-way actions. The user's plain confirmation in Step 4 (`yes` / `sí` / `proceed` / …) covers both ⚠️s in that single round-trip; do not require a separate confirmation prompt. On a **private repo** these confirmations are unnecessary and must NOT be raised — private mode skips both the tag and the GitHub release by default, so there's nothing to confirm. The user already opted in/out via the `con tag` modifier in Step 4 (and even then, the GitHub release stays skipped on private repos).
433
- - If the repo has no remote → run Steps 5.1–5.5 only; skip push, tag, and release. Tell the user.
434
- - If the repo has a remote but `gh` is not available → run through 5.7's tag step but skip the GitHub release; tell the user how to create the release manually if they want to.
440
+ - If the repo has no remote → land the semantic and release commits only; skip push, tag, and GitHub release. Tell the user.
441
+ - If the repo has a remote but `gh` is not available → push the branch and tag, but skip the GitHub release; tell the user how to create it manually if they want to.
435
442
  - **Never** create a GitHub release on a private repo, even if the user added `con tag` to the confirmation. The `con tag` modifier only re-enables the git tag; the GitHub release stays skipped.