claude-code-arcane 2.9.7 → 2.9.9

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 (129) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/agents/business/business-ops-lead.md +1 -14
  3. package/agents/game/gameplay-programmer.md +3 -4
  4. package/agents/game/technical-artist.md +3 -4
  5. package/dist/cli.js +74 -24
  6. package/docs/USER-GUIDE.md +1 -1
  7. package/docs/coordination-rules.md +1 -1
  8. package/docs/directory-structure.md +93 -122
  9. package/package.json +1 -1
  10. package/profiles/backend-go.yaml +1 -0
  11. package/profiles/core.yaml +0 -1
  12. package/rules/gamedev/engine-code.md +1 -1
  13. package/rules/gamedev/shader-code.md +1 -2
  14. package/rules/gamedev/vn-code.md +3 -2
  15. package/rules/implementation-workflow.md +1 -1
  16. package/rules/{ai-code.md → llm-code.md} +5 -5
  17. package/skills/agent-designer/README.md +2 -1
  18. package/skills/agent-designer/agent_evaluator.py +0 -5
  19. package/skills/ai-sdk-setup/SKILL.md +4 -4
  20. package/skills/architecture-decision/SKILL.md +3 -4
  21. package/skills/architecture-review/SKILL.md +1 -1
  22. package/skills/asset-audit/SKILL.md +0 -1
  23. package/skills/balance-check/SKILL.md +1 -1
  24. package/skills/brainstorm/SKILL.md +3 -3
  25. package/skills/brainstorm/references/next-steps-pipeline.md +8 -9
  26. package/skills/consistency-check/SKILL.md +2 -2
  27. package/skills/design-system/SKILL.md +1 -1
  28. package/skills/design-system/references/post-design-validation.md +2 -3
  29. package/skills/frontend-dev/SKILL.md +27 -28
  30. package/skills/frontend-dev/references/asset-prompt-guide.md +1 -1
  31. package/skills/frontend-dev/references/motion-recipes.md +1 -1
  32. package/skills/help/SKILL.md +1 -2
  33. package/skills/hotfix/SKILL.md +2 -2
  34. package/skills/milestone-review/SKILL.md +1 -1
  35. package/skills/patch-notes/SKILL.md +1 -1
  36. package/skills/playtest-report/SKILL.md +2 -3
  37. package/skills/playwright-pro/CLAUDE.md +2 -2
  38. package/skills/playwright-pro/SKILL.md +13 -9
  39. package/skills/playwright-pro/agents/migration-planner.md +2 -2
  40. package/skills/playwright-pro/agents/test-architect.md +1 -2
  41. package/skills/playwright-pro/agents/test-debugger.md +1 -1
  42. package/skills/playwright-pro/hooks/detect-playwright.sh +1 -1
  43. package/skills/playwright-pro/skills/browserstack/SKILL.md +5 -5
  44. package/skills/playwright-pro/skills/migrate/SKILL.md +1 -1
  45. package/skills/playwright-pro/skills/report/SKILL.md +2 -2
  46. package/skills/playwright-pro/skills/testrail/SKILL.md +5 -5
  47. package/skills/playwright-pro/templates/README.md +2 -2
  48. package/skills/prototype/SKILL.md +1 -1
  49. package/skills/quick-design/SKILL.md +1 -1
  50. package/skills/release-checklist/SKILL.md +0 -1
  51. package/skills/security-audit/SKILL.md +1 -1
  52. package/skills/self-improving-agent/CLAUDE.md +12 -12
  53. package/skills/self-improving-agent/SKILL.md +16 -12
  54. package/skills/self-improving-agent/agents/memory-analyst.md +1 -1
  55. package/skills/self-improving-agent/hooks/error-capture.sh +2 -2
  56. package/skills/self-improving-agent/reference/memory-architecture.md +2 -2
  57. package/skills/self-improving-agent/reference/promotion-rules.md +3 -3
  58. package/skills/self-improving-agent/reference/rules-directory-patterns.md +1 -1
  59. package/skills/self-improving-agent/settings.json +5 -5
  60. package/skills/self-improving-agent/skills/extract/SKILL.md +7 -7
  61. package/skills/self-improving-agent/skills/promote/SKILL.md +5 -5
  62. package/skills/self-improving-agent/skills/remember/SKILL.md +9 -9
  63. package/skills/self-improving-agent/skills/review/SKILL.md +7 -7
  64. package/skills/self-improving-agent/skills/status/SKILL.md +8 -8
  65. package/skills/senior-ml-engineer/references/llm_integration_guide.md +14 -31
  66. package/skills/senior-prompt-engineer/SKILL.md +10 -10
  67. package/skills/senior-prompt-engineer/references/prompt_engineering_patterns.md +1 -1
  68. package/skills/senior-prompt-engineer/scripts/agent_orchestrator.py +43 -40
  69. package/skills/senior-prompt-engineer/scripts/prompt_optimizer.py +23 -66
  70. package/skills/shader-dev/reference/fluid-simulation.md +4 -4
  71. package/skills/shader-dev/reference/simulation-physics.md +6 -6
  72. package/skills/shader-dev/reference/voxel-rendering.md +1 -1
  73. package/skills/shader-dev/techniques/ambient-occlusion.md +1 -1
  74. package/skills/shader-dev/techniques/analytic-ray-tracing.md +2 -2
  75. package/skills/shader-dev/techniques/domain-warping.md +2 -2
  76. package/skills/shader-dev/techniques/fluid-simulation.md +45 -45
  77. package/skills/shader-dev/techniques/multipass-buffer.md +24 -24
  78. package/skills/shader-dev/techniques/normal-estimation.md +1 -1
  79. package/skills/shader-dev/techniques/particle-system.md +16 -16
  80. package/skills/shader-dev/techniques/polar-uv-manipulation.md +1 -1
  81. package/skills/shader-dev/techniques/post-processing.md +7 -7
  82. package/skills/shader-dev/techniques/sdf-3d.md +1 -1
  83. package/skills/shader-dev/techniques/simulation-physics.md +24 -24
  84. package/skills/shader-dev/techniques/sound-synthesis.md +2 -2
  85. package/skills/shader-dev/techniques/voronoi-cellular-noise.md +1 -1
  86. package/skills/shader-dev/techniques/voxel-rendering.md +60 -60
  87. package/skills/smoke-check/SKILL.md +1 -1
  88. package/skills/sprint-plan/SKILL.md +1 -2
  89. package/skills/start/SKILL.md +7 -7
  90. package/skills/story-done/SKILL.md +1 -1
  91. package/skills/test-helpers/SKILL.md +7 -2
  92. package/skills/test-setup/SKILL.md +1 -1
  93. package/skills/ue-actor-component-architecture/SKILL.md +0 -1
  94. package/skills/ue-ai-navigation/SKILL.md +0 -1
  95. package/skills/ue-animation-system/SKILL.md +0 -1
  96. package/skills/ue-async-threading/SKILL.md +0 -1
  97. package/skills/ue-audio-system/SKILL.md +0 -1
  98. package/skills/ue-blueprints/SKILL.md +0 -1
  99. package/skills/ue-character-movement/SKILL.md +0 -1
  100. package/skills/ue-cpp-foundations/SKILL.md +0 -1
  101. package/skills/ue-data-assets-tables/SKILL.md +0 -1
  102. package/skills/ue-editor-tools/SKILL.md +0 -1
  103. package/skills/ue-game-features/SKILL.md +0 -1
  104. package/skills/ue-gameplay-abilities/SKILL.md +0 -1
  105. package/skills/ue-gameplay-framework/SKILL.md +0 -1
  106. package/skills/ue-input-system/SKILL.md +0 -1
  107. package/skills/ue-mass-entity/SKILL.md +0 -1
  108. package/skills/ue-materials-rendering/SKILL.md +0 -1
  109. package/skills/ue-module-build-system/SKILL.md +0 -1
  110. package/skills/ue-naming-conventions/SKILL.md +0 -1
  111. package/skills/ue-networking-replication/SKILL.md +0 -1
  112. package/skills/ue-niagara-effects/SKILL.md +0 -1
  113. package/skills/ue-packaging/SKILL.md +0 -1
  114. package/skills/ue-physics-collision/SKILL.md +0 -1
  115. package/skills/ue-procedural-generation/SKILL.md +0 -1
  116. package/skills/ue-project-context/SKILL.md +0 -1
  117. package/skills/ue-sequencer-cinematics/SKILL.md +0 -1
  118. package/skills/ue-serialization-savegames/SKILL.md +0 -1
  119. package/skills/ue-state-trees/SKILL.md +0 -1
  120. package/skills/ue-testing-debugging/SKILL.md +0 -1
  121. package/skills/ue-ui-umg-slate/SKILL.md +0 -1
  122. package/skills/ue-world-level-streaming/SKILL.md +0 -1
  123. package/skills/ux-review/SKILL.md +1 -1
  124. package/docs/RELEASE-SETUP.md +0 -99
  125. package/docs/presentations/arcane-overview-12.pptx +0 -0
  126. package/docs/presentations/arcane-overview.pptx +0 -0
  127. package/docs/presentations/build_arcane_deck.py +0 -310
  128. package/docs/presentations/build_arcane_deck_12.py +0 -399
  129. package/docs/trusted-publishing-setup.md +0 -163
