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.
- package/CHANGELOG.md +21 -0
- package/agents/business/business-ops-lead.md +1 -14
- package/agents/game/gameplay-programmer.md +3 -4
- package/agents/game/technical-artist.md +3 -4
- package/dist/cli.js +74 -24
- package/docs/USER-GUIDE.md +1 -1
- package/docs/coordination-rules.md +1 -1
- package/docs/directory-structure.md +93 -122
- package/package.json +1 -1
- package/profiles/backend-go.yaml +1 -0
- package/profiles/core.yaml +0 -1
- package/rules/gamedev/engine-code.md +1 -1
- package/rules/gamedev/shader-code.md +1 -2
- package/rules/gamedev/vn-code.md +3 -2
- package/rules/implementation-workflow.md +1 -1
- package/rules/{ai-code.md → llm-code.md} +5 -5
- package/skills/agent-designer/README.md +2 -1
- package/skills/agent-designer/agent_evaluator.py +0 -5
- package/skills/ai-sdk-setup/SKILL.md +4 -4
- package/skills/architecture-decision/SKILL.md +3 -4
- package/skills/architecture-review/SKILL.md +1 -1
- package/skills/asset-audit/SKILL.md +0 -1
- package/skills/balance-check/SKILL.md +1 -1
- package/skills/brainstorm/SKILL.md +3 -3
- package/skills/brainstorm/references/next-steps-pipeline.md +8 -9
- package/skills/consistency-check/SKILL.md +2 -2
- package/skills/design-system/SKILL.md +1 -1
- package/skills/design-system/references/post-design-validation.md +2 -3
- package/skills/frontend-dev/SKILL.md +27 -28
- package/skills/frontend-dev/references/asset-prompt-guide.md +1 -1
- package/skills/frontend-dev/references/motion-recipes.md +1 -1
- package/skills/help/SKILL.md +1 -2
- package/skills/hotfix/SKILL.md +2 -2
- package/skills/milestone-review/SKILL.md +1 -1
- package/skills/patch-notes/SKILL.md +1 -1
- package/skills/playtest-report/SKILL.md +2 -3
- package/skills/playwright-pro/CLAUDE.md +2 -2
- package/skills/playwright-pro/SKILL.md +13 -9
- package/skills/playwright-pro/agents/migration-planner.md +2 -2
- package/skills/playwright-pro/agents/test-architect.md +1 -2
- package/skills/playwright-pro/agents/test-debugger.md +1 -1
- package/skills/playwright-pro/hooks/detect-playwright.sh +1 -1
- package/skills/playwright-pro/skills/browserstack/SKILL.md +5 -5
- package/skills/playwright-pro/skills/migrate/SKILL.md +1 -1
- package/skills/playwright-pro/skills/report/SKILL.md +2 -2
- package/skills/playwright-pro/skills/testrail/SKILL.md +5 -5
- package/skills/playwright-pro/templates/README.md +2 -2
- package/skills/prototype/SKILL.md +1 -1
- package/skills/quick-design/SKILL.md +1 -1
- package/skills/release-checklist/SKILL.md +0 -1
- package/skills/security-audit/SKILL.md +1 -1
- package/skills/self-improving-agent/CLAUDE.md +12 -12
- package/skills/self-improving-agent/SKILL.md +16 -12
- package/skills/self-improving-agent/agents/memory-analyst.md +1 -1
- package/skills/self-improving-agent/hooks/error-capture.sh +2 -2
- package/skills/self-improving-agent/reference/memory-architecture.md +2 -2
- package/skills/self-improving-agent/reference/promotion-rules.md +3 -3
- package/skills/self-improving-agent/reference/rules-directory-patterns.md +1 -1
- package/skills/self-improving-agent/settings.json +5 -5
- package/skills/self-improving-agent/skills/extract/SKILL.md +7 -7
- package/skills/self-improving-agent/skills/promote/SKILL.md +5 -5
- package/skills/self-improving-agent/skills/remember/SKILL.md +9 -9
- package/skills/self-improving-agent/skills/review/SKILL.md +7 -7
- package/skills/self-improving-agent/skills/status/SKILL.md +8 -8
- package/skills/senior-ml-engineer/references/llm_integration_guide.md +14 -31
- package/skills/senior-prompt-engineer/SKILL.md +10 -10
- package/skills/senior-prompt-engineer/references/prompt_engineering_patterns.md +1 -1
- package/skills/senior-prompt-engineer/scripts/agent_orchestrator.py +43 -40
- package/skills/senior-prompt-engineer/scripts/prompt_optimizer.py +23 -66
- package/skills/shader-dev/reference/fluid-simulation.md +4 -4
- package/skills/shader-dev/reference/simulation-physics.md +6 -6
- package/skills/shader-dev/reference/voxel-rendering.md +1 -1
- package/skills/shader-dev/techniques/ambient-occlusion.md +1 -1
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +2 -2
- package/skills/shader-dev/techniques/domain-warping.md +2 -2
- package/skills/shader-dev/techniques/fluid-simulation.md +45 -45
- package/skills/shader-dev/techniques/multipass-buffer.md +24 -24
- package/skills/shader-dev/techniques/normal-estimation.md +1 -1
- package/skills/shader-dev/techniques/particle-system.md +16 -16
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +1 -1
- package/skills/shader-dev/techniques/post-processing.md +7 -7
- package/skills/shader-dev/techniques/sdf-3d.md +1 -1
- package/skills/shader-dev/techniques/simulation-physics.md +24 -24
- package/skills/shader-dev/techniques/sound-synthesis.md +2 -2
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +1 -1
- package/skills/shader-dev/techniques/voxel-rendering.md +60 -60
- package/skills/smoke-check/SKILL.md +1 -1
- package/skills/sprint-plan/SKILL.md +1 -2
- package/skills/start/SKILL.md +7 -7
- package/skills/story-done/SKILL.md +1 -1
- package/skills/test-helpers/SKILL.md +7 -2
- package/skills/test-setup/SKILL.md +1 -1
- package/skills/ue-actor-component-architecture/SKILL.md +0 -1
- package/skills/ue-ai-navigation/SKILL.md +0 -1
- package/skills/ue-animation-system/SKILL.md +0 -1
- package/skills/ue-async-threading/SKILL.md +0 -1
- package/skills/ue-audio-system/SKILL.md +0 -1
- package/skills/ue-blueprints/SKILL.md +0 -1
- package/skills/ue-character-movement/SKILL.md +0 -1
- package/skills/ue-cpp-foundations/SKILL.md +0 -1
- package/skills/ue-data-assets-tables/SKILL.md +0 -1
- package/skills/ue-editor-tools/SKILL.md +0 -1
- package/skills/ue-game-features/SKILL.md +0 -1
- package/skills/ue-gameplay-abilities/SKILL.md +0 -1
- package/skills/ue-gameplay-framework/SKILL.md +0 -1
- package/skills/ue-input-system/SKILL.md +0 -1
- package/skills/ue-mass-entity/SKILL.md +0 -1
- package/skills/ue-materials-rendering/SKILL.md +0 -1
- package/skills/ue-module-build-system/SKILL.md +0 -1
- package/skills/ue-naming-conventions/SKILL.md +0 -1
- package/skills/ue-networking-replication/SKILL.md +0 -1
- package/skills/ue-niagara-effects/SKILL.md +0 -1
- package/skills/ue-packaging/SKILL.md +0 -1
- package/skills/ue-physics-collision/SKILL.md +0 -1
- package/skills/ue-procedural-generation/SKILL.md +0 -1
- package/skills/ue-project-context/SKILL.md +0 -1
- package/skills/ue-sequencer-cinematics/SKILL.md +0 -1
- package/skills/ue-serialization-savegames/SKILL.md +0 -1
- package/skills/ue-state-trees/SKILL.md +0 -1
- package/skills/ue-testing-debugging/SKILL.md +0 -1
- package/skills/ue-ui-umg-slate/SKILL.md +0 -1
- package/skills/ue-world-level-streaming/SKILL.md +0 -1
- package/skills/ux-review/SKILL.md +1 -1
- package/docs/RELEASE-SETUP.md +0 -99
- package/docs/presentations/arcane-overview-12.pptx +0 -0
- package/docs/presentations/arcane-overview.pptx +0 -0
- package/docs/presentations/build_arcane_deck.py +0 -310
- package/docs/presentations/build_arcane_deck_12.py +0 -399
- 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.
|
|
73
|
-
2. If the API
|
|
74
|
-
> "This API may have changed in [version] — verify against the
|
|
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.
|
|
72
|
-
2. If the API
|
|
73
|
-
> "This API may have changed in [version] — verify against the
|
|
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:
|
|
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:
|
|
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) =>
|
|
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
|
|
2871
|
-
if (
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
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
|
|
package/docs/USER-GUIDE.md
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
5
|
-
├── CLAUDE.md #
|
|
6
|
-
├── README.md # Documentación
|
|
7
|
-
├──
|
|
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
|
-
├── .
|
|
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
|
-
├──
|
|
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
|
-
├──
|
|
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
|
-
├──
|
|
50
|
-
│
|
|
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
|
-
├──
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
├──
|
|
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 #
|
|
132
|
-
│ ├── quality-rubric.md
|
|
133
|
-
│ ├── skills
|
|
134
|
-
│ ├── agents
|
|
135
|
-
│
|
|
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
|
-
|
|
139
|
-
|
|
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
|
-
##
|
|
85
|
+
## Un proyecto instalado
|
|
143
86
|
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
157
|
-
| PostToolUse (Write
|
|
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
package/profiles/backend-go.yaml
CHANGED
package/profiles/core.yaml
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
package/rules/gamedev/vn-code.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Implementation Workflow Rule
|
|
2
2
|
|
|
3
|
-
Before starting
|
|
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
|
|