Rename the portable conversation-shortcut skill from agent-shortcuts to shortcuts and re-prefix every token to soc* (sobu, soco, socobu, socon, sona, sote) so each token mirrors its command and never places two consonants next to each other. make install and make project now also register the caveman and ponytail marketplaces and enable both plugins in the target's .claude/settings.json so their SessionStart hooks activate every session; the merge is non-destructive, idempotent, and leaves an unparseable settings.json untouched. - skills/shortcuts/SKILL.md: new name and soc* token table - tests/test_shortcuts.py: assert present, sorted, soc-prefixed, no cluster - remove skills/agent-shortcuts and tests/test_agent_shortcuts.py - scripts/enable-plugins.js: node JSON merge helper - scripts/install.sh: run the helper after copying skills - README.md: document the auto-enable behavior Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
43 lines
1.4 KiB
JavaScript
43 lines
1.4 KiB
JavaScript
#!/usr/bin/env node
|
|
// Enable the caveman and ponytail plugins in a Claude Code settings.json so
|
|
// their SessionStart hooks auto-activate both modes. Merges non-destructively:
|
|
// existing marketplaces and enabled plugins are preserved, unparseable files
|
|
// are left untouched.
|
|
"use strict";
|
|
|
|
const fs = require("fs");
|
|
|
|
const settingsPath = process.argv[2];
|
|
if (!settingsPath) {
|
|
console.error("usage: enable-plugins.js <settings.json>");
|
|
process.exit(2);
|
|
}
|
|
|
|
const MARKETPLACES = {
|
|
caveman: { source: { source: "github", repo: "JuliusBrussee/caveman" } },
|
|
ponytail: { source: { source: "github", repo: "DietrichGebert/ponytail" } },
|
|
};
|
|
const PLUGINS = { "caveman@caveman": true, "ponytail@ponytail": true };
|
|
|
|
let data = {};
|
|
if (fs.existsSync(settingsPath)) {
|
|
const raw = fs.readFileSync(settingsPath, "utf8").trim();
|
|
if (raw) {
|
|
try {
|
|
data = JSON.parse(raw);
|
|
} catch (err) {
|
|
console.error(`skills: ${settingsPath} is not valid JSON; leaving it untouched (${err.message}).`);
|
|
process.exit(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
data.extraKnownMarketplaces = data.extraKnownMarketplaces || {};
|
|
for (const [name, entry] of Object.entries(MARKETPLACES)) {
|
|
if (!data.extraKnownMarketplaces[name]) data.extraKnownMarketplaces[name] = entry;
|
|
}
|
|
data.enabledPlugins = Object.assign(data.enabledPlugins || {}, PLUGINS);
|
|
|
|
fs.writeFileSync(settingsPath, JSON.stringify(data, null, 2) + "\n");
|
|
console.log(`skills: enabled caveman + ponytail plugins in ${settingsPath}`);
|