package/CHANGELOG.md CHANGED
@@ -1,3 +1,24 @@
1
+ ## [2.9.9](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.9.8...v2.9.9) (2026-10-10)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **content:** remove stale facts and dated prompting found by a prompt audit ([f6d0cf0](https://github.com/SebastianLuser/claude-code-arcane/commit/f6d0cf0abef40682a5ea7b5546c740787267c2bb))
7
+ * **rules:** install the LLM rule with backend-go as llm-code ([8fbac31](https://github.com/SebastianLuser/claude-code-arcane/commit/8fbac317376dd0243878db501ce996df705e3478))
8
+ * **skills:** price current Claude models in the cost estimators ([352e062](https://github.com/SebastianLuser/claude-code-arcane/commit/352e0623123de5833e6734fa785e71c06c004429))
9
+ * **skills:** reach playwright-pro and self-improving-agent sub-skills through their parent ([4cc9dff](https://github.com/SebastianLuser/claude-code-arcane/commit/4cc9dffe71c406d1e12ccdb041587b3607a301b2))
10
+ * **skills:** read the engine from the project in the last four skills ([120c8eb](https://github.com/SebastianLuser/claude-code-arcane/commit/120c8eb0ddee200acea6e2f29b0f04e3118b6b5a))
11
+ * **skills:** route the remaining skills to skills and files that exist ([eb2eea0](https://github.com/SebastianLuser/claude-code-arcane/commit/eb2eea0eed4e1ba8964a1944548cb9ae9b386a4e))
12
+ * **skills:** stop pricing and advising prompts from 2023 in the prompt tools ([429247d](https://github.com/SebastianLuser/claude-code-arcane/commit/429247db70689e3df86fc1bfdf7b78cab3e10195))
13
+ * **update:** keep .claude/docs/ current like the other installed content ([f753c03](https://github.com/SebastianLuser/claude-code-arcane/commit/f753c030b73c89d5f3d035f0460954ba8d8c69a4))
14
+
15
+ ## [2.9.8](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.9.7...v2.9.8) (2026-09-09)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * **statusline:** point the global install at the script it owns ([1a8aada](https://github.com/SebastianLuser/claude-code-arcane/commit/1a8aada612e7f2bad2d60450306c0d51887f6b65))
21
+
1
22
  ## [2.9.7](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.9.6...v2.9.7) (2026-09-08)
2
23
 
3
24
 
@@ -32,20 +32,7 @@ Sos el **Business Operations Lead**. Tu rol: que el motor comercial funcione —
32
32
 
33
33
  ## Customer Health Score
34
34
 
35
- ```
36
- Health Score = weighted average of:
37
- Product Usage (30%): DAU/MAU, feature adoption, depth
38
- Support (20%): Ticket volume, CSAT, escalations
39
- Engagement (20%): NPS, exec sponsor active, QBR attendance
40
- Financial (15%): Payment on time, expansion signals
41
- Relationship (15%): Champion changes, stakeholder map
42
-
43
- Tiers:
44
- 90-100: Healthy (green) → Expansion candidate
45
- 70-89: Monitor (yellow) → Proactive outreach
46
- 50-69: At Risk (orange) → Success plan
47
- <50: Critical (red) → Executive intervention
48
- ```
35
+ Calculate it with `health_score_calculator.py` from the `customer-success-manager` skill: its dimensions, weights and segment thresholds are the ones in use. Do not compute it by hand.
49
36
 
50
37
  ## Protocolo
51
38
 
@@ -69,10 +69,9 @@ arrive. Decide, act, and make your reasoning auditable in the report.
69
69
  ### Engine Version Safety
70
70
 
71
71
  **Engine Version Safety**: Before suggesting any engine-specific API, class, or node:
72
- 1. Check `docs/engine-reference/[engine]/VERSION.md` for the project's pinned engine version
73
- 2. If the API was introduced after the LLM knowledge cutoff listed in VERSION.md, flag it explicitly:
74
- > "This API may have changed in [version] — verify against the reference docs before using."
75
- 3. Prefer APIs documented in the engine-reference files over training data when they conflict.
72
+ 1. Read the engine version from the project: `ProjectSettings/ProjectVersion.txt` (Unity) or `EngineAssociation` in the `.uproject` (Unreal)
73
+ 2. If the API may have changed in that version, flag it explicitly:
74
+ > "This API may have changed in [version] — verify against the engine docs before using."
76
75
 
77
76
  **ADR Compliance**: Before implementing any system, check `docs/architecture/` for a governing ADR.
78
77
  If an ADR exists for this system:
@@ -68,10 +68,9 @@ arrive. Decide, act, and make your reasoning auditable in the report.
68
68
  ### Engine Version Safety
69
69
 
70
70
  **Engine Version Safety**: Before suggesting any engine-specific API, class, or node:
71
- 1. Check `docs/engine-reference/[engine]/VERSION.md` for the project's pinned engine version
72
- 2. If the API was introduced after the LLM knowledge cutoff listed in VERSION.md, flag it explicitly:
73
- > "This API may have changed in [version] — verify against the reference docs before using."
74
- 3. Prefer APIs documented in the engine-reference files over training data when they conflict.
71
+ 1. Read the engine version from the project: `ProjectSettings/ProjectVersion.txt` (Unity) or `EngineAssociation` in the `.uproject` (Unreal)
72
+ 2. If the API may have changed in that version, flag it explicitly:
73
+ > "This API may have changed in [version] — verify against the engine docs before using."
75
74
 
76
75
  ### Performance Budgets
77
76
 
package/dist/cli.js CHANGED
@@ -397,6 +397,14 @@ import os from "os";
397
397
  function arcaneHome() {
398
398
  return process.env.ARCANE_HOME ?? path3.join(os.homedir(), ".arcane");
399
399
  }
400
+ var RELATIVE_STATUSLINE_COMMAND = "bash .claude/statusline.sh";
401
+ function statuslineCommand(target) {
402
+ if (path3.resolve(target) !== path3.resolve(os.homedir())) {
403
+ return RELATIVE_STATUSLINE_COMMAND;
404
+ }
405
+ const script = path3.join(target, ".claude", "statusline.sh").replace(/\\/g, "/");
406
+ return `bash "${script}"`;
407
+ }
400
408
  function getPackageRoot() {
401
409
  const thisFile = fileURLToPath(import.meta.url);
402
410
  return path3.resolve(path3.dirname(thisFile), "..");
@@ -743,7 +751,8 @@ function computeContentHashes(claudeDir) {
743
751
  skills: {},
744
752
  rules: {},
745
753
  agents: {},
746
- hooks: {}
754
+ hooks: {},
755
+ docs: {}
747
756
  };
748
757
  const skillsDir = path7.join(claudeDir, "skills");
749
758
  if (fs6.existsSync(skillsDir)) {
@@ -782,6 +791,8 @@ function computeContentHashes(claudeDir) {
782
791
  }
783
792
  }
784
793
  }
794
+ const docsDir = path7.join(claudeDir, "docs");
795
+ if (fs6.existsSync(docsDir)) hashes.docs = hashDirectory(docsDir);
785
796
  return hashes;
786
797
  }
787
798
  function computeSourceHashes(packageRoot, skills, rules, agents) {
@@ -789,7 +800,8 @@ function computeSourceHashes(packageRoot, skills, rules, agents) {
789
800
  skills: {},
790
801
  rules: {},
791
802
  agents: {},
792
- hooks: {}
803
+ hooks: {},
804
+ docs: {}
793
805
  };
794
806
  for (const skill of skills) {
795
807
  const skillDir = path7.join(packageRoot, "skills", skill);
@@ -828,6 +840,8 @@ function computeSourceHashes(packageRoot, skills, rules, agents) {
828
840
  }
829
841
  }
830
842
  }
843
+ const docsDir = path7.join(packageRoot, "docs");
844
+ if (fs6.existsSync(docsDir)) hashes.docs = hashDirectory(docsDir);
831
845
  return hashes;
832
846
  }
833
847
 
@@ -1243,7 +1257,7 @@ var Installer = class {
1243
1257
  if (this.hasStatusline) {
1244
1258
  settings.statusLine = {
1245
1259
  type: "command",
1246
- command: "bash .claude/statusline.sh"
1260
+ command: statuslineCommand(this.target)
1247
1261
  };
1248
1262
  }
1249
1263
  const activeStyle = this.merged.output_styles[0];
@@ -1926,7 +1940,7 @@ async function addCommand(items = []) {
1926
1940
  manifest.profile_command = manifest.profiles.filter((p3) => p3 !== "core").join("+");
1927
1941
  }
1928
1942
  if (statuslineAdded) {
1929
- addStatuslineToSettings(claudeDir);
1943
+ addStatuslineToSettings(target, claudeDir);
1930
1944
  }
1931
1945
  } else {
1932
1946
  const result = addSkill(root, target, item, manifest.installed_skills);
@@ -2046,14 +2060,14 @@ function mergePermissions(claudeDir, newPerms) {
2046
2060
  settings.permissions = perms;
2047
2061
  writeJsonSync(settingsPath, settings);
2048
2062
  }
2049
- function addStatuslineToSettings(claudeDir) {
2063
+ function addStatuslineToSettings(target, claudeDir) {
2050
2064
  const settingsPath = path14.join(claudeDir, "settings.json");
2051
2065
  if (!fs12.existsSync(settingsPath)) return;
2052
2066
  const settings = readJsonSync(settingsPath);
2053
2067
  if (settings.statusLine) return;
2054
2068
  settings.statusLine = {
2055
2069
  type: "command",
2056
- command: "bash .claude/statusline.sh"
2070
+ command: statuslineCommand(target)
2057
2071
  };
2058
2072
  writeJsonSync(settingsPath, settings);
2059
2073
  }
@@ -2539,6 +2553,10 @@ Update available: ${chalk7.red(installedVersion)} -> ${chalk7.green(currentVersi
2539
2553
  const sourceHashes = computeSourceHashes(root, merged.skills, allRules, merged.agents);
2540
2554
  const claudeDir = path17.join(target, ".claude");
2541
2555
  const installedHashes = computeContentHashes(claudeDir);
2556
+ if (isSymlink(path17.join(claudeDir, "docs"))) {
2557
+ sourceHashes.docs = {};
2558
+ installedHashes.docs = {};
2559
+ }
2542
2560
  const unhashed = earlySync;
2543
2561
  const items = computeUpdatePlan(
2544
2562
  manifest.content_hashes ?? null,
@@ -2641,10 +2659,21 @@ function printGeneralSummary(results, isDryRun) {
2641
2659
  ${prefix}Done. ${results.length} installation${results.length === 1 ? "" : "s"} processed:`));
2642
2660
  console.log(` ${chalk7.green(updated)} ${isDryRun ? "would change" : "updated"}, ${chalk7.dim(unchanged + " unchanged")}`);
2643
2661
  }
2662
+ var RETIRED_DOCS = /* @__PURE__ */ new Set([
2663
+ "RELEASE-SETUP.md",
2664
+ "trusted-publishing-setup.md",
2665
+ "presentations/arcane-overview.pptx",
2666
+ "presentations/arcane-overview-12.pptx",
2667
+ "presentations/build_arcane_deck.py",
2668
+ "presentations/build_arcane_deck_12.py"
2669
+ ]);
2644
2670
  function makeOwnershipCheck(manifest) {
2645
2671
  const hashes = manifest.content_hashes;
2646
2672
  if (hashes) {
2647
- return (type, name) => name in (hashes[type] ?? {});
2673
+ return (type, name) => {
2674
+ if (type === "docs" && !hashes.docs) return RETIRED_DOCS.has(name);
2675
+ return name in (hashes[type] ?? {});
2676
+ };
2648
2677
  }
2649
2678
  const skills = new Set(manifest.installed_skills ?? []);
2650
2679
  const rules = new Set(
@@ -2663,6 +2692,8 @@ function makeOwnershipCheck(manifest) {
2663
2692
  return agents.has(name);
2664
2693
  case "hooks":
2665
2694
  return true;
2695
+ case "docs":
2696
+ return RETIRED_DOCS.has(name);
2666
2697
  }
2667
2698
  };
2668
2699
  }
@@ -2681,7 +2712,8 @@ function hashesToRecord(fresh, previous, items, force) {
2681
2712
  skills: { ...fresh.skills },
2682
2713
  rules: { ...fresh.rules },
2683
2714
  agents: { ...fresh.agents },
2684
- hooks: { ...fresh.hooks }
2715
+ hooks: { ...fresh.hooks },
2716
+ docs: { ...fresh.docs }
2685
2717
  };
2686
2718
  for (const item of items) {
2687
2719
  const bucket = `${item.type}s`;
@@ -2698,8 +2730,8 @@ function hashesToRecord(fresh, previous, items, force) {
2698
2730
  }
2699
2731
  function computeUpdatePlan(manifestHashes, installedHashes, sourceHashes, owned, exemptAgentDivisions = /* @__PURE__ */ new Set()) {
2700
2732
  const items = [];
2701
- for (const contentType of ["skills", "rules", "agents", "hooks"]) {
2702
- const itemType = contentType === "skills" ? "skill" : contentType === "rules" ? "rule" : contentType === "agents" ? "agent" : "hook";
2733
+ for (const contentType of ["skills", "rules", "agents", "hooks", "docs"]) {
2734
+ const itemType = contentType === "skills" ? "skill" : contentType === "rules" ? "rule" : contentType === "agents" ? "agent" : contentType === "hooks" ? "hook" : "doc";
2703
2735
  const manifest = manifestHashes?.[contentType] ?? {};
2704
2736
  const installed = installedHashes[contentType];
2705
2737
  const source = sourceHashes[contentType];
@@ -2867,22 +2899,29 @@ function syncUnhashedFiles(root, claudeDir, merged, dryRun) {
2867
2899
  fs15.mkdirSync(path17.dirname(t.dst), { recursive: true });
2868
2900
  fs15.copyFileSync(t.src, t.dst);
2869
2901
  }
2870
- const activeStyle = merged.output_styles[0];
2871
- if (activeStyle) {
2872
- const settingsPath = path17.join(claudeDir, "settings.json");
2873
- if (fs15.existsSync(settingsPath)) {
2874
- try {
2875
- const settings = JSON.parse(fs15.readFileSync(settingsPath, "utf-8"));
2876
- if (settings.outputStyle !== activeStyle) {
2877
- changed.push(`settings.json (outputStyle: ${activeStyle})`);
2878
- if (!dryRun) {
2879
- settings.outputStyle = activeStyle;
2880
- fs15.writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}
2902
+ const settingsPath = path17.join(claudeDir, "settings.json");
2903
+ if (fs15.existsSync(settingsPath)) {
2904
+ try {
2905
+ const settings = JSON.parse(fs15.readFileSync(settingsPath, "utf-8"));
2906
+ let dirty = false;
2907
+ const activeStyle = merged.output_styles[0];
2908
+ if (activeStyle && settings.outputStyle !== activeStyle) {
2909
+ changed.push(`settings.json (outputStyle: ${activeStyle})`);
2910
+ settings.outputStyle = activeStyle;
2911
+ dirty = true;
2912
+ }
2913
+ const wanted = statuslineCommand(path17.dirname(claudeDir));
2914
+ const current = settings.statusLine;
2915
+ if (wanted !== RELATIVE_STATUSLINE_COMMAND && current && current.command !== wanted) {
2916
+ changed.push("settings.json (statusLine path)");
2917
+ settings.statusLine = { ...current, command: wanted };
2918
+ dirty = true;
2919
+ }
2920
+ if (dirty && !dryRun) {
2921
+ fs15.writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}
2881
2922
  `, "utf-8");
2882
- }
2883
- }
2884
- } catch {
2885
2923
  }
2924
+ } catch {
2886
2925
  }
2887
2926
  }
2888
2927
  return changed;
@@ -2927,6 +2966,8 @@ function getSourcePath(item, root) {
2927
2966
  return path17.join(root, "agents", item.name);
2928
2967
  case "hook":
2929
2968
  return path17.join(root, "hooks", item.name);
2969
+ case "doc":
2970
+ return path17.join(root, "docs", item.name);
2930
2971
  default:
2931
2972
  return null;
2932
2973
  }
@@ -2941,6 +2982,15 @@ function getInstalledPath(item, claudeDir) {
2941
2982
  return path17.join(claudeDir, "agents", item.name);
2942
2983
  case "hook":
2943
2984
  return path17.join(claudeDir, "hooks", item.name);
2985
+ case "doc":
2986
+ return path17.join(claudeDir, "docs", item.name);
2987
+ }
2988
+ }
2989
+ function isSymlink(p3) {
2990
+ try {
2991
+ return fs15.lstatSync(p3).isSymbolicLink();
2992
+ } catch {
2993
+ return false;
2944
2994
  }
2945
2995
  }
2946
2996
 
@@ -414,7 +414,7 @@ La lista `agents:` de un profile acepta dos formas:
414
414
 
415
415
  ```yaml
416
416
  agents:
417
- - game # la división entera: 30 agentes
417
+ - game # la división entera: 32 agentes
418
418
  - quality/security-architect # solo ese agente
419
419
  ```
420
420
 
@@ -49,7 +49,7 @@ Cuando un agente es invocado como "gate" (approval gate), debe empezar la respue
49
49
 
50
50
  Luego el rationale. El token en la primera línea permite que el skill orquestador lo parsee.
51
51
 
52
- **Escalation:** Cuando múltiples gates corren en paralelo, aplica el verdict más estricto — un REJECT override cualquier APPROVE. Ver `director-gates.md` para gates definidos.
52
+ **Escalation:** Cuando múltiples gates corren en paralelo, aplica el verdict más estricto — un REJECT override cualquier APPROVE.
53
53
 
54
54
  ## Regla #6 — Cross-Division Collaboration
55
55
 
@@ -1,31 +1,40 @@
1
1
  # Estructura de Directorios
2
2
 
3
+ Hay dos layouts distintos y conviene no mezclarlos:
4
+
5
+ - **El repo** (`claude-code-arcane/`): la fuente. Acá se edita el contenido y el instalador.
6
+ - **Un proyecto instalado** (`<proyecto>/.claude/`): lo que `npx claude-code-arcane install <profile>` copia. Solo llega lo que algún profile lista.
7
+
8
+ ## El repo
9
+
3
10
  ```
4
- Claude-Code-Arcane/
5
- ├── CLAUDE.md # Configuración maestra
6
- ├── README.md # Documentación del repo
7
- ├── pyproject.toml # Python package config
11
+ claude-code-arcane/
12
+ ├── CLAUDE.md # Guía para trabajar en este repo
13
+ ├── README.md # Documentación pública
14
+ ├── CHANGELOG.md # Generado por semantic-release, no se edita a mano
15
+ ├── ATTRIBUTION.md # Origen del contenido adaptado de terceros
8
16
  ├── LICENSE
9
- ├── .gitignore
17
+ ├── package.json # CLI npm: build (tsup), test (vitest), test:skills (Python)
18
+ ├── tsconfig.json
19
+ ├── vitest.config.ts # Aísla ARCANE_SOURCE y ARCANE_HOME para la suite
20
+ ├── .releaserc.json # semantic-release
21
+ │
22
+ ├── src/ # Instalador TypeScript (único código con build y typecheck)
23
+ │ ├── cli.ts # Entry point: arcane install/add/remove/update/...
24
+ │ ├── commands/ # Un archivo por subcomando
25
+ │ ├── installer.ts # Copia contenido a .claude/ y genera settings.json
26
+ │ ├── profiles.ts # Parser y merge de profiles/*.yaml
27
+ │ ├── agent-entries.ts # Entradas de agentes: división entera o agente suelto
28
+ │ ├── content-source.ts, cache.ts # Fuente del contenido: bundled / github / cache
29
+ │ ├── manifest.ts, content-hash.ts # arcane-manifest.json y hashes para update
30
+ │ ├── registry.ts # ~/.arcane/installations.json
31
+ │ ├── worktree.ts # Instalación en git worktrees
32
+ │ ├── wizard.ts, detect.ts # Wizard interactivo y auto-detección de stack
33
+ │ └── __tests__/ # Suite vitest, incluidos los invariantes de docs
10
34
  │
11
- ├── arcane/ # Python CLI (installer, profiles parser)
12
- │ ├── cli.py # Entry point: arcane install/list/clean
13
- │ ├── installer.py # Profile installer logic
14
- │ └── profiles.py # Profile parser & merger
35
+ ├── profiles/ # Profiles declarativos (.yaml); core.yaml siempre se carga
15
36
  │
16
- ├── profiles/ # 27 profile definitions (.profile)
17
- │ ├── core.profile # Always included (21 skills, hooks, rules)
18
- │ ├── backend-go.profile # Base: Go backend
19
- │ ├── backend-ts.profile # Base: TypeScript backend
20
- │ ├── frontend.profile # Base: React frontend
21
- │ ├── unity-dev.profile # Base: Unity programmer
22
- │ ├── ai.profile # Add-on: AI/ML
23
- │ ├── clevel.profile # Add-on: C-suite advisory
24
- │ ├── business.profile # Add-on: Business ops
25
- │ ├── marketing.profile # Add-on: Marketing
26
- │ ├── finance.profile # Add-on: Finance
27
- │ ├── regulatory.profile # Add-on: Regulatory & compliance
28
- │ └── ... # agile, testing, infra, security, etc.
37
+ ├── skills/ # Un directorio por skill: SKILL.md + references/ + scripts/
29
38
  │
30
39
  ├── agents/ # 115 agent definitions (root level)
31
40
  │ ├── ai/ # 4 agents
@@ -46,116 +55,78 @@ Claude-Code-Arcane/
46
55
  │ ├── regulatory/ # 3 agents
47
56
  │ └── visualnovel/ # 6 agents
48
57
  │
49
- ├── .claude/ # Claude Code configuration
50
- │ ├── settings.json # Hooks, permissions, safety
51
- │ ├── settings.local.json # User-specific overrides (gitignored)
52
- │ ├── statusline.sh # Status line bash script
53
- │ ├── setup-skill-junctions.bat # Windows: create skill junctions
54
- │ ├── remove-skill-junctions.bat # Windows: remove skill junctions
55
- │ │
56
- │ ├── skills-agile/ # 35 agile/PM skills
57
- │ ├── skills-ai/ # 7 AI/ML skills
58
- │ ├── skills-arcane/ # 7 Arcane self-management skills
59
- │ ├── skills-backend/ # 45 backend skills
60
- │ ├── skills-business/ # 4 business skills
61
- │ ├── skills-clevel-advisors/ # 10 C-suite advisor skills
62
- │ ├── skills-clevel-operations/ # 18 C-suite operations skills
63
- │ ├── skills-design/ # 9 design skills
64
- │ ├── skills-devops/ # 17 DevOps/infra skills
65
- │ ├── skills-docs/ # 13 documentation skills
66
- │ ├── skills-finance/ # 3 finance skills
67
- │ ├── skills-frontend/ # 9 frontend skills
68
- │ ├── skills-gamedev/ # 19 gamedev skills + _rules/ + _templates/
69
- │ ├── skills-git/ # 21 git workflow skills
70
- │ ├── skills-integrations/ # 3 integration skills
71
- │ ├── skills-marketing-content/ # 8 content marketing skills
72
- │ ├── skills-marketing-growth/ # 10 growth marketing skills
73
- │ ├── skills-marketing-seo/ # 11 SEO/CRO skills
74
- │ ├── skills-marketing-strategy/ # 15 marketing strategy skills
75
- │ ├── skills-mobile/ # 5 mobile skills
76
- │ ├── skills-regulatory/ # 13 regulatory/compliance skills
77
- │ ├── skills-release/ # 5 release skills
78
- │ ├── skills-security/ # 9 security skills
79
- │ ├── skills-testing/ # 13 testing skills
80
- │ │
81
- │ ├── hooks/ # 14 lifecycle hooks
82
- │ │ ├── session-start.sh
83
- │ │ ├── session-stop.sh
84
- │ │ ├── detect-division.sh
85
- │ │ ├── detect-gaps.sh
86
- │ │ ├── validate-commit.sh
87
- │ │ ├── validate-push.sh
88
- │ │ ├── validate-secrets.sh
89
- │ │ ├── validate-assets.sh
90
- │ │ ├── validate-skill-change.sh
91
- │ │ ├── notify.sh
92
- │ │ ├── pre-compact.sh
93
- │ │ ├── post-compact.sh
94
- │ │ ├── log-agent.sh
95
- │ │ └── log-agent-stop.sh
96
- │ │
97
- │ ├── rules/ # 9 path-scoped rules
98
- │ │ ├── backend-code.md
99
- │ │ ├── frontend-code.md
100
- │ │ ├── api-code.md
101
- │ │ ├── migration-code.md
102
- │ │ ├── infra-code.md
103
- │ │ ├── ai-code.md
104
- │ │ ├── data-files.md
105
- │ │ ├── test-standards.md
106
- │ │ └── prototype-code.md
107
- │ │
108
- │ └── docs/ # Internal documentation
109
- │ ├── division-structure.md
110
- │ ├── agent-hierarchy.md
111
- │ ├── directory-structure.md # This file
112
- │ ├── coding-standards.md
113
- │ ├── technical-preferences.md
114
- │ ├── coordination-rules.md
115
- │ ├── context-management.md
116
- │ ├── workflow-catalog.yaml
117
- │ ├── stack-registry.md
118
- │ └── templates/
58
+ ├── rules/ # Rules universales (rules.universal en los profiles)
59
+ │ └── gamedev/ # Rules de gamedev (rules.gamedev en los profiles)
119
60
  │
120
- ├── docs/ # Public documentation
121
- │ ├── SKILLS-CATALOG.md # Complete skill catalog
122
- │ └── USER-GUIDE.md # User guide
61
+ ├── hooks/ # Scripts bash de lifecycle; statusline.sh incluido
62
+ ├── output-styles/ # Output styles (arcane.md)
63
+ ├── templates/
64
+ │ └── gamedev/ # Plantillas de GDD y docs de juego
65
+ ├── docs/ # Documentación; se copia entera a .claude/docs/
66
+ │ ├── templates/ # Plantillas de ADR, PRD, RFC, test plan, etc.
67
+ │ ├── gates/ # Gates de fase (software y gamedev)
68
+ │ └── gamedev/, software/ # coding-standards por dominio
123
69
  │
124
- ├── tools/ # Migration & wrapper scripts
125
- │ ├── arcane.sh # Legacy bash installer
126
- │ ├── arcane.bat # Windows wrapper
127
- │ └── migrate-*.sh # Migration tools
128
- │
129
- ├── skills-selftest/ # QA framework for skills/agents
70
+ ├── skills-selftest/ # QA de skills y agentes (no se instala)
130
71
  │ ├── CLAUDE.md
131
- │ ├── catalog.yaml # Registry: 305 skills + 94 agents
132
- │ ├── quality-rubric.md
133
- │ ├── skills/[category]/ # Behavioral specs per skill
134
- │ ├── agents/[tier]/ # Behavioral specs per agent
135
- │ ├── templates/
136
- │ └── results/ # Test outputs (gitignored)
72
+ │ ├── catalog.yaml # Registro de skills y agentes con su spec
73
+ │ ├── quality-rubric.md # Métricas por categoría
74
+ │ ├── skills/<categoria>/ # Specs de comportamiento por skill
75
+ │ ├── agents/<tier>/ # Specs de comportamiento por agente
76
+ │ └── templates/ # Plantillas para specs nuevos
137
77
  │
138
- └── production/ # Runtime state
139
- └── session-state/
78
+ ├── tests/ # Specs Python de los scripts de skills (npm run test:skills)
79
+ ├── maintainers/ # Cómo publicar Arcane (release, npm). No se instala ni se publica
80
+ ├── scripts/ # Utilidades de mantenimiento del repo
81
+ ├── .github/workflows/ # ci.yml (vitest, typecheck, specs Python) y release.yml (semantic-release)
82
+ └── .claude/ # La instalación de Arcane que usa este mismo repo
140
83
  ```
141
84
 
142
- ## Rules Split Policy
85
+ ## Un proyecto instalado
143
86
 
144
- - **`.claude/rules/`** — reglas universales que aplican a cualquier stack software (backend APIs, frontends web/mobile, DBs, infra, LLM apps). Usan paths genéricos (`src/api/**`, `src/components/**`, `migrations/**`).
145
- - **`.claude/skills-gamedev/_rules/`** — reglas exclusivas de gamedev (frame budgets, shaders, NPC AI, GDDs, lore). Usan paths gamedev (`src/gameplay/**`, `assets/shaders/**`, `design/gdd/**`, `design/narrative/**`).
87
+ ```
88
+ <proyecto>/
89
+ ├── .claude/
90
+ │ ├── settings.json # Generado: permisos, hooks y statusline
91
+ │ ├── arcane-manifest.json # Profiles instalados y content_hashes de cada archivo
92
+ │ ├── skills/<skill>/ # Los skills de los profiles elegidos, con sus references/ y scripts/
93
+ │ │ └── _templates/ # templates/gamedev/, solo si algún profile trae rules de gamedev
94
+ │ ├── agents/<division>/ # Divisiones enteras o agentes sueltos, según el profile
95
+ │ ├── rules/ # Universales y de gamedev juntas, en un solo nivel
96
+ │ ├── hooks/ # Todos los hooks de hooks/ salvo statusline.sh
97
+ │ ├── statusline.sh # Solo con el profile statusline
98
+ │ ├── output-styles/ # Solo si algún profile declara output_styles
99
+ │ ├── docs/ # Copia de docs/; arcane update la mantiene al día
100
+ │ └── .arcane-trash/ # Lo que arcane update saca; nunca se borra con rm
101
+ ├── .claude.bak/ # Backup de .claude/ antes de instalar
102
+ └── production/session-state/ # Estado de sesión que escriben los hooks
103
+ ```
146
104
 
147
- Cuando un proyecto es dual (ej. web + game), ambos sets de rules aplican por sus paths scoped.
105
+ Fuera del proyecto, `~/.arcane/` guarda el registro de instalaciones (`installations.json`) y el contenido descargado de GitHub (`cache/<version>/`). `ARCANE_HOME` lo desvía.
148
106
 
149
- ## Hook Events Wiring
107
+ En un git worktree, `hooks/` y `docs/` son symlinks al worktree principal; `skills/`, `agents/` y `rules/` se copian para que puedan divergir por rama.
150
108
 
151
- Ver `settings.json`. Los eventos wireados:
109
+ ## Rules: dos carpetas en el repo, una en el proyecto
110
+
111
+ - **`rules/`**: reglas para cualquier stack de software (backend, frontend, APIs, DBs, infra, apps LLM). Paths genéricos como `src/api/**` o `src/components/**`.
112
+ - **`rules/gamedev/`**: reglas exclusivas de gamedev (frame budgets, shaders, IA de NPCs, GDDs, lore). Paths como `src/gameplay/**`, `assets/shaders/**` o `design/gdd/**`.
113
+
114
+ El installer copia las dos al mismo `.claude/rules/`, sin subcarpeta. Por eso un nombre no puede repetirse entre las dos carpetas: el segundo archivo pisaría al primero. La rule de apps LLM se llama `llm-code.md` justamente para no chocar con `gamedev/ai-code.md`, que es la de IA de NPCs.
115
+
116
+ Cuando un proyecto es dual (por ejemplo web + juego), las dos familias aplican cada una por sus paths.
117
+
118
+ ## Hooks: cómo se cablean
119
+
120
+ Los eventos los define `src/installer.ts` al generar `settings.json`, no los profiles. Todo proyecto instalado recibe estos:
152
121
 
153
122
  | Evento | Hooks |
154
123
  |--------|-------|
155
- | SessionStart | session-start.sh → detect-division.sh → detect-gaps.sh |
156
- | PreToolUse (Bash) | validate-commit.sh, validate-push.sh, validate-secrets.sh |
157
- | PostToolUse (Write/Edit) | validate-assets.sh, validate-skill-change.sh |
158
- | Notification | notify.sh |
159
- | PreCompact / PostCompact | pre-compact.sh / post-compact.sh |
160
- | Stop | session-stop.sh |
161
- | SubagentStart / SubagentStop | log-agent.sh / log-agent-stop.sh |
124
+ | SessionStart | `session-start.sh` → `detect-division.sh` → `detect-unreal.sh` → `detect-gaps.sh` → `check-update.sh` |
125
+ | PreToolUse (`Bash`) | `validate-commit.sh`, `validate-push.sh`, `validate-secrets.sh` |
126
+ | PostToolUse (`Write\|Edit`) | `validate-assets.sh`, `validate-skill-change.sh` |
127
+ | Notification | `notify.sh` |
128
+ | PreCompact / PostCompact | `pre-compact.sh` / `post-compact.sh` |
129
+ | Stop | `session-stop.sh` |
130
+ | SubagentStart / SubagentStop | `log-agent.sh` / `log-agent-stop.sh` |
131
+
132
+ La statusline (`statusline.sh`) se configura aparte, solo con el profile `statusline`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-arcane",
3
- "version": "2.9.7",
3
+ "version": "2.9.9",
4
4
  "description": "Skills, agents, hooks and rules for Claude Code — installable via npx claude-code-arcane",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,6 +41,7 @@ rules:
41
41
  - backend-code
42
42
  - api-code
43
43
  - migration-code
44
+ - llm-code
44
45
  gamedev:
45
46
  []
46
47
 
@@ -57,7 +57,6 @@ hooks:
57
57
  - session-stop.sh
58
58
  - log-agent.sh
59
59
  - log-agent-stop.sh
60
- - statusline.sh
61
60
 
62
61
  permissions:
63
62
  allow:
@@ -13,7 +13,7 @@ paths:
13
13
  - Changes to public interfaces require a deprecation period and migration guide
14
14
  - Use RAII / deterministic cleanup for all resources
15
15
  - All engine systems must support graceful degradation
16
- - Before writing engine API code, consult `docs/engine-reference/` for the current engine version and verify APIs against the reference docs
16
+ - Before writing engine API code, read the project's engine version (`ProjectSettings/ProjectVersion.txt` or the `.uproject`) and verify APIs against that version's docs
17
17
 
18
18
  ## Examples
19
19
 
@@ -13,7 +13,6 @@ visual quality, performance, and cross-platform compatibility.
13
13
  - `SG_Env_Water` (Unity Shader Graph)
14
14
  - `M_Env_Water` (Unreal Material)
15
15
  - Use descriptive names that indicate the material purpose
16
- - Prefix with shader type: `spatial_`, `canvas_`, `particles_`, `post_`
17
16
 
18
17
  ## Code Quality
19
18
  - All uniforms/parameters must have descriptive names and appropriate hints
@@ -32,7 +31,7 @@ visual quality, performance, and cross-platform compatibility.
32
31
  ## Cross-Platform
33
32
  - Test shaders on minimum spec target hardware
34
33
  - Provide fallback/simplified versions for lower quality tiers
35
- - Document which render pipeline the shader targets (Forward/Deferred, URP/HDRP, Forward+/Mobile/Compatibility)
34
+ - Document which render pipeline the shader targets (Forward/Deferred, URP/HDRP)
36
35
  - Do not mix shaders from different render pipelines in the same directory
37
36
 
38
37
  ## Variant Management
@@ -1,6 +1,7 @@
1
1
  ---
2
- name: vn-code
3
- description: "Coding rules for Ren'Py visual novel development"
2
+ paths:
3
+ - "game/**"
4
+ - "**/*.rpy"
4
5
  ---
5
6
 
6
7
  # Visual Novel Code Rules
@@ -1,6 +1,6 @@
1
1
  # Implementation Workflow Rule
2
2
 
3
- Before starting any non-trivial implementation task, you MUST present the user with work mode options using AskUserQuestion. This is mandatory — do not skip it and jump to coding.
3
+ Before starting a non-trivial implementation task, present the user with work mode options using AskUserQuestion, so they choose how much planning the task gets before any code is written.
4
4
 
5
5
  ## When to trigger
6
6