claude-code-arcane 2.9.8 → 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 +14 -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 +41 -6
- 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/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,17 @@
|
|
|
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
|
+
|
|
1
15
|
## [2.9.8](https://github.com/SebastianLuser/claude-code-arcane/compare/v2.9.7...v2.9.8) (2026-09-09)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -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
|
@@ -751,7 +751,8 @@ function computeContentHashes(claudeDir) {
|
|
|
751
751
|
skills: {},
|
|
752
752
|
rules: {},
|
|
753
753
|
agents: {},
|
|
754
|
-
hooks: {}
|
|
754
|
+
hooks: {},
|
|
755
|
+
docs: {}
|
|
755
756
|
};
|
|
756
757
|
const skillsDir = path7.join(claudeDir, "skills");
|
|
757
758
|
if (fs6.existsSync(skillsDir)) {
|
|
@@ -790,6 +791,8 @@ function computeContentHashes(claudeDir) {
|
|
|
790
791
|
}
|
|
791
792
|
}
|
|
792
793
|
}
|
|
794
|
+
const docsDir = path7.join(claudeDir, "docs");
|
|
795
|
+
if (fs6.existsSync(docsDir)) hashes.docs = hashDirectory(docsDir);
|
|
793
796
|
return hashes;
|
|
794
797
|
}
|
|
795
798
|
function computeSourceHashes(packageRoot, skills, rules, agents) {
|
|
@@ -797,7 +800,8 @@ function computeSourceHashes(packageRoot, skills, rules, agents) {
|
|
|
797
800
|
skills: {},
|
|
798
801
|
rules: {},
|
|
799
802
|
agents: {},
|
|
800
|
-
hooks: {}
|
|
803
|
+
hooks: {},
|
|
804
|
+
docs: {}
|
|
801
805
|
};
|
|
802
806
|
for (const skill of skills) {
|
|
803
807
|
const skillDir = path7.join(packageRoot, "skills", skill);
|
|
@@ -836,6 +840,8 @@ function computeSourceHashes(packageRoot, skills, rules, agents) {
|
|
|
836
840
|
}
|
|
837
841
|
}
|
|
838
842
|
}
|
|
843
|
+
const docsDir = path7.join(packageRoot, "docs");
|
|
844
|
+
if (fs6.existsSync(docsDir)) hashes.docs = hashDirectory(docsDir);
|
|
839
845
|
return hashes;
|
|
840
846
|
}
|
|
841
847
|
|
|
@@ -2547,6 +2553,10 @@ Update available: ${chalk7.red(installedVersion)} -> ${chalk7.green(currentVersi
|
|
|
2547
2553
|
const sourceHashes = computeSourceHashes(root, merged.skills, allRules, merged.agents);
|
|
2548
2554
|
const claudeDir = path17.join(target, ".claude");
|
|
2549
2555
|
const installedHashes = computeContentHashes(claudeDir);
|
|
2556
|
+
if (isSymlink(path17.join(claudeDir, "docs"))) {
|
|
2557
|
+
sourceHashes.docs = {};
|
|
2558
|
+
installedHashes.docs = {};
|
|
2559
|
+
}
|
|
2550
2560
|
const unhashed = earlySync;
|
|
2551
2561
|
const items = computeUpdatePlan(
|
|
2552
2562
|
manifest.content_hashes ?? null,
|
|
@@ -2649,10 +2659,21 @@ function printGeneralSummary(results, isDryRun) {
|
|
|
2649
2659
|
${prefix}Done. ${results.length} installation${results.length === 1 ? "" : "s"} processed:`));
|
|
2650
2660
|
console.log(` ${chalk7.green(updated)} ${isDryRun ? "would change" : "updated"}, ${chalk7.dim(unchanged + " unchanged")}`);
|
|
2651
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
|
+
]);
|
|
2652
2670
|
function makeOwnershipCheck(manifest) {
|
|
2653
2671
|
const hashes = manifest.content_hashes;
|
|
2654
2672
|
if (hashes) {
|
|
2655
|
-
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
|
+
};
|
|
2656
2677
|
}
|
|
2657
2678
|
const skills = new Set(manifest.installed_skills ?? []);
|
|
2658
2679
|
const rules = new Set(
|
|
@@ -2671,6 +2692,8 @@ function makeOwnershipCheck(manifest) {
|
|
|
2671
2692
|
return agents.has(name);
|
|
2672
2693
|
case "hooks":
|
|
2673
2694
|
return true;
|
|
2695
|
+
case "docs":
|
|
2696
|
+
return RETIRED_DOCS.has(name);
|
|
2674
2697
|
}
|
|
2675
2698
|
};
|
|
2676
2699
|
}
|
|
@@ -2689,7 +2712,8 @@ function hashesToRecord(fresh, previous, items, force) {
|
|
|
2689
2712
|
skills: { ...fresh.skills },
|
|
2690
2713
|
rules: { ...fresh.rules },
|
|
2691
2714
|
agents: { ...fresh.agents },
|
|
2692
|
-
hooks: { ...fresh.hooks }
|
|
2715
|
+
hooks: { ...fresh.hooks },
|
|
2716
|
+
docs: { ...fresh.docs }
|
|
2693
2717
|
};
|
|
2694
2718
|
for (const item of items) {
|
|
2695
2719
|
const bucket = `${item.type}s`;
|
|
@@ -2706,8 +2730,8 @@ function hashesToRecord(fresh, previous, items, force) {
|
|
|
2706
2730
|
}
|
|
2707
2731
|
function computeUpdatePlan(manifestHashes, installedHashes, sourceHashes, owned, exemptAgentDivisions = /* @__PURE__ */ new Set()) {
|
|
2708
2732
|
const items = [];
|
|
2709
|
-
for (const contentType of ["skills", "rules", "agents", "hooks"]) {
|
|
2710
|
-
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";
|
|
2711
2735
|
const manifest = manifestHashes?.[contentType] ?? {};
|
|
2712
2736
|
const installed = installedHashes[contentType];
|
|
2713
2737
|
const source = sourceHashes[contentType];
|
|
@@ -2942,6 +2966,8 @@ function getSourcePath(item, root) {
|
|
|
2942
2966
|
return path17.join(root, "agents", item.name);
|
|
2943
2967
|
case "hook":
|
|
2944
2968
|
return path17.join(root, "hooks", item.name);
|
|
2969
|
+
case "doc":
|
|
2970
|
+
return path17.join(root, "docs", item.name);
|
|
2945
2971
|
default:
|
|
2946
2972
|
return null;
|
|
2947
2973
|
}
|
|
@@ -2956,6 +2982,15 @@ function getInstalledPath(item, claudeDir) {
|
|
|
2956
2982
|
return path17.join(claudeDir, "agents", item.name);
|
|
2957
2983
|
case "hook":
|
|
2958
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;
|
|
2959
2994
|
}
|
|
2960
2995
|
}
|
|
2961
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
|
@@ -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
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
paths:
|
|
3
|
-
- "src
|
|
3
|
+
- "src/**/ai/**"
|
|
4
|
+
- "src/**/llm/**"
|
|
5
|
+
- "src/**/agents/**"
|
|
4
6
|
- "src/ml/**"
|
|
5
|
-
- "src/llm/**"
|
|
6
|
-
- "src/agents/**"
|
|
7
7
|
- "src/inference/**"
|
|
8
8
|
- "prompts/**"
|
|
9
9
|
- "models/**"
|
|
@@ -12,7 +12,7 @@ paths:
|
|
|
12
12
|
# AI / LLM / ML Code Rules
|
|
13
13
|
|
|
14
14
|
Applies to software integrations with LLMs, ML inference, and AI agents — not NPC behavior in games
|
|
15
|
-
(
|
|
15
|
+
(the gamedev profiles ship their own `ai-code` rule for that).
|
|
16
16
|
|
|
17
17
|
## Prompts & Templates
|
|
18
18
|
|
|
@@ -28,7 +28,7 @@ Applies to software integrations with LLMs, ML inference, and AI agents — not
|
|
|
28
28
|
- **Cost budget per request is measured and logged**: token counts in + out, model, cost in $. Track P50/P95 cost per feature.
|
|
29
29
|
- **Timeouts and retries are bounded**: max retries ≤ 2, exponential backoff, circuit breaker on the provider. A hung LLM call must not hang a user request.
|
|
30
30
|
- **Streaming for user-facing generation**; batch / async for back-office work.
|
|
31
|
-
- **Cache deterministic calls** (same
|
|
31
|
+
- **Cache deterministic calls** (same model + same system + same user → cache the response). Document TTL and invalidation.
|
|
32
32
|
|
|
33
33
|
## Safety & PII
|
|
34
34
|
|
|
@@ -377,7 +377,8 @@ with open('my_tools_anthropic.json') as f:
|
|
|
377
377
|
# Use with Anthropic tool use
|
|
378
378
|
client = anthropic.Anthropic()
|
|
379
379
|
response = client.messages.create(
|
|
380
|
-
model="claude-
|
|
380
|
+
model="claude-opus-5-5",
|
|
381
|
+
max_tokens=16000,
|
|
381
382
|
messages=[{"role": "user", "content": "Search for AI news"}],
|
|
382
383
|
tools=schemas['tools']
|
|
383
384
|
)
|
|
@@ -220,11 +220,6 @@ class AgentEvaluator:
|
|
|
220
220
|
def _define_cost_benchmarks(self) -> Dict[str, Any]:
|
|
221
221
|
"""Define cost benchmarks for different operations"""
|
|
222
222
|
return {
|
|
223
|
-
"token_costs": {
|
|
224
|
-
"gpt-4": {"input": 0.00003, "output": 0.00006},
|
|
225
|
-
"gpt-3.5-turbo": {"input": 0.000002, "output": 0.000002},
|
|
226
|
-
"claude-3": {"input": 0.000015, "output": 0.000075}
|
|
227
|
-
},
|
|
228
223
|
"operation_costs": {
|
|
229
224
|
"simple_task": 0.005,
|
|
230
225
|
"complex_task": 0.050,
|
|
@@ -15,7 +15,7 @@ allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Task
|
|
|
15
15
|
### Step 0: Gather Requirements
|
|
16
16
|
1. **Caso:** chat / generación one-shot / extracción structured / agente con tools / RAG
|
|
17
17
|
2. **Streaming** al cliente o respuesta completa
|
|
18
|
-
3. **Modelo:** Opus
|
|
18
|
+
3. **Modelo:** Opus 5.5 (`claude-opus-5-5`, razonamiento) / Sonnet 5.5 (`claude-sonnet-5-5`, balance) / Haiku 5.5 (`claude-haiku-5-5`, rápido/barato)
|
|
19
19
|
4. ¿Necesita tool calling / structured output / RAG (ver skill `pgvector-search`)?
|
|
20
20
|
|
|
21
21
|
### Step 1: Instalar
|
|
@@ -33,7 +33,7 @@ import { streamText, convertToModelMessages } from 'ai';
|
|
|
33
33
|
export async function POST(req: Request) {
|
|
34
34
|
const { messages } = await req.json();
|
|
35
35
|
const result = streamText({
|
|
36
|
-
model: anthropic('claude-sonnet-
|
|
36
|
+
model: anthropic('claude-sonnet-5-5'),
|
|
37
37
|
messages: convertToModelMessages(messages),
|
|
38
38
|
});
|
|
39
39
|
return result.toUIMessageStreamResponse();
|
|
@@ -44,7 +44,7 @@ Cliente: `useChat()` de `@ai-sdk/react`.
|
|
|
44
44
|
### Step 3: Structured output (Zod)
|
|
45
45
|
```ts
|
|
46
46
|
const { object } = await generateObject({
|
|
47
|
-
model: anthropic('claude-sonnet-
|
|
47
|
+
model: anthropic('claude-sonnet-5-5'),
|
|
48
48
|
schema: z.object({ sentiment: z.enum(['pos','neg','neutral']), score: z.number() }),
|
|
49
49
|
prompt: text,
|
|
50
50
|
});
|
|
@@ -53,7 +53,7 @@ const { object } = await generateObject({
|
|
|
53
53
|
### Step 4: Tool calling / agente
|
|
54
54
|
```ts
|
|
55
55
|
const result = await generateText({
|
|
56
|
-
model: anthropic('claude-opus-
|
|
56
|
+
model: anthropic('claude-opus-5-5'),
|
|
57
57
|
tools: {
|
|
58
58
|
search: tool({
|
|
59
59
|
description: 'Buscar docs', inputSchema: z.object({ q: z.string() }),
|
|
@@ -18,11 +18,10 @@ allowed-tools: Read, Glob, Grep, Write, Task, AskUserQuestion
|
|
|
18
18
|
|
|
19
19
|
## Phase 0: Load Engine Context (ALWAYS FIRST)
|
|
20
20
|
|
|
21
|
-
1. Read `docs/
|
|
21
|
+
1. Read the engine version from the project: `ProjectSettings/ProjectVersion.txt` (Unity) or `EngineAssociation` in the `.uproject` (Unreal). For Unreal, also read `docs/unreal/project-context.md` if `/ue-project-context` has run
|
|
22
22
|
2. Identify domain from title (Physics, Rendering, UI, Audio, etc.)
|
|
23
|
-
3.
|
|
24
|
-
4.
|
|
25
|
-
5. No engine configured → prompt to run `/setup-engine`
|
|
23
|
+
3. If the engine version is newer than what you know reliably, say so before proposing engine APIs
|
|
24
|
+
4. No engine detected → ask the user which engine and version
|
|
26
25
|
|
|
27
26
|
## Phase 1: Context Gathering
|
|
28
27
|
|