@devenius/junamis-skills 0.0.0-stage → 1.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 (311) hide show
  1. package/CHANGELOG.md +150 -0
  2. package/LICENSE +21 -0
  3. package/README.md +231 -2
  4. package/SECURITY.md +81 -0
  5. package/bin/junamis-skills.js +7 -0
  6. package/dist/cli.d.ts +59 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +564 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/color.d.ts +40 -0
  11. package/dist/color.d.ts.map +1 -0
  12. package/dist/color.js +55 -0
  13. package/dist/color.js.map +1 -0
  14. package/dist/design/atomic.d.ts +4 -0
  15. package/dist/design/atomic.d.ts.map +1 -0
  16. package/dist/design/atomic.js +14 -0
  17. package/dist/design/atomic.js.map +1 -0
  18. package/dist/design/bootstrap.d.ts +23 -0
  19. package/dist/design/bootstrap.d.ts.map +1 -0
  20. package/dist/design/bootstrap.js +411 -0
  21. package/dist/design/bootstrap.js.map +1 -0
  22. package/dist/design/cli.d.ts +86 -0
  23. package/dist/design/cli.d.ts.map +1 -0
  24. package/dist/design/cli.js +425 -0
  25. package/dist/design/cli.js.map +1 -0
  26. package/dist/design/delta.d.ts +45 -0
  27. package/dist/design/delta.d.ts.map +1 -0
  28. package/dist/design/delta.js +557 -0
  29. package/dist/design/delta.js.map +1 -0
  30. package/dist/design/drift.d.ts +26 -0
  31. package/dist/design/drift.d.ts.map +1 -0
  32. package/dist/design/drift.js +341 -0
  33. package/dist/design/drift.js.map +1 -0
  34. package/dist/design/errors.d.ts +25 -0
  35. package/dist/design/errors.d.ts.map +1 -0
  36. package/dist/design/errors.js +30 -0
  37. package/dist/design/errors.js.map +1 -0
  38. package/dist/design/events.d.ts +18 -0
  39. package/dist/design/events.d.ts.map +1 -0
  40. package/dist/design/events.js +44 -0
  41. package/dist/design/events.js.map +1 -0
  42. package/dist/design/fingerprint.d.ts +10 -0
  43. package/dist/design/fingerprint.d.ts.map +1 -0
  44. package/dist/design/fingerprint.js +66 -0
  45. package/dist/design/fingerprint.js.map +1 -0
  46. package/dist/design/index-gen.d.ts +16 -0
  47. package/dist/design/index-gen.d.ts.map +1 -0
  48. package/dist/design/index-gen.js +94 -0
  49. package/dist/design/index-gen.js.map +1 -0
  50. package/dist/design/schema.d.ts +54 -0
  51. package/dist/design/schema.d.ts.map +1 -0
  52. package/dist/design/schema.js +408 -0
  53. package/dist/design/schema.js.map +1 -0
  54. package/dist/design/yaml.d.ts +12 -0
  55. package/dist/design/yaml.d.ts.map +1 -0
  56. package/dist/design/yaml.js +264 -0
  57. package/dist/design/yaml.js.map +1 -0
  58. package/dist/external.d.ts +61 -0
  59. package/dist/external.d.ts.map +1 -0
  60. package/dist/external.js +426 -0
  61. package/dist/external.js.map +1 -0
  62. package/dist/guide.d.ts +17 -0
  63. package/dist/guide.d.ts.map +1 -0
  64. package/dist/guide.js +219 -0
  65. package/dist/guide.js.map +1 -0
  66. package/dist/index.d.ts +2 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +7 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/install-external.d.ts +3 -0
  71. package/dist/install-external.d.ts.map +1 -0
  72. package/dist/install-external.js +37 -0
  73. package/dist/install-external.js.map +1 -0
  74. package/dist/library-install.d.ts +39 -0
  75. package/dist/library-install.d.ts.map +1 -0
  76. package/dist/library-install.js +663 -0
  77. package/dist/library-install.js.map +1 -0
  78. package/dist/orchestrator/boot.d.ts +3 -0
  79. package/dist/orchestrator/boot.d.ts.map +1 -0
  80. package/dist/orchestrator/boot.js +515 -0
  81. package/dist/orchestrator/boot.js.map +1 -0
  82. package/dist/orchestrator/cli.d.ts +37 -0
  83. package/dist/orchestrator/cli.d.ts.map +1 -0
  84. package/dist/orchestrator/cli.js +563 -0
  85. package/dist/orchestrator/cli.js.map +1 -0
  86. package/dist/orchestrator/commands.d.ts +46 -0
  87. package/dist/orchestrator/commands.d.ts.map +1 -0
  88. package/dist/orchestrator/commands.js +752 -0
  89. package/dist/orchestrator/commands.js.map +1 -0
  90. package/dist/orchestrator/compaction.d.ts +21 -0
  91. package/dist/orchestrator/compaction.d.ts.map +1 -0
  92. package/dist/orchestrator/compaction.js +93 -0
  93. package/dist/orchestrator/compaction.js.map +1 -0
  94. package/dist/orchestrator/drift.d.ts +11 -0
  95. package/dist/orchestrator/drift.d.ts.map +1 -0
  96. package/dist/orchestrator/drift.js +181 -0
  97. package/dist/orchestrator/drift.js.map +1 -0
  98. package/dist/orchestrator/errors.d.ts +52 -0
  99. package/dist/orchestrator/errors.d.ts.map +1 -0
  100. package/dist/orchestrator/errors.js +96 -0
  101. package/dist/orchestrator/errors.js.map +1 -0
  102. package/dist/orchestrator/frontmatter.d.ts +6 -0
  103. package/dist/orchestrator/frontmatter.d.ts.map +1 -0
  104. package/dist/orchestrator/frontmatter.js +50 -0
  105. package/dist/orchestrator/frontmatter.js.map +1 -0
  106. package/dist/orchestrator/fsx.d.ts +45 -0
  107. package/dist/orchestrator/fsx.d.ts.map +1 -0
  108. package/dist/orchestrator/fsx.js +295 -0
  109. package/dist/orchestrator/fsx.js.map +1 -0
  110. package/dist/orchestrator/handoff.d.ts +8 -0
  111. package/dist/orchestrator/handoff.d.ts.map +1 -0
  112. package/dist/orchestrator/handoff.js +246 -0
  113. package/dist/orchestrator/handoff.js.map +1 -0
  114. package/dist/orchestrator/hash.d.ts +10 -0
  115. package/dist/orchestrator/hash.d.ts.map +1 -0
  116. package/dist/orchestrator/hash.js +65 -0
  117. package/dist/orchestrator/hash.js.map +1 -0
  118. package/dist/orchestrator/journal.d.ts +35 -0
  119. package/dist/orchestrator/journal.d.ts.map +1 -0
  120. package/dist/orchestrator/journal.js +163 -0
  121. package/dist/orchestrator/journal.js.map +1 -0
  122. package/dist/orchestrator/lease.d.ts +31 -0
  123. package/dist/orchestrator/lease.d.ts.map +1 -0
  124. package/dist/orchestrator/lease.js +175 -0
  125. package/dist/orchestrator/lease.js.map +1 -0
  126. package/dist/orchestrator/plan.d.ts +27 -0
  127. package/dist/orchestrator/plan.d.ts.map +1 -0
  128. package/dist/orchestrator/plan.js +240 -0
  129. package/dist/orchestrator/plan.js.map +1 -0
  130. package/dist/orchestrator/report.d.ts +49 -0
  131. package/dist/orchestrator/report.d.ts.map +1 -0
  132. package/dist/orchestrator/report.js +244 -0
  133. package/dist/orchestrator/report.js.map +1 -0
  134. package/dist/orchestrator/state.d.ts +43 -0
  135. package/dist/orchestrator/state.d.ts.map +1 -0
  136. package/dist/orchestrator/state.js +369 -0
  137. package/dist/orchestrator/state.js.map +1 -0
  138. package/dist/orchestrator/store.d.ts +42 -0
  139. package/dist/orchestrator/store.d.ts.map +1 -0
  140. package/dist/orchestrator/store.js +202 -0
  141. package/dist/orchestrator/store.js.map +1 -0
  142. package/dist/orchestrator/test-hooks.d.ts +5 -0
  143. package/dist/orchestrator/test-hooks.d.ts.map +1 -0
  144. package/dist/orchestrator/test-hooks.js +31 -0
  145. package/dist/orchestrator/test-hooks.js.map +1 -0
  146. package/dist/orchestrator/time.d.ts +11 -0
  147. package/dist/orchestrator/time.d.ts.map +1 -0
  148. package/dist/orchestrator/time.js +38 -0
  149. package/dist/orchestrator/time.js.map +1 -0
  150. package/dist/paths.d.ts +9 -0
  151. package/dist/paths.d.ts.map +1 -0
  152. package/dist/paths.js +42 -0
  153. package/dist/paths.js.map +1 -0
  154. package/dist/pinned-source.d.ts +13 -0
  155. package/dist/pinned-source.d.ts.map +1 -0
  156. package/dist/pinned-source.js +238 -0
  157. package/dist/pinned-source.js.map +1 -0
  158. package/dist/reconcile/cli.d.ts +17 -0
  159. package/dist/reconcile/cli.d.ts.map +1 -0
  160. package/dist/reconcile/cli.js +171 -0
  161. package/dist/reconcile/cli.js.map +1 -0
  162. package/dist/reconcile/detectors.d.ts +29 -0
  163. package/dist/reconcile/detectors.d.ts.map +1 -0
  164. package/dist/reconcile/detectors.js +294 -0
  165. package/dist/reconcile/detectors.js.map +1 -0
  166. package/dist/reconcile/manifest.d.ts +11 -0
  167. package/dist/reconcile/manifest.d.ts.map +1 -0
  168. package/dist/reconcile/manifest.js +118 -0
  169. package/dist/reconcile/manifest.js.map +1 -0
  170. package/dist/reconcile/queue.d.ts +3 -0
  171. package/dist/reconcile/queue.d.ts.map +1 -0
  172. package/dist/reconcile/queue.js +723 -0
  173. package/dist/reconcile/queue.js.map +1 -0
  174. package/dist/reconcile/score.d.ts +19 -0
  175. package/dist/reconcile/score.d.ts.map +1 -0
  176. package/dist/reconcile/score.js +58 -0
  177. package/dist/reconcile/score.js.map +1 -0
  178. package/dist/scripts/check-opencode-config.d.ts +12 -0
  179. package/dist/scripts/check-opencode-config.d.ts.map +1 -0
  180. package/dist/scripts/check-opencode-config.js +216 -0
  181. package/dist/scripts/check-opencode-config.js.map +1 -0
  182. package/dist/scripts/check-pack.d.ts +3 -0
  183. package/dist/scripts/check-pack.d.ts.map +1 -0
  184. package/dist/scripts/check-pack.js +74 -0
  185. package/dist/scripts/check-pack.js.map +1 -0
  186. package/dist/scripts/check-pins.d.ts +9 -0
  187. package/dist/scripts/check-pins.d.ts.map +1 -0
  188. package/dist/scripts/check-pins.js +65 -0
  189. package/dist/scripts/check-pins.js.map +1 -0
  190. package/dist/scripts/check-security.d.ts +3 -0
  191. package/dist/scripts/check-security.d.ts.map +1 -0
  192. package/dist/scripts/check-security.js +47 -0
  193. package/dist/scripts/check-security.js.map +1 -0
  194. package/dist/scripts/check-skills-lock.d.ts +7 -0
  195. package/dist/scripts/check-skills-lock.d.ts.map +1 -0
  196. package/dist/scripts/check-skills-lock.js +36 -0
  197. package/dist/scripts/check-skills-lock.js.map +1 -0
  198. package/dist/scripts/check-skills-sync.d.ts +7 -0
  199. package/dist/scripts/check-skills-sync.d.ts.map +1 -0
  200. package/dist/scripts/check-skills-sync.js +146 -0
  201. package/dist/scripts/check-skills-sync.js.map +1 -0
  202. package/dist/scripts/check-yaml.d.ts +3 -0
  203. package/dist/scripts/check-yaml.d.ts.map +1 -0
  204. package/dist/scripts/check-yaml.js +41 -0
  205. package/dist/scripts/check-yaml.js.map +1 -0
  206. package/dist/scripts/publish-npm.d.ts +3 -0
  207. package/dist/scripts/publish-npm.d.ts.map +1 -0
  208. package/dist/scripts/publish-npm.js +67 -0
  209. package/dist/scripts/publish-npm.js.map +1 -0
  210. package/dist/scripts/release-check.d.ts +3 -0
  211. package/dist/scripts/release-check.d.ts.map +1 -0
  212. package/dist/scripts/release-check.js +97 -0
  213. package/dist/scripts/release-check.js.map +1 -0
  214. package/dist/scripts/support.d.ts +41 -0
  215. package/dist/scripts/support.d.ts.map +1 -0
  216. package/dist/scripts/support.js +78 -0
  217. package/dist/scripts/support.js.map +1 -0
  218. package/dist/targets/claude.d.ts +4 -0
  219. package/dist/targets/claude.d.ts.map +1 -0
  220. package/dist/targets/claude.js +42 -0
  221. package/dist/targets/claude.js.map +1 -0
  222. package/dist/targets/cline.d.ts +4 -0
  223. package/dist/targets/cline.d.ts.map +1 -0
  224. package/dist/targets/cline.js +39 -0
  225. package/dist/targets/cline.js.map +1 -0
  226. package/dist/targets/cursor.d.ts +4 -0
  227. package/dist/targets/cursor.d.ts.map +1 -0
  228. package/dist/targets/cursor.js +40 -0
  229. package/dist/targets/cursor.js.map +1 -0
  230. package/dist/targets/index.d.ts +4 -0
  231. package/dist/targets/index.d.ts.map +1 -0
  232. package/dist/targets/index.js +11 -0
  233. package/dist/targets/index.js.map +1 -0
  234. package/dist/targets/opencode.d.ts +4 -0
  235. package/dist/targets/opencode.d.ts.map +1 -0
  236. package/dist/targets/opencode.js +48 -0
  237. package/dist/targets/opencode.js.map +1 -0
  238. package/dist/targets/windsurf.d.ts +4 -0
  239. package/dist/targets/windsurf.d.ts.map +1 -0
  240. package/dist/targets/windsurf.js +41 -0
  241. package/dist/targets/windsurf.js.map +1 -0
  242. package/dist/types/common.d.ts +193 -0
  243. package/dist/types/common.d.ts.map +1 -0
  244. package/dist/types/common.js +6 -0
  245. package/dist/types/common.js.map +1 -0
  246. package/dist/types/design.d.ts +185 -0
  247. package/dist/types/design.d.ts.map +1 -0
  248. package/dist/types/design.js +3 -0
  249. package/dist/types/design.js.map +1 -0
  250. package/dist/types/guards.d.ts +13 -0
  251. package/dist/types/guards.d.ts.map +1 -0
  252. package/dist/types/guards.js +64 -0
  253. package/dist/types/guards.js.map +1 -0
  254. package/dist/types/handoff.d.ts +29 -0
  255. package/dist/types/handoff.d.ts.map +1 -0
  256. package/dist/types/handoff.js +3 -0
  257. package/dist/types/handoff.js.map +1 -0
  258. package/dist/types/index.d.ts +7 -0
  259. package/dist/types/index.d.ts.map +1 -0
  260. package/dist/types/index.js +11 -0
  261. package/dist/types/index.js.map +1 -0
  262. package/dist/types/orchestrator.d.ts +414 -0
  263. package/dist/types/orchestrator.d.ts.map +1 -0
  264. package/dist/types/orchestrator.js +4 -0
  265. package/dist/types/orchestrator.js.map +1 -0
  266. package/dist/types/reconcile.d.ts +160 -0
  267. package/dist/types/reconcile.d.ts.map +1 -0
  268. package/dist/types/reconcile.js +3 -0
  269. package/dist/types/reconcile.js.map +1 -0
  270. package/docs/RECONCILE.md +505 -0
  271. package/docs/design/_schema.md +506 -0
  272. package/junamis-skills.yml +328 -0
  273. package/library/EXTERNAL.md +35 -0
  274. package/library/HANDOFF.md +93 -0
  275. package/library/RESUME.md +429 -0
  276. package/library/SAFETY.md +83 -0
  277. package/library/agents/context-keeper.md +41 -0
  278. package/library/agents/frontend.md +43 -0
  279. package/library/agents/maintainer.md +44 -0
  280. package/library/agents/nestjs.md +40 -0
  281. package/library/agents/nextjs.md +40 -0
  282. package/library/agents/operator.md +42 -0
  283. package/library/agents/orchestrator.md +313 -0
  284. package/library/agents/researcher.md +40 -0
  285. package/library/agents/reviewer.md +40 -0
  286. package/library/skills/db-migrate/SKILL.md +50 -0
  287. package/library/skills/decision-record/SKILL.md +74 -0
  288. package/library/skills/dependency-upgrade/SKILL.md +57 -0
  289. package/library/skills/deploy-verify/SKILL.md +51 -0
  290. package/library/skills/document/SKILL.md +51 -0
  291. package/library/skills/env-doctor/SKILL.md +65 -0
  292. package/library/skills/frontend/SKILL.md +63 -0
  293. package/library/skills/handoff/SKILL.md +79 -0
  294. package/library/skills/incident-response/SKILL.md +69 -0
  295. package/library/skills/nestjs/SKILL.md +49 -0
  296. package/library/skills/nextjs/SKILL.md +48 -0
  297. package/library/skills/perf-budget/SKILL.md +62 -0
  298. package/library/skills/refactor-safely/SKILL.md +48 -0
  299. package/library/skills/release-prep/SKILL.md +75 -0
  300. package/library/skills/research/SKILL.md +66 -0
  301. package/library/skills/rollback/SKILL.md +49 -0
  302. package/library/skills/route/SKILL.md +107 -0
  303. package/library/skills/route-external/SKILL.md +67 -0
  304. package/library/skills/security-audit/SKILL.md +64 -0
  305. package/library/skills/skill-author/SKILL.md +49 -0
  306. package/opencode.json +5906 -0
  307. package/package.json +88 -4
  308. package/scripts/design-registry.mjs +7 -0
  309. package/scripts/orchestrator-state.mjs +7 -0
  310. package/scripts/reconcile.mjs +7 -0
  311. package/skills-lock.json +197 -0
