claude-code-arcane 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +104 -55
  3. package/agents/career/career-strategist.md +88 -0
  4. package/agents/career/cv-reviewer.md +81 -0
  5. package/agents/career/hiring-manager.md +68 -0
  6. package/agents/career/mock-interviewer.md +76 -0
  7. package/agents/freelance/client-screener.md +84 -0
  8. package/agents/freelance/discovery-call.md +65 -0
  9. package/agents/freelance/pipeline-strategist.md +99 -0
  10. package/agents/freelance/proposal-reviewer.md +82 -0
  11. package/agents/game/ue-blueprint-specialist.md +125 -0
  12. package/agents/game/ue-gas-specialist.md +133 -0
  13. package/agents/game/ue-umg-specialist.md +131 -0
  14. package/dist/cli.js +57 -13
  15. package/docs/RELEASE-SETUP.md +1 -1
  16. package/docs/SKILLS-CATALOG.md +67 -4
  17. package/docs/USER-GUIDE.md +77 -72
  18. package/docs/agent-hierarchy.md +21 -1
  19. package/docs/presentations/build_arcane_deck.py +2 -2
  20. package/docs/presentations/build_arcane_deck_12.py +2 -2
  21. package/hooks/detect-unreal.sh +90 -0
  22. package/package.json +2 -2
  23. package/profiles/freelance.yaml +43 -0
  24. package/profiles/job-hunt.yaml +5 -2
  25. package/profiles/unreal-dev.yaml +97 -0
  26. package/rules/drafter-reviewer.md +16 -3
  27. package/rules/freelance-guardrails.md +53 -0
  28. package/rules/gamedev/unreal-code.md +125 -0
  29. package/skills/career-registry/SKILL.md +95 -0
  30. package/skills/career-registry/scripts/career_registry.py +488 -0
  31. package/skills/client-screen/SKILL.md +83 -0
  32. package/skills/client-screen/references/red-flags.md +95 -0
  33. package/skills/cover-letter/SKILL.md +4 -3
  34. package/skills/cv-tailor/SKILL.md +11 -2
  35. package/skills/freelance-deliver/SKILL.md +90 -0
  36. package/skills/freelance-hunt/SKILL.md +126 -0
  37. package/skills/freelance-hunt/references/templates/Connects.md +39 -0
  38. package/skills/freelance-hunt/references/templates/Contrato.md +60 -0
  39. package/skills/freelance-hunt/references/templates/Propuesta.md +66 -0
  40. package/skills/freelance-kickoff/SKILL.md +94 -0
  41. package/skills/freelance-pipeline/SKILL.md +109 -0
  42. package/skills/freelance-pipeline/scripts/import_history.py +425 -0
  43. package/skills/freelance-profile/SKILL.md +93 -0
  44. package/skills/freelance-proposal/SKILL.md +112 -0
  45. package/skills/freelance-scan/SKILL.md +196 -0
  46. package/skills/freelance-scan/references/dedup.md +35 -0
  47. package/skills/freelance-scan/references/platforms.md +167 -0
  48. package/skills/freelance-scan/scripts/freelance_search.py +1077 -0
  49. package/skills/install-mcp/SKILL.md +135 -46
  50. package/skills/install-mcp/references/unreal-operations.md +55 -0
  51. package/skills/interview-prep/SKILL.md +11 -3
  52. package/skills/job-aplicar/SKILL.md +5 -1
  53. package/skills/job-hunt/SKILL.md +17 -0
  54. package/skills/job-outcome/SKILL.md +15 -1
  55. package/skills/job-upskill/SKILL.md +10 -2
  56. package/skills/ue-actor-component-architecture/SKILL.md +509 -0
  57. package/skills/ue-actor-component-architecture/references/actor-lifecycle.md +301 -0
  58. package/skills/ue-actor-component-architecture/references/component-types.md +592 -0
  59. package/skills/ue-ai-navigation/SKILL.md +526 -0
  60. package/skills/ue-ai-navigation/references/behavior-tree-patterns.md +392 -0
  61. package/skills/ue-ai-navigation/references/behavior-tree-workflow.md +107 -0
  62. package/skills/ue-ai-navigation/references/custom-bttask.md +104 -0
  63. package/skills/ue-ai-navigation/references/eqs-reference.md +423 -0
  64. package/skills/ue-animation-system/SKILL.md +521 -0
  65. package/skills/ue-animation-system/references/anim-notify-reference.md +486 -0
  66. package/skills/ue-animation-system/references/locomotion-setup.md +550 -0
  67. package/skills/ue-async-threading/SKILL.md +433 -0
  68. package/skills/ue-async-threading/references/thread-safety-guide.md +213 -0
  69. package/skills/ue-async-threading/references/threading-patterns.md +345 -0
  70. package/skills/ue-audio-system/SKILL.md +527 -0
  71. package/skills/ue-audio-system/references/audio-setup-patterns.md +700 -0
  72. package/skills/ue-blueprints/SKILL.md +134 -0
  73. package/skills/ue-blueprints/references/communication.md +82 -0
  74. package/skills/ue-character-movement/SKILL.md +475 -0
  75. package/skills/ue-character-movement/references/cmc-extension-patterns.md +335 -0
  76. package/skills/ue-character-movement/references/movement-pipeline.md +189 -0
  77. package/skills/ue-cpp-foundations/SKILL.md +533 -0
  78. package/skills/ue-cpp-foundations/references/components-and-gc.md +107 -0
  79. package/skills/ue-cpp-foundations/references/container-patterns.md +544 -0
  80. package/skills/ue-cpp-foundations/references/delegate-patterns.md +497 -0
  81. package/skills/ue-cpp-foundations/references/gameplay-classes-cpp.md +136 -0
  82. package/skills/ue-cpp-foundations/references/property-specifiers.md +306 -0
  83. package/skills/ue-data-assets-tables/SKILL.md +527 -0
  84. package/skills/ue-data-assets-tables/references/asset-loading-patterns.md +306 -0
  85. package/skills/ue-data-assets-tables/references/data-driven-design.md +378 -0
  86. package/skills/ue-editor-tools/SKILL.md +523 -0
  87. package/skills/ue-editor-tools/references/detail-customization-patterns.md +395 -0
  88. package/skills/ue-editor-tools/references/editor-module-setup.md +480 -0
  89. package/skills/ue-game-features/SKILL.md +477 -0
  90. package/skills/ue-game-features/references/experience-system.md +222 -0
  91. package/skills/ue-game-features/references/game-feature-patterns.md +308 -0
  92. package/skills/ue-gameplay-abilities/SKILL.md +518 -0
  93. package/skills/ue-gameplay-abilities/references/ability-task-reference.md +391 -0
  94. package/skills/ue-gameplay-abilities/references/gameplay-effect-reference.md +397 -0
  95. package/skills/ue-gameplay-abilities/references/gas-setup-patterns.md +369 -0
  96. package/skills/ue-gameplay-framework/SKILL.md +466 -0
  97. package/skills/ue-gameplay-framework/references/framework-class-map.md +243 -0
  98. package/skills/ue-input-system/SKILL.md +394 -0
  99. package/skills/ue-input-system/references/cpp-setup.md +131 -0
  100. package/skills/ue-input-system/references/enhanced-input-workflow.md +117 -0
  101. package/skills/ue-input-system/references/input-action-reference.md +731 -0
  102. package/skills/ue-mass-entity/SKILL.md +476 -0
  103. package/skills/ue-mass-entity/references/mass-entity-patterns.md +319 -0
  104. package/skills/ue-mass-entity/references/mass-fragment-reference.md +119 -0
  105. package/skills/ue-materials-rendering/SKILL.md +526 -0
  106. package/skills/ue-materials-rendering/references/material-parameter-reference.md +216 -0
  107. package/skills/ue-materials-rendering/references/post-process-settings.md +383 -0
  108. package/skills/ue-module-build-system/SKILL.md +487 -0
  109. package/skills/ue-module-build-system/references/build-cs-reference.md +418 -0
  110. package/skills/ue-module-build-system/references/common-build-errors.md +381 -0
  111. package/skills/ue-naming-conventions/SKILL.md +142 -0
  112. package/skills/ue-naming-conventions/references/asset-name-modifiers.md +233 -0
  113. package/skills/ue-naming-conventions/references/content-structure.md +83 -0
  114. package/skills/ue-networking-replication/SKILL.md +452 -0
  115. package/skills/ue-networking-replication/references/replication-patterns.md +526 -0
  116. package/skills/ue-networking-replication/references/rpc-decision-guide.md +393 -0
  117. package/skills/ue-niagara-effects/SKILL.md +531 -0
  118. package/skills/ue-niagara-effects/references/niagara-data-interfaces.md +491 -0
  119. package/skills/ue-niagara-effects/references/niagara-parameter-types.md +153 -0
  120. package/skills/ue-niagara-effects/references/niagara-workflow.md +115 -0
  121. package/skills/ue-packaging/SKILL.md +116 -0
  122. package/skills/ue-physics-collision/SKILL.md +423 -0
  123. package/skills/ue-physics-collision/references/collision-channel-setup.md +218 -0
  124. package/skills/ue-physics-collision/references/trace-patterns.md +499 -0
  125. package/skills/ue-procedural-generation/SKILL.md +505 -0
  126. package/skills/ue-procedural-generation/references/pcg-node-reference.md +381 -0
  127. package/skills/ue-procedural-generation/references/procedural-mesh-patterns.md +940 -0
  128. package/skills/ue-project-context/SKILL.md +305 -0
  129. package/skills/ue-sequencer-cinematics/SKILL.md +506 -0
  130. package/skills/ue-sequencer-cinematics/references/sequencer-patterns.md +629 -0
  131. package/skills/ue-serialization-savegames/SKILL.md +524 -0
  132. package/skills/ue-serialization-savegames/references/save-system-architecture.md +705 -0
  133. package/skills/ue-state-trees/SKILL.md +489 -0
  134. package/skills/ue-state-trees/references/state-tree-mass-integration.md +184 -0
  135. package/skills/ue-state-trees/references/state-tree-patterns.md +321 -0
  136. package/skills/ue-testing-debugging/SKILL.md +520 -0
  137. package/skills/ue-testing-debugging/references/automation-test-patterns.md +387 -0
  138. package/skills/ue-testing-debugging/references/profiling-commands.md +357 -0
  139. package/skills/ue-ui-umg-slate/SKILL.md +431 -0
  140. package/skills/ue-ui-umg-slate/references/common-ui-setup.md +484 -0
  141. package/skills/ue-ui-umg-slate/references/widget-types.md +487 -0
  142. package/skills/ue-world-level-streaming/SKILL.md +518 -0
  143. package/skills/ue-world-level-streaming/references/streaming-patterns.md +414 -0
  144. package/templates/gamedev/unreal-project-context.md +107 -0
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: ue-gas-specialist
3
+ description: "The UE GAS specialist owns the Gameplay Ability System: UGameplayAbility, UGameplayEffect, UAttributeSet, Gameplay Tags, Ability Tasks and GAS prediction. They keep stat mutation inside Gameplay Effects and state inside tags, and defer custom net serialization and ability UI to the specialists that own them."
4
+ tools: Read, Glob, Grep, Write, Edit, Bash, Task
5
+ model: sonnet
6
+ maxTurns: 20
7
+ ---
8
+ You are the Unreal Gameplay Ability System specialist for an Unreal Engine 5 project. You own abilities, effects, attributes and tags.
9
+
10
+ ## Collaboration Protocol
11
+
12
+ **You are a collaborative implementer, not an autonomous code generator.** The user approves all architectural decisions and file changes.
13
+
14
+ ### Implementation Workflow
15
+
16
+ Before writing any code:
17
+
18
+ 1. **Read the design document:**
19
+ - Identify what's specified vs. what's ambiguous
20
+ - Note any deviations from standard patterns
21
+ - Flag potential implementation challenges
22
+
23
+ 2. **Ask architecture questions:**
24
+ - "Should this be a static utility class or a scene node?"
25
+ - "Where should [data] live? ([SystemData]? [Container] class? Config file?)"
26
+ - "The design doc doesn't specify [edge case]. What should happen when...?"
27
+ - "This will require changes to [other system]. Should I coordinate with that first?"
28
+
29
+ 3. **Propose architecture before implementing:**
30
+ - Show class structure, file organization, data flow
31
+ - Explain WHY you're recommending this approach (patterns, engine conventions, maintainability)
32
+ - Highlight trade-offs: "This approach is simpler but less flexible" vs "This is more complex but more extensible"
33
+ - Ask: "Does this match your expectations? Any changes before I write the code?"
34
+
35
+ 4. **Implement with transparency:**
36
+ - If you encounter spec ambiguities during implementation, STOP and ask
37
+ - If rules/hooks flag issues, fix them and explain what was wrong
38
+ - If a deviation from the design doc is necessary (technical constraint), explicitly call it out
39
+
40
+ 5. **Get approval before writing files:**
41
+ - Show the code or a detailed summary
42
+ - Explicitly ask: "May I write this to [filepath(s)]?"
43
+ - For multi-file changes, list all affected files
44
+ - Wait for "yes" before using Write/Edit tools
45
+
46
+ 6. **Offer next steps:**
47
+ - "Should I write tests now, or would you like to review the implementation first?"
48
+ - "This is ready for /code-review if you'd like validation"
49
+ - "I notice [potential improvement]. Should I refactor, or is this good for now?"
50
+
51
+ ### Collaborative Mindset
52
+
53
+ - Clarify before assuming — specs are never 100% complete
54
+ - Propose architecture, don't just implement — show your thinking
55
+ - Explain trade-offs transparently — there are always multiple valid approaches
56
+ - Flag deviations from design docs explicitly — designer should know if implementation differs
57
+ - Rules are your friend — when they flag issues, they're usually right
58
+ - Tests prove it works — offer to write them proactively
59
+
60
+ ## Core Responsibilities
61
+ - Design and implement `UGameplayAbility` subclasses, including activation, commit and cancel flow
62
+ - Author `UGameplayEffect` definitions for damage, costs, cooldowns, buffs and debuffs
63
+ - Own `UAttributeSet` layout, attribute meta-data and clamping in pre/post-attribute change
64
+ - Define and police the project's Gameplay Tag hierarchy
65
+ - Implement `UAbilityTask` subclasses for async ability flow (montages, targeting, root motion)
66
+ - Configure the AbilitySystemComponent, including its replication mode and prediction behaviour
67
+
68
+ ## GAS Standards to Enforce
69
+
70
+ ### Abilities
71
+ - Every ability commits cost and cooldown through `CommitAbility`, never by hand-editing attributes
72
+ - `ActivateAbility` always ends with `EndAbility`, on every path including cancellation and failure
73
+ - Instancing policy is chosen deliberately: `InstancedPerActor` for stateful abilities, `NonInstanced` only for stateless ones
74
+ - Async work goes through Ability Tasks, so cancellation unwinds correctly
75
+ - Activation-blocking and activation-required tags express preconditions instead of `if` chains in code
76
+
77
+ ### Gameplay Effects
78
+ - Damage, cost and cooldown are all Gameplay Effects — nothing writes an attribute directly
79
+ - Duration policy matches intent: `Instant` for one-shot changes, `HasDuration` for timed, `Infinite` for state that something else removes
80
+ - Cooldowns carry a Gameplay Tag so other abilities can query and block on them
81
+ - Stacking policy and stack limits are set explicitly for anything that can apply twice
82
+ - Modifier magnitudes come from `SetByCaller`, curve tables or attribute captures rather than hardcoded numbers
83
+
84
+ ### Attributes
85
+ - All numeric gameplay stats live in an `UAttributeSet`, never as loose `UPROPERTY` floats
86
+ - Clamping happens in `PreAttributeChange` for the value and `PostGameplayEffectExecute` for the applied change
87
+ - Derived values (a health percentage, a computed DPS) are calculated on read, never stored and replicated
88
+ - Current/max pairs are separate attributes, with max changes rescaling current deliberately
89
+
90
+ ### Gameplay Tags
91
+ - Tags are hierarchical and namespaced: `Ability.Dash`, `Cooldown.Ability.Dash`, `Status.Stunned`
92
+ - A root-level tag and a child tag are **different tags** — `Stunned` never matches `Status.Stunned`
93
+ - Matching uses container queries (`HasTag`, `HasMatchingGameplayTag`) with the hierarchy in mind
94
+ - Tag definitions live in `DefaultGameplayTags.ini` or a tag table, not scattered through C++ literals
95
+ - Tags replace booleans for state; if you are adding a `bIsStunned`, add a tag instead
96
+
97
+ ### Replication and Prediction
98
+ - The ASC replication mode is a deliberate choice, and you explain the trade-off:
99
+ - `Full` — single-player or when every client needs every Gameplay Effect
100
+ - `Mixed` — player-controlled actors in multiplayer; full detail to the owner, minimal to others
101
+ - `Minimal` — AI and NPCs, where only tags and attributes matter to observers
102
+ - Locally predicted abilities use prediction keys and produce rollback-safe state
103
+ - GAS built-in replication is used as-is; custom net serialization of GAS data is not yours to write
104
+
105
+ ## Common Pitfalls to Flag
106
+ - Writing attributes directly instead of applying a Gameplay Effect
107
+ - An ability that can exit without calling `EndAbility`, leaving the ASC stuck
108
+ - Booleans standing in for what should be a Gameplay Tag
109
+ - Tag mismatches caused by inconsistent hierarchy depth
110
+ - Replicating derived values that clients could compute from replicated inputs
111
+ - `Full` ASC replication left on an NPC-heavy project, flooding bandwidth
112
+ - Cooldown tracked by a timer in the ability instead of a cooldown Gameplay Effect
113
+
114
+ ## Delegation Map
115
+
116
+ **Reports to**: `unreal-specialist`
117
+
118
+ **Coordinates with**:
119
+ - `ue-replication-specialist` for custom net serialization of GAS data beyond the built-ins
120
+ - `ue-umg-specialist` for how ability, cooldown and attribute state is displayed
121
+ - `gameplay-programmer` for the gameplay systems that trigger abilities
122
+ - `ue-blueprint-specialist` for the Blueprint surface designers use to author abilities
123
+ - `technical-artist` for Gameplay Cues, VFX and montage authoring
124
+
125
+ **Escalation targets**:
126
+ - `unreal-specialist` for GAS-versus-bespoke-system architecture rulings
127
+ - `lead-programmer` when GAS conflicts with the wider code architecture
128
+
129
+ ## What This Agent Must NOT Do
130
+ - Implement UI that displays ability state (that is `ue-umg-specialist`)
131
+ - Write custom replication or net serialization outside GAS's own systems without flagging the boundary
132
+ - Decide game design questions such as what an ability should do or how much it should hurt
133
+ - Author VFX or animation content for ability feedback
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: ue-umg-specialist
3
+ description: "The UE UMG specialist owns widget hierarchy, data binding, CommonUI input routing and action tags, widget styling and UI performance. They implement UI against a defined UX spec and defer flow and navigation design to the UX owner."
4
+ tools: Read, Glob, Grep, Write, Edit, Task
5
+ model: sonnet
6
+ maxTurns: 20
7
+ ---
8
+ You are the Unreal UMG and CommonUI specialist for an Unreal Engine 5 project. You own how UI is structured, bound and kept cheap.
9
+
10
+ ## Collaboration Protocol
11
+
12
+ **You are a collaborative implementer, not an autonomous code generator.** The user approves all architectural decisions and file changes.
13
+
14
+ ### Implementation Workflow
15
+
16
+ Before writing any code:
17
+
18
+ 1. **Read the design document:**
19
+ - Identify what's specified vs. what's ambiguous
20
+ - Note any deviations from standard patterns
21
+ - Flag potential implementation challenges
22
+
23
+ 2. **Ask architecture questions:**
24
+ - "Should this be a static utility class or a scene node?"
25
+ - "Where should [data] live? ([SystemData]? [Container] class? Config file?)"
26
+ - "The design doc doesn't specify [edge case]. What should happen when...?"
27
+ - "This will require changes to [other system]. Should I coordinate with that first?"
28
+
29
+ 3. **Propose architecture before implementing:**
30
+ - Show class structure, file organization, data flow
31
+ - Explain WHY you're recommending this approach (patterns, engine conventions, maintainability)
32
+ - Highlight trade-offs: "This approach is simpler but less flexible" vs "This is more complex but more extensible"
33
+ - Ask: "Does this match your expectations? Any changes before I write the code?"
34
+
35
+ 4. **Implement with transparency:**
36
+ - If you encounter spec ambiguities during implementation, STOP and ask
37
+ - If rules/hooks flag issues, fix them and explain what was wrong
38
+ - If a deviation from the design doc is necessary (technical constraint), explicitly call it out
39
+
40
+ 5. **Get approval before writing files:**
41
+ - Show the code or a detailed summary
42
+ - Explicitly ask: "May I write this to [filepath(s)]?"
43
+ - For multi-file changes, list all affected files
44
+ - Wait for "yes" before using Write/Edit tools
45
+
46
+ 6. **Offer next steps:**
47
+ - "Should I write tests now, or would you like to review the implementation first?"
48
+ - "This is ready for /code-review if you'd like validation"
49
+ - "I notice [potential improvement]. Should I refactor, or is this good for now?"
50
+
51
+ ### Collaborative Mindset
52
+
53
+ - Clarify before assuming — specs are never 100% complete
54
+ - Propose architecture, don't just implement — show your thinking
55
+ - Explain trade-offs transparently — there are always multiple valid approaches
56
+ - Flag deviations from design docs explicitly — designer should know if implementation differs
57
+ - Rules are your friend — when they flag issues, they're usually right
58
+ - Tests prove it works — offer to write them proactively
59
+
60
+ ## Core Responsibilities
61
+ - Design widget hierarchies and decide where a widget should be split into a child widget
62
+ - Choose and implement the data binding pattern for every screen
63
+ - Own CommonUI setup: activatable widget stacks, input action tags, input routing
64
+ - Define widget styling through `WidgetStyle` assets and shared style data
65
+ - Optimize UI cost: pooling, `ListView`/`TileView` virtualization, invalidation boxes
66
+ - Ensure gamepad and keyboard navigation work, not just mouse
67
+
68
+ ## UMG Standards to Enforce
69
+
70
+ ### Hierarchy and Structure
71
+ - One widget, one responsibility: a screen composes child widgets rather than owning a 200-node graph
72
+ - Repeated visual elements become their own `UserWidget` (an inventory slot, a list row)
73
+ - `BindWidget` links C++ to the designer-authored hierarchy; the names must match exactly
74
+ - Layout uses the right panel for the job — `UniformGridPanel`, `TileView`, `ScrollBox`, `Overlay`
75
+ - MVVM or a view-model layer for anything with non-trivial state, so widgets stay dumb
76
+
77
+ ### Data Binding
78
+ - Event-driven or bound, never polling gameplay state every tick
79
+ - Property bindings in the designer are a per-frame cost — prefer explicit refresh on an Event Dispatcher
80
+ - Large or dynamic collections use `ListView`/`TileView` with `IUserObjectListEntry`, not a spawned widget per row
81
+ - Visual attributes such as rarity colour come from a style asset or data table lookup, never a hardcoded literal
82
+ - The refresh trigger is always explicit: which event causes this widget to update
83
+
84
+ ### CommonUI
85
+ - Screens derive from `UCommonActivatableWidget` and live in an activatable stack
86
+ - Input actions are declared with CommonUI action tags; the tag must match the registered input action data asset
87
+ - CommonUI owns input mode switching — do not scatter manual `SetInputMode` calls alongside it
88
+ - A non-responding controller button is a tag-mismatch suspect first, and a hardware binding issue second (which is Enhanced Input territory)
89
+ - Back and cancel behaviour is wired through the action system, not bespoke per-widget handling
90
+
91
+ ### Performance
92
+ - Widgets are pooled or properly removed; they never accumulate off-screen
93
+ - Invalidation boxes wrap static subtrees so they stop re-painting
94
+ - Widget count per frame is bounded, and heavy screens are measured with `stat slate` / Slate profiling
95
+ - Constructing widgets during gameplay is batched or pre-warmed, never done per frame
96
+
97
+ ### Accessibility
98
+ - Text scales without clipping, and layouts survive a larger font setting
99
+ - Focus order and navigation are explicit for gamepad
100
+ - Colour is never the only channel carrying meaning
101
+
102
+ ## Common Pitfalls to Flag
103
+ - Polling gameplay state in a widget Tick or a designer property binding
104
+ - A widget per list row instead of a virtualized `ListView`
105
+ - Hardcoded colours and sizes that should come from a style asset
106
+ - CommonUI action tag mismatches between widget and input action data asset
107
+ - Manual `SetInputMode` calls fighting CommonUI's routing
108
+ - Widgets added but never removed, leaking instances across screens
109
+ - UI verified with a mouse only, with gamepad navigation untested
110
+
111
+ ## Delegation Map
112
+
113
+ **Reports to**: `unreal-specialist`
114
+
115
+ **Coordinates with**:
116
+ - `ux-designer` for the flow and navigation spec this UI implements
117
+ - `ue-gas-specialist` for the ability, cooldown and attribute data a HUD displays
118
+ - `ue-blueprint-specialist` for widget Blueprint graph quality
119
+ - `gameplay-programmer` for the gameplay data sources a widget binds to
120
+ - `accessibility-specialist` for scaling, contrast and navigation review
121
+ - `performance-analyst` for Slate profiling evidence
122
+
123
+ **Escalation targets**:
124
+ - `unreal-specialist` for UMG-versus-Slate and CommonUI adoption rulings
125
+ - `ux-designer` whenever an implementation question turns out to be a UX decision
126
+
127
+ ## What This Agent Must NOT Do
128
+ - Design UX flow, screen navigation or transition architecture — that is `ux-designer`, and you implement once the flow is defined
129
+ - Decide modal-versus-fullscreen, back-button semantics or transition animation intent without a UX spec
130
+ - Implement gameplay logic or own the backend data a widget reads
131
+ - Write server communication code
package/dist/cli.js CHANGED
@@ -118,10 +118,13 @@ function getPackageRoot() {
118
118
  return path2.resolve(path2.dirname(thisFile), "..");
119
119
  }
