mewkit 1.6.8 → 1.7.1
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/package.json +10 -2
- package/dist/commands/budget.d.ts +0 -6
- package/dist/commands/budget.d.ts.map +0 -1
- package/dist/commands/budget.js +0 -95
- package/dist/commands/budget.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -4
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -365
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/init.d.ts +0 -7
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -309
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -9
- package/dist/commands/memory.d.ts.map +0 -1
- package/dist/commands/memory.js +0 -217
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -16
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -413
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/task.d.ts +0 -10
- package/dist/commands/task.d.ts.map +0 -1
- package/dist/commands/task.js +0 -313
- package/dist/commands/task.js.map +0 -1
- package/dist/commands/upgrade.d.ts +0 -7
- package/dist/commands/upgrade.d.ts.map +0 -1
- package/dist/commands/upgrade.js +0 -143
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/validate.d.ts +0 -2
- package/dist/commands/validate.d.ts.map +0 -1
- package/dist/commands/validate.js +0 -139
- package/dist/commands/validate.js.map +0 -1
- package/dist/core/compute-checksums.d.ts +0 -25
- package/dist/core/compute-checksums.d.ts.map +0 -1
- package/dist/core/compute-checksums.js +0 -105
- package/dist/core/compute-checksums.js.map +0 -1
- package/dist/core/core-logger.d.ts +0 -9
- package/dist/core/core-logger.d.ts.map +0 -1
- package/dist/core/core-logger.js +0 -31
- package/dist/core/core-logger.js.map +0 -1
- package/dist/core/dependency-installer.d.ts +0 -29
- package/dist/core/dependency-installer.d.ts.map +0 -1
- package/dist/core/dependency-installer.js +0 -150
- package/dist/core/dependency-installer.js.map +0 -1
- package/dist/core/github-releases.d.ts +0 -32
- package/dist/core/github-releases.d.ts.map +0 -1
- package/dist/core/github-releases.js +0 -96
- package/dist/core/github-releases.js.map +0 -1
- package/dist/core/index.d.ts +0 -12
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -12
- package/dist/core/index.js.map +0 -1
- package/dist/core/merge-settings.d.ts +0 -7
- package/dist/core/merge-settings.d.ts.map +0 -1
- package/dist/core/merge-settings.js +0 -131
- package/dist/core/merge-settings.js.map +0 -1
- package/dist/core/skills-dependencies.d.ts +0 -25
- package/dist/core/skills-dependencies.d.ts.map +0 -1
- package/dist/core/skills-dependencies.js +0 -100
- package/dist/core/skills-dependencies.js.map +0 -1
- package/dist/core/smart-update-utils.d.ts +0 -10
- package/dist/core/smart-update-utils.d.ts.map +0 -1
- package/dist/core/smart-update-utils.js +0 -61
- package/dist/core/smart-update-utils.js.map +0 -1
- package/dist/core/smart-update.d.ts +0 -18
- package/dist/core/smart-update.d.ts.map +0 -1
- package/dist/core/smart-update.js +0 -177
- package/dist/core/smart-update.js.map +0 -1
- package/dist/core/substitute-placeholders.d.ts +0 -11
- package/dist/core/substitute-placeholders.d.ts.map +0 -1
- package/dist/core/substitute-placeholders.js +0 -28
- package/dist/core/substitute-placeholders.js.map +0 -1
- package/dist/core/validate-install.d.ts +0 -6
- package/dist/core/validate-install.d.ts.map +0 -1
- package/dist/core/validate-install.js +0 -97
- package/dist/core/validate-install.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -153
- package/dist/index.js.map +0 -1
- package/dist/lib/system-deps-registry.d.ts +0 -117
- package/dist/lib/system-deps-registry.d.ts.map +0 -1
- package/dist/lib/system-deps-registry.js +0 -234
- package/dist/lib/system-deps-registry.js.map +0 -1
- package/dist/logger.d.ts +0 -26
- package/dist/logger.js +0 -70
- package/dist/logger.js.map +0 -1
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync, statSync, accessSync, constants } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import pc from "picocolors";
|
|
4
|
-
function check(label, pass, issues) {
|
|
5
|
-
if (pass) {
|
|
6
|
-
console.log(` ${pc.green("PASS")} ${label}`);
|
|
7
|
-
}
|
|
8
|
-
else {
|
|
9
|
-
console.log(` ${pc.red("FAIL")} ${label}`);
|
|
10
|
-
issues.push(label);
|
|
11
|
-
}
|
|
12
|
-
return pass;
|
|
13
|
-
}
|
|
14
|
-
/** Counts .md files in a directory (non-recursive) */
|
|
15
|
-
function countMdFiles(dir) {
|
|
16
|
-
if (!existsSync(dir))
|
|
17
|
-
return 0;
|
|
18
|
-
try {
|
|
19
|
-
return readdirSync(dir).filter((f) => f.endsWith(".md")).length;
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return 0;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/** Counts subdirectories in a directory */
|
|
26
|
-
function countSubdirs(dir) {
|
|
27
|
-
if (!existsSync(dir))
|
|
28
|
-
return 0;
|
|
29
|
-
try {
|
|
30
|
-
return readdirSync(dir).filter((f) => {
|
|
31
|
-
try {
|
|
32
|
-
return statSync(join(dir, f)).isDirectory();
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
}).length;
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return 0;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export function validate(targetDir) {
|
|
44
|
-
const issues = [];
|
|
45
|
-
const claude = join(targetDir, ".claude");
|
|
46
|
-
console.log(pc.bold("\nValidation Results:"));
|
|
47
|
-
// Core structure
|
|
48
|
-
check(".claude/ directory exists", existsSync(claude), issues);
|
|
49
|
-
check("CLAUDE.md exists", existsSync(join(targetDir, "CLAUDE.md")), issues);
|
|
50
|
-
check("meowkit.config.json exists", existsSync(join(claude, "meowkit.config.json")), issues);
|
|
51
|
-
// Agents (expect 10+ from real system)
|
|
52
|
-
const agentCount = countMdFiles(join(claude, "agents"));
|
|
53
|
-
check(`Agents: ${agentCount} files (need 10+)`, agentCount >= 10, issues);
|
|
54
|
-
// Skills (expect 30+ directories)
|
|
55
|
-
const skillCount = countSubdirs(join(claude, "skills"));
|
|
56
|
-
check(`Skills: ${skillCount} directories (need 30+)`, skillCount >= 30, issues);
|
|
57
|
-
// Commands
|
|
58
|
-
const cmdDir = join(claude, "commands");
|
|
59
|
-
const cmdExists = existsSync(cmdDir);
|
|
60
|
-
check("Commands directory exists", cmdExists, issues);
|
|
61
|
-
// Modes
|
|
62
|
-
const modeCount = countMdFiles(join(claude, "modes"));
|
|
63
|
-
check(`Modes: ${modeCount} files (need 5+)`, modeCount >= 5, issues);
|
|
64
|
-
// Rules
|
|
65
|
-
const ruleCount = countMdFiles(join(claude, "rules"));
|
|
66
|
-
check(`Rules: ${ruleCount} files (need 10+)`, ruleCount >= 10, issues);
|
|
67
|
-
// Hooks — all must be executable
|
|
68
|
-
const hooksDir = join(claude, "hooks");
|
|
69
|
-
if (existsSync(hooksDir)) {
|
|
70
|
-
const hookFiles = readdirSync(hooksDir);
|
|
71
|
-
for (const hookFile of hookFiles) {
|
|
72
|
-
const hookPath = join(hooksDir, hookFile);
|
|
73
|
-
let isExecutable = false;
|
|
74
|
-
try {
|
|
75
|
-
accessSync(hookPath, constants.X_OK);
|
|
76
|
-
isExecutable = true;
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// Not executable
|
|
80
|
-
}
|
|
81
|
-
check(`Hook ${hookFile} is executable`, isExecutable, issues);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
check("Hooks directory exists", false, issues);
|
|
86
|
-
}
|
|
87
|
-
// Scripts
|
|
88
|
-
check("Scripts directory exists", existsSync(join(claude, "scripts")), issues);
|
|
89
|
-
// Settings
|
|
90
|
-
check("settings.json exists", existsSync(join(claude, "settings.json")), issues);
|
|
91
|
-
const valid = issues.length === 0;
|
|
92
|
-
console.log(valid
|
|
93
|
-
? `\n ${pc.green(pc.bold("All checks passed"))}`
|
|
94
|
-
: `\n ${pc.red(pc.bold(`${issues.length} issue(s) found`))}`);
|
|
95
|
-
return { valid, issues };
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=validate-install.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate-install.js","sourceRoot":"","sources":["../../src/core/validate-install.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import { dirname, join } from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
import minimist from "minimist";
|
|
6
|
-
import pc from "picocolors";
|
|
7
|
-
import { init } from "./commands/init.js";
|
|
8
|
-
import { upgrade } from "./commands/upgrade.js";
|
|
9
|
-
import { validate } from "./commands/validate.js";
|
|
10
|
-
import { budget } from "./commands/budget.js";
|
|
11
|
-
import { memory } from "./commands/memory.js";
|
|
12
|
-
import { doctor } from "./commands/doctor.js";
|
|
13
|
-
import { setup } from "./commands/setup.js";
|
|
14
|
-
import { task } from "./commands/task.js";
|
|
15
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
const pkgJson = JSON.parse(fs.readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
|
|
17
|
-
const VERSION = pkgJson.version;
|
|
18
|
-
function printHelp() {
|
|
19
|
-
console.log(`
|
|
20
|
-
${pc.bold(pc.cyan("meowkit"))} ${pc.dim(`v${VERSION}`)} — MeowKit runtime CLI
|
|
21
|
-
|
|
22
|
-
${pc.bold("Usage:")}
|
|
23
|
-
meowkit <command> [options]
|
|
24
|
-
|
|
25
|
-
${pc.bold("Commands:")}
|
|
26
|
-
${pc.green("init")} Scaffold or update MeowKit in the current project
|
|
27
|
-
${pc.green("upgrade")} Upgrade MeowKit to the latest version
|
|
28
|
-
${pc.green("validate")} Validate .claude/ project structure
|
|
29
|
-
${pc.green("budget")} View token usage and cost log
|
|
30
|
-
${pc.green("memory")} Manage agent memory (lessons & patterns)
|
|
31
|
-
${pc.green("setup")} Guided post-scaffold configuration
|
|
32
|
-
${pc.green("doctor")} Diagnose common environment issues
|
|
33
|
-
${pc.green("status")} Print version and config summary
|
|
34
|
-
${pc.green("task")} Create and list task files (new, list)
|
|
35
|
-
|
|
36
|
-
${pc.bold("Options:")}
|
|
37
|
-
--help, -h Show help
|
|
38
|
-
--version, -v Show version
|
|
39
|
-
`);
|
|
40
|
-
}
|
|
41
|
-
async function printStatus() {
|
|
42
|
-
const channel = VERSION.includes("-beta") || VERSION.includes("-rc") ? "beta" : "stable";
|
|
43
|
-
console.log(`${pc.bold(pc.cyan("meowkit"))} ${pc.dim(`v${VERSION}`)} ${pc.dim(`(${channel})`)}`);
|
|
44
|
-
console.log();
|
|
45
|
-
const configPath = ".claude/meowkit.config.json";
|
|
46
|
-
try {
|
|
47
|
-
const content = fs.readFileSync(configPath, "utf-8");
|
|
48
|
-
const config = JSON.parse(content);
|
|
49
|
-
console.log(`${pc.bold("Config:")} ${configPath}`);
|
|
50
|
-
for (const [key, value] of Object.entries(config)) {
|
|
51
|
-
console.log(` ${pc.dim(key)}: ${String(value)}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
console.log(`${pc.dim("No .claude/meowkit.config.json found.")}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async function main() {
|
|
59
|
-
const args = minimist(process.argv.slice(2), {
|
|
60
|
-
boolean: [
|
|
61
|
-
"help",
|
|
62
|
-
"version",
|
|
63
|
-
"check",
|
|
64
|
-
"beta",
|
|
65
|
-
"list",
|
|
66
|
-
"monthly",
|
|
67
|
-
"clear",
|
|
68
|
-
"show",
|
|
69
|
-
"stats",
|
|
70
|
-
"report",
|
|
71
|
-
"all",
|
|
72
|
-
"dry-run",
|
|
73
|
-
"force",
|
|
74
|
-
"system-deps",
|
|
75
|
-
],
|
|
76
|
-
string: ["only", "type", "priority", "status"],
|
|
77
|
-
alias: { h: "help", v: "version" },
|
|
78
|
-
});
|
|
79
|
-
if (args.version) {
|
|
80
|
-
console.log(VERSION);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
const command = args._[0];
|
|
84
|
-
if (args.help && !command) {
|
|
85
|
-
printHelp();
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
switch (command) {
|
|
89
|
-
case "init":
|
|
90
|
-
await init({
|
|
91
|
-
dryRun: args["dry-run"],
|
|
92
|
-
force: args.force,
|
|
93
|
-
beta: args.beta,
|
|
94
|
-
});
|
|
95
|
-
break;
|
|
96
|
-
case "upgrade":
|
|
97
|
-
await upgrade({
|
|
98
|
-
check: args.check,
|
|
99
|
-
beta: args.beta,
|
|
100
|
-
list: args.list,
|
|
101
|
-
});
|
|
102
|
-
break;
|
|
103
|
-
case "validate":
|
|
104
|
-
await validate();
|
|
105
|
-
break;
|
|
106
|
-
case "budget":
|
|
107
|
-
await budget({ monthly: args.monthly });
|
|
108
|
-
break;
|
|
109
|
-
case "memory":
|
|
110
|
-
await memory({
|
|
111
|
-
clear: args.clear,
|
|
112
|
-
show: args.show,
|
|
113
|
-
stats: args.stats,
|
|
114
|
-
});
|
|
115
|
-
break;
|
|
116
|
-
case "setup":
|
|
117
|
-
await setup({ only: args.only, systemDeps: args["system-deps"] });
|
|
118
|
-
break;
|
|
119
|
-
case "doctor":
|
|
120
|
-
await doctor({ report: args.report });
|
|
121
|
-
break;
|
|
122
|
-
case "status":
|
|
123
|
-
await printStatus();
|
|
124
|
-
break;
|
|
125
|
-
case "task": {
|
|
126
|
-
const subcommand = args._[1];
|
|
127
|
-
// positional description: everything after the subcommand that isn't a flag
|
|
128
|
-
const description = args._.slice(2).join(" ");
|
|
129
|
-
task({
|
|
130
|
-
subcommand,
|
|
131
|
-
type: args.type,
|
|
132
|
-
priority: args.priority,
|
|
133
|
-
all: args.all,
|
|
134
|
-
status: args.status,
|
|
135
|
-
description: description || undefined,
|
|
136
|
-
});
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
default:
|
|
140
|
-
if (command) {
|
|
141
|
-
console.error(pc.red(`Unknown command: ${command}`));
|
|
142
|
-
console.log();
|
|
143
|
-
}
|
|
144
|
-
printHelp();
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
main().catch((error) => {
|
|
149
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
150
|
-
console.error(pc.red(`Fatal: ${message}`));
|
|
151
|
-
process.exit(1);
|
|
152
|
-
});
|
|
153
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* system-deps-registry.ts
|
|
3
|
-
*
|
|
4
|
-
* Single source of truth for installable system dependencies.
|
|
5
|
-
*
|
|
6
|
-
* WHY THIS FILE EXISTS (Q4 / locked decision #2):
|
|
7
|
-
* The mewkit CLI used to hardcode ffmpeg + imagemagick directly in setup.ts and
|
|
8
|
-
* doctor.ts. This refactor extracts them into a typed registry so:
|
|
9
|
-
* 1. Skills can declare opt-in system deps via SKILL.md metadata (schema-driven).
|
|
10
|
-
* 2. The CLI iterates the registry instead of hardcoded if/else branches.
|
|
11
|
-
* 3. New deps (e.g. playwright-chromium) are registered here — not scattered.
|
|
12
|
-
*
|
|
13
|
-
* PARSE CONTRACT (optional_system_deps HTML comment):
|
|
14
|
-
* Claude Code's native frontmatter schema does NOT support custom fields like
|
|
15
|
-
* optional_system_deps — they are silently dropped. Skills instead declare deps in
|
|
16
|
-
* a MEOWKIT METADATA HTML comment block inside SKILL.md:
|
|
17
|
-
*
|
|
18
|
-
* <!--
|
|
19
|
-
* MEOWKIT METADATA ...:
|
|
20
|
-
* optional_system_deps: [playwright-chromium]
|
|
21
|
-
* -->
|
|
22
|
-
*
|
|
23
|
-
* parseOptionalSystemDepsFromSkillMd() finds this comment and extracts the list.
|
|
24
|
-
* validateSkillDeclaredKeys() then checks each key against SYSTEM_DEPS — unknown
|
|
25
|
-
* keys are rejected so no skill can request arbitrary package installs.
|
|
26
|
-
*
|
|
27
|
-
* Playwright version: 1.58.0 (pinned from PyPI on 2026-04-09 via WebFetch).
|
|
28
|
-
*/
|
|
29
|
-
export interface DoctorContext {
|
|
30
|
-
/** Absolute path to the project root (contains .claude/) */
|
|
31
|
-
projectRoot: string;
|
|
32
|
-
}
|
|
33
|
-
export interface DoctorResult {
|
|
34
|
-
status: "OK" | "MISSING_PACKAGE" | "MISSING_BINARY" | "ERROR";
|
|
35
|
-
message?: string;
|
|
36
|
-
}
|
|
37
|
-
export interface SystemDepEntry {
|
|
38
|
-
/** Registry key — referenced in SKILL.md optional_system_deps */
|
|
39
|
-
key: string;
|
|
40
|
-
/** Human-readable name shown in prompts */
|
|
41
|
-
name: string;
|
|
42
|
-
/**
|
|
43
|
-
* Shell command whose exit code 0 means the dep is present.
|
|
44
|
-
* For PATH-based deps with a single binary (e.g. ffmpeg), this is the canonical probe.
|
|
45
|
-
* When the dep may ship under multiple binary names (e.g. ImageMagick 6 uses "convert",
|
|
46
|
-
* ImageMagick 7+ uses "magick"), use detectCommands instead.
|
|
47
|
-
*/
|
|
48
|
-
detectCommand: string;
|
|
49
|
-
/**
|
|
50
|
-
* Optional fallback probes for deps that ship under multiple binary names.
|
|
51
|
-
* If ANY entry exits 0, the dep is considered present.
|
|
52
|
-
* When set, takes precedence over detectCommand for presence checks.
|
|
53
|
-
* Example: ImageMagick 6 ships "convert", IM 7+ ships "magick" (no "convert" shim).
|
|
54
|
-
*/
|
|
55
|
-
detectCommands?: string[];
|
|
56
|
-
/** Per-OS ordered list of install commands */
|
|
57
|
-
installCommands: Partial<Record<NodeJS.Platform, string[]>>;
|
|
58
|
-
/** Link shown to users when auto-install is unavailable */
|
|
59
|
-
manualUrl: string;
|
|
60
|
-
/** Approximate download size in bytes — shown as ~NMB in prompts */
|
|
61
|
-
sizeBytes: number;
|
|
62
|
-
/** Optional dedicated doctor check (overrides generic detectCommand probe) */
|
|
63
|
-
doctorCheck?: (ctx: DoctorContext) => Promise<DoctorResult>;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* All registered system dependencies.
|
|
67
|
-
* Insertion order = display order in prompts (ffmpeg, imagemagick, playwright-chromium).
|
|
68
|
-
*/
|
|
69
|
-
export declare const SYSTEM_DEPS: Record<string, SystemDepEntry>;
|
|
70
|
-
/** Return all registered entries in insertion order */
|
|
71
|
-
export declare function listDeps(): SystemDepEntry[];
|
|
72
|
-
/**
|
|
73
|
-
* Check whether a PATH-based dep's binary (or any of its aliases) is present.
|
|
74
|
-
* Uses detectCommands when set (multi-probe); falls back to single detectCommand probe.
|
|
75
|
-
*
|
|
76
|
-
* NOT suitable for venv-based deps (playwright-chromium) — callers must handle
|
|
77
|
-
* those separately (detectCommand includes ".venv").
|
|
78
|
-
*/
|
|
79
|
-
export declare function isDepCommandPresent(dep: SystemDepEntry, commandAvailableFn: (cmd: string) => boolean): boolean;
|
|
80
|
-
/** Look up a single entry by key */
|
|
81
|
-
export declare function getDep(key: string): SystemDepEntry | undefined;
|
|
82
|
-
/**
|
|
83
|
-
* Validate keys declared in a skill's optional_system_deps against the registry.
|
|
84
|
-
* Unknown keys are rejected to prevent skills from requesting arbitrary installs.
|
|
85
|
-
*
|
|
86
|
-
* @param declared Keys parsed from SKILL.md optional_system_deps comment
|
|
87
|
-
* @param skillName Used in warning messages for traceability
|
|
88
|
-
*/
|
|
89
|
-
export declare function validateSkillDeclaredKeys(declared: string[], skillName: string): {
|
|
90
|
-
valid: string[];
|
|
91
|
-
invalid: string[];
|
|
92
|
-
};
|
|
93
|
-
/**
|
|
94
|
-
* Parse optional_system_deps from a SKILL.md HTML comment block.
|
|
95
|
-
*
|
|
96
|
-
* PARSE CONTRACT:
|
|
97
|
-
* The parser looks for a comment starting with "MEOWKIT METADATA" and extracts
|
|
98
|
-
* the "optional_system_deps:" line from it. Handles both single-line and
|
|
99
|
-
* multi-line YAML-ish list formats:
|
|
100
|
-
*
|
|
101
|
-
* optional_system_deps: [playwright-chromium]
|
|
102
|
-
* optional_system_deps: [playwright-chromium, ffmpeg]
|
|
103
|
-
*
|
|
104
|
-
* Multi-line YAML block format (not currently used but handled):
|
|
105
|
-
* optional_system_deps:
|
|
106
|
-
* - playwright-chromium
|
|
107
|
-
*
|
|
108
|
-
* Returns an empty array if the comment or field is absent.
|
|
109
|
-
*
|
|
110
|
-
* WHY NOT NATIVE FRONTMATTER (Q4 decision):
|
|
111
|
-
* Claude Code's frontmatter schema only supports a fixed set of native fields.
|
|
112
|
-
* Custom fields like optional_system_deps are silently dropped. The HTML comment
|
|
113
|
-
* approach is the agreed MeowKit convention for skill metadata that the CLI needs
|
|
114
|
-
* but Claude Code should ignore.
|
|
115
|
-
*/
|
|
116
|
-
export declare function parseOptionalSystemDepsFromSkillMd(skillMdContent: string): string[];
|
|
117
|
-
//# sourceMappingURL=system-deps-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"system-deps-registry.d.ts","sourceRoot":"","sources":["../../src/lib/system-deps-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AASH,MAAM,WAAW,aAAa;IAC7B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,IAAI,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,OAAO,CAAC;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC9B,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5D,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5D;AAuDD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CA2DtD,CAAC;AAMF,uDAAuD;AACvD,wBAAgB,QAAQ,IAAI,cAAc,EAAE,CAE3C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAG9G;AAED,oCAAoC;AACpC,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE9D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBxC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,kCAAkC,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BnF"}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* system-deps-registry.ts
|
|
3
|
-
*
|
|
4
|
-
* Single source of truth for installable system dependencies.
|
|
5
|
-
*
|
|
6
|
-
* WHY THIS FILE EXISTS (Q4 / locked decision #2):
|
|
7
|
-
* The mewkit CLI used to hardcode ffmpeg + imagemagick directly in setup.ts and
|
|
8
|
-
* doctor.ts. This refactor extracts them into a typed registry so:
|
|
9
|
-
* 1. Skills can declare opt-in system deps via SKILL.md metadata (schema-driven).
|
|
10
|
-
* 2. The CLI iterates the registry instead of hardcoded if/else branches.
|
|
11
|
-
* 3. New deps (e.g. playwright-chromium) are registered here — not scattered.
|
|
12
|
-
*
|
|
13
|
-
* PARSE CONTRACT (optional_system_deps HTML comment):
|
|
14
|
-
* Claude Code's native frontmatter schema does NOT support custom fields like
|
|
15
|
-
* optional_system_deps — they are silently dropped. Skills instead declare deps in
|
|
16
|
-
* a MEOWKIT METADATA HTML comment block inside SKILL.md:
|
|
17
|
-
*
|
|
18
|
-
* <!--
|
|
19
|
-
* MEOWKIT METADATA ...:
|
|
20
|
-
* optional_system_deps: [playwright-chromium]
|
|
21
|
-
* -->
|
|
22
|
-
*
|
|
23
|
-
* parseOptionalSystemDepsFromSkillMd() finds this comment and extracts the list.
|
|
24
|
-
* validateSkillDeclaredKeys() then checks each key against SYSTEM_DEPS — unknown
|
|
25
|
-
* keys are rejected so no skill can request arbitrary package installs.
|
|
26
|
-
*
|
|
27
|
-
* Playwright version: 1.58.0 (pinned from PyPI on 2026-04-09 via WebFetch).
|
|
28
|
-
*/
|
|
29
|
-
import { spawnSync } from "node:child_process";
|
|
30
|
-
import path from "node:path";
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
// Registry
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
/**
|
|
35
|
-
* Dedicated Playwright doctor check (locked decision #3):
|
|
36
|
-
* Two probes — package import AND chromium binary presence.
|
|
37
|
-
* Generic detectCommand is not enough here because pip install playwright
|
|
38
|
-
* succeeds without downloading the ~130MB Chromium binary.
|
|
39
|
-
*/
|
|
40
|
-
async function playwrightDoctorCheck(ctx) {
|
|
41
|
-
const venvPython = path.join(ctx.projectRoot, ".claude", "skills", ".venv", "bin", "python3");
|
|
42
|
-
// On Windows the venv layout differs
|
|
43
|
-
const venvPythonWin = path.join(ctx.projectRoot, ".claude", "skills", ".venv", "Scripts", "python.exe");
|
|
44
|
-
const python = process.platform === "win32" ? venvPythonWin : venvPython;
|
|
45
|
-
// Probe 1: can we import playwright?
|
|
46
|
-
const importProbe = spawnSync(python, ["-c", "import playwright"], {
|
|
47
|
-
encoding: "utf-8",
|
|
48
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
49
|
-
});
|
|
50
|
-
if (importProbe.status !== 0) {
|
|
51
|
-
return {
|
|
52
|
-
status: "MISSING_PACKAGE",
|
|
53
|
-
message: "playwright Python package not installed — run: npx mewkit setup --system-deps",
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
// Probe 2: is the Chromium binary installed?
|
|
57
|
-
// playwright install --dry-run chromium exits 0 and prints "chromium" if installed
|
|
58
|
-
const venvPlaywright = process.platform === "win32"
|
|
59
|
-
? path.join(ctx.projectRoot, ".claude", "skills", ".venv", "Scripts", "playwright.exe")
|
|
60
|
-
: path.join(ctx.projectRoot, ".claude", "skills", ".venv", "bin", "playwright");
|
|
61
|
-
const dryRunProbe = spawnSync(venvPlaywright, ["install", "--dry-run", "chromium"], {
|
|
62
|
-
encoding: "utf-8",
|
|
63
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
64
|
-
});
|
|
65
|
-
// --dry-run output contains "chromium" when already installed (no-op)
|
|
66
|
-
// If it returns non-zero or output doesn't mention chromium, binary is missing
|
|
67
|
-
const combinedOutput = (dryRunProbe.stdout ?? "") + (dryRunProbe.stderr ?? "");
|
|
68
|
-
if (dryRunProbe.status !== 0 || !combinedOutput.toLowerCase().includes("chromium")) {
|
|
69
|
-
return {
|
|
70
|
-
status: "MISSING_BINARY",
|
|
71
|
-
message: "Chromium binary not installed — run: npx mewkit setup --system-deps",
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
return { status: "OK" };
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* All registered system dependencies.
|
|
78
|
-
* Insertion order = display order in prompts (ffmpeg, imagemagick, playwright-chromium).
|
|
79
|
-
*/
|
|
80
|
-
export const SYSTEM_DEPS = {
|
|
81
|
-
ffmpeg: {
|
|
82
|
-
key: "ffmpeg",
|
|
83
|
-
name: "FFmpeg",
|
|
84
|
-
detectCommand: "ffmpeg",
|
|
85
|
-
installCommands: {
|
|
86
|
-
darwin: ["brew install ffmpeg"],
|
|
87
|
-
linux: [
|
|
88
|
-
// apt-get
|
|
89
|
-
"apt-get install -y ffmpeg",
|
|
90
|
-
// dnf fallback handled at runtime in setup.ts by checking available pkg manager
|
|
91
|
-
],
|
|
92
|
-
win32: [],
|
|
93
|
-
},
|
|
94
|
-
manualUrl: "https://ffmpeg.org/download.html",
|
|
95
|
-
sizeBytes: 50_000_000,
|
|
96
|
-
},
|
|
97
|
-
imagemagick: {
|
|
98
|
-
key: "imagemagick",
|
|
99
|
-
name: "ImageMagick",
|
|
100
|
-
// IM 6 ships "convert"; IM 7+ ships "magick" with no "convert" shim.
|
|
101
|
-
// detectCommands ensures presence is detected regardless of which version is installed.
|
|
102
|
-
detectCommand: "convert",
|
|
103
|
-
detectCommands: ["convert", "magick"],
|
|
104
|
-
installCommands: {
|
|
105
|
-
darwin: ["brew install imagemagick"],
|
|
106
|
-
linux: ["apt-get install -y imagemagick"],
|
|
107
|
-
win32: [],
|
|
108
|
-
},
|
|
109
|
-
manualUrl: "https://imagemagick.org/script/download.php",
|
|
110
|
-
sizeBytes: 20_000_000,
|
|
111
|
-
},
|
|
112
|
-
// Playwright version: 1.58.0 — pinned from PyPI on 2026-04-09 via WebFetch
|
|
113
|
-
// Source: https://pypi.org/pypi/playwright/json → info.version = "1.58.0"
|
|
114
|
-
"playwright-chromium": {
|
|
115
|
-
key: "playwright-chromium",
|
|
116
|
-
name: "Playwright + Chromium",
|
|
117
|
-
// Detect by importing the Python package (not a PATH command)
|
|
118
|
-
detectCommand: ".claude/skills/.venv/bin/python3 -c 'import playwright'",
|
|
119
|
-
installCommands: {
|
|
120
|
-
darwin: [
|
|
121
|
-
".claude/skills/.venv/bin/pip install playwright==1.58.0",
|
|
122
|
-
".claude/skills/.venv/bin/playwright install chromium",
|
|
123
|
-
],
|
|
124
|
-
linux: [
|
|
125
|
-
".claude/skills/.venv/bin/pip install playwright==1.58.0",
|
|
126
|
-
".claude/skills/.venv/bin/playwright install chromium",
|
|
127
|
-
],
|
|
128
|
-
win32: [
|
|
129
|
-
".claude\\skills\\.venv\\Scripts\\pip install playwright==1.58.0",
|
|
130
|
-
".claude\\skills\\.venv\\Scripts\\playwright install chromium",
|
|
131
|
-
],
|
|
132
|
-
},
|
|
133
|
-
sizeBytes: 200_000_000,
|
|
134
|
-
manualUrl: "https://playwright.dev/python/docs/intro",
|
|
135
|
-
doctorCheck: playwrightDoctorCheck,
|
|
136
|
-
},
|
|
137
|
-
};
|
|
138
|
-
// ---------------------------------------------------------------------------
|
|
139
|
-
// Helpers
|
|
140
|
-
// ---------------------------------------------------------------------------
|
|
141
|
-
/** Return all registered entries in insertion order */
|
|
142
|
-
export function listDeps() {
|
|
143
|
-
return Object.values(SYSTEM_DEPS);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Check whether a PATH-based dep's binary (or any of its aliases) is present.
|
|
147
|
-
* Uses detectCommands when set (multi-probe); falls back to single detectCommand probe.
|
|
148
|
-
*
|
|
149
|
-
* NOT suitable for venv-based deps (playwright-chromium) — callers must handle
|
|
150
|
-
* those separately (detectCommand includes ".venv").
|
|
151
|
-
*/
|
|
152
|
-
export function isDepCommandPresent(dep, commandAvailableFn) {
|
|
153
|
-
const probes = dep.detectCommands ?? [dep.detectCommand];
|
|
154
|
-
return probes.some((cmd) => commandAvailableFn(cmd));
|
|
155
|
-
}
|
|
156
|
-
/** Look up a single entry by key */
|
|
157
|
-
export function getDep(key) {
|
|
158
|
-
return SYSTEM_DEPS[key];
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Validate keys declared in a skill's optional_system_deps against the registry.
|
|
162
|
-
* Unknown keys are rejected to prevent skills from requesting arbitrary installs.
|
|
163
|
-
*
|
|
164
|
-
* @param declared Keys parsed from SKILL.md optional_system_deps comment
|
|
165
|
-
* @param skillName Used in warning messages for traceability
|
|
166
|
-
*/
|
|
167
|
-
export function validateSkillDeclaredKeys(declared, skillName) {
|
|
168
|
-
const valid = [];
|
|
169
|
-
const invalid = [];
|
|
170
|
-
for (const key of declared) {
|
|
171
|
-
if (SYSTEM_DEPS[key]) {
|
|
172
|
-
valid.push(key);
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
console.warn(`[mewkit] Skill "${skillName}" declares unknown system dep "${key}" — ignored. ` +
|
|
176
|
-
`Register it in lib/system-deps-registry.ts to allow installation.`);
|
|
177
|
-
invalid.push(key);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return { valid, invalid };
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Parse optional_system_deps from a SKILL.md HTML comment block.
|
|
184
|
-
*
|
|
185
|
-
* PARSE CONTRACT:
|
|
186
|
-
* The parser looks for a comment starting with "MEOWKIT METADATA" and extracts
|
|
187
|
-
* the "optional_system_deps:" line from it. Handles both single-line and
|
|
188
|
-
* multi-line YAML-ish list formats:
|
|
189
|
-
*
|
|
190
|
-
* optional_system_deps: [playwright-chromium]
|
|
191
|
-
* optional_system_deps: [playwright-chromium, ffmpeg]
|
|
192
|
-
*
|
|
193
|
-
* Multi-line YAML block format (not currently used but handled):
|
|
194
|
-
* optional_system_deps:
|
|
195
|
-
* - playwright-chromium
|
|
196
|
-
*
|
|
197
|
-
* Returns an empty array if the comment or field is absent.
|
|
198
|
-
*
|
|
199
|
-
* WHY NOT NATIVE FRONTMATTER (Q4 decision):
|
|
200
|
-
* Claude Code's frontmatter schema only supports a fixed set of native fields.
|
|
201
|
-
* Custom fields like optional_system_deps are silently dropped. The HTML comment
|
|
202
|
-
* approach is the agreed MeowKit convention for skill metadata that the CLI needs
|
|
203
|
-
* but Claude Code should ignore.
|
|
204
|
-
*/
|
|
205
|
-
export function parseOptionalSystemDepsFromSkillMd(skillMdContent) {
|
|
206
|
-
// Find the MEOWKIT METADATA comment block
|
|
207
|
-
const commentMatch = skillMdContent.match(/<!--\s*\n\s*MEOWKIT METADATA[\s\S]*?-->/);
|
|
208
|
-
if (!commentMatch)
|
|
209
|
-
return [];
|
|
210
|
-
const block = commentMatch[0];
|
|
211
|
-
// Inline bracket format: optional_system_deps: [key1, key2]
|
|
212
|
-
const inlineMatch = block.match(/optional_system_deps:\s*\[([^\]]*)\]/);
|
|
213
|
-
if (inlineMatch) {
|
|
214
|
-
const raw = inlineMatch[1] ?? "";
|
|
215
|
-
return raw
|
|
216
|
-
.split(",")
|
|
217
|
-
.map((s) => s.trim())
|
|
218
|
-
.filter((s) => s.length > 0);
|
|
219
|
-
}
|
|
220
|
-
// Multi-line YAML block format:
|
|
221
|
-
// optional_system_deps:
|
|
222
|
-
// - key1
|
|
223
|
-
// - key2
|
|
224
|
-
const blockMatch = block.match(/optional_system_deps:\s*\n((?:\s*-\s*\S+\s*\n?)+)/);
|
|
225
|
-
if (blockMatch) {
|
|
226
|
-
const lines = blockMatch[1] ?? "";
|
|
227
|
-
return lines
|
|
228
|
-
.split("\n")
|
|
229
|
-
.map((l) => l.replace(/^\s*-\s*/, "").trim())
|
|
230
|
-
.filter((s) => s.length > 0);
|
|
231
|
-
}
|
|
232
|
-
return [];
|
|
233
|
-
}
|
|
234
|
-
//# sourceMappingURL=system-deps-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"system-deps-registry.js","sourceRoot":"","sources":["../../src/lib/system-deps-registry.ts"],"names":[],"mappings":"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"}
|