@khalidsaidi/skillrunner 0.1.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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +91 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/cursor.d.ts +27 -0
  8. package/dist/commands/cursor.d.ts.map +1 -0
  9. package/dist/commands/cursor.js +80 -0
  10. package/dist/commands/cursor.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +13 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +59 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/info.d.ts +13 -0
  16. package/dist/commands/info.d.ts.map +1 -0
  17. package/dist/commands/info.js +102 -0
  18. package/dist/commands/info.js.map +1 -0
  19. package/dist/commands/install.d.ts +13 -0
  20. package/dist/commands/install.d.ts.map +1 -0
  21. package/dist/commands/install.js +167 -0
  22. package/dist/commands/install.js.map +1 -0
  23. package/dist/commands/list.d.ts +13 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +51 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/logs.d.ts +15 -0
  28. package/dist/commands/logs.d.ts.map +1 -0
  29. package/dist/commands/logs.js +99 -0
  30. package/dist/commands/logs.js.map +1 -0
  31. package/dist/commands/open.d.ts +13 -0
  32. package/dist/commands/open.d.ts.map +1 -0
  33. package/dist/commands/open.js +30 -0
  34. package/dist/commands/open.js.map +1 -0
  35. package/dist/commands/plan.d.ts +14 -0
  36. package/dist/commands/plan.d.ts.map +1 -0
  37. package/dist/commands/plan.js +75 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/run.d.ts +17 -0
  40. package/dist/commands/run.d.ts.map +1 -0
  41. package/dist/commands/run.js +143 -0
  42. package/dist/commands/run.js.map +1 -0
  43. package/dist/commands/search.d.ts +13 -0
  44. package/dist/commands/search.d.ts.map +1 -0
  45. package/dist/commands/search.js +32 -0
  46. package/dist/commands/search.js.map +1 -0
  47. package/dist/commands/uninstall.d.ts +13 -0
  48. package/dist/commands/uninstall.d.ts.map +1 -0
  49. package/dist/commands/uninstall.js +35 -0
  50. package/dist/commands/uninstall.js.map +1 -0
  51. package/dist/util.d.ts +7 -0
  52. package/dist/util.d.ts.map +1 -0
  53. package/dist/util.js +9 -0
  54. package/dist/util.js.map +1 -0
  55. package/dist/utils/json.d.ts +11 -0
  56. package/dist/utils/json.d.ts.map +1 -0
  57. package/dist/utils/json.js +10 -0
  58. package/dist/utils/json.js.map +1 -0
  59. package/package.json +58 -0