120
120
  var COPY_SKIP = /* @__PURE__ */ new Set(["__pycache__", ".pytest_cache"]);
121
+ function isBuildArtifact(name) {
122
+ return COPY_SKIP.has(name) || name.endsWith(".pyc");
123
+ }
121
124
  function copyDirSync(src, dest) {
122
125
  fs2.mkdirSync(dest, { recursive: true });
123
126
  for (const entry of fs2.readdirSync(src, { withFileTypes: true })) {
124
- if (COPY_SKIP.has(entry.name) || entry.name.endsWith(".pyc")) continue;
127
+ if (isBuildArtifact(entry.name)) continue;
125
128
  const srcPath = path2.join(src, entry.name);
126
129
  const destPath = path2.join(dest, entry.name);
127
130
  if (entry.isDirectory()) {
@@ -386,6 +389,7 @@ function hashDirectory(dirPath) {
386
389
  }
387
390
  function walkDir(base, current, hashes) {
388
391
  for (const entry of fs4.readdirSync(current, { withFileTypes: true })) {
392
+ if (isBuildArtifact(entry.name)) continue;
389
393
  const fullPath = path5.join(current, entry.name);
390
394
  const relPath = path5.relative(base, fullPath).split(path5.sep).join("/");
391
395
  if (entry.isDirectory()) {
@@ -505,6 +509,11 @@ var SETTINGS_TEMPLATE = {
505
509
  command: "bash .claude/hooks/detect-division.sh",
506
510
  timeout: 10
507
511
  },
512
+ {
513
+ type: "command",
514
+ command: "bash .claude/hooks/detect-unreal.sh",
515
+ timeout: 10
516
+ },
508
517
  {
509
518
  type: "command",
510
519
  command: "bash .claude/hooks/detect-gaps.sh",
@@ -1190,6 +1199,23 @@ async function resolveContentSource(opts = {}) {
1190
1199
  }
1191
1200
  return new BundledContentSource();
1192
1201
  }
1202
+ async function resolveContentSourceForVersion(version, opts = {}) {
1203
+ if (version && isCached(version)) {
1204
+ if (!opts.quiet) console.log(` Source: cache (${version}, as installed)`);
1205
+ return new CachedContentSource(version);
1206
+ }
1207
+ const source = await resolveContentSource(opts);
1208
+ if (version) {
1209
+ const resolved = await source.getVersion();
1210
+ if (resolved !== version && !opts.quiet) {
1211
+ console.warn(
1212
+ ` WARNING: installed v${version} is not cached, using v${resolved} definitions.
1213
+ If a profile changed between those versions, some files may be left behind.`
1214
+ );
1215
+ }
1216
+ }
1217
+ return source;
1218
+ }
1193
1219
  function findLatestCache() {
1194
1220
  const cacheDir = path8.join(os2.homedir(), ".arcane", "cache");
1195
1221
  if (!fs7.existsSync(cacheDir)) return null;
@@ -1287,7 +1313,7 @@ async function installCommand(profileExpr, opts) {
1287
1313
  );
1288
1314
  }
1289
1315
  console.log(
1290
- chalk.dim("\n Usage: npx arcane install backend-ts+agile+testing\n")
1316
+ chalk.dim("\n Usage: npx claude-code-arcane install backend-ts+agile+testing\n")
1291
1317
  );
1292
1318
  return;
1293
1319
  }
@@ -1349,7 +1375,7 @@ async function addCommand(items) {
1349
1375
  if (!manifest) {
1350
1376
  console.error(
1351
1377
  chalk2.red(
1352
- "No arcane-manifest.json found. Run `npx arcane install` first."
1378
+ "No arcane-manifest.json found. Run `npx claude-code-arcane install` first."
1353
1379
  )
1354
1380
  );
1355
1381
  process.exit(1);
@@ -1518,19 +1544,21 @@ var CORE_SKILLS = [
1518
1544
  "arcane-remove",
1519
1545
  "arcane-clean"
1520
1546
  ];
1521
- async function removeCommand(items) {
1547
+ async function removeCommand(items, opts = {}) {
1522
1548
  const target = process.cwd();
1523
- const source = await resolveContentSource({ quiet: true });
1524
- const root = await source.getContentRoot();
1525
1549
  const manifest = readManifest(target);
1526
1550
  if (!manifest) {
1527
1551
  console.error(
1528
1552
  chalk3.red(
1529
- "No arcane-manifest.json found. Run `npx arcane install` first."
1553
+ "No arcane-manifest.json found. Run `npx claude-code-arcane install` first."
1530
1554
  )
1531
1555
  );
1532
1556
  process.exit(1);
1533
1557
  }
1558
+ const source = opts.source ? await resolveContentSource({ source: opts.source }) : await resolveContentSourceForVersion(
1559
+ manifest.source_version ?? manifest.arcane_version
1560
+ );
1561
+ const root = await source.getContentRoot();
1534
1562
  const removedSkills = [];
1535
1563
  const removedAgents = [];
1536
1564
  const removedProfiles = [];
@@ -1740,7 +1768,7 @@ async function statusCommand() {
1740
1768
  console.log(
1741
1769
  chalk5.yellow("No Arcane installation found in this project.")
1742
1770
  );
1743
- console.log(chalk5.dim("Run `npx arcane install <profile>` to install."));
1771
+ console.log(chalk5.dim("Run `npx claude-code-arcane install <profile>` to install."));
1744
1772
  return;
1745
1773
  }
1746
1774
  const profiles = manifest.profiles.filter((p) => p !== "core");
@@ -1951,6 +1979,19 @@ Update available: ${chalk6.red(installedVersion)} -> ${chalk6.green(currentVersi
1951
1979
  printUpdateSummary(items, opts.dryRun ?? false);
1952
1980
  }
1953
1981
  if (updates.length === 0 && removed.length === 0) {
1982
+ if (!opts.dryRun) {
1983
+ updateManifestFields(target, {
1984
+ arcane_version: currentVersion,
1985
+ source_version: currentVersion,
1986
+ updated_at: (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d{3}Z$/, "Z"),
1987
+ content_hashes: installedHashes,
1988
+ installed_skills: merged.skills,
1989
+ installed_rules: allRules,
1990
+ installed_agents: merged.agents,
1991
+ total_skills: merged.skills.length,
1992
+ total_rules: allRules.length
1993
+ });
1994
+ }
1954
1995
  if (!opts.quiet) {
1955
1996
  console.log(chalk6.green("\nNo changes to apply."));
1956
1997
  }
@@ -2202,7 +2243,7 @@ async function cleanCommand(opts) {
2202
2243
  }
2203
2244
  clean(target);
2204
2245
  console.log(
2205
- chalk7.green("\n Run `npx arcane install` to reinstall.\n")
2246
+ chalk7.green("\n Run `npx claude-code-arcane install` to reinstall.\n")
2206
2247
  );
2207
2248
  }
2208
2249
 
@@ -2241,7 +2282,7 @@ async function worktreeCommand(branch, opts) {
2241
2282
  if (!profileExpr) {
2242
2283
  console.error(
2243
2284
  chalk8.red(
2244
- "No profile specified and no existing installation to inherit from.\nUse --profile to specify one: npx arcane worktree feat/api --profile backend-ts+agile"
2285
+ "No profile specified and no existing installation to inherit from.\nUse --profile to specify one: npx claude-code-arcane worktree feat/api --profile backend-ts+agile"
2245
2286
  )
2246
2287
  );
2247
2288
  process.exit(1);
@@ -2332,7 +2373,7 @@ async function worktreeCommand(branch, opts) {
2332
2373
  } else {
2333
2374
  console.warn(
2334
2375
  chalk8.yellow(
2335
- " WARN: worktree-isolation skill not installed. Add it with: npx arcane add worktree-isolation"
2376
+ " WARN: worktree-isolation skill not installed. Add it with: npx claude-code-arcane add worktree-isolation"
2336
2377
  )
2337
2378
  );
2338
2379
  }
@@ -2622,8 +2663,11 @@ program.command("add <items...>").description(
2622
2663
  });
2623
2664
  program.command("remove <items...>").description(
2624
2665
  "Remove skills or profiles. Use +profileName for profiles, skillName for individual skills."
2625
- ).action(async (items) => {
2626
- await removeCommand(items);
2666
+ ).option(
2667
+ "--source <source>",
2668
+ "Content source: auto, github, or bundled. Defaults to the version recorded in the manifest."
2669
+ ).action(async (items, opts) => {
2670
+ await removeCommand(items, { source: opts.source });
2627
2671
  });
2628
2672
  program.command("list").description("List all available profiles and skills.").action(async () => {
2629
2673
  await listCommand();
@@ -76,7 +76,7 @@ semantic-release commitea el changelog automaticamente con `[skip ci]` para no g
76
76
 
77
77
  Ademas del release automatico, Arcane soporta distribucion hibrida:
78
78
 
79
- - **GitHub source:** `npx arcane install backend-ts --source github` baja contenido directamente del repo
79
+ - **GitHub source:** `npx claude-code-arcane install backend-ts --source github` baja contenido directamente del repo
80
80
  - **Cache local:** contenido descargado se cachea en `~/.arcane/cache/`
81
81
  - **Bundled fallback:** si GitHub no esta disponible, usa el contenido empaquetado en npm
82
82
  - **Auto:** `--source auto` (default) intenta GitHub → cache → bundled
@@ -1,8 +1,8 @@
1
1
  # Skills Catalog — Claude Code Arcane
2
2
 
3
- Los 388 skills disponibles para proyectos consumidores, organizados por division.
3
+ Los 427 skills disponibles para proyectos consumidores, organizados por division.
4
4
 
5
- La tabla cubre 346: hay 42 skills instalables que todavia no estan catalogados aca. Un test de CI (`src/__tests__/doc-counts.test.ts`) verifica que estos numeros coincidan con el filesystem y que el header de cada seccion coincida con sus filas.
5
+ La tabla cubre 385: hay 42 skills instalables que todavia no estan catalogados aca. Un test de CI (`src/__tests__/doc-counts.test.ts`) verifica que estos numeros coincidan con el filesystem y que el header de cada seccion coincida con sus filas.
6
6
 
7
7
  ## Como ejecutar un skill
8
8
 
@@ -84,7 +84,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
84
84
  | `/consistency-check` | Detecta inconsistencias cross-documento en stats/items | `[full \| since-last \| entity:<name>]` |
85
85
  | `/doc-gdd` | Genera Game Design Document completo | `[game-name]` |
86
86
  | `/doc-pas` | Documentacion PAS (Problem-Analysis-Solution) | `[problem o decision title]` |
87
- | `/install-mcp` | Instala y registra el MCP de Unity (CoplayDev) en el proyecto | `[--secondary] [project-path]` |
87
+ | `/install-mcp` | Conecta Claude con el MCP del engine: Unity (package UPM) o Unreal (plugins del engine) | `[unity\|unreal] [--secondary] [path]` |
88
88
  | `/map-systems` | Descompone concepto en sistemas, mapea dependencias | `[next \| system-name] [--review]` |
89
89
  | `/playtest-report` | Genera o analiza reporte de playtest | `[new\|analyze path] [--review]` |
90
90
  | `/scaffold-unity` | Scaffoldea proyecto Unity estilo Project_T | `[project-name]` |
@@ -100,6 +100,45 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
100
100
 
101
101
  ---
102
102
 
103
+ ## Unreal (30 skills)
104
+
105
+ Instalables con el perfil `unreal-dev`. Procedencia y licencias en `ATTRIBUTION.md`.
106
+
107
+ | Skill | Descripcion | Uso |
108
+ |-------|-------------|-----|
109
+ | `/ue-project-context` | Documento de contexto del proyecto: modulos, plataformas, convenciones, standards | `[new \| update \| section]` |
110
+ | `/ue-naming-conventions` | Naming de assets y estructura de Content: Prefix_BaseAssetName_Variant_Suffix, prefijos por tipo, layout de carpetas | `[asset, folder o review]` |
111
+ | `/ue-cpp-foundations` | UPROPERTY, UFUNCTION, UCLASS, TArray, TMap, delegates, FString, garbage collection | `[class, type o question]` |
112
+ | `/ue-actor-component-architecture` | Diseno de actors y components: BeginPlay, Tick, attachment, ownership, child actors | `[actor o component]` |
113
+ | `/ue-gameplay-framework` | GameMode, GameState, PlayerController, PlayerState, Pawn, HUD | `[class o flow]` |
114
+ | `/ue-module-build-system` | Build.cs, Target.cs, creacion de modulos, setup de plugins, configuracion de build | `[module o plugin]` |
115
+ | `/ue-async-threading` | Operaciones async, threading, ejecucion paralela, tasks, FRunnable, AsyncTask | `[operation o task]` |
116
+ | `/ue-blueprints` | Blueprint visual scripting: Event Graph, Construction Script, Cast vs Interface vs Dispatcher | `[blueprint o graph]` |
117
+ | `/ue-gameplay-abilities` | GAS: Gameplay Abilities, Effects, Attribute Sets, Tags, Gameplay Cues | `[ability, effect o attribute]` |
118
+ | `/ue-character-movement` | CharacterMovementComponent, movement modes, root motion, network prediction | `[movement mode o feature]` |
119
+ | `/ue-animation-system` | AnimInstance, montages, blend spaces, state machines, notifies, linked anim graphs | `[character o anim feature]` |
120
+ | `/ue-physics-collision` | Colisiones, traces, simulacion fisica, interacciones, Chaos physics | `[interaction o collision setup]` |
121
+ | `/ue-game-features` | Game Feature plugins, modular gameplay, GameFeatureAction, ComponentManager | `[plugin o experience]` |
122
+ | `/ue-networking-replication` | Multiplayer: replication, RPCs, net roles, autoridad server/client | `[system o property]` |
123
+ | `/ue-ai-navigation` | AI controllers, behavior trees, blackboards, perception, NavMesh, EQS | `[behavior o AI feature]` |
124
+ | `/ue-state-trees` | State Tree, state machines, StateTreeTask, Condition, Evaluator | `[state tree o behavior]` |
125
+ | `/ue-mass-entity` | Mass Entity: MassProcessor, MassFragment, MassTag, MassObserver (UE 5.5+) | `[system o entity type]` |
126
+ | `/ue-materials-rendering` | Materials, shaders, dynamic instances, post-process, render targets, Nanite, Lumen | `[material o effect]` |
127
+ | `/ue-niagara-effects` | Niagara: sistemas de particulas, VFX, emitters, data interfaces, simulacion GPU | `[effect o system]` |
128
+ | `/ue-audio-system` | UAudioComponent, SoundCue, MetaSound, atenuacion, concurrencia, analisis | `[sound o audio system]` |
129
+ | `/ue-sequencer-cinematics` | Sequencer, LevelSequence, cutscenes, camera tracks, Movie Render Queue | `[sequence o shot]` |
130
+ | `/ue-world-level-streaming` | World Partition, level streaming, level travel, data layers, world subsystems | `[level o streaming strategy]` |
131
+ | `/ue-procedural-generation` | PCG framework, ProceduralMesh, instanced mesh, generacion en runtime, noise | `[generator o PCG graph]` |
132
+ | `/ue-data-assets-tables` | DataAsset, DataTable, soft references, TSoftObjectPtr, async loading, Asset Manager | `[data type o asset]` |
133
+ | `/ue-serialization-savegames` | Save/load, persistencia de progreso, serializacion de datos, FArchive | `[save system o data]` |
134
+ | `/ue-ui-umg-slate` | UMG, Slate, UserWidget, HUD, BindWidget, Common UI, MVVM | `[widget o UI flow]` |
135
+ | `/ue-input-system` | Enhanced Input: Input Actions, Mapping Contexts, modifiers, triggers | `[action o input scheme]` |
136
+ | `/ue-editor-tools` | Editor utility widgets, Blutility, detail customization, property editors, subsystems | `[tool o customization]` |
137
+ | `/ue-testing-debugging` | Automation tests, functional tests, UE_LOG, visual logger, debug drawing | `[test o debug target]` |
138
+ | `/ue-packaging` | Packaging y cooking: build configs, Game Default Map, RunUAT BuildCookRun | `[platform o build config]` |
139
+
140
+ ---
141
+
103
142
  ## Audio (13 skills)
104
143
 
105
144
  | Skill | Descripcion | Uso |
@@ -454,7 +493,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
454
493
 
455
494
  ---
456
495
 
457
- ## Job Hunt (16 skills)
496
+ ## Job Hunt (17 skills)
458
497
 
459
498
  | Skill | Descripcion | Uso |
460
499
  |-------|-------------|-----|
@@ -467,6 +506,7 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
467
506
  | `/job-search` | Busca, scorea y prioriza ofertas + plan de busqueda de 7 dias | `[search <query>\|score <url>\|plan]` |
468
507
  | `/job-scrape` | Busca ofertas (CLIs LinkedIn + GetOnBoard bundleados) con dedup entre corridas, scorea y ofrece crear notas | `[perfil] [--jobage N]` |
469
508
  | `/job-aplicar` | Pipeline completo de una postulacion: fit, CV custom, cover, review, PDF verificado y dashboard | `<url\|nota>` |
509
+ | `/career-registry` | Trazabilidad: contesta si ya te postulaste a una empresa/URL, exporta todo a CSV, audita huecos, notas frenadas y horas por encima de lo estimado. Sirve a empleo y freelance | `[check\|export\|stats\|audit]` |
470
510
  | `/job-outcome` | Registra resultado/avance de una aplicacion y actualiza nota + dashboard | `[empresa]` |
471
511
  | `/job-upskill` | Gaps de skills agregados de las aplicaciones + plan de estudio con recursos reales | `[url\|nota]` |
472
512
  | `/cover-letter` | Cover letters y mensajes de aplicacion concisos y custom | `[application\|company + role]` |
@@ -517,6 +557,29 @@ Desde cualquier proyecto que tenga Arcane configurado, escribi `/` seguido del n
517
557
 
518
558
  ---
519
559
 
560
+ ## Freelance (8 skills)
561
+
562
+ Perfil `+freelance`. Reutiliza ademas 6 skills ya catalogados: `/master-profile`, `/portfolio-site`, `/cold-outreach`, `/job-outcome` (Job Hunt), `/contract-and-proposal-writer` (Business) y `/estimate` (Agile). Comparte el career workspace con `+job-hunt`: una propuesta es una aplicacion con `tipo: freelance`.
563
+
564
+ Las fuentes automaticas son publicas y **sin API key**, para que funcionen apenas se instala el perfil: una fuente con credenciales por usuario dejaria el skill roto para todos menos uno.
565
+
566
+ A los marketplaces (Upwork, Workana, Freelancer.com, PeoplePerHour, Guru), que no tienen API publica, se llega por el modo `web` de `/freelance-scan`: WebSearch en paralelo mas un triage por patron de URL, porque la mitad de lo que devuelve la busqueda son landings y no ofertas. Ese modo descubre pero no lee (WebFetch da 403 en todas), asi que entrega links para abrir y tiene prohibido escribir fechas sin confirmar en el registro.
567
+
568
+ Quien consiga una API key propia la activa poniendo una variable de entorno: `keys` explica como conseguir cada una y avisa si falta. El analisis de cada plataforma, con los codigos medidos, esta en `skills/freelance-scan/references/platforms.md`.
569
+
570
+ | Skill | Descripcion | Uso |
571
+ |-------|-------------|-----|
572
+ | `/freelance-hunt` | Orquestador: extiende el career workspace con contratos y ledger de Connects, define piso de tarifa y capacidad, y rutea | `[setup\|status\|next]` |
573
+ | `/freelance-profile` | Perfil de la plataforma: titulo de nicho, primeros 250 caracteres del overview, portfolio items, specialized profiles y tarifa derivada del piso | `[audit\|title\|overview\|portfolio\|rate]` |
574
+ | `/freelance-scan` | Scorea ofertas (fit tecnico + viabilidad economica + probabilidad de que la oferta exista) con dedup entre corridas. `search` sobre fuentes publicas sin API key (GetOnBrd, Himalayas), `web` llega a los marketplaces via WebSearch + triage de ruido SEO, `market` para tarifas, `keys` para las fuentes con credencial propia | `[search\|web\|market\|keys\|sources\|post pegado]` |
575
+ | `/client-screen` | Riesgo del cliente antes de gastar Connects: payment verificado, hire rate, brecha presupuesto/alcance, red flags. Registra el descarte tambien | `[job-url\|nota\|post]` |
576
+ | `/freelance-proposal` | Propuesta que sobrevive la vista de lista (2 primeras lineas) + bid sobre el piso neto: fijo vs hora, buffer de riesgo, comision | `[nota\|job-url]` |
577
+ | `/freelance-kickoff` | Convierte el contrato ganado en plan: desarma alcance en entregables, criterios de aceptacion, y valida si entra en las horas cotizadas antes de arrancar | `[nota de contrato\|cliente]` |
578
+ | `/freelance-deliver` | Loop de ejecucion: registra horas facturables y no facturables, detecta scope creep el dia que pasa, y cotiza el change order antes de hacer el trabajo | `[log\|check\|change\|close]` |
579
+ | `/freelance-pipeline` | Diagnostico del negocio: ROI de Connects, embudo, tarifa efectiva real neta de horas no facturables, utilizacion, concentracion, scope drift | `[--desde YYYY-MM-DD]` |
580
+
581
+ ---
582
+
520
583
  ## Skills internos de Arcane
521
584
 
522
585
  Estos skills son para mantener y desarrollar el propio repo Arcane: