@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.
- package/README.md +97 -83
- package/lib/commands/doctor.js +10 -5
- package/lib/config.js +4 -4
- package/lib/symlink.js +5 -4
- package/package.json +2 -1
- package/skills/release/SKILL.md +26 -0
- package/skills/release/agents/openai.yaml +6 -0
- package/{commands/release.md → skills/release/references/workflow.md} +46 -39
- package/skills/technical-demo-videos/SKILL.md +146 -0
- package/skills/technical-demo-videos/agents/openai.yaml +4 -0
- package/skills/technical-demo-videos/evals/evals.json +62 -0
- package/skills/technical-demo-videos/references/audio-timing.md +40 -0
- package/skills/technical-demo-videos/references/package-contract.md +33 -0
- package/skills/technical-demo-videos/references/publishing-metadata.md +36 -0
- package/skills/technical-demo-videos/references/recording-workflow.md +40 -0
- package/skills/technical-demo-videos/references/story-direction.md +37 -0
- package/skills/technical-demo-videos/references/vertical-social-video.md +24 -0
- package/skills/technical-demo-videos/references/vscode-default-profile.md +49 -0
- package/skills/technical-demo-videos/references/youtube-master.md +42 -0
- package/skills/technical-demo-videos/references/youtube-publishing.md +126 -0
- package/skills/technical-demo-videos/scripts/events_to_cues.py +89 -0
- package/skills/technical-demo-videos/scripts/normalize_youtube_master.py +210 -0
- package/skills/technical-demo-videos/scripts/recording_runtime.py +427 -0
- 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
|
|
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
|
-
|
|
|
46
|
-
|
|
47
|
-
| **Claude Code**
|
|
48
|
-
| **Gemini CLI**
|
|
49
|
-
| **Codex CLI**
|
|
50
|
-
| **Auto-updates** | Via marketplace
|
|
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
|
|
69
|
-
|
|
|
70
|
-
| refactoring-ui
|
|
71
|
-
| humaniza
|
|
72
|
-
| audit-codebase
|
|
73
|
-
| vscode-extension-dev
|
|
74
|
-
| stitch-showcase
|
|
75
|
-
| session-log
|
|
76
|
-
|
|
|
77
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
| ---------- | ------------------------------------------------------------------------------ |
|
|
89
|
-
| `/release` | Full release workflow: detect project, bump semver, update CHANGELOG + README, commit, push, tag, GitHub release |
|
|
91
|
+
---
|
|
90
92
|
|
|
91
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
|
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
|
|
326
|
-
|
|
|
327
|
-
| `status.md`
|
|
328
|
-
| `requirements.md` | What the system must do, and the acceptance criterion for each item
|
|
329
|
-
| `decisions.md`
|
|
330
|
-
| `context.md`
|
|
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
|
-
|
|
|
361
|
-
|
|
|
362
|
-
| Kept volatile status out of the startup chain
|
|
363
|
-
| Left the user's broken uncommitted code untouched | yes
|
|
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
|
|
479
|
-
|
|
|
480
|
-
| `head-tags.md`
|
|
481
|
-
| `images.md`
|
|
482
|
-
| `server-files.md`
|
|
483
|
-
| `structured-data.md` | JSON-LD for LocalBusiness, Organization, Article and BreadcrumbList
|
|
484
|
-
| `search-engines.md`
|
|
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
|
|
520
|
-
|
|
|
521
|
-
| `authentication.md`
|
|
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`
|
|
524
|
-
| `migration.md`
|
|
525
|
-
| `verification.md`
|
|
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
|
|
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
|
package/lib/commands/doctor.js
CHANGED
|
@@ -75,7 +75,9 @@ export async function doctorCommand() {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
const expectedCommands = COMMANDS.length - pluginCommands.length;
|
|
78
|
-
if (
|
|
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.
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
if (
|
|
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
|
-
//
|
|
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.
|
|
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.
|
|
@@ -1,39 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
41
|
+
### What this skill actually does (read this first)
|
|
35
42
|
|
|
36
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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 →
|
|
434
|
-
- If the repo has a remote but `gh` is not available →
|
|
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.
|