@maccesar/aiskills 1.22.0 → 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 +84 -75
- package/lib/config.js +1 -0
- package/package.json +1 -1
- 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
|
@@ -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,20 +65,29 @@ 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
|
-
|
|
|
78
|
-
|
|
|
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 |
|
|
79
80
|
|
|
80
81
|
Use `aiskills list` to see available skills from the command line. Pull requests are welcome.
|
|
81
82
|
|
|
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.
|
|
86
|
+
|
|
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.
|
|
88
|
+
|
|
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.
|
|
90
|
+
|
|
82
91
|
---
|
|
83
92
|
|
|
84
93
|
## Explicit-only release skill
|
|
@@ -87,11 +96,11 @@ End-to-end release janitor that works across project types: npm, Titanium (`tiap
|
|
|
87
96
|
|
|
88
97
|
Unlike the other skills, `release` is never supposed to activate merely because a repository looks ready. Name it explicitly:
|
|
89
98
|
|
|
90
|
-
| Platform
|
|
91
|
-
|
|
|
92
|
-
| Claude Code | `/release [patch\|minor\|major]`
|
|
93
|
-
| Codex CLI
|
|
94
|
-
| Gemini CLI
|
|
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]` |
|
|
95
104
|
|
|
96
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.
|
|
97
106
|
|
|
@@ -182,15 +191,15 @@ Example prompts:
|
|
|
182
191
|
```
|
|
183
192
|
|
|
184
193
|
Reference files:
|
|
185
|
-
| File | Topics
|
|
186
|
-
| ------------------------ |
|
|
194
|
+
| File | Topics |
|
|
195
|
+
| ------------------------ | ---------------------------------------------------------------------------------------- |
|
|
187
196
|
| 01-foundations.md | Project mindset: feature-first work, scope discipline, defining systems, picking a voice |
|
|
188
|
-
| 02-page-mechanics.md | Visual hierarchy, layout, white space, spacing scales, typography
|
|
189
|
-
| 03-visual-treatment.md | Color systems (HSL, shades, greys, contrast), depth and shadows, image handling
|
|
190
|
-
| 04-polish.md | Borders, accents, empty states, decorative defaults, sharpening design intuition
|
|
191
|
-
| 05-motion.md | Motion system, hover/press states, loading patterns, `prefers-reduced-motion`
|
|
192
|
-
| 06-dark-mode.md | Dark mode color tokens, text contrast, shadows, images, theme toggle
|
|
193
|
-
| 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) |
|
|
194
203
|
|
|
195
204
|
---
|
|
196
205
|
|
|
@@ -263,7 +272,7 @@ Example prompts:
|
|
|
263
272
|
```
|
|
264
273
|
|
|
265
274
|
Reference files:
|
|
266
|
-
| File | Topics
|
|
275
|
+
| File | Topics |
|
|
267
276
|
| ---------------------- | --------------------------------------------------------------------------- |
|
|
268
277
|
| comprehensive-audit.md | Mandatory principles, 24-area technical scope, 5-phase method, severity |
|
|
269
278
|
| report-format.md | Executive summary, findings table, decision matrix, correction plan formats |
|
|
@@ -302,22 +311,22 @@ Example prompts:
|
|
|
302
311
|
```
|
|
303
312
|
|
|
304
313
|
Reference files:
|
|
305
|
-
| File | Topics
|
|
306
|
-
| ---------------------- |
|
|
307
|
-
| api-treeview.md | TreeDataProvider, TreeView registration
|
|
308
|
-
| api-webview.md | Webview Panel, CSP/nonce, postMessage, asWebviewUri
|
|
309
|
-
| api-quickpick.md | Simple and async QuickPick with debounced search
|
|
310
|
-
| api-statusbar.md | StatusBarItem, codicons, dynamic updates
|
|
311
|
-
| api-secretstorage.md | Credential manager pattern, onDidChange
|
|
312
|
-
| 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 |
|
|
313
322
|
| api-additional.md | FileSystemWatcher, Disposable cleanup, Diagnostics, OutputChannel, ContextKeys, TextDocumentContentProvider |
|
|
314
|
-
| architecture.md | Project structure, layered architecture, testing strategy
|
|
315
|
-
| package-json-schema.md | contributes, activationEvents, engines, scripts, devDependencies
|
|
316
|
-
| publishing.md | vsce, .vscodeignore, CI/CD, Open VSX, versioning
|
|
317
|
-
| lsp.md | LSP client setup, server lifecycle, capabilities, diagnostics
|
|
318
|
-
| notebooks.md | Notebook serializers, controllers, renderers, output mime types
|
|
319
|
-
| debugger.md | DAP: descriptor factory, configuration provider, adapter lifecycle
|
|
320
|
-
| 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 |
|
|
321
330
|
|
|
322
331
|
---
|
|
323
332
|
|
|
@@ -327,12 +336,12 @@ Gives a project one predictable place for its working state, so both you and any
|
|
|
327
336
|
|
|
328
337
|
The convention:
|
|
329
338
|
|
|
330
|
-
| File
|
|
331
|
-
|
|
|
332
|
-
| `status.md`
|
|
333
|
-
| `requirements.md` | What the system must do, and the acceptance criterion for each item
|
|
334
|
-
| `decisions.md`
|
|
335
|
-
| `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 |
|
|
336
345
|
|
|
337
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.
|
|
338
347
|
|
|
@@ -362,10 +371,10 @@ What it will not do:
|
|
|
362
371
|
|
|
363
372
|
Measured behaviour, across three A/B rounds against a no-skill baseline (18 runs, adversarially graded):
|
|
364
373
|
|
|
365
|
-
|
|
|
366
|
-
|
|
|
367
|
-
| Kept volatile status out of the startup chain
|
|
368
|
-
| 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 |
|
|
369
378
|
|
|
370
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/`.
|
|
371
380
|
|
|
@@ -480,13 +489,13 @@ Certificate verification is on by default; `--local` is the explicit opt-out for
|
|
|
480
489
|
|
|
481
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.
|
|
482
491
|
|
|
483
|
-
| Reference file
|
|
484
|
-
|
|
|
485
|
-
| `head-tags.md`
|
|
486
|
-
| `images.md`
|
|
487
|
-
| `server-files.md`
|
|
488
|
-
| `structured-data.md` | JSON-LD for LocalBusiness, Organization, Article and BreadcrumbList
|
|
489
|
-
| `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 |
|
|
490
499
|
|
|
491
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`.
|
|
492
501
|
|
|
@@ -521,13 +530,13 @@ It reports tokens sitting in `~/.npmrc` or the project `.npmrc`, Actions secrets
|
|
|
521
530
|
|
|
522
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.
|
|
523
532
|
|
|
524
|
-
| Reference file
|
|
525
|
-
|
|
|
526
|
-
| `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 |
|
|
527
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 |
|
|
528
|
-
| `install-defaults.md`
|
|
529
|
-
| `migration.md`
|
|
530
|
-
| `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 |
|
|
531
540
|
|
|
532
541
|
`assets/publish.yml` is the workflow template, commented line by line.
|
|
533
542
|
|
|
@@ -588,9 +597,9 @@ aiskills auto-update --silent # No output (for hooks)
|
|
|
588
597
|
```
|
|
589
598
|
|
|
590
599
|
Options:
|
|
591
|
-
| Option
|
|
592
|
-
|
|
|
593
|
-
| `-s, --silent` | Suppress all output except errors
|
|
600
|
+
| Option | Description |
|
|
601
|
+
| -------------- | --------------------------------- |
|
|
602
|
+
| `-s, --silent` | Suppress all output except errors |
|
|
594
603
|
|
|
595
604
|
What it does:
|
|
596
605
|
1. Checks a local cache (`~/.aiskills/last-check.json`) — if already checked today, exits immediately
|
package/lib/config.js
CHANGED
package/package.json
CHANGED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: technical-demo-videos
|
|
3
|
+
description: Plan and produce reproducible macOS screen-recorded technical demonstrations from a project path and a conversational goal. Use when the user wants a coding, CLI, build, simulator, emulator, or app workflow recorded in VS Code, including reviewable scripts, timed narration, captions, retakes, or final video assembly. Present the recording plan for approval before controlling the UI or starting a capture.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Technical Demo Videos
|
|
7
|
+
|
|
8
|
+
Turn a natural-language request into a reviewable production plan and, after approval, a reproducible recording package. Treat domain-specific projects such as Titanium, Flutter, native mobile, web, or a CLI as inputs; do not encode one repository, framework, command, or directory layout in this skill.
|
|
9
|
+
|
|
10
|
+
Act as the project's technical screenwriter, director, producer, screen operator, voice-script writer, and editor. Translate the user's informal explanation into a concise visual story that is technically accurate, pleasant to watch, and practical to reproduce. These roles are responsibilities, not permission to override the user's creative brief, change the product, publish media, spend money, or begin recording without approval.
|
|
11
|
+
|
|
12
|
+
## Required workflow
|
|
13
|
+
|
|
14
|
+
Read only the references needed for the current phase, but read each applicable reference before drafting advice or acting:
|
|
15
|
+
|
|
16
|
+
| Task | Required reference |
|
|
17
|
+
|---|---|
|
|
18
|
+
| Storyboard, narration intent, or take review | [references/story-direction.md](references/story-direction.md) |
|
|
19
|
+
| Production package or artifact cleanup | [references/package-contract.md](references/package-contract.md) |
|
|
20
|
+
| macOS or VS Code automation | [references/recording-workflow.md](references/recording-workflow.md) and [references/vscode-default-profile.md](references/vscode-default-profile.md) |
|
|
21
|
+
| Audio alignment or final duration | [references/audio-timing.md](references/audio-timing.md) |
|
|
22
|
+
| Upload-ready horizontal master | [references/youtube-master.md](references/youtube-master.md) |
|
|
23
|
+
| Vertical or social derivative | [references/vertical-social-video.md](references/vertical-social-video.md) |
|
|
24
|
+
| Publishing copy and settings | [references/publishing-metadata.md](references/publishing-metadata.md) |
|
|
25
|
+
| Automated YouTube publication | [references/youtube-publishing.md](references/youtube-publishing.md) |
|
|
26
|
+
|
|
27
|
+
In proposals, review notes, and handoff documents, cite each concrete production recommendation from this skill as `[source: references/<file>.md]`. Cite technical claims using the applicable domain skill or official primary documentation. If a claim cannot be verified from the inspected project or a consulted source, prefix it with `FROM_MEMORY (unverified):` instead of presenting it as fact.
|
|
28
|
+
|
|
29
|
+
## Establish the request
|
|
30
|
+
|
|
31
|
+
Resolve these facts from the user's message and the inspected project:
|
|
32
|
+
|
|
33
|
+
- source project path;
|
|
34
|
+
- demonstration goal and intended audience;
|
|
35
|
+
- exact command or UI operation;
|
|
36
|
+
- target platform, device, simulator, or emulator;
|
|
37
|
+
- files, terminal output, and runtime result that prove success;
|
|
38
|
+
- spoken language, caption language, and desired voice workflow;
|
|
39
|
+
- artifact destination and naming convention.
|
|
40
|
+
|
|
41
|
+
Preserve meaningful series conventions. When a project slug combines an order and the demonstrated command, such as `02-images`, keep that slug across the plan, recorder, recipe, takes, event logs, narration, captions, and final render. Do not invent a marketing title that breaks traceability unless the user requests one.
|
|
42
|
+
|
|
43
|
+
Infer safe details from the project and existing conventions. Ask only when a missing choice would materially change the demonstration. Use the applicable domain skill or official documentation to validate commands and expected results. Do not execute the showcased command during planning unless a harmless preflight is necessary and the user authorized implementation rather than review only.
|
|
44
|
+
|
|
45
|
+
## Route technical knowledge
|
|
46
|
+
|
|
47
|
+
This skill owns production and recording decisions; it is not the technical authority for every stack. Detect the project's languages, framework, build system, requested feature, and teaching angle before drafting the proposal. Assemble the smallest useful panel of installed skills, which may combine:
|
|
48
|
+
|
|
49
|
+
- **platform and framework expertise:** mobile and web frameworks, application platforms, databases, build systems, CLIs, or release tooling;
|
|
50
|
+
- **software judgment:** architecture, senior engineering, refactoring, security, performance, testing, maintainability, or framework-specific best practices;
|
|
51
|
+
- **presentation quality:** UI/UX, visual hierarchy, accessibility, responsive design, technical writing, diagrams, or documentation;
|
|
52
|
+
- **deliverable expertise:** voice, captions, image work, presentations, or publishing when the brief actually needs them.
|
|
53
|
+
|
|
54
|
+
This routing is a hard gate: do not draft the recording plan, visible sequence, narration intent, recipe, or recorder until every applicable domain skill has been loaded and its required task-specific references have been read. If a requested command, option, API, or behavior belongs to another installed skill, treat that skill and its cited sources as the technical authority. Verify the exact behavior in the inspected project or implementation when the documentation leaves any uncertainty. Never fill a technical gap with a plausible-looking command, option, output path, or product claim.
|
|
55
|
+
|
|
56
|
+
Use those skills to establish:
|
|
57
|
+
|
|
58
|
+
- the exact valid command and required working directory;
|
|
59
|
+
- prerequisites, configuration, credentials, devices, and expected duration;
|
|
60
|
+
- success and failure signals;
|
|
61
|
+
- files or runtime behavior that prove the claim;
|
|
62
|
+
- framework-specific actions that should or should not appear on screen.
|
|
63
|
+
|
|
64
|
+
Apply specialists only when their perspective materially affects this video. A command-only demo may need the framework skill and engineering judgment but no UI redesign. A UI walkthrough may need UI/UX and accessibility guidance in addition to the framework skill. An architecture explanation may need diagrams and software-architecture analysis without changing the application.
|
|
65
|
+
|
|
66
|
+
Then apply this skill to turn those verified facts into the visual sequence, narration intent, automation, and edit. If no suitable domain skill is installed, inspect the project and consult official primary documentation when current or uncertain facts matter. Never invent a command or expected result merely to complete a script.
|
|
67
|
+
|
|
68
|
+
Reconcile advice in this order: the user's explicit brief and scope, factual platform constraints, observable project behavior, safety and correctness, then stylistic recommendations. Clearly label an optional best practice as a recommendation; do not present it as a prerequisite. Mention the specialist skills used in the written proposal so the user can review the basis of the technical and creative decisions.
|
|
69
|
+
|
|
70
|
+
## Phase 1: propose before recording
|
|
71
|
+
|
|
72
|
+
Inspect the source project without changing it. Draft a production package and present the plan to the user before any UI automation or screen recording. The proposal must include:
|
|
73
|
+
|
|
74
|
+
1. the exact initial frame and preparation that will remain outside the video;
|
|
75
|
+
2. every visible action in order, including commands exactly as typed;
|
|
76
|
+
3. the proof shown after each meaningful action;
|
|
77
|
+
4. estimated visual timing and narration beats;
|
|
78
|
+
5. files that will be generated and files that will remain untouched;
|
|
79
|
+
6. cleanup behavior and any external cost, login, device, or permission dependency.
|
|
80
|
+
|
|
81
|
+
Shape the proposal as a short story: establish what exists before the command, show the action without wasted motion, prove the promised result, and finish on the strongest useful frame. Every spoken claim must have matching visual evidence. Remove dead time, redundant file browsing, terminal noise, and actions that do not advance the demonstration. Narration explains meaning while the image supplies evidence; it should not mechanically read filenames already visible.
|
|
82
|
+
|
|
83
|
+
Use a beat table with these columns unless the user requests another format: `Beat`, `Estimated time`, `On screen`, `Operator action`, `Narration intent`, and `Proof/exit condition`. Follow it with the proposed exact command text, initial-frame checklist, expected generated artifacts, and open questions or risks.
|
|
84
|
+
|
|
85
|
+
Write the draft `recording-plan.md` and recipe/recorder files when the user asked to create the production package, but mark them as draft. Then stop and request review. Approval of the concept is not approval to begin recording.
|
|
86
|
+
|
|
87
|
+
Read [references/story-direction.md](references/story-direction.md) when drafting or revising the proposal. Read [references/package-contract.md](references/package-contract.md) when creating the package. Read [references/recording-workflow.md](references/recording-workflow.md) before generating or running macOS/VS Code automation. Also read [references/vscode-default-profile.md](references/vscode-default-profile.md), load an approved workstation profile when one exists, and preserve its calibrated layout across takes. When none exists, calibrate once outside capture and save the resulting values with the production package.
|
|
88
|
+
|
|
89
|
+
## Phase 2: generate the reproducible package
|
|
90
|
+
|
|
91
|
+
After the plan is approved, generate one permanent recorder and its data under the episode's `production/` subfolder. Build the recorder from reusable primitives in `scripts/recording_runtime.py`, but copy that runtime into the production package so recreation does not depend on this installed skill or its future version. Reserve the episode root for the final upload-ready MP4, external SRT, and one publishing-metadata document.
|
|
92
|
+
|
|
93
|
+
The recorder must:
|
|
94
|
+
|
|
95
|
+
- accept or derive the source project path without embedding a random temporary path;
|
|
96
|
+
- create a fresh disposable copy for every take unless the workflow genuinely requires the original; select a short, dedicated copies directory from the recipe, `TECHNICAL_DEMO_COPIES_ROOT`, or the runtime default, append a random slug, and keep helpers in a separate system-temp directory so printed absolute paths remain readable;
|
|
97
|
+
- verify preconditions before opening applications;
|
|
98
|
+
- prepare the initial frame before capture begins;
|
|
99
|
+
- identify and assert the exact target window before every UI action block;
|
|
100
|
+
- record real event timestamps from the same clock as capture;
|
|
101
|
+
- refuse to overwrite existing recordings or user-provided audio;
|
|
102
|
+
- let validation-only checks inspect draft, approved, and finalized packages, while allowing a real capture only when the recipe is explicitly approved and its timing is ready;
|
|
103
|
+
- stop capture before closing the project window;
|
|
104
|
+
- close only the window it opened and remove all temporary copies and helpers in `finally` cleanup.
|
|
105
|
+
|
|
106
|
+
For VS Code captures, make the accepted workstation-profile preparation part of every generated recorder. Project-specific recipes begin after that common preparation and contain only the actions that tell the episode's story. Store display selection, logical geometry, shortcuts, terminal-divider coordinates, and panel behavior as profile data rather than scattering machine-specific values through the recorder.
|
|
107
|
+
|
|
108
|
+
Retakes modify the same permanent recorder or declarative recipe. Names such as `take-02` identify output media, never different throwaway automation scripts.
|
|
109
|
+
|
|
110
|
+
## Phase 3: announce and capture
|
|
111
|
+
|
|
112
|
+
Immediately before a real capture, send a commentary message beginning with `🎬` that says recording is about to start and asks the user not to move the mouse or keyboard. Allow a short visible lead time before starting. Never begin a capture in the same tool call that first announces it.
|
|
113
|
+
|
|
114
|
+
Do all setup outside the recording: open the isolated project window, arrange panels, open the terminal, choose the correct device or simulator state, and remove Welcome or unrelated tabs. Capture only the approved sequence. Do not introduce extra pauses merely to fit provisional narration.
|
|
115
|
+
|
|
116
|
+
When a simulator or emulator is needed only for a later proof beat, boot it, wait for readiness, warm the build, and terminate any previously running copy of the demonstrated app without activating the simulator window. Bring that app to the foreground only at the scheduled recorded action. This keeps preparation invisible and avoids leaving an old runtime state on screen.
|
|
117
|
+
|
|
118
|
+
After capture, perform only inexpensive structural checks: confirm that capture exited, the video and event log exist, and the disposable copy was removed. Then ask the user how the take looked before extracting frames, building contact sheets, transcribing, or performing detailed visual analysis. The user watched the live sequence and is the primary first reviewer.
|
|
119
|
+
|
|
120
|
+
Inspect frames only when the user requests it, reports a specific problem that needs diagnosis, or could not watch the take. Correct confirmed automation defects by editing the same recorder and creating a new take. Do not generate final narration for a rejected take.
|
|
121
|
+
|
|
122
|
+
## Phase 4: narration and delivery
|
|
123
|
+
|
|
124
|
+
Choose the timing authority explicitly. The default is capture-first: write narration after an accepted visual sequence, derive cue boundaries from its event log, then create narration text, cue JSON, and external SRT. When the user wants an externally generated voice track to determine the video duration, use audio-first instead: approve final narration before capture, preserve ordinary paragraph breaks, measure the returned audio, and only then lock and execute the visual recipe. Keep an audio-first recipe in draft until those measurements exist.
|
|
125
|
+
|
|
126
|
+
For voice-generator input, use fluent prose and normal paragraph breaks by default. Do not inject pause-control tags such as `[short pause]`, `[pause]`, `[long pause]`, or SSML `<break>` unless the user explicitly requests provider-specific pause markup. Do not burn subtitles into the image unless explicitly requested.
|
|
127
|
+
|
|
128
|
+
If the user generates voice audio in an external service, preserve the original file. Align speech blocks to cues without stretching the voice, and report a paragraph/block mismatch rather than guessing. Creating paid audio or using an external account requires the user's authorization.
|
|
129
|
+
|
|
130
|
+
Measure the first and last audible speech in the returned audio instead of relying only on the container duration. Unless the brief specifies otherwise, allow roughly 0.35 seconds before the first spoken word and 1.5 seconds after the last spoken word, with a normal acceptable post-roll range of 1–2 seconds. Count silence already present in the audio toward those margins, avoid doubling it, and never use `-shortest` when it would remove the clean final frame. Read [references/audio-timing.md](references/audio-timing.md) before timing or assembling narration.
|
|
131
|
+
|
|
132
|
+
Do not settle for placing the complete narration track under the capture when the spoken paragraphs and visible actions drift apart. After the take is accepted, compare every narration paragraph with its intended event and perform block-level editorial alignment whenever needed: preserve every spoken sample unchanged, trim only surplus silence at known paragraph boundaries, and place each paragraph against the action or proof it explains. Adjust visual holds or cuts when that produces the more natural result; never create one conspicuous pause to absorb a distributed timing mismatch. Record the source and final ranges in the cue sheet or recording plan so the edit is reproducible. If paragraph boundaries cannot be identified confidently, stop and report the mismatch instead of cutting through speech.
|
|
133
|
+
|
|
134
|
+
Verify the final video visually and audibly. Review the beginning, every paragraph transition, every command/result beat, and the ending rather than checking duration alone. Keep a clean final frame after the last spoken line. Preserve the complete reproducible package and remove only intermediates identified by the package contract.
|
|
135
|
+
|
|
136
|
+
Before naming any render `<slug>-final.mp4`, read [references/youtube-master.md](references/youtube-master.md), verify its time-sensitive defaults against current official YouTube upload guidance, and pass its delivery-master quality gate. A stream-copied mux is a review preview, not a final upload file. Validate resolution, constant frame rate, bitrate, H.264 profile, pixel format, BT.709 metadata, AAC sample rate, and fast-start layout; never infer quality from the `.mp4` extension or 4K dimensions alone.
|
|
137
|
+
|
|
138
|
+
Use `scripts/events_to_cues.py` to normalize a completed event log. The generated SRT must reflect final audio alignment rather than estimated plan timings.
|
|
139
|
+
|
|
140
|
+
When the user requests a vertical or social-media derivative, read [references/vertical-social-video.md](references/vertical-social-video.md). Keep it opt-in: do not reframe a horizontal master or burn dynamic captions merely because social delivery might be useful later.
|
|
141
|
+
|
|
142
|
+
When the user requests titles, descriptions, keywords, hashtags, upload settings, or a complete social publishing handoff, read [references/publishing-metadata.md](references/publishing-metadata.md). Browse current official platform documentation because these recommendations and limits change, then create one clearly grouped metadata document for each episode.
|
|
143
|
+
|
|
144
|
+
When the user requests automated YouTube upload, playlist placement, captions, scheduling, or metadata publication, read [references/youtube-publishing.md](references/youtube-publishing.md). Before generating the upload manifest or dry run, present a publishing-target table containing the expected channel ID/name, either an exact playlist ID/name or an explicit `none`, privacy/schedule, captions, and thumbnail. Do not infer “no playlist” from silence. If the user does not know the IDs, request authorization to run `scripts/youtube_publish.py --inspect-account` and present the authenticated channel and available playlists without uploading. Wait for the user to approve these choices.
|
|
145
|
+
|
|
146
|
+
Then generate the production manifest and run a dry run with `scripts/youtube_publish.py`. Present its exact target, operations, hashes, and confirmation token. A real API upload is a separate external mutation: wait for explicit authorization that refers to the reviewed dry run, then pass its token through `--confirm-plan`. The script must verify that OAuth exposes `expectedChannelId` before performing `videos.insert`. Default new uploads to private, never invent a playlist ID, and preserve an upload receipt so retries do not create duplicate videos.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Technical Demo Videos"
|
|
3
|
+
short_description: "Plan and produce reproducible technical screen demos"
|
|
4
|
+
default_prompt: "Use $technical-demo-videos to create a reviewable recording plan and reproducible production package for this technical demo. Do not record until I approve the plan."
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "technical-demo-videos",
|
|
3
|
+
"note": "Cross-domain planning evals written when a project-specific production workflow was generalized. These prompts are review fixtures, not claims of completed recordings or measured results.",
|
|
4
|
+
"evals": [
|
|
5
|
+
{
|
|
6
|
+
"id": 0,
|
|
7
|
+
"name": "node-cli-capture-plan",
|
|
8
|
+
"prompt": "Take /workspace/json-pretty-cli and make a short VS Code video showing npm test, then formatting fixtures/input.json with node bin/pretty.js. Show the output file and give me the recording plan before touching the UI.",
|
|
9
|
+
"fixture_spec": "A small Node.js CLI repository with package.json, bin/pretty.js, test/pretty.test.js and fixtures/input.json. It has no video conventions or workstation-specific paths.",
|
|
10
|
+
"expected_output": "Inspects the project and applicable Node documentation, proposes the exact initial frame, command sequence, visible proof, narration beats, disposable-copy location and cleanup, then waits for approval without recording.",
|
|
11
|
+
"assertions": [
|
|
12
|
+
"Does not start UI automation or recording before approval",
|
|
13
|
+
"Uses the exact project path and verified commands instead of framework assumptions",
|
|
14
|
+
"Shows both test success and the formatted output as separate proof beats",
|
|
15
|
+
"Keeps workstation geometry and disposable-copy root configurable",
|
|
16
|
+
"Names the production artifacts and cleanup behavior"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": 1,
|
|
21
|
+
"name": "web-app-runtime-proof",
|
|
22
|
+
"prompt": "Plan a tutorial from /workspace/inventory-web that starts its dev server, changes the stock filter in VS Code, and proves the result in the browser. I want English narration and selectable captions.",
|
|
23
|
+
"fixture_spec": "A Vite web application with a documented npm run dev command, a StockFilter component and local fixture data. The browser can be opened without authentication or network access.",
|
|
24
|
+
"expected_output": "Loads appropriate web/UI expertise, proposes a deterministic server-readiness check and browser proof, keeps setup outside capture, and separates narration source from SRT spelling.",
|
|
25
|
+
"assertions": [
|
|
26
|
+
"Routes technical claims through applicable domain skills or primary project documentation",
|
|
27
|
+
"Waits for observable server readiness instead of a long arbitrary sleep",
|
|
28
|
+
"Defines the browser state that proves the filter works",
|
|
29
|
+
"Keeps English voice text and selectable captions as separate artifacts",
|
|
30
|
+
"Does not publish or create paid voice audio without authorization"
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": 2,
|
|
35
|
+
"name": "retake-audio-alignment",
|
|
36
|
+
"prompt": "The take is good, but paragraph three says the build completed before the terminal reaches Finished. Fix the same recorder, keep my original voice file, and make take 2.",
|
|
37
|
+
"fixture_spec": "An approved technical-video package with recording plan, permanent recorder, take-01 MOV, event log, paragraph-based narration, original external voice MP3 and cue sheet.",
|
|
38
|
+
"expected_output": "Edits the permanent recipe rather than creating a throwaway script, preserves the supplied audio, records take 2 after a clapperboard warning, asks for the live review, and performs block-level alignment only after acceptance.",
|
|
39
|
+
"assertions": [
|
|
40
|
+
"Modifies the permanent recorder or recipe instead of creating a take-specific automation script",
|
|
41
|
+
"Never overwrites take 1 or the supplied audio",
|
|
42
|
+
"Announces the real capture with a clapperboard in a separate update",
|
|
43
|
+
"Uses actual event timing for the Finished beat",
|
|
44
|
+
"Keeps a clean post-roll and does not use one unrelated long pause to absorb drift"
|
|
45
|
+
]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": 3,
|
|
49
|
+
"name": "youtube-channel-playlist-targeting",
|
|
50
|
+
"prompt": "Upload the approved final video to my YouTube tutorials playlist. I have several channels and do not know the channel or playlist IDs yet.",
|
|
51
|
+
"fixture_spec": "An approved production package with final MP4, SRT, publishing metadata, OAuth client file, and token path. No channel or playlist ID has been selected.",
|
|
52
|
+
"expected_output": "Requests authorization for read-only account inspection, presents the authenticated channels and playlists, obtains an explicit channel/playlist/privacy/captions/thumbnail decision, runs a dry run, and waits for separate approval before executing with its confirmation token.",
|
|
53
|
+
"assertions": [
|
|
54
|
+
"Does not infer a channel or playlist from its visible name",
|
|
55
|
+
"Does not treat silence as approval to leave the video out of playlists",
|
|
56
|
+
"Inspects the OAuth account without uploading when IDs are unknown",
|
|
57
|
+
"Verifies expectedChannelId before videos.insert",
|
|
58
|
+
"Requires approval of the exact dry-run token before upload"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Narration entrance, exit, and visual timing
|
|
2
|
+
|
|
3
|
+
Read this before aligning returned narration audio or deciding the final video duration.
|
|
4
|
+
|
|
5
|
+
## Measure audible speech
|
|
6
|
+
|
|
7
|
+
Inspect three different values:
|
|
8
|
+
|
|
9
|
+
1. the audio container duration;
|
|
10
|
+
2. the first audible spoken sample;
|
|
11
|
+
3. the last audible spoken sample.
|
|
12
|
+
|
|
13
|
+
Use silence detection as a measurement aid, then associate speech blocks with the known narration paragraphs. Do not assume every detected pause is a paragraph boundary; voices may pause naturally around punctuation or spelled product names.
|
|
14
|
+
|
|
15
|
+
## Default margins
|
|
16
|
+
|
|
17
|
+
- Aim for about `0.35 s` of visual lead-in before the first spoken word. A practical range is `0.25–0.50 s` for a short technical video.
|
|
18
|
+
- Aim for `1.5 s` of clean visual post-roll after the last spoken word. A range of `1–2 s` is normally appropriate.
|
|
19
|
+
- Count existing leading or trailing silence in the returned audio toward those margins. Do not add the same cushion twice.
|
|
20
|
+
- Base the final video duration on the last audible speech plus post-roll, not simply on the audio container duration.
|
|
21
|
+
|
|
22
|
+
Distribute additional visual time across the matching narration beats. Do not hide a duration mismatch by adding one unrelated pause before the command or by holding a source preview longer than its spoken explanation.
|
|
23
|
+
|
|
24
|
+
Preserve the original narration file. Do not time-stretch it unless the user explicitly requests that treatment. When muxing, do not use `-shortest` if it would cut the final visual margin.
|
|
25
|
+
|
|
26
|
+
## Align paragraphs as editable blocks
|
|
27
|
+
|
|
28
|
+
Treat the narration paragraphs and their matching event-log beats as the units of the final edit. A single unedited audio track is acceptable only when those blocks already align naturally.
|
|
29
|
+
|
|
30
|
+
When they do not:
|
|
31
|
+
|
|
32
|
+
1. map each approved paragraph to its audible source range and intended visual event;
|
|
33
|
+
2. preserve the original audio file and every spoken sample;
|
|
34
|
+
3. remove only unnecessary silence between confidently identified paragraph boundaries;
|
|
35
|
+
4. position each speech block so its explanation begins with, or slightly anticipates, the corresponding visible action;
|
|
36
|
+
5. extend or trim neutral visual holds where appropriate, distributing corrections across the relevant beats;
|
|
37
|
+
6. retain natural conversational pauses and the configured lead-in and post-roll;
|
|
38
|
+
7. write the source-audio range, final-video range, and matching visual cue into the cue sheet or recording plan.
|
|
39
|
+
|
|
40
|
+
Never cut based only on generic silence detection. Confirm boundaries against the approved paragraph text, and do not split a spoken sentence or word. If the returned voice merges paragraphs or inserts ambiguous pauses, report the mismatch instead of guessing.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Production package contract
|
|
2
|
+
|
|
3
|
+
Prefer an existing project convention. Otherwise propose `demo-videos/<slug>/` beneath the project root, or an external destination when the source repository should remain untouched. Treat the episode root as the upload handoff: it contains only `<slug>-final.mp4`, `<slug>-subtitles-<language>.srt`, `<slug>-publishing-metadata.md`, and the `production/` subfolder.
|
|
4
|
+
|
|
5
|
+
## Draft and source files
|
|
6
|
+
|
|
7
|
+
- `production/recording-plan.md`: human-readable approved story, initial frame, visible actions, proof, timing intent, narration beats, risks, and cleanup.
|
|
8
|
+
- `production/<slug>-recording.json`: machine-readable values and ordered actions when the recorder is data-driven.
|
|
9
|
+
- `production/record-<slug>.py`: permanent entry point for rehearsals, retakes, and recreation.
|
|
10
|
+
- `production/recording_runtime.py`: copied reusable automation primitives, pinned with the package.
|
|
11
|
+
|
|
12
|
+
The recorder and recipe are source artifacts. A take number never appears in their filenames. Choose the next take number after the highest take already present in `production/`; do not reuse gaps left by rejected or archived takes.
|
|
13
|
+
|
|
14
|
+
## Capture and delivery files
|
|
15
|
+
|
|
16
|
+
- `production/<slug>-take-01.mov`: raw capture; increment for a retake and never overwrite.
|
|
17
|
+
- `production/<slug>-take-01-events.json`: actual monotonic timestamps for the matching capture.
|
|
18
|
+
- `production/<slug>-cues.json`: normalized visual and narration intervals for the accepted take.
|
|
19
|
+
- `production/<slug>-narration-<language>.txt`: text sent to the voice generator.
|
|
20
|
+
- `production/` keeps the original returned audio, with its provider filename preserved when useful.
|
|
21
|
+
- `<slug>-subtitles-<language>.srt`: selectable upload-ready captions in the episode root.
|
|
22
|
+
- `<slug>-final.mp4`: synchronized delivery master that passed the YouTube master quality gate; a stream-copied review preview does not qualify.
|
|
23
|
+
- `<slug>-publishing-metadata.md`: copy-ready YouTube, TikTok and Instagram metadata plus upload settings in the episode root.
|
|
24
|
+
|
|
25
|
+
Use names appropriate to the project when it already has a convention. The essential rule is that each media file can be traced to the recorder version, recipe, and event log that produced it.
|
|
26
|
+
|
|
27
|
+
## Temporary material
|
|
28
|
+
|
|
29
|
+
Disposable project copies, compiled click helpers, diagnostic screenshots, extracted frames, split audio blocks, proxy files, and rejected render intermediates are temporary. Create them in a uniquely named temporary directory and remove that exact directory after verification or failure.
|
|
30
|
+
|
|
31
|
+
Remove caches and Finder metadata such as `__pycache__/` and `.DS_Store` from the episode root before handoff. They are neither publication files nor production sources.
|
|
32
|
+
|
|
33
|
+
Never delete source projects, accepted takes, user-provided audio, or an existing artifact merely to reuse its filename.
|