@mahdy-gribkov/arcana 2.2.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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/audit.d.ts +17 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +157 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/audit.test.d.ts +2 -0
- package/dist/commands/audit.test.d.ts.map +1 -0
- package/dist/commands/audit.test.js +217 -0
- package/dist/commands/audit.test.js.map +1 -0
- package/dist/commands/clean.d.ts +5 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +125 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/config.d.ts +4 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +135 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +100 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +213 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/info.d.ts +5 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +114 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +216 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +8 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +404 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +8 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +100 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/providers.d.ts +6 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +103 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/scan.d.ts +5 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +110 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/search.d.ts +6 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +58 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/stats.d.ts +4 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +143 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/uninstall.d.ts +6 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +163 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +348 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +6 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +140 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +2 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +812 -0
- package/dist/interactive.js.map +1 -0
- package/dist/providers/arcana.d.ts +5 -0
- package/dist/providers/arcana.d.ts.map +1 -0
- package/dist/providers/arcana.js +11 -0
- package/dist/providers/arcana.js.map +1 -0
- package/dist/providers/base.d.ts +11 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +10 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/github.d.ts +25 -0
- package/dist/providers/github.d.ts.map +1 -0
- package/dist/providers/github.js +146 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/registry.d.ts +9 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +71 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/atomic.d.ts +2 -0
- package/dist/utils/atomic.d.ts.map +1 -0
- package/dist/utils/atomic.js +20 -0
- package/dist/utils/atomic.js.map +1 -0
- package/dist/utils/atomic.test.d.ts +2 -0
- package/dist/utils/atomic.test.d.ts.map +1 -0
- package/dist/utils/atomic.test.js +31 -0
- package/dist/utils/atomic.test.js.map +1 -0
- package/dist/utils/cache.d.ts +4 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +47 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +6 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +90 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/config.test.d.ts +2 -0
- package/dist/utils/config.test.d.ts.map +1 -0
- package/dist/utils/config.test.js +38 -0
- package/dist/utils/config.test.js.map +1 -0
- package/dist/utils/errors.d.ts +6 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +11 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +12 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +172 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/frontmatter.test.d.ts +2 -0
- package/dist/utils/frontmatter.test.d.ts.map +1 -0
- package/dist/utils/frontmatter.test.js +152 -0
- package/dist/utils/frontmatter.test.js.map +1 -0
- package/dist/utils/fs.d.ts +16 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +118 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/fs.test.d.ts +2 -0
- package/dist/utils/fs.test.d.ts.map +1 -0
- package/dist/utils/fs.test.js +145 -0
- package/dist/utils/fs.test.js.map +1 -0
- package/dist/utils/help.d.ts +6 -0
- package/dist/utils/help.d.ts.map +1 -0
- package/dist/utils/help.js +117 -0
- package/dist/utils/help.js.map +1 -0
- package/dist/utils/help.test.d.ts +2 -0
- package/dist/utils/help.test.d.ts.map +1 -0
- package/dist/utils/help.test.js +66 -0
- package/dist/utils/help.test.js.map +1 -0
- package/dist/utils/history.d.ts +10 -0
- package/dist/utils/history.d.ts.map +1 -0
- package/dist/utils/history.js +58 -0
- package/dist/utils/history.js.map +1 -0
- package/dist/utils/http.d.ts +17 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +165 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/http.test.d.ts +2 -0
- package/dist/utils/http.test.d.ts.map +1 -0
- package/dist/utils/http.test.js +55 -0
- package/dist/utils/http.test.js.map +1 -0
- package/dist/utils/parallel.d.ts +2 -0
- package/dist/utils/parallel.d.ts.map +1 -0
- package/dist/utils/parallel.js +17 -0
- package/dist/utils/parallel.js.map +1 -0
- package/dist/utils/scanner.d.ts +27 -0
- package/dist/utils/scanner.d.ts.map +1 -0
- package/dist/utils/scanner.js +195 -0
- package/dist/utils/scanner.js.map +1 -0
- package/dist/utils/ui.d.ts +27 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +99 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/utils/ui.test.d.ts +2 -0
- package/dist/utils/ui.test.d.ts.map +1 -0
- package/dist/utils/ui.test.js +31 -0
- package/dist/utils/ui.test.js.map +1 -0
- package/dist/utils/validate.d.ts +2 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +7 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +62 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,SAAS,IAAI,OAAO,CA0OnC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { ui } from "./utils/ui.js";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const pkg = require("../package.json");
|
|
6
|
+
export function createCli() {
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name("arcana")
|
|
10
|
+
.description("Universal AI development CLI")
|
|
11
|
+
.version(pkg.version);
|
|
12
|
+
// Store default help formatter before overriding
|
|
13
|
+
const defaultFormatHelp = program.createHelp().formatHelp.bind(program.createHelp());
|
|
14
|
+
program.configureHelp({
|
|
15
|
+
formatHelp: (cmd, helper) => {
|
|
16
|
+
if (cmd.name() === "arcana") {
|
|
17
|
+
// Lazy import to avoid loading help.ts at startup for subcommands
|
|
18
|
+
const { buildCustomHelp } = require("./utils/help.js");
|
|
19
|
+
return buildCustomHelp(pkg.version);
|
|
20
|
+
}
|
|
21
|
+
return defaultFormatHelp(cmd, helper);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
program.addHelpCommand(false);
|
|
25
|
+
program.showSuggestionAfterError(true);
|
|
26
|
+
program.configureOutput({
|
|
27
|
+
outputError: (str) => {
|
|
28
|
+
const cleaned = str.replace(/^error: /, "");
|
|
29
|
+
console.error();
|
|
30
|
+
console.error(ui.error(" Error: ") + cleaned.trim());
|
|
31
|
+
console.error(ui.dim(" Run arcana <command> --help for usage"));
|
|
32
|
+
console.error();
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
program.argument("[command]", "", "").action(async (cmd) => {
|
|
36
|
+
if (cmd) {
|
|
37
|
+
console.error();
|
|
38
|
+
console.error(ui.error(" Error: ") + `unknown command '${cmd}'`);
|
|
39
|
+
const commands = ["list", "install", "info", "search", "providers", "create", "validate", "update", "uninstall", "init", "doctor", "clean", "stats", "config", "audit", "scan"];
|
|
40
|
+
const match = commands.find(c => c.startsWith(cmd.slice(0, 3)));
|
|
41
|
+
if (match) {
|
|
42
|
+
console.error(ui.dim(` Did you mean '${match}'?`));
|
|
43
|
+
}
|
|
44
|
+
console.error(ui.dim(" Run arcana --help for all commands"));
|
|
45
|
+
console.error();
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const { isFirstRun, showWelcome, markInitialized, buildCustomHelp } = await import("./utils/help.js");
|
|
49
|
+
// Non-TTY (CI, pipes): print static help
|
|
50
|
+
if (!process.stdout.isTTY) {
|
|
51
|
+
console.log(buildCustomHelp(pkg.version));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (isFirstRun()) {
|
|
55
|
+
showWelcome(pkg.version);
|
|
56
|
+
markInitialized();
|
|
57
|
+
}
|
|
58
|
+
const { showInteractiveMenu } = await import("./interactive.js");
|
|
59
|
+
await showInteractiveMenu(pkg.version);
|
|
60
|
+
});
|
|
61
|
+
program
|
|
62
|
+
.command("list")
|
|
63
|
+
.description("List available skills")
|
|
64
|
+
.option("-p, --provider <name>", "Provider to list from")
|
|
65
|
+
.option("-a, --all", "List from all providers")
|
|
66
|
+
.option("--installed", "Show only installed skills")
|
|
67
|
+
.option("--no-cache", "Bypass skill cache")
|
|
68
|
+
.option("-j, --json", "Output as JSON")
|
|
69
|
+
.addHelpText("after", "\nExamples:\n arcana list\n arcana list --installed\n arcana list --all --no-cache")
|
|
70
|
+
.action(async (opts) => {
|
|
71
|
+
const { listCommand } = await import("./commands/list.js");
|
|
72
|
+
return listCommand(opts);
|
|
73
|
+
});
|
|
74
|
+
program
|
|
75
|
+
.command("install [skills...]")
|
|
76
|
+
.description("Install one or more skills")
|
|
77
|
+
.option("-p, --provider <name>", "Provider to install from")
|
|
78
|
+
.option("-a, --all", "Install all skills")
|
|
79
|
+
.option("-f, --force", "Reinstall even if already installed")
|
|
80
|
+
.option("--dry-run", "Show what would be installed without installing")
|
|
81
|
+
.option("-j, --json", "Output as JSON")
|
|
82
|
+
.addHelpText("after", "\nExamples:\n arcana install code-reviewer\n arcana install skill1 skill2 skill3\n arcana install --all --force")
|
|
83
|
+
.action(async (skills, opts) => {
|
|
84
|
+
const { installCommand } = await import("./commands/install.js");
|
|
85
|
+
return installCommand(skills, opts);
|
|
86
|
+
});
|
|
87
|
+
program
|
|
88
|
+
.command("info <skill>")
|
|
89
|
+
.description("Show skill details")
|
|
90
|
+
.option("-p, --provider <name>", "Provider to search")
|
|
91
|
+
.option("-j, --json", "Output as JSON")
|
|
92
|
+
.action(async (skill, opts) => {
|
|
93
|
+
const { infoCommand } = await import("./commands/info.js");
|
|
94
|
+
return infoCommand(skill, opts);
|
|
95
|
+
});
|
|
96
|
+
program
|
|
97
|
+
.command("search <query>")
|
|
98
|
+
.description("Search for skills across providers")
|
|
99
|
+
.option("-p, --provider <name>", "Limit search to provider")
|
|
100
|
+
.option("--no-cache", "Bypass skill cache")
|
|
101
|
+
.option("-j, --json", "Output as JSON")
|
|
102
|
+
.addHelpText("after", "\nExamples:\n arcana search testing\n arcana search \"code review\"")
|
|
103
|
+
.action(async (query, opts) => {
|
|
104
|
+
const { searchCommand } = await import("./commands/search.js");
|
|
105
|
+
return searchCommand(query, opts);
|
|
106
|
+
});
|
|
107
|
+
program
|
|
108
|
+
.command("providers")
|
|
109
|
+
.description("Manage skill providers")
|
|
110
|
+
.option("--add <owner/repo>", "Add a GitHub provider")
|
|
111
|
+
.option("--remove <name>", "Remove a provider")
|
|
112
|
+
.option("--json", "Output as JSON")
|
|
113
|
+
.action(async (opts) => {
|
|
114
|
+
const { providersCommand } = await import("./commands/providers.js");
|
|
115
|
+
return providersCommand(opts);
|
|
116
|
+
});
|
|
117
|
+
program
|
|
118
|
+
.command("create <name>")
|
|
119
|
+
.description("Create a new skill from template")
|
|
120
|
+
.action(async (name) => {
|
|
121
|
+
const { createCommand } = await import("./commands/create.js");
|
|
122
|
+
return createCommand(name);
|
|
123
|
+
});
|
|
124
|
+
program
|
|
125
|
+
.command("validate [skill]")
|
|
126
|
+
.description("Validate skill structure and metadata")
|
|
127
|
+
.option("-a, --all", "Validate all installed skills")
|
|
128
|
+
.option("-f, --fix", "Auto-fix common issues")
|
|
129
|
+
.option("-j, --json", "Output as JSON")
|
|
130
|
+
.action(async (skill, opts) => {
|
|
131
|
+
const { validateCommand } = await import("./commands/validate.js");
|
|
132
|
+
return validateCommand(skill, opts);
|
|
133
|
+
});
|
|
134
|
+
program
|
|
135
|
+
.command("update [skills...]")
|
|
136
|
+
.description("Update installed skills")
|
|
137
|
+
.option("-a, --all", "Update all installed skills")
|
|
138
|
+
.option("-p, --provider <name>", "Update from specific provider")
|
|
139
|
+
.option("-n, --dry-run", "Show what would be updated without updating")
|
|
140
|
+
.option("-j, --json", "Output as JSON")
|
|
141
|
+
.addHelpText("after", "\nExamples:\n arcana update code-reviewer\n arcana update skill1 skill2\n arcana update --all --dry-run")
|
|
142
|
+
.action(async (skills, opts) => {
|
|
143
|
+
const { updateCommand } = await import("./commands/update.js");
|
|
144
|
+
return updateCommand(skills, opts);
|
|
145
|
+
});
|
|
146
|
+
program
|
|
147
|
+
.command("uninstall [skills...]")
|
|
148
|
+
.description("Uninstall one or more skills")
|
|
149
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
150
|
+
.option("-j, --json", "Output as JSON")
|
|
151
|
+
.addHelpText("after", "\nExamples:\n arcana uninstall code-reviewer\n arcana uninstall skill1 skill2 --yes")
|
|
152
|
+
.action(async (skills, opts) => {
|
|
153
|
+
const { uninstallCommand } = await import("./commands/uninstall.js");
|
|
154
|
+
return uninstallCommand(skills, opts);
|
|
155
|
+
});
|
|
156
|
+
program
|
|
157
|
+
.command("init")
|
|
158
|
+
.description("Initialize arcana in current project")
|
|
159
|
+
.option("-t, --tool <name>", "Target tool (claude, cursor, codex, gemini, antigravity, windsurf, aider, all)")
|
|
160
|
+
.action(async (opts) => {
|
|
161
|
+
const { initCommand } = await import("./commands/init.js");
|
|
162
|
+
return initCommand(opts);
|
|
163
|
+
});
|
|
164
|
+
program
|
|
165
|
+
.command("doctor")
|
|
166
|
+
.description("Check environment and diagnose issues")
|
|
167
|
+
.option("-j, --json", "Output as JSON")
|
|
168
|
+
.action(async (opts) => {
|
|
169
|
+
const { doctorCommand } = await import("./commands/doctor.js");
|
|
170
|
+
return doctorCommand(opts);
|
|
171
|
+
});
|
|
172
|
+
program
|
|
173
|
+
.command("clean")
|
|
174
|
+
.description("Remove orphaned data and temp files")
|
|
175
|
+
.option("-n, --dry-run", "Show what would be removed without deleting")
|
|
176
|
+
.option("--json", "Output as JSON")
|
|
177
|
+
.action(async (opts) => {
|
|
178
|
+
const { cleanCommand } = await import("./commands/clean.js");
|
|
179
|
+
return cleanCommand(opts);
|
|
180
|
+
});
|
|
181
|
+
program
|
|
182
|
+
.command("stats")
|
|
183
|
+
.description("Show session analytics and token usage")
|
|
184
|
+
.option("-j, --json", "Output as JSON")
|
|
185
|
+
.action(async (opts) => {
|
|
186
|
+
const { statsCommand } = await import("./commands/stats.js");
|
|
187
|
+
return statsCommand(opts);
|
|
188
|
+
});
|
|
189
|
+
program
|
|
190
|
+
.command("config [action] [value]")
|
|
191
|
+
.description("View or modify arcana configuration")
|
|
192
|
+
.option("-j, --json", "Output as JSON")
|
|
193
|
+
.addHelpText("after", "\nExamples:\n arcana config\n arcana config path\n arcana config defaultProvider arcana\n arcana config reset")
|
|
194
|
+
.action(async (action, value, opts) => {
|
|
195
|
+
const { configCommand } = await import("./commands/config.js");
|
|
196
|
+
return configCommand(action, value, opts);
|
|
197
|
+
});
|
|
198
|
+
program
|
|
199
|
+
.command("audit [skill]")
|
|
200
|
+
.description("Audit skill quality (code examples, BAD/GOOD pairs, structure)")
|
|
201
|
+
.option("-a, --all", "Audit all installed skills")
|
|
202
|
+
.option("-j, --json", "Output as JSON")
|
|
203
|
+
.action(async (skill, opts) => {
|
|
204
|
+
const { auditCommand } = await import("./commands/audit.js");
|
|
205
|
+
return auditCommand(skill, opts);
|
|
206
|
+
});
|
|
207
|
+
program
|
|
208
|
+
.command("scan [skill]")
|
|
209
|
+
.description("Scan skills for security threats (prompt injection, malware, credential theft)")
|
|
210
|
+
.option("-a, --all", "Scan all installed skills")
|
|
211
|
+
.option("-j, --json", "Output as JSON")
|
|
212
|
+
.addHelpText("after", "\nExamples:\n arcana scan code-reviewer\n arcana scan --all\n arcana scan --all --json")
|
|
213
|
+
.action(async (skill, opts) => {
|
|
214
|
+
const { scanCommand } = await import("./commands/scan.js");
|
|
215
|
+
return scanCommand(skill, opts);
|
|
216
|
+
});
|
|
217
|
+
return program;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface AuditResult {
|
|
2
|
+
skill: string;
|
|
3
|
+
rating: "PERFECT" | "STRONG" | "ADEQUATE" | "WEAK";
|
|
4
|
+
score: number;
|
|
5
|
+
checks: {
|
|
6
|
+
name: string;
|
|
7
|
+
passed: boolean;
|
|
8
|
+
detail?: string;
|
|
9
|
+
}[];
|
|
10
|
+
}
|
|
11
|
+
export declare function auditSkill(skillDir: string, skillName: string): AuditResult;
|
|
12
|
+
export declare function auditCommand(skill: string | undefined, opts: {
|
|
13
|
+
all?: boolean;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CA2E3E;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CA4Ef"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { getInstallDir } from "../utils/fs.js";
|
|
4
|
+
import { extractFrontmatter, parseFrontmatter } from "../utils/frontmatter.js";
|
|
5
|
+
import { ui, banner } from "../utils/ui.js";
|
|
6
|
+
export function auditSkill(skillDir, skillName) {
|
|
7
|
+
const checks = [];
|
|
8
|
+
let score = 0;
|
|
9
|
+
const skillMd = join(skillDir, "SKILL.md");
|
|
10
|
+
if (!existsSync(skillMd)) {
|
|
11
|
+
return { skill: skillName, rating: "WEAK", score: 0, checks: [{ name: "SKILL.md exists", passed: false }] };
|
|
12
|
+
}
|
|
13
|
+
let content;
|
|
14
|
+
try {
|
|
15
|
+
content = readFileSync(skillMd, "utf-8");
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return { skill: skillName, rating: "WEAK", score: 0, checks: [{ name: "SKILL.md readable", passed: false }] };
|
|
19
|
+
}
|
|
20
|
+
const extracted = extractFrontmatter(content);
|
|
21
|
+
const parsed = extracted ? parseFrontmatter(extracted.raw) : null;
|
|
22
|
+
const body = extracted?.body || "";
|
|
23
|
+
const lines = body.split("\n");
|
|
24
|
+
const lineCount = lines.length;
|
|
25
|
+
// 1. Has frontmatter with name and description
|
|
26
|
+
const hasFrontmatter = !!parsed?.name && !!parsed?.description;
|
|
27
|
+
checks.push({ name: "Valid frontmatter", passed: hasFrontmatter });
|
|
28
|
+
if (hasFrontmatter)
|
|
29
|
+
score += 10;
|
|
30
|
+
// 2. Description length (80-1024)
|
|
31
|
+
const descLen = parsed?.description?.length || 0;
|
|
32
|
+
const goodDesc = descLen >= 80 && descLen <= 1024;
|
|
33
|
+
checks.push({ name: "Description length (80-1024)", passed: goodDesc, detail: `${descLen} chars` });
|
|
34
|
+
if (goodDesc)
|
|
35
|
+
score += 10;
|
|
36
|
+
// 3. Has ## headings
|
|
37
|
+
const headingCount = (body.match(/^## /gm) || []).length;
|
|
38
|
+
const hasHeadings = headingCount >= 2;
|
|
39
|
+
checks.push({ name: "Has ## headings (2+)", passed: hasHeadings, detail: `${headingCount} headings` });
|
|
40
|
+
if (hasHeadings)
|
|
41
|
+
score += 10;
|
|
42
|
+
// 4. Has code examples
|
|
43
|
+
const codeBlockCount = (body.match(/```/g) || []).length / 2;
|
|
44
|
+
const hasCode = codeBlockCount >= 2;
|
|
45
|
+
checks.push({ name: "Has code examples (2+)", passed: hasCode, detail: `${Math.floor(codeBlockCount)} blocks` });
|
|
46
|
+
if (hasCode)
|
|
47
|
+
score += 20;
|
|
48
|
+
// 5. Has BAD/GOOD or BEFORE/AFTER patterns
|
|
49
|
+
const hasBadGood = /\b(BAD|GOOD|BEFORE|AFTER|DON'T|DO)\b/i.test(body);
|
|
50
|
+
checks.push({ name: "Has BAD/GOOD or BEFORE/AFTER pairs", passed: hasBadGood });
|
|
51
|
+
if (hasBadGood)
|
|
52
|
+
score += 15;
|
|
53
|
+
// 6. Not a capabilities list (detects pattern of many "- " lines with no code between them)
|
|
54
|
+
const bulletLines = (body.match(/^- /gm) || []).length;
|
|
55
|
+
const isCapabilityList = bulletLines > 20 && codeBlockCount < 3;
|
|
56
|
+
checks.push({ name: "Not a capabilities list", passed: !isCapabilityList, detail: isCapabilityList ? `${bulletLines} bullets, ${Math.floor(codeBlockCount)} code blocks` : undefined });
|
|
57
|
+
if (!isCapabilityList)
|
|
58
|
+
score += 15;
|
|
59
|
+
// 7. Reasonable length (50-500 lines)
|
|
60
|
+
const goodLength = lineCount >= 50 && lineCount <= 500;
|
|
61
|
+
checks.push({ name: "Reasonable length (50-500 lines)", passed: goodLength, detail: `${lineCount} lines` });
|
|
62
|
+
if (goodLength)
|
|
63
|
+
score += 10;
|
|
64
|
+
// 8. Has scripts/ or references/ directory (bonus)
|
|
65
|
+
const hasScripts = existsSync(join(skillDir, "scripts"));
|
|
66
|
+
const hasRefs = existsSync(join(skillDir, "references")) || existsSync(join(skillDir, "rules"));
|
|
67
|
+
const hasExtras = hasScripts || hasRefs;
|
|
68
|
+
checks.push({ name: "Has scripts/ or references/", passed: hasExtras, detail: hasExtras ? [hasScripts && "scripts", hasRefs && "references"].filter(Boolean).join(", ") : "none" });
|
|
69
|
+
if (hasExtras)
|
|
70
|
+
score += 10;
|
|
71
|
+
// Rating
|
|
72
|
+
let rating;
|
|
73
|
+
if (score >= 85)
|
|
74
|
+
rating = "PERFECT";
|
|
75
|
+
else if (score >= 65)
|
|
76
|
+
rating = "STRONG";
|
|
77
|
+
else if (score >= 40)
|
|
78
|
+
rating = "ADEQUATE";
|
|
79
|
+
else
|
|
80
|
+
rating = "WEAK";
|
|
81
|
+
return { skill: skillName, rating, score, checks };
|
|
82
|
+
}
|
|
83
|
+
export async function auditCommand(skill, opts) {
|
|
84
|
+
if (!opts.json)
|
|
85
|
+
banner();
|
|
86
|
+
const installDir = getInstallDir();
|
|
87
|
+
if (!existsSync(installDir)) {
|
|
88
|
+
if (opts.json) {
|
|
89
|
+
console.log(JSON.stringify({ results: [] }));
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
console.log(ui.dim(" No skills installed."));
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
let skills;
|
|
98
|
+
if (opts.all) {
|
|
99
|
+
skills = readdirSync(installDir).filter((d) => statSync(join(installDir, d)).isDirectory());
|
|
100
|
+
}
|
|
101
|
+
else if (skill) {
|
|
102
|
+
skills = [skill];
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
if (opts.json) {
|
|
106
|
+
console.log(JSON.stringify({ error: "Specify a skill name or use --all" }));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log(ui.error(" Specify a skill name or use --all"));
|
|
110
|
+
console.log(ui.dim(" Usage: arcana audit <skill>"));
|
|
111
|
+
console.log(ui.dim(" arcana audit --all [--json]"));
|
|
112
|
+
console.log();
|
|
113
|
+
}
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
const results = [];
|
|
117
|
+
for (const name of skills.sort()) {
|
|
118
|
+
const skillDir = join(installDir, name);
|
|
119
|
+
if (!existsSync(skillDir)) {
|
|
120
|
+
results.push({ skill: name, rating: "WEAK", score: 0, checks: [{ name: "Exists", passed: false }] });
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
results.push(auditSkill(skillDir, name));
|
|
124
|
+
}
|
|
125
|
+
if (opts.json) {
|
|
126
|
+
console.log(JSON.stringify({ results }, null, 2));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const counts = { PERFECT: 0, STRONG: 0, ADEQUATE: 0, WEAK: 0 };
|
|
130
|
+
for (const r of results) {
|
|
131
|
+
counts[r.rating]++;
|
|
132
|
+
const ratingColor = r.rating === "PERFECT" ? ui.success
|
|
133
|
+
: r.rating === "STRONG" ? ui.cyan
|
|
134
|
+
: r.rating === "ADEQUATE" ? ui.warn
|
|
135
|
+
: ui.error;
|
|
136
|
+
console.log(` ${ratingColor(`[${r.rating}]`)} ${ui.bold(r.skill)} ${ui.dim(`(${r.score}/100)`)}`);
|
|
137
|
+
for (const check of r.checks) {
|
|
138
|
+
if (!check.passed) {
|
|
139
|
+
const detail = check.detail ? ` ${ui.dim(`(${check.detail})`)}` : "";
|
|
140
|
+
console.log(` ${ui.error("x")} ${check.name}${detail}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
console.log();
|
|
145
|
+
const parts = [];
|
|
146
|
+
if (counts.PERFECT > 0)
|
|
147
|
+
parts.push(ui.success(`${counts.PERFECT} perfect`));
|
|
148
|
+
if (counts.STRONG > 0)
|
|
149
|
+
parts.push(ui.cyan(`${counts.STRONG} strong`));
|
|
150
|
+
if (counts.ADEQUATE > 0)
|
|
151
|
+
parts.push(ui.warn(`${counts.ADEQUATE} adequate`));
|
|
152
|
+
if (counts.WEAK > 0)
|
|
153
|
+
parts.push(ui.error(`${counts.WEAK} weak`));
|
|
154
|
+
console.log(` ${parts.join(ui.dim(" | "))}`);
|
|
155
|
+
console.log();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.test.d.ts","sourceRoot":"","sources":["../../src/commands/audit.test.ts"],"names":[],"mappings":""}
|