justskill-design 0.0.1 → 3.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.
Files changed (67) hide show
  1. package/README.en.md +235 -0
  2. package/README.md +184 -11
  3. package/SKILL.md +435 -0
  4. package/canvas/app.mjs +2870 -0
  5. package/canvas/groups.mjs +204 -0
  6. package/canvas/index.html +141 -0
  7. package/canvas/styles.css +1032 -0
  8. package/canvas/tree.mjs +249 -0
  9. package/cordis.patch.yml +8 -0
  10. package/design.mjs +172 -0
  11. package/docs/dsh-workbench.png +0 -0
  12. package/dsh/client.js +864 -0
  13. package/dsh/index.js +354 -0
  14. package/dsh/scan.js +139 -0
  15. package/dsh/skill.js +41 -0
  16. package/lib/base-css.mjs +92 -0
  17. package/lib/detect.mjs +123 -0
  18. package/lib/diagnostics.mjs +382 -0
  19. package/lib/export-html.mjs +309 -0
  20. package/lib/export-svg.mjs +111 -0
  21. package/lib/fragment.mjs +702 -0
  22. package/lib/geometry.mjs +827 -0
  23. package/lib/icons.mjs +106 -0
  24. package/lib/levenshtein.mjs +133 -0
  25. package/lib/node/cli.mjs +387 -0
  26. package/lib/node/export-svg.mjs +75 -0
  27. package/lib/node/fs.mjs +309 -0
  28. package/lib/node/op-json.mjs +75 -0
  29. package/lib/node/raster-run.mjs +115 -0
  30. package/lib/node/server.mjs +1264 -0
  31. package/lib/node/static.mjs +206 -0
  32. package/lib/node/verbs/add.mjs +220 -0
  33. package/lib/node/verbs/export.mjs +161 -0
  34. package/lib/node/verbs/format.mjs +106 -0
  35. package/lib/node/verbs/import.mjs +126 -0
  36. package/lib/node/verbs/ls.mjs +98 -0
  37. package/lib/node/verbs/migrate.mjs +236 -0
  38. package/lib/node/verbs/move.mjs +76 -0
  39. package/lib/node/verbs/new.mjs +284 -0
  40. package/lib/node/verbs/remove.mjs +41 -0
  41. package/lib/node/verbs/rename.mjs +87 -0
  42. package/lib/node/verbs/serve.mjs +164 -0
  43. package/lib/node/verbs/set.mjs +150 -0
  44. package/lib/node/verbs/show.mjs +122 -0
  45. package/lib/node/verbs/tokens.mjs +167 -0
  46. package/lib/node/verbs/validate.mjs +130 -0
  47. package/lib/node/write-verbs.mjs +215 -0
  48. package/lib/normalize.mjs +288 -0
  49. package/lib/ops.mjs +2063 -0
  50. package/lib/parse.mjs +997 -0
  51. package/lib/raster.mjs +186 -0
  52. package/lib/readers/pen.mjs +1684 -0
  53. package/lib/receipt.mjs +203 -0
  54. package/lib/render.mjs +503 -0
  55. package/lib/serialize.mjs +441 -0
  56. package/lib/spans.mjs +177 -0
  57. package/lib/svg-path.mjs +483 -0
  58. package/lib/table.mjs +1047 -0
  59. package/lib/tokens.mjs +295 -0
  60. package/lib/validate.mjs +929 -0
  61. package/package.json +68 -6
  62. package/references/cookbook.md +156 -0
  63. package/references/images.md +171 -0
  64. package/references/product-flow.md +408 -0
  65. package/references/schema.md +90 -0
  66. package/references/styling.md +181 -0
  67. package/scripts/install.mjs +95 -0
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Link this repository into a skills directory.
4
+ *
5
+ * A symlink, not a copy: edit the repository and every installed skill follows.
6
+ * That is the same reason the project has no build step — the thing on disk is
7
+ * the thing that runs.
8
+ *
9
+ * node scripts/install.mjs link into ~/.agents/skills and ~/.claude/skills
10
+ * node scripts/install.mjs --uninstall remove what this linked
11
+ * node scripts/install.mjs --dry-run print what it would do
12
+ */
13
+
14
+ import fs from "node:fs";
15
+ import os from "node:os";
16
+ import path from "node:path";
17
+ import process from "node:process";
18
+ import { fileURLToPath } from "node:url";
19
+
20
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
21
+ const ROOT = path.resolve(HERE, "..");
22
+ const NAME = "justskill-design";
23
+ const HOME = os.homedir();
24
+
25
+ const argv = process.argv.slice(2);
26
+ const doUninstall = argv.includes("--uninstall");
27
+ const dryRun = argv.includes("--dry-run");
28
+
29
+ function linkTargets() {
30
+ const agents = path.join(HOME, ".agents", "skills");
31
+ const claude = path.join(HOME, ".claude", "skills");
32
+ return [
33
+ { from: path.join(agents, NAME), to: ROOT, via: "~/.agents/skills" },
34
+ { from: path.join(claude, NAME), to: path.join(agents, NAME), via: "~/.claude/skills" },
35
+ ];
36
+ }
37
+
38
+ function describe(entry) {
39
+ try {
40
+ const stat = fs.lstatSync(entry.from);
41
+ if (stat.isSymbolicLink()) {
42
+ const resolved = path.resolve(path.dirname(entry.from), fs.readlinkSync(entry.from));
43
+ return { kind: "symlink", correct: resolved === entry.to, resolved };
44
+ }
45
+ return { kind: stat.isDirectory() ? "directory" : "file" };
46
+ } catch (error) {
47
+ if (error.code === "ENOENT") return { kind: "absent" };
48
+ throw error;
49
+ }
50
+ }
51
+
52
+ function install() {
53
+ let changed = 0;
54
+ for (const entry of linkTargets()) {
55
+ const state = describe(entry);
56
+ if (state.kind === "symlink" && state.correct) {
57
+ console.log(`ok ${entry.from} -> ${entry.to}`);
58
+ continue;
59
+ }
60
+ if (state.kind !== "absent") {
61
+ console.log(`SKIPPED ${entry.from} exists (${state.kind}). Remove it yourself, or use --uninstall if this tool linked it.`);
62
+ continue;
63
+ }
64
+ if (dryRun) {
65
+ console.log(`would ${entry.from} -> ${entry.to}`);
66
+ continue;
67
+ }
68
+ fs.mkdirSync(path.dirname(entry.from), { recursive: true });
69
+ fs.symlinkSync(entry.to, entry.from, "dir");
70
+ console.log(`linked ${entry.from} -> ${entry.to}`);
71
+ changed += 1;
72
+ }
73
+ console.log("");
74
+ console.log(changed ? "Installed." : "Nothing to do.");
75
+ }
76
+
77
+ function uninstall() {
78
+ for (const entry of linkTargets()) {
79
+ const state = describe(entry);
80
+ if (state.kind !== "symlink") {
81
+ console.log(`nothing ${entry.from} (${state.kind})`);
82
+ continue;
83
+ }
84
+ if (dryRun) {
85
+ console.log(`would remove ${entry.from}`);
86
+ continue;
87
+ }
88
+ fs.unlinkSync(entry.from);
89
+ console.log(`removed ${entry.from}`);
90
+ }
91
+ }
92
+
93
+ console.log(`${doUninstall ? "Uninstalling" : "Installing"} ${NAME} from ${ROOT}\n`);
94
+ if (doUninstall) uninstall();
95
+ else install();