@@ -0,0 +1,143 @@
1
+ import chalk from "chalk";
2
+ import { existsSync, readFileSync, readdirSync } from "fs";
3
+ import { join } from "path";
4
+ import prompts from "prompts";
5
+ import { parseSkillMd, buildPlan, scanScriptForBannedPatterns, blockMessage, executePlan, writeRunArtifacts, checkSkillPrerequisites, getSkillsDir, } from "@skillrunner/engine";
6
+ import { randomUUID } from "crypto";
7
+ import { shouldUseJson } from "../utils/json.js";
8
+ function findSkillDir(name) {
9
+ const skillsDir = getSkillsDir();
10
+ if (!existsSync(skillsDir))
11
+ return null;
12
+ const entries = readdirSync(skillsDir, { withFileTypes: true });
13
+ const match = entries.find((e) => e.isDirectory() && (e.name === name || e.name.startsWith(name + "@")));
14
+ return match ? join(skillsDir, match.name) : null;
15
+ }
16
+ export async function runCmd(name, opts, cmd) {
17
+ const json = shouldUseJson(opts, cmd);
18
+ const cwd = opts.cwd || process.cwd();
19
+ const skillDir = findSkillDir(name);
20
+ if (!skillDir) {
21
+ if (json) {
22
+ console.log(JSON.stringify({ success: false, error: `Skill not installed: ${name}` }, null, 2));
23
+ }
24
+ else {
25
+ console.error(chalk.red("Skill not installed:"), name);
26
+ }
27
+ process.exit(1);
28
+ }
29
+ const skillMd = join(skillDir, "SKILL.md");
30
+ if (!existsSync(skillMd)) {
31
+ if (json)
32
+ console.log(JSON.stringify({ success: false, error: "SKILL.md not found" }, null, 2));
33
+ else
34
+ console.error(chalk.red("SKILL.md not found"));
35
+ process.exit(1);
36
+ }
37
+ const meta = parseSkillMd(readFileSync(skillMd, "utf-8"));
38
+ const plan = buildPlan(skillDir, meta);
39
+ const preflight = checkSkillPrerequisites(meta, cwd);
40
+ if (!preflight.passed) {
41
+ if (json) {
42
+ console.log(JSON.stringify({
43
+ success: false,
44
+ error: "Preflight check failed",
45
+ preflight,
46
+ }, null, 2));
47
+ }
48
+ else {
49
+ console.error(chalk.red("Preflight check failed."));
50
+ if (preflight.missingTools.length) {
51
+ console.error(chalk.dim(` Missing tools: ${preflight.missingTools.join(", ")}`));
52
+ }
53
+ if (preflight.missingFiles.length) {
54
+ console.error(chalk.dim(` Missing files: ${preflight.missingFiles.join(", ")}`));
55
+ }
56
+ if (preflight.missingEnv.length) {
57
+ console.error(chalk.dim(` Missing env vars: ${preflight.missingEnv
58
+ .map((v) => `$${v}`)
59
+ .join(", ")}`));
60
+ }
61
+ if (preflight.missingPackageJsonDeps.length) {
62
+ console.error(chalk.dim(` Missing package.json deps: ${preflight.missingPackageJsonDeps.join(", ")}`));
63
+ }
64
+ console.error(chalk.dim(` Skill: ${meta.name}`));
65
+ }
66
+ process.exit(1);
67
+ }
68
+ const checkPath = meta.scripts?.check
69
+ ? join(skillDir, meta.scripts.check)
70
+ : join(skillDir, "scripts", "check.sh");
71
+ const runPath = meta.scripts?.run
72
+ ? join(skillDir, meta.scripts.run)
73
+ : join(skillDir, "scripts", "run.sh");
74
+ const guardCheck = scanScriptForBannedPatterns(checkPath);
75
+ const guardRun = scanScriptForBannedPatterns(runPath);
76
+ const guardResult = {
77
+ passed: guardCheck.passed && guardRun.passed,
78
+ violations: [...guardCheck.violations, ...guardRun.violations],
79
+ };
80
+ if (!guardResult.passed) {
81
+ if (json) {
82
+ console.log(JSON.stringify({
83
+ success: false,
84
+ error: "Guard block",
85
+ violations: guardResult.violations,
86
+ }, null, 2));
87
+ }
88
+ else {
89
+ console.error(chalk.red(blockMessage(guardResult.violations)));
90
+ }
91
+ process.exit(1);
92
+ }
93
+ if (!opts.yes && !json) {
94
+ const { confirm } = await prompts({
95
+ type: "confirm",
96
+ name: "confirm",
97
+ message: `Run ${meta.name}? (${plan.steps.length} step(s), risk: ${plan.risk})`,
98
+ initial: false,
99
+ });
100
+ if (!confirm) {
101
+ console.log(chalk.dim("Cancelled."));
102
+ return;
103
+ }
104
+ }
105
+ const runId = randomUUID();
106
+ writeRunArtifacts(runId, meta.name, cwd, plan, guardResult);
107
+ const results = await executePlan(cwd, skillDir, plan, runId);
108
+ const last = results[results.length - 1];
109
+ const success = last ? last.success : true;
110
+ const exitCode = last ? last.exitCode : 0;
111
+ writeRunArtifacts(runId, meta.name, cwd, plan, guardResult, last
112
+ ? {
113
+ success,
114
+ stdout: last.stdout,
115
+ stderr: last.stderr,
116
+ exitCode,
117
+ }
118
+ : undefined);
119
+ if (json) {
120
+ console.log(JSON.stringify({
121
+ success,
122
+ runId,
123
+ exitCode,
124
+ stdout: last?.stdout,
125
+ stderr: last?.stderr,
126
+ }, null, 2));
127
+ if (!success) {
128
+ process.exit(exitCode || 1);
129
+ }
130
+ }
131
+ else {
132
+ if (success) {
133
+ console.log(chalk.green("Done."), chalk.dim(`Run ID: ${runId}`));
134
+ }
135
+ else {
136
+ console.error(chalk.red("Failed."), chalk.dim(`Run ID: ${runId}`));
137
+ if (last?.stderr)
138
+ console.error(chalk.dim(last.stderr));
139
+ process.exit(exitCode || 1);
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,SAAS,EACT,2BAA2B,EAC3B,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,CAA+C,EAAE,EAAE,CAClD,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CACxE,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAY,EACZ,IAMC,EACD,GAGC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,IAAI,EAAE,EAAE,EACzD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,IAAI;YACN,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAC/C,IAAI,EACJ,CAAC,CACF,CACF,CAAC;;YACC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAErD,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;gBAC/B,SAAS;aACV,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACpD,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACnE,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACnE,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAChC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,uBAAuB,SAAS,CAAC,UAAU;qBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;qBACnB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CACF,CAAC;YACJ,CAAC;YACD,IAAI,SAAS,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;gBAC5C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,gCAAgC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK;QACnC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG;QAC/B,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG;QAClB,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;QAC5C,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC;KAC/D,CAAC;IAEF,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,WAAW,CAAC,UAAU;aACnC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC;YAChC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,mBAAmB,IAAI,CAAC,IAAI,GAAG;YAC/E,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAE5D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,iBAAiB,CACf,KAAK,EACL,IAAI,CAAC,IAAI,EACT,GAAG,EACH,IAAI,EACJ,WAAW,EACX,IAAI;QACF,CAAC,CAAC;YACE,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ;SACT;QACH,CAAC,CAAC,SAAS,CACd,CAAC;IAEF,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,OAAO;YACP,KAAK;YACL,QAAQ;YACR,MAAM,EAAE,IAAI,EAAE,MAAM;YACpB,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,IAAI,IAAI,EAAE,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function searchCmd(query: string, opts: {
2
+ json?: boolean;
3
+ }, cmd: {
4
+ opts?: () => {
5
+ json?: boolean;
6
+ };
7
+ parent?: {
8
+ opts?: () => {
9
+ json?: boolean;
10
+ };
11
+ };
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAIA,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACxB,GAAG,EAAE;IACH,IAAI,CAAC,EAAE,MAAM;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM;YAAE,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;CAC9C,GACA,OAAO,CAAC,IAAI,CAAC,CAiCf"}
@@ -0,0 +1,32 @@
1
+ import chalk from "chalk";
2
+ import { resolveRegistryIndex, searchRegistry } from "@skillrunner/engine";
3
+ import { shouldUseJson } from "../utils/json.js";
4
+ export async function searchCmd(query, opts, cmd) {
5
+ const json = shouldUseJson(opts, cmd);
6
+ let index;
7
+ try {
8
+ index = await resolveRegistryIndex();
9
+ }
10
+ catch (e) {
11
+ if (json) {
12
+ console.log(JSON.stringify({ error: e.message, skills: [] }, null, 2));
13
+ }
14
+ else {
15
+ console.error(chalk.red("Registry unreachable:"), e.message);
16
+ }
17
+ process.exit(1);
18
+ }
19
+ const hits = searchRegistry(index, query || "");
20
+ if (json) {
21
+ console.log(JSON.stringify({ query: query || "", skills: hits }, null, 2));
22
+ return;
23
+ }
24
+ console.log(chalk.bold(`Search: "${query || ""}"\n`));
25
+ for (const s of hits) {
26
+ const risk = s.risk || "low";
27
+ const availability = s.availability || "default";
28
+ console.log(` ${chalk.cyan(s.name)}${chalk.dim(` [${risk}|${availability}]`)}`);
29
+ console.log(` ${s.description}`);
30
+ }
31
+ }
32
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAa,EACb,IAAwB,EACxB,GAGC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,oBAAoB,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAG,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CACrE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAEhD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;QAC7B,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,IAAI,SAAS,CAAC;QACjD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,YAAY,GAAG,CAAC,EAAE,CACpE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function uninstallCmd(name: string, opts: {
2
+ json?: boolean;
3
+ }, cmd: {
4
+ opts?: () => {
5
+ json?: boolean;
6
+ };
7
+ parent?: {
8
+ opts?: () => {
9
+ json?: boolean;
10
+ };
11
+ };
12
+ }): Promise<void>;
13
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACxB,GAAG,EAAE;IACH,IAAI,CAAC,EAAE,MAAM;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM;YAAE,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;CAC9C,GACA,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
@@ -0,0 +1,35 @@
1
+ import chalk from "chalk";
2
+ import { rmSync, existsSync, readdirSync } from "fs";
3
+ import { join } from "path";
4
+ import { getSkillsDir } from "@skillrunner/engine";
5
+ import { shouldUseJson } from "../utils/json.js";
6
+ export async function uninstallCmd(name, opts, cmd) {
7
+ const json = shouldUseJson(opts, cmd);
8
+ const skillsDir = getSkillsDir();
9
+ if (!existsSync(skillsDir)) {
10
+ if (json)
11
+ console.log(JSON.stringify({ success: false, error: "No skills installed" }, null, 2));
12
+ else
13
+ console.log(chalk.dim("No skills installed."));
14
+ return;
15
+ }
16
+ const entries = readdirSync(skillsDir, { withFileTypes: true });
17
+ const match = entries.find((e) => e.isDirectory() && (e.name === name || e.name.startsWith(name + "@")));
18
+ if (!match) {
19
+ if (json) {
20
+ console.log(JSON.stringify({ success: false, error: `Skill not found: ${name}` }, null, 2));
21
+ }
22
+ else {
23
+ console.error(chalk.red("Skill not found:"), name);
24
+ }
25
+ process.exit(1);
26
+ }
27
+ rmSync(join(skillsDir, match.name), { recursive: true });
28
+ if (json) {
29
+ console.log(JSON.stringify({ success: true }, null, 2));
30
+ }
31
+ else {
32
+ console.log(chalk.green("Uninstalled:"), match.name);
33
+ }
34
+ }
35
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,IAAwB,EACxB,GAGC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,IAAI,IAAI;YACN,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAChD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;;YACC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CACxE,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,IAAI,EAAE,EAAE,EACrD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare function isJson(program: {
2
+ opts: () => {
3
+ json?: boolean;
4
+ };
5
+ }): boolean;
6
+ export declare function out(data: unknown, json: boolean): void;
7
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,GAAG,OAAO,CAE3E;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAItD"}
package/dist/util.js ADDED
@@ -0,0 +1,9 @@
1
+ export function isJson(program) {
2
+ return !!program.opts?.()?.json;
3
+ }
4
+ export function out(data, json) {
5
+ if (json) {
6
+ console.log(JSON.stringify(data, null, 2));
7
+ }
8
+ }
9
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,MAAM,CAAC,OAA2C;IAChE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAa,EAAE,IAAa;IAC9C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface CommandLike {
2
+ opts?: () => {
3
+ json?: boolean;
4
+ };
5
+ parent?: CommandLike;
6
+ }
7
+ export declare function shouldUseJson(opts?: {
8
+ json?: boolean;
9
+ }, cmd?: CommandLike): boolean;
10
+ export {};
11
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,aAAa,CAC3B,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EACzB,GAAG,CAAC,EAAE,WAAW,GAChB,OAAO,CAKT"}
@@ -0,0 +1,10 @@
1
+ export function shouldUseJson(opts, cmd) {
2
+ if (opts?.json)
3
+ return true;
4
+ if (cmd?.opts?.().json)
5
+ return true;
6
+ if (cmd?.parent?.opts?.().json)
7
+ return true;
8
+ return process.argv.includes("--json") || process.argv.includes("-j");
9
+ }
10
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,aAAa,CAC3B,IAAyB,EACzB,GAAiB;IAEjB,IAAI,IAAI,EAAE,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@khalidsaidi/skillrunner",
3
+ "version": "0.1.0",
4
+ "description": "Local-first CLI to discover, install, plan, and safely run reusable engineering skills.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "homepage": "https://github.com/khalidsaidi/skillrunner#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/khalidsaidi/skillrunner.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/khalidsaidi/skillrunner/issues"
14
+ },
15
+ "keywords": [
16
+ "cli",
17
+ "skills-cli",
18
+ "automation",
19
+ "developer-tools",
20
+ "engineering-workflows",
21
+ "devops-automation",
22
+ "local-first",
23
+ "agent-workflows",
24
+ "skill-registry",
25
+ "code-review",
26
+ "testing",
27
+ "terraform",
28
+ "react"
29
+ ],
30
+ "bin": {
31
+ "skill": "dist/cli.js"
32
+ },
33
+ "main": "dist/cli.js",
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ],
40
+ "dependencies": {
41
+ "chalk": "^5.3.0",
42
+ "commander": "^12.1.0",
43
+ "ora": "^8.1.0",
44
+ "prompts": "^2.4.2",
45
+ "@skillrunner/engine": "0.1.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^20.17.0",
49
+ "typescript": "^5.6.0"
50
+ },
51
+ "engines": {
52
+ "node": ">=20"
53
+ },
54
+ "scripts": {
55
+ "build": "tsc",
56
+ "typecheck": "tsc --noEmit"
57
+ }
58
+ }