Skip to content

Commit 1370212

Browse files
committed
Remove the stale virus-scan surface and lock the pack back to 4 skills
The compatibility alias solved a temporary external mismatch, but the desired steady state is a canonical 4-skill pack with no `virus-scan` surface at all. This removes the alias from the repo, README, and manifest, and adds a README check in CI so the public GitHub surface stays aligned with the canonical pack inventory. Constraint: Make the pack production-ready without reintroducing unnecessary alias or compatibility complexity Rejected: Keep virus-scan as a permanent alias | adds long-term drift surface the user explicitly does not want Confidence: high Scope-risk: moderate Reversibility: clean Directive: Treat the 4 canonical skills as the pack API; if a compatibility alias is ever reintroduced, it should be explicitly time-bounded and removed once external drift is resolved Tested: Local `npx skills add . --list --full-depth`; local isolated `--all` install from repo path; local README/manifest sync check Not-tested: External skills.sh cache refresh timing after push; GitHub Actions execution after push
1 parent b504ebb commit 1370212

5 files changed

Lines changed: 34 additions & 106 deletions

File tree

.github/workflows/verify-pack.yml

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -77,32 +77,8 @@ jobs:
7777
}
7878
}
7979
80-
for (const alias of manifest.aliases ?? []) {
81-
if (!alias.name || !alias.path || !alias.replaced_by) {
82-
fail(`Alias entry is missing required fields: ${JSON.stringify(alias)}`);
83-
}
84-
if (seenNames.has(alias.name)) {
85-
fail(`Duplicate manifest entry for alias: ${alias.name}`);
86-
}
87-
if (!alias.deprecated) {
88-
fail(`Alias ${alias.name} must be marked deprecated.`);
89-
}
90-
if (!canonicalNames.has(alias.replaced_by)) {
91-
fail(`Alias ${alias.name} points to missing replacement target: ${alias.replaced_by}`);
92-
}
93-
seenNames.add(alias.name);
94-
const aliasPath = path.resolve(alias.path);
95-
const aliasFile = path.join(aliasPath, "SKILL.md");
96-
if (!fs.existsSync(aliasPath) || !fs.statSync(aliasPath).isDirectory()) {
97-
fail(`Alias path does not exist: ${alias.path}`);
98-
}
99-
if (!fs.existsSync(aliasFile)) {
100-
fail(`Alias is missing SKILL.md: ${alias.path}`);
101-
}
102-
const frontmatterName = readFrontmatterName(aliasFile);
103-
if (frontmatterName !== alias.name) {
104-
fail(`Manifest alias/path mismatch for ${alias.name}; SKILL.md declares ${frontmatterName}`);
105-
}
80+
if (manifest.aliases && !Array.isArray(manifest.aliases)) {
81+
fail("Manifest aliases must be an array when present.");
10682
}
10783
'
10884
@@ -113,16 +89,21 @@ jobs:
11389
OUTPUT="$OUTPUT" node -e '
11490
const fs = require("fs");
11591
const manifest = JSON.parse(fs.readFileSync("skills-pack.json", "utf8"));
116-
const names = [
117-
...manifest.skills.map((skill) => skill.name),
118-
...(manifest.aliases ?? []).map((skill) => skill.name),
119-
];
92+
const names = manifest.skills.map((skill) => skill.name);
12093
const output = process.env.OUTPUT ?? "";
12194
const missing = names.filter((name) => !output.includes(name));
12295
if (missing.length) {
12396
console.error("Missing skills in discovery output:", missing.join(", "));
12497
process.exit(1);
12598
}
99+
const unexpected = (output.match(/^\s*[A-Za-z0-9-]+$/gm) ?? [])
100+
.map((line) => line.trim())
101+
.filter((line) => line && !["Available Skills", "Use --skill <name> to install specific skills"].includes(line))
102+
.filter((line) => !names.includes(line));
103+
if (unexpected.length) {
104+
console.error("Unexpected skills in discovery output:", unexpected.join(", "));
105+
process.exit(1);
106+
}
126107
'
127108
128109
- name: Verify isolated --all install
@@ -137,10 +118,7 @@ jobs:
137118
const fs = require("fs");
138119
const path = require("path");
139120
const manifest = JSON.parse(fs.readFileSync("skills-pack.json", "utf8"));
140-
const expected = [
141-
...manifest.skills.map((skill) => skill.name),
142-
...(manifest.aliases ?? []).map((skill) => skill.name),
143-
].sort();
121+
const expected = manifest.skills.map((skill) => skill.name).sort();
144122
const installedDir = path.join(process.env.TMP_DIR, ".agents", "skills");
145123
const installed = fs.readdirSync(installedDir, { withFileTypes: true })
146124
.filter((entry) => entry.isDirectory())
@@ -154,12 +132,26 @@ jobs:
154132
}
155133
'
156134
157-
- name: Verify deprecated alias install path still works
158-
env:
159-
PACK_SOURCE: ${{ github.workspace }}
135+
- name: Verify README stays aligned with canonical skills
160136
run: |
161-
TMP_DIR="$(mktemp -d)"
162-
pushd "$TMP_DIR" >/dev/null
163-
npx skills add "$PACK_SOURCE" -y --agent codex --skill virus-scan --copy
164-
popd >/dev/null
165-
test -f "$TMP_DIR/.agents/skills/virus-scan/SKILL.md"
137+
node -e '
138+
const fs = require("fs");
139+
const manifest = JSON.parse(fs.readFileSync("skills-pack.json", "utf8"));
140+
const readme = fs.readFileSync("README.md", "utf8");
141+
for (const skill of manifest.skills) {
142+
const installNeedle = `--skill ${skill.name}`;
143+
const commandNeedle = `\`$${skill.name}\``;
144+
if (!readme.includes(installNeedle)) {
145+
console.error(`README is missing install command for ${skill.name}`);
146+
process.exit(1);
147+
}
148+
if (!readme.includes(commandNeedle)) {
149+
console.error(`README is missing command table entry for ${skill.name}`);
150+
process.exit(1);
151+
}
152+
}
153+
if (readme.includes("virus-scan")) {
154+
console.error("README still contains removed skill name: virus-scan");
155+
process.exit(1);
156+
}
157+
'

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ npx skills add https://github.com/jasperdevs/computer-doctor --skill computer-do
1818
npx skills add https://github.com/jasperdevs/computer-doctor --skill security-scan
1919
npx skills add https://github.com/jasperdevs/computer-doctor --skill devtools-audit
2020
npx skills add https://github.com/jasperdevs/computer-doctor --skill update-audit
21-
npx skills add https://github.com/jasperdevs/computer-doctor --skill virus-scan
2221
```
2322

2423
</details>
@@ -31,7 +30,6 @@ npx skills add https://github.com/jasperdevs/computer-doctor --skill virus-scan
3130
| `$security-scan` | Endpoint protection, firewall status, suspicious processes, persistence, autoruns, risky permissions, and obvious malware signals. | [open](https://skills.sh/jasperdevs/computer-doctor/security-scan) |
3231
| `$devtools-audit` | PATH problems, shell setup, runtimes, SDKs, package managers, Git tooling, and dead or conflicting installs. | [open](https://skills.sh/jasperdevs/computer-doctor/devtools-audit) |
3332
| `$update-audit` | OS updates, outdated apps, drivers where visible, runtimes, package managers, and better replacement choices. | [open](https://skills.sh/jasperdevs/computer-doctor/update-audit) |
34-
| `$virus-scan` | Deprecated compatibility alias for `$security-scan`. Keep using it only if you still rely on the old command name. | [open](https://skills.sh/jasperdevs/computer-doctor/virus-scan) |
3533

3634
The canonical pack surface is tracked in [skills-pack.json](./skills-pack.json).
3735

skills-pack.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,5 @@
1818
"name": "update-audit",
1919
"path": "skills/update-audit"
2020
}
21-
],
22-
"aliases": [
23-
{
24-
"name": "virus-scan",
25-
"path": "skills/virus-scan",
26-
"deprecated": true,
27-
"replaced_by": "security-scan"
28-
}
2921
]
3022
}

skills/virus-scan/SKILL.md

Lines changed: 0 additions & 50 deletions
This file was deleted.

skills/virus-scan/agents/openai.yaml

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)