@@ -0,0 +1,426 @@
1
+ import { spawn } from "node:child_process";
2
+ import { lstatSync } from "node:fs";
3
+ import { readFile } from "node:fs/promises";
4
+ import { devNull, tmpdir } from "node:os";
5
+ import { isAbsolute, join } from "node:path";
6
+ import { getSkillTreeSha, preparePinnedSource } from "./pinned-source.js";
7
+ import { getTarget } from "./targets/index.js";
8
+ import { isRecord, parseJsonUnknown } from "./types/guards.js";
9
+ // Installs every skill in skills-lock.json with the pinned skillsio scanner.
10
+ //
11
+ // Safety rules for this file:
12
+ // - No shell. Commands are argument arrays passed to spawn(), never strings.
13
+ // - Every value that reaches a command is validated against a strict pattern first.
14
+ // - The scanner is pinned and integrity-checked: registry, version, tarball URL,
15
+ // and the SHA-512 integrity are constants in this file.
16
+ // - `-y` is required so `init` can install every skill non-interactively. It only
17
+ // skips the overwrite prompt; it does NOT bypass the high/critical security
18
+ // prompt, so a skill can be reported as installed while nothing was written.
19
+ // - `--skip-scan` is therefore always passed. Install-time scanning is skipped by
20
+ // design; the recorded results in SECURITY.md plus the gate in library/SAFETY.md
21
+ // are the vetting record. After a successful run every expected skill directory
22
+ // is checked on disk before it is counted as installed.
23
+ // - Nothing else is answered on the user's behalf. stdin is inherited.
24
+ const SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
25
+ const SOURCE = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/;
26
+ const SHA = /^[a-f0-9]{40}$/;
27
+ const SECURITY_CANCELLATION = "Installation cancelled due to security concerns";
28
+ export { SECURITY_CANCELLATION };
29
+ const SECURITY_CANCELLATION_EXIT = 125;
30
+ const MAX_CAPTURE_BYTES = 64 * 1024;
31
+ export const KILL_GRACE_MS = 5000;
32
+ const SETTLE_GRACE_MS = KILL_GRACE_MS + 2000;
33
+ // The scanner is the trusted component in the whole supply-chain story, so its
34
+ // registry and tarball integrity are constants, not project configuration.
35
+ export const SCANNER = {
36
+ name: "skillsio",
37
+ version: "1.1.3",
38
+ registry: "https://registry.npmjs.org/",
39
+ integrity: "sha512-gsm2Urzgjrz9Mx84lkI4UOXSCkQlYgrUMqQqTDj5sn44vkRO+GDBg372UyUAw5vT/+h/I3MLh4+qgghm5tDDIA==",
40
+ };
41
+ const DENIED_ENV = /^(npm_config_|NPM_CONFIG_|pnpm_config_|PNPM_CONFIG_|NODE_OPTIONS|NODE_PATH|COREPACK_)/;
42
+ // CI markers make some tools switch to non-interactive or auto-accept paths.
43
+ const DENIED_ENV_EXACT = new Set(["CI", "GITHUB_ACTIONS"]);
44
+ // A hostile project can set registry or Node options through the environment.
45
+ // Only keep the variables a scanner needs, then force our own registry paths.
46
+ export function sanitizedEnv(base = process.env) {
47
+ const env = {};
48
+ for (const [key, value] of Object.entries(base)) {
49
+ if (!DENIED_ENV.test(key) && !DENIED_ENV_EXACT.has(key) && value !== undefined)
50
+ env[key] = value;
51
+ }
52
+ return Object.assign(env, {
53
+ npm_config_registry: SCANNER.registry,
54
+ npm_config_userconfig: devNull,
55
+ npm_config_globalconfig: devNull,
56
+ GIT_TERMINAL_PROMPT: "0",
57
+ NO_COLOR: "1",
58
+ FORCE_COLOR: "0",
59
+ });
60
+ }
61
+ const SCANNER_TARBALL = `${SCANNER.registry}${SCANNER.name}/-/${SCANNER.name}-${SCANNER.version}.tgz`;
62
+ export async function verifyScannerIntegrity(fetchImpl = fetch) {
63
+ const url = `${SCANNER.registry}${SCANNER.name}/${SCANNER.version}`;
64
+ const response = await fetchImpl(url, {
65
+ headers: { accept: "application/json" },
66
+ signal: globalThis.AbortSignal.timeout(15000),
67
+ });
68
+ if (!response.ok) {
69
+ throw new Error(`could not verify ${SCANNER.name}@${SCANNER.version}: HTTP ${response.status}`);
70
+ }
71
+ const metadata = await response.json();
72
+ const dist = isRecord(metadata) && isRecord(metadata["dist"]) ? metadata["dist"] : {};
73
+ const integrity = dist["integrity"];
74
+ if (integrity !== SCANNER.integrity) {
75
+ throw new Error(`${SCANNER.name}@${SCANNER.version} integrity mismatch (expected ${SCANNER.integrity}, got ${String(integrity)})`);
76
+ }
77
+ const tarball = dist["tarball"];
78
+ if (tarball !== SCANNER_TARBALL) {
79
+ throw new Error(`${SCANNER.name}@${SCANNER.version} tarball mismatch (expected ${SCANNER_TARBALL}, got ${String(tarball)})`);
80
+ }
81
+ }
82
+ export function stripControlSequences(value) {
83
+ return String(value)
84
+ // OSC: ESC ] ... BEL or ST
85
+ // eslint-disable-next-line no-control-regex
86
+ .replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, "")
87
+ // CSI: ESC [ parameters final byte
88
+ // eslint-disable-next-line no-control-regex
89
+ .replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")
90
+ // Other two-byte ESC sequences.
91
+ // eslint-disable-next-line no-control-regex
92
+ .replace(/\x1b[@-_]/g, "")
93
+ // Remaining control characters except tab, newline, and carriage return.
94
+ // eslint-disable-next-line no-control-regex
95
+ .replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "");
96
+ }
97
+ function isValidSkillPath(value) {
98
+ if (typeof value !== "string")
99
+ return false;
100
+ const segments = value.split("/");
101
+ return segments.at(-1) === "SKILL.md" && segments.every((segment) => segment !== "" && segment !== "." && segment !== ".." && /^[A-Za-z0-9._-]+$/.test(segment));
102
+ }
103
+ // Agent ids accepted on the command line, mapped to the name skillsio expects.
104
+ const SKILLSIO_AGENT = new Map([
105
+ ["opencode", "opencode"],
106
+ ["claude", "claude-code"],
107
+ ["claude-code", "claude-code"],
108
+ ]);
109
+ const INSTALLERS = new Map([
110
+ ["skillsio", ["pnpm", "--registry", SCANNER.registry, "dlx", `${SCANNER.name}@${SCANNER.version}`]],
111
+ ]);
112
+ function installerRunner(installer) {
113
+ const runner = INSTALLERS.get(installer);
114
+ if (!runner) {
115
+ throw new Error(`unknown installer "${installer}"; expected one of: ${[...INSTALLERS.keys()].join(", ")}`);
116
+ }
117
+ return runner;
118
+ }
119
+ export function validateAgent(agent) {
120
+ const mapped = SKILLSIO_AGENT.get(agent);
121
+ if (mapped === undefined) {
122
+ throw new Error(`unknown agent "${agent}"; expected one of: ${[...SKILLSIO_AGENT.keys()].join(", ")}`);
123
+ }
124
+ return mapped;
125
+ }
126
+ export function validateInstaller(installer) {
127
+ installerRunner(installer);
128
+ return installer;
129
+ }
130
+ // A scan can be declined with wording or casing we do not control. Treat a
131
+ // line about security that also says cancel/decline/block/fail as a failure,
132
+ // but never turn an explicit pass into a cancellation. Match whole words only:
133
+ // a bare substring test would read the "fail" inside "failures" as a decline.
134
+ export function isSecurityCancellation(output) {
135
+ const text = String(output);
136
+ if (text.toLowerCase().includes(SECURITY_CANCELLATION.toLowerCase()))
137
+ return true;
138
+ return text.split(/\r?\n/).some((line) => {
139
+ const lower = line.toLowerCase();
140
+ if (!lower.includes("security"))
141
+ return false;
142
+ if (/no security issues|security scan passed/.test(lower))
143
+ return false;
144
+ return /\b(?:cancel(?:led|ed)?|declin(?:ed|e)|block(?:ed)?|fail(?:ed|s|ure)?)\b/.test(lower);
145
+ });
146
+ }
147
+ export function installerExitCode(code, output) {
148
+ return isSecurityCancellation(output) ? SECURITY_CANCELLATION_EXIT : code ?? 1;
149
+ }
150
+ // Lock entries are external input: every field is proved before it is grouped.
151
+ export function groupLock(lock) {
152
+ if (!isRecord(lock))
153
+ throw new Error("lock must contain a skills object");
154
+ const skills = lock["skills"];
155
+ if (!isRecord(skills))
156
+ throw new Error("lock must contain a skills object");
157
+ if (Object.keys(skills).length === 0) {
158
+ throw new Error("lock must contain at least one skill");
159
+ }
160
+ const groups = new Map();
161
+ for (const [name, entry] of Object.entries(skills)) {
162
+ if (!SKILL_NAME.test(name))
163
+ throw new Error(`invalid skill name in lock: "${name}"`);
164
+ const source = isRecord(entry) ? entry["source"] : undefined;
165
+ if (typeof source !== "string" || !SOURCE.test(source)) {
166
+ throw new Error(`invalid source for "${name}" in lock: ${JSON.stringify(source)}`);
167
+ }
168
+ if (!isRecord(entry) || entry["sourceType"] !== "github") {
169
+ throw new Error(`invalid sourceType for "${name}" in lock`);
170
+ }
171
+ const skillPath = entry["skillPath"];
172
+ if (!isValidSkillPath(skillPath)) {
173
+ throw new Error(`invalid skillPath for "${name}" in lock`);
174
+ }
175
+ const license = entry["license"];
176
+ if (typeof license !== "string" || license.trim() === "") {
177
+ throw new Error(`missing license for "${name}" in lock`);
178
+ }
179
+ const ref = entry["ref"];
180
+ if (typeof ref !== "string" || !SHA.test(ref)) {
181
+ throw new Error(`invalid commit SHA for "${name}" in lock`);
182
+ }
183
+ const treeSha = entry["treeSha"];
184
+ if (typeof treeSha !== "string" || !SHA.test(treeSha)) {
185
+ throw new Error(`invalid tree SHA for "${name}" in lock`);
186
+ }
187
+ const key = `${source}\0${ref}`;
188
+ const skill = { name, skillPath, treeSha };
189
+ const group = groups.get(key);
190
+ if (group)
191
+ group.skills.push(skill);
192
+ else
193
+ groups.set(key, { source, ref, skills: [skill] });
194
+ }
195
+ return [...groups.values()].map((group) => ({
196
+ ...group,
197
+ skills: [...group.skills].sort((left, right) => left.name.localeCompare(right.name)),
198
+ }));
199
+ }
200
+ // Returns an argv array. Never a string. Always includes --skip-scan: the
201
+ // scanner's high/critical prompt cannot be bypassed with -y, and install-time
202
+ // scanning is skipped by design (SECURITY.md is the recorded vetting record).
203
+ export function buildCommand({ installer, source, agent, skills, local = false }) {
204
+ const runner = installerRunner(validateInstaller(installer));
205
+ const skillsioAgent = validateAgent(agent);
206
+ if (local ? !isAbsolute(source) : !SOURCE.test(source)) {
207
+ throw new Error(`invalid ${local ? "local source path" : "source"}: ${JSON.stringify(source)}`);
208
+ }
209
+ for (const s of skills)
210
+ if (!SKILL_NAME.test(s))
211
+ throw new Error(`invalid skill name: ${JSON.stringify(s)}`);
212
+ return [...runner, "add", source, "--agent", skillsioAgent, "--skill", ...skills, "--skip-scan", "-g", "-y"];
213
+ }
214
+ export async function verifySkillTree(directory, skill, readTreeSha = getSkillTreeSha) {
215
+ const actual = await readTreeSha(directory, skill.skillPath);
216
+ if (actual !== skill.treeSha) {
217
+ throw new Error(`locked tree SHA mismatch for "${skill.name}" (expected ${skill.treeSha}, got ${actual})`);
218
+ }
219
+ }
220
+ function pathExists(path) {
221
+ try {
222
+ lstatSync(path);
223
+ return true;
224
+ }
225
+ catch (error) {
226
+ if (isRecord(error) && error["code"] === "ENOENT")
227
+ return false;
228
+ throw error;
229
+ }
230
+ }
231
+ export function partitionExistingSkills(skills, skillsDir, exists = pathExists) {
232
+ const available = [];
233
+ const conflicts = [];
234
+ for (const skill of skills) {
235
+ const path = join(skillsDir, skill.name);
236
+ if (exists(path))
237
+ conflicts.push({ ...skill, path });
238
+ else
239
+ available.push(skill);
240
+ }
241
+ return { available, conflicts };
242
+ }
243
+ export function runCommand(argv, timeout = 300000, options = {}) {
244
+ const { cwd = tmpdir(), env = sanitizedEnv() } = options;
245
+ return new Promise((resolve) => {
246
+ const [program, ...args] = argv;
247
+ if (program === undefined)
248
+ throw new Error("runCommand needs a program");
249
+ const child = spawn(program, args, {
250
+ stdio: ["inherit", "pipe", "pipe"],
251
+ shell: false,
252
+ cwd,
253
+ env,
254
+ detached: true,
255
+ });
256
+ let settled = false;
257
+ let capturedOutput = "";
258
+ let securityCancellationDetected = false;
259
+ let timedOut = false;
260
+ let killTimer;
261
+ let settleTimer;
262
+ const killGroup = (signal) => {
263
+ try {
264
+ if (child.pid)
265
+ process.kill(-child.pid, signal);
266
+ else
267
+ child.kill(signal);
268
+ }
269
+ catch {
270
+ try {
271
+ child.kill(signal);
272
+ }
273
+ catch { /* ignore */ }
274
+ }
275
+ };
276
+ const capture = (stream, destination) => {
277
+ stream.on("data", (chunk) => {
278
+ const text = chunk.toString();
279
+ capturedOutput = (capturedOutput + text).slice(-MAX_CAPTURE_BYTES);
280
+ securityCancellationDetected ||= isSecurityCancellation(capturedOutput);
281
+ const readable = stripControlSequences(text);
282
+ if (readable)
283
+ destination.write(readable);
284
+ });
285
+ };
286
+ capture(child.stdout, process.stdout);
287
+ capture(child.stderr, process.stderr);
288
+ const finish = (code) => {
289
+ if (settled)
290
+ return;
291
+ settled = true;
292
+ clearTimeout(timer);
293
+ clearTimeout(killTimer);
294
+ clearTimeout(settleTimer);
295
+ resolve(installerExitCode(timedOut ? 124 : code, securityCancellationDetected ? SECURITY_CANCELLATION : ""));
296
+ };
297
+ const timer = timeout > 0
298
+ ? setTimeout(() => {
299
+ timedOut = true;
300
+ killGroup("SIGTERM");
301
+ killTimer = setTimeout(() => killGroup("SIGKILL"), KILL_GRACE_MS);
302
+ // A descendant can leave its own process group and keep the pipes open,
303
+ // so `close` may never arrive. After the escalation window, settle anyway.
304
+ settleTimer = setTimeout(() => {
305
+ child.stdout?.destroy();
306
+ child.stderr?.destroy();
307
+ finish(124);
308
+ }, SETTLE_GRACE_MS);
309
+ }, timeout)
310
+ : undefined;
311
+ // Resolve only once the child (and its process group) is actually gone.
312
+ child.on("close", (code) => finish(code));
313
+ child.on("error", () => finish(1));
314
+ });
315
+ }
316
+ export async function installExternal({ lockPath, agent, installer = "skillsio", log = console.log, run = runCommand, prepareSource = preparePinnedSource, verifyTree = verifySkillTree, verifyScanner = verifyScannerIntegrity, exists = pathExists, retries = 1, timeout = 300000, }) {
317
+ validateInstaller(installer);
318
+ validateAgent(agent);
319
+ const target = getTarget(agent);
320
+ if (!target)
321
+ throw new Error(`unknown agent "${agent}"`);
322
+ const parsed = parseJsonUnknown(await readFile(lockPath, "utf8"));
323
+ if (!parsed.ok)
324
+ throw new Error(`cannot read ${lockPath}: ${parsed.error.message}`);
325
+ const groups = groupLock(parsed.value);
326
+ let installed = 0;
327
+ let skipped = 0;
328
+ let failed = 0;
329
+ let scannerVerified = false;
330
+ log("scan: skipped at install by design; recorded results are in SECURITY.md (see library/SAFETY.md)");
331
+ for (const group of groups) {
332
+ let checkout;
333
+ let { available, conflicts } = partitionExistingSkills(group.skills, target.globalSkillsDir(), exists);
334
+ skipped += conflicts.length;
335
+ log(`\n--> ${group.source}`);
336
+ log(` commit: ${group.ref}`);
337
+ log(` skills: ${available.map((skill) => skill.name).join(", ") || "none"}`);
338
+ for (const conflict of conflicts) {
339
+ log(` SKIPPED ${conflict.name}: existing skill was not overwritten (${conflict.path})`);
340
+ }
341
+ if (available.length === 0) {
342
+ // Everything in this group is already installed. That is not a failure:
343
+ // init runs again on machines that already have some or all skills.
344
+ log(` skipped: ${group.source} (all skills already installed)`);
345
+ continue;
346
+ }
347
+ try {
348
+ checkout = await prepareSource({ ...group, skills: available }, { timeout });
349
+ const afterCheckout = partitionExistingSkills(available, target.globalSkillsDir(), exists);
350
+ for (const conflict of afterCheckout.conflicts) {
351
+ log(` SKIPPED ${conflict.name}: skill appeared during checkout and was not overwritten (${conflict.path})`);
352
+ }
353
+ skipped += afterCheckout.conflicts.length;
354
+ available = afterCheckout.available;
355
+ if (available.length === 0) {
356
+ log(` skipped: ${group.source} (all remaining skills appeared during checkout)`);
357
+ continue;
358
+ }
359
+ for (const skill of available)
360
+ await verifyTree(checkout.path, skill);
361
+ const argv = buildCommand({
362
+ installer,
363
+ source: checkout.path,
364
+ agent,
365
+ skills: available.map((skill) => skill.name),
366
+ local: true,
367
+ });
368
+ log(` command: ${argv.join(" ")}\n`);
369
+ if (!scannerVerified) {
370
+ await verifyScanner();
371
+ scannerVerified = true;
372
+ }
373
+ let code = 1;
374
+ for (let attempt = 0; attempt <= retries; attempt++) {
375
+ if (attempt > 0)
376
+ log(` retry ${attempt}/${retries}: ${group.source}`);
377
+ code = await run(argv, timeout);
378
+ if (code === 0 || code === SECURITY_CANCELLATION_EXIT)
379
+ break;
380
+ }
381
+ if (code === 0) {
382
+ // The scanner can exit 0 after silently skipping a skill whose scan
383
+ // prompt went unanswered. Count only what actually landed on disk, and
384
+ // treat a missing SKILL.md as a failure rather than a successful install.
385
+ for (const skill of available) {
386
+ const skillFile = join(target.globalSkillsDir(), skill.name, "SKILL.md");
387
+ if (exists(skillFile)) {
388
+ installed++;
389
+ }
390
+ else {
391
+ failed++;
392
+ log(` MISSING ${skill.name}: no SKILL.md at ${skillFile} after a successful run`);
393
+ }
394
+ }
395
+ continue;
396
+ }
397
+ failed++;
398
+ if (code === SECURITY_CANCELLATION_EXIT) {
399
+ log(` FAILED: ${group.source} (security scan declined)`);
400
+ }
401
+ else {
402
+ log(` FAILED: ${group.source} (exit ${code})`);
403
+ }
404
+ log(" Some dependencies could not be installed. They may have been removed upstream.");
405
+ log(" Please report this at https://github.com/devenius/junamis-skills/issues");
406
+ }
407
+ catch (error) {
408
+ failed++;
409
+ log(` FAILED: ${group.source} (${error instanceof Error ? error.message : String(error)})`);
410
+ log(" No skills from this source were passed to the installer.");
411
+ }
412
+ finally {
413
+ if (checkout) {
414
+ try {
415
+ await checkout.cleanup();
416
+ }
417
+ catch (error) {
418
+ log(` WARNING: could not clean temporary checkout: ${error instanceof Error ? error.message : String(error)}`);
419
+ }
420
+ }
421
+ }
422
+ }
423
+ log(`\nDone. ${installed} installed, ${skipped} skipped, ${failed} failed across ${groups.length} source groups.`);
424
+ return { groups: groups.length, installed, skipped, failed };
425
+ }
426
+ //# sourceMappingURL=external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external.js","sourceRoot":"","sources":["../src/external.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { GuideInput, GuideResult } from "./types/index.js";
2
+ export declare const PACKAGE_ROOT: string;
3
+ export declare const GUIDE_NAME = "junamis-skills-guide.md";
4
+ export declare const MARKER_PATH: string;
5
+ export declare function renderGuide({ version, library, agents, locked }: GuideInput): string;
6
+ export interface WriteGuideOptions {
7
+ readonly projectDir: string;
8
+ readonly force?: boolean;
9
+ readonly packageRoot?: string;
10
+ }
11
+ /**
12
+ * Write the one-time setup guide into projectDir.
13
+ * - Idempotent: if the guide was already written by this package, do nothing.
14
+ * - Never overwrites a guide the user has, unless force is true.
15
+ */
16
+ export declare function writeGuide({ projectDir, force, packageRoot, }: WriteGuideOptions): Promise<GuideResult>;
17
+ //# sourceMappingURL=guide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.d.ts","sourceRoot":"","sources":["../src/guide.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,UAAU,EACV,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,YAAY,QAAyD,CAAC;AACnF,eAAO,MAAM,UAAU,4BAA4B,CAAC;AACpD,eAAO,MAAM,WAAW,QAA0C,CAAC;AAmEnE,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,GAAG,MAAM,CAqGpF;AAiBD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,EAC/B,UAAU,EACV,KAAa,EACb,WAA0B,GAC3B,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA2B1C"}