arcane-cli 0.39.0 → 1.0.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 (176) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/.agents/skills/spell-address-review/SKILL.md +1 -1
  3. package/dist/assets/.agents/skills/spell-adopt-docs/SKILL.md +1 -1
  4. package/dist/assets/.agents/skills/spell-arcane-version/SKILL.md +1 -1
  5. package/dist/assets/.agents/skills/spell-architect/SKILL.md +1 -1
  6. package/dist/assets/.agents/skills/spell-brainstorm/SKILL.md +1 -1
  7. package/dist/assets/.agents/skills/spell-bug/SKILL.md +1 -1
  8. package/dist/assets/.agents/skills/spell-bump/SKILL.md +1 -1
  9. package/dist/assets/.agents/skills/spell-check-drift/SKILL.md +1 -1
  10. package/dist/assets/.agents/skills/spell-close-session/SKILL.md +1 -1
  11. package/dist/assets/.agents/skills/spell-commit-work/SKILL.md +1 -1
  12. package/dist/assets/.agents/skills/spell-compliance/SKILL.md +1 -1
  13. package/dist/assets/.agents/skills/spell-create-pull-request/SKILL.md +1 -1
  14. package/dist/assets/.agents/skills/spell-document/SKILL.md +1 -1
  15. package/dist/assets/.agents/skills/spell-dotnet-expert/SKILL.md +1 -1
  16. package/dist/assets/.agents/skills/spell-eas-store-deploy/SKILL.md +1 -1
  17. package/dist/assets/.agents/skills/spell-enchant/SKILL.md +1 -1
  18. package/dist/assets/.agents/skills/spell-explain-concept/SKILL.md +1 -1
  19. package/dist/assets/.agents/skills/spell-feedback/SKILL.md +1 -1
  20. package/dist/assets/.agents/skills/spell-full-cycle/SKILL.md +1 -1
  21. package/dist/assets/.agents/skills/spell-generate-bot-icons/SKILL.md +1 -1
  22. package/dist/assets/.agents/skills/spell-implement/SKILL.md +1 -1
  23. package/dist/assets/.agents/skills/spell-make-discoverable/SKILL.md +1 -1
  24. package/dist/assets/.agents/skills/spell-manifest/SKILL.md +1 -1
  25. package/dist/assets/.agents/skills/spell-open-session/SKILL.md +1 -1
  26. package/dist/assets/.agents/skills/spell-plan/SKILL.md +1 -1
  27. package/dist/assets/.agents/skills/spell-present-arcane/SKILL.md +1 -1
  28. package/dist/assets/.agents/skills/spell-product-review/SKILL.md +1 -1
  29. package/dist/assets/.agents/skills/spell-review/SKILL.md +1 -1
  30. package/dist/assets/.agents/skills/spell-review-batch/SKILL.md +1 -1
  31. package/dist/assets/.agents/skills/spell-save-idea/SKILL.md +1 -1
  32. package/dist/assets/.agents/skills/spell-scope/SKILL.md +1 -1
  33. package/dist/assets/.agents/skills/spell-scry/SKILL.md +1 -1
  34. package/dist/assets/.agents/skills/spell-security-review/SKILL.md +1 -1
  35. package/dist/assets/.agents/skills/spell-ship/SKILL.md +1 -1
  36. package/dist/assets/.agents/skills/spell-status/SKILL.md +1 -1
  37. package/dist/assets/.agents/skills/spell-suggest-feature/SKILL.md +1 -1
  38. package/dist/assets/.agents/skills/spell-summon-venture/SKILL.md +1 -1
  39. package/dist/assets/.agents/skills/spell-sync-pull-request/SKILL.md +1 -1
  40. package/dist/assets/.agents/skills/spell-test/SKILL.md +1 -1
  41. package/dist/assets/.agents/skills/spell-todo/SKILL.md +1 -1
  42. package/dist/assets/.agents/skills/spell-verification-ledger/SKILL.md +1 -1
  43. package/dist/assets/.arcane/governance/development-methodology.md +6 -6
  44. package/dist/assets/.arcane/governance/git-conventions.md +2 -2
  45. package/dist/assets/.arcane/governance/portable-bootstrap.md +1 -0
  46. package/dist/assets/.arcane/governance/product-excellence-standards.md +1 -1
  47. package/dist/assets/.arcane/governance/spell-authoring-standards.md +9 -1
  48. package/dist/assets/.arcane/governance/universal-agent-rules.md +5 -3
  49. package/dist/assets/.arcane/spells/spell-address-review.md +115 -0
  50. package/dist/assets/.arcane/spells/spell-adopt-docs.md +158 -0
  51. package/dist/assets/.arcane/spells/spell-arcane-version.md +87 -0
  52. package/dist/assets/.arcane/spells/spell-architect.md +117 -0
  53. package/dist/assets/.arcane/spells/spell-brainstorm.md +125 -0
  54. package/dist/assets/.arcane/spells/spell-bug.md +123 -0
  55. package/dist/assets/.arcane/spells/spell-bump.md +82 -0
  56. package/dist/assets/.arcane/spells/spell-check-drift.md +118 -0
  57. package/dist/assets/.arcane/spells/spell-close-session.md +266 -0
  58. package/dist/assets/.arcane/spells/spell-commit-work.md +279 -0
  59. package/dist/assets/.arcane/spells/spell-compliance.md +130 -0
  60. package/dist/assets/.arcane/spells/spell-create-pull-request.md +224 -0
  61. package/dist/assets/.arcane/spells/spell-document.md +84 -0
  62. package/dist/assets/.arcane/spells/spell-dotnet-expert.md +118 -0
  63. package/dist/assets/.arcane/spells/spell-eas-store-deploy.md +254 -0
  64. package/dist/assets/.arcane/spells/spell-enchant.md +386 -0
  65. package/dist/assets/.arcane/spells/spell-explain-concept.md +70 -0
  66. package/dist/assets/.arcane/spells/spell-feedback.md +138 -0
  67. package/dist/assets/.arcane/spells/spell-full-cycle.md +253 -0
  68. package/dist/assets/.arcane/spells/spell-generate-bot-icons.md +85 -0
  69. package/dist/assets/.arcane/spells/spell-implement.md +109 -0
  70. package/dist/assets/.arcane/spells/spell-make-discoverable.md +293 -0
  71. package/dist/assets/.arcane/spells/spell-manifest.md +148 -0
  72. package/dist/assets/.arcane/spells/spell-open-session.md +154 -0
  73. package/dist/assets/.arcane/spells/spell-plan.md +160 -0
  74. package/dist/assets/.arcane/spells/spell-present-arcane.md +189 -0
  75. package/dist/assets/.arcane/spells/spell-product-review.md +98 -0
  76. package/dist/assets/.arcane/spells/spell-review-batch.md +113 -0
  77. package/dist/assets/.arcane/spells/spell-review.md +142 -0
  78. package/dist/assets/.arcane/spells/spell-save-idea.md +117 -0
  79. package/dist/assets/.arcane/spells/spell-scope.md +266 -0
  80. package/dist/assets/.arcane/spells/spell-scry.md +124 -0
  81. package/dist/assets/.arcane/spells/spell-security-review.md +152 -0
  82. package/dist/assets/.arcane/spells/spell-ship.md +106 -0
  83. package/dist/assets/.arcane/spells/spell-status.md +86 -0
  84. package/dist/assets/.arcane/spells/spell-suggest-feature.md +122 -0
  85. package/dist/assets/.arcane/spells/spell-summon-venture.md +110 -0
  86. package/dist/assets/.arcane/spells/spell-sync-pull-request.md +161 -0
  87. package/dist/assets/.arcane/spells/spell-test.md +88 -0
  88. package/dist/assets/.arcane/spells/spell-todo.md +166 -0
  89. package/dist/assets/.arcane/spells/spell-verification-ledger.md +102 -0
  90. package/dist/assets/.claude/commands/spell-address-review.md +2 -2
  91. package/dist/assets/.claude/commands/spell-adopt-docs.md +2 -2
  92. package/dist/assets/.claude/commands/spell-arcane-version.md +2 -2
  93. package/dist/assets/.claude/commands/spell-architect.md +2 -2
  94. package/dist/assets/.claude/commands/spell-brainstorm.md +2 -2
  95. package/dist/assets/.claude/commands/spell-bug.md +2 -2
  96. package/dist/assets/.claude/commands/spell-bump.md +2 -2
  97. package/dist/assets/.claude/commands/spell-check-drift.md +2 -2
  98. package/dist/assets/.claude/commands/spell-close-session.md +2 -2
  99. package/dist/assets/.claude/commands/spell-commit-work.md +2 -2
  100. package/dist/assets/.claude/commands/spell-compliance.md +2 -2
  101. package/dist/assets/.claude/commands/spell-create-pull-request.md +2 -2
  102. package/dist/assets/.claude/commands/spell-document.md +2 -2
  103. package/dist/assets/.claude/commands/spell-dotnet-expert.md +2 -2
  104. package/dist/assets/.claude/commands/spell-eas-store-deploy.md +2 -2
  105. package/dist/assets/.claude/commands/spell-enchant.md +2 -2
  106. package/dist/assets/.claude/commands/spell-explain-concept.md +2 -2
  107. package/dist/assets/.claude/commands/spell-feedback.md +2 -2
  108. package/dist/assets/.claude/commands/spell-full-cycle.md +2 -2
  109. package/dist/assets/.claude/commands/spell-generate-bot-icons.md +2 -2
  110. package/dist/assets/.claude/commands/spell-implement.md +2 -2
  111. package/dist/assets/.claude/commands/spell-make-discoverable.md +2 -2
  112. package/dist/assets/.claude/commands/spell-manifest.md +2 -2
  113. package/dist/assets/.claude/commands/spell-open-session.md +2 -2
  114. package/dist/assets/.claude/commands/spell-plan.md +2 -2
  115. package/dist/assets/.claude/commands/spell-present-arcane.md +2 -2
  116. package/dist/assets/.claude/commands/spell-product-review.md +2 -2
  117. package/dist/assets/.claude/commands/spell-review-batch.md +2 -2
  118. package/dist/assets/.claude/commands/spell-review.md +2 -2
  119. package/dist/assets/.claude/commands/spell-save-idea.md +2 -2
  120. package/dist/assets/.claude/commands/spell-scope.md +2 -2
  121. package/dist/assets/.claude/commands/spell-scry.md +2 -2
  122. package/dist/assets/.claude/commands/spell-security-review.md +2 -2
  123. package/dist/assets/.claude/commands/spell-ship.md +2 -2
  124. package/dist/assets/.claude/commands/spell-status.md +2 -2
  125. package/dist/assets/.claude/commands/spell-suggest-feature.md +2 -2
  126. package/dist/assets/.claude/commands/spell-summon-venture.md +2 -2
  127. package/dist/assets/.claude/commands/spell-sync-pull-request.md +2 -2
  128. package/dist/assets/.claude/commands/spell-test.md +2 -2
  129. package/dist/assets/.claude/commands/spell-todo.md +2 -2
  130. package/dist/assets/.claude/commands/spell-verification-ledger.md +2 -2
  131. package/dist/assets/.github/instructions/agent-output.instructions.md +14 -13
  132. package/dist/assets/.github/prompts/spell-address-review.prompt.md +1 -107
  133. package/dist/assets/.github/prompts/spell-adopt-docs.prompt.md +1 -150
  134. package/dist/assets/.github/prompts/spell-arcane-version.prompt.md +1 -79
  135. package/dist/assets/.github/prompts/spell-architect.prompt.md +1 -109
  136. package/dist/assets/.github/prompts/spell-brainstorm.prompt.md +1 -117
  137. package/dist/assets/.github/prompts/spell-bug.prompt.md +1 -115
  138. package/dist/assets/.github/prompts/spell-bump.prompt.md +1 -74
  139. package/dist/assets/.github/prompts/spell-check-drift.prompt.md +1 -110
  140. package/dist/assets/.github/prompts/spell-close-session.prompt.md +1 -258
  141. package/dist/assets/.github/prompts/spell-commit-work.prompt.md +1 -270
  142. package/dist/assets/.github/prompts/spell-compliance.prompt.md +1 -122
  143. package/dist/assets/.github/prompts/spell-create-pull-request.prompt.md +1 -215
  144. package/dist/assets/.github/prompts/spell-document.prompt.md +1 -76
  145. package/dist/assets/.github/prompts/spell-dotnet-expert.prompt.md +1 -110
  146. package/dist/assets/.github/prompts/spell-eas-store-deploy.prompt.md +1 -246
  147. package/dist/assets/.github/prompts/spell-enchant.prompt.md +1 -378
  148. package/dist/assets/.github/prompts/spell-explain-concept.prompt.md +1 -62
  149. package/dist/assets/.github/prompts/spell-feedback.prompt.md +1 -130
  150. package/dist/assets/.github/prompts/spell-full-cycle.prompt.md +1 -245
  151. package/dist/assets/.github/prompts/spell-generate-bot-icons.prompt.md +1 -77
  152. package/dist/assets/.github/prompts/spell-implement.prompt.md +1 -101
  153. package/dist/assets/.github/prompts/spell-make-discoverable.prompt.md +1 -285
  154. package/dist/assets/.github/prompts/spell-manifest.prompt.md +1 -140
  155. package/dist/assets/.github/prompts/spell-open-session.prompt.md +1 -146
  156. package/dist/assets/.github/prompts/spell-plan.prompt.md +1 -152
  157. package/dist/assets/.github/prompts/spell-present-arcane.prompt.md +1 -181
  158. package/dist/assets/.github/prompts/spell-product-review.prompt.md +1 -90
  159. package/dist/assets/.github/prompts/spell-review-batch.prompt.md +1 -105
  160. package/dist/assets/.github/prompts/spell-review.prompt.md +1 -134
  161. package/dist/assets/.github/prompts/spell-save-idea.prompt.md +1 -109
  162. package/dist/assets/.github/prompts/spell-scope.prompt.md +1 -258
  163. package/dist/assets/.github/prompts/spell-scry.prompt.md +1 -116
  164. package/dist/assets/.github/prompts/spell-security-review.prompt.md +1 -144
  165. package/dist/assets/.github/prompts/spell-ship.prompt.md +1 -98
  166. package/dist/assets/.github/prompts/spell-status.prompt.md +1 -78
  167. package/dist/assets/.github/prompts/spell-suggest-feature.prompt.md +1 -114
  168. package/dist/assets/.github/prompts/spell-summon-venture.prompt.md +1 -102
  169. package/dist/assets/.github/prompts/spell-sync-pull-request.prompt.md +1 -152
  170. package/dist/assets/.github/prompts/spell-test.prompt.md +1 -80
  171. package/dist/assets/.github/prompts/spell-todo.prompt.md +1 -158
  172. package/dist/assets/.github/prompts/spell-verification-ledger.prompt.md +1 -94
  173. package/dist/index.js +143 -39
  174. package/dist/index.js.map +1 -1
  175. package/package.json +4 -4
  176. /package/dist/assets/{.github/prompts → .arcane/spells}/_fragments/tracking-mode-declaration.md +0 -0
package/dist/index.js CHANGED
@@ -508,31 +508,39 @@ var COMPONENTS = [
508
508
  // ─── Spells ────────────────────────────────────────────────────────────────
509
509
  // Split from the former monolithic `spell-prompts` + `claude-commands` pair
510
510
  // so a profile can select spells by capability (see ARC-0NN). Grouping lives
511
- // here and only here -- every spell file stays flat and unrenamed on disk.
511
+ // here and only here -- every spell file stays flat on disk; the one
512
+ // sanctioned relocation is ARC-045's canonical move (CS-03).
512
513
  //
513
- // Each component carries ALL THREE client formats of the same spell: the
514
- // Copilot prompt (.github/prompts/*.prompt.md), the Claude Code wrapper
514
+ // Each component carries, per spell, the canonical source and ALL THREE
515
+ // generated client shims (ARC-045 / CS-03): the client-neutral source
516
+ // (.arcane/spells/*.md, always listed first), the Copilot prompt shim
517
+ // (.github/prompts/*.prompt.md), the Claude Code command stub
515
518
  // (.claude/commands/*.md), and the Codex skill (.agents/skills/*/SKILL.md,
516
519
  // CS-01). They are never independently selectable -- every profile that
517
520
  // wanted one always wanted the others -- and pairing them here makes it
518
- // structurally impossible for the formats of one spell to drift apart
519
- // across profiles.
521
+ // structurally impossible for a spell's source and its shims to drift
522
+ // apart across profiles.
520
523
  {
521
524
  name: "spells-session",
522
525
  description: "Session lifecycle \u2014 open, close, commit, status, version",
523
526
  files: [
527
+ ".arcane/spells/spell-open-session.md",
524
528
  ".github/prompts/spell-open-session.prompt.md",
525
529
  ".claude/commands/spell-open-session.md",
526
530
  ".agents/skills/spell-open-session/SKILL.md",
531
+ ".arcane/spells/spell-close-session.md",
527
532
  ".github/prompts/spell-close-session.prompt.md",
528
533
  ".claude/commands/spell-close-session.md",
529
534
  ".agents/skills/spell-close-session/SKILL.md",
535
+ ".arcane/spells/spell-commit-work.md",
530
536
  ".github/prompts/spell-commit-work.prompt.md",
531
537
  ".claude/commands/spell-commit-work.md",
532
538
  ".agents/skills/spell-commit-work/SKILL.md",
539
+ ".arcane/spells/spell-status.md",
533
540
  ".github/prompts/spell-status.prompt.md",
534
541
  ".claude/commands/spell-status.md",
535
542
  ".agents/skills/spell-status/SKILL.md",
543
+ ".arcane/spells/spell-arcane-version.md",
536
544
  ".github/prompts/spell-arcane-version.prompt.md",
537
545
  ".claude/commands/spell-arcane-version.md",
538
546
  ".agents/skills/spell-arcane-version/SKILL.md"
@@ -542,27 +550,35 @@ var COMPONENTS = [
542
550
  name: "spells-capture",
543
551
  description: "Idea, todo, feedback and explanation capture",
544
552
  files: [
553
+ ".arcane/spells/spell-save-idea.md",
545
554
  ".github/prompts/spell-save-idea.prompt.md",
546
555
  ".claude/commands/spell-save-idea.md",
547
556
  ".agents/skills/spell-save-idea/SKILL.md",
557
+ ".arcane/spells/spell-todo.md",
548
558
  ".github/prompts/spell-todo.prompt.md",
549
559
  ".claude/commands/spell-todo.md",
550
560
  ".agents/skills/spell-todo/SKILL.md",
561
+ ".arcane/spells/spell-feedback.md",
551
562
  ".github/prompts/spell-feedback.prompt.md",
552
563
  ".claude/commands/spell-feedback.md",
553
564
  ".agents/skills/spell-feedback/SKILL.md",
565
+ ".arcane/spells/spell-suggest-feature.md",
554
566
  ".github/prompts/spell-suggest-feature.prompt.md",
555
567
  ".claude/commands/spell-suggest-feature.md",
556
568
  ".agents/skills/spell-suggest-feature/SKILL.md",
569
+ ".arcane/spells/spell-document.md",
557
570
  ".github/prompts/spell-document.prompt.md",
558
571
  ".claude/commands/spell-document.md",
559
572
  ".agents/skills/spell-document/SKILL.md",
573
+ ".arcane/spells/spell-verification-ledger.md",
560
574
  ".github/prompts/spell-verification-ledger.prompt.md",
561
575
  ".claude/commands/spell-verification-ledger.md",
562
576
  ".agents/skills/spell-verification-ledger/SKILL.md",
577
+ ".arcane/spells/spell-brainstorm.md",
563
578
  ".github/prompts/spell-brainstorm.prompt.md",
564
579
  ".claude/commands/spell-brainstorm.md",
565
580
  ".agents/skills/spell-brainstorm/SKILL.md",
581
+ ".arcane/spells/spell-explain-concept.md",
566
582
  ".github/prompts/spell-explain-concept.prompt.md",
567
583
  ".claude/commands/spell-explain-concept.md",
568
584
  ".agents/skills/spell-explain-concept/SKILL.md"
@@ -572,12 +588,15 @@ var COMPONENTS = [
572
588
  name: "spells-delivery",
573
589
  description: "Pull-request lifecycle \u2014 open a PR, sync a stale one, respond to review feedback",
574
590
  files: [
591
+ ".arcane/spells/spell-create-pull-request.md",
575
592
  ".github/prompts/spell-create-pull-request.prompt.md",
576
593
  ".claude/commands/spell-create-pull-request.md",
577
594
  ".agents/skills/spell-create-pull-request/SKILL.md",
595
+ ".arcane/spells/spell-sync-pull-request.md",
578
596
  ".github/prompts/spell-sync-pull-request.prompt.md",
579
597
  ".claude/commands/spell-sync-pull-request.md",
580
598
  ".agents/skills/spell-sync-pull-request/SKILL.md",
599
+ ".arcane/spells/spell-address-review.md",
581
600
  ".github/prompts/spell-address-review.prompt.md",
582
601
  ".claude/commands/spell-address-review.md",
583
602
  ".agents/skills/spell-address-review/SKILL.md"
@@ -587,9 +606,11 @@ var COMPONENTS = [
587
606
  name: "spells-review",
588
607
  description: "Adversarial code review \u2014 requires source and tests, so excluded from docs-only profiles",
589
608
  files: [
609
+ ".arcane/spells/spell-review.md",
590
610
  ".github/prompts/spell-review.prompt.md",
591
611
  ".claude/commands/spell-review.md",
592
612
  ".agents/skills/spell-review/SKILL.md",
613
+ ".arcane/spells/spell-review-batch.md",
593
614
  ".github/prompts/spell-review-batch.prompt.md",
594
615
  ".claude/commands/spell-review-batch.md",
595
616
  ".agents/skills/spell-review-batch/SKILL.md"
@@ -599,15 +620,19 @@ var COMPONENTS = [
599
620
  name: "spells-planning",
600
621
  description: "PRD, architecture, scoping and product review",
601
622
  files: [
623
+ ".arcane/spells/spell-plan.md",
602
624
  ".github/prompts/spell-plan.prompt.md",
603
625
  ".claude/commands/spell-plan.md",
604
626
  ".agents/skills/spell-plan/SKILL.md",
627
+ ".arcane/spells/spell-architect.md",
605
628
  ".github/prompts/spell-architect.prompt.md",
606
629
  ".claude/commands/spell-architect.md",
607
630
  ".agents/skills/spell-architect/SKILL.md",
631
+ ".arcane/spells/spell-scope.md",
608
632
  ".github/prompts/spell-scope.prompt.md",
609
633
  ".claude/commands/spell-scope.md",
610
634
  ".agents/skills/spell-scope/SKILL.md",
635
+ ".arcane/spells/spell-product-review.md",
611
636
  ".github/prompts/spell-product-review.prompt.md",
612
637
  ".claude/commands/spell-product-review.md",
613
638
  ".agents/skills/spell-product-review/SKILL.md"
@@ -617,45 +642,59 @@ var COMPONENTS = [
617
642
  name: "spells-build",
618
643
  description: "Code and product delivery \u2014 implementation, tests, stack experts, release, deployment, asset tooling",
619
644
  files: [
645
+ ".arcane/spells/spell-implement.md",
620
646
  ".github/prompts/spell-implement.prompt.md",
621
647
  ".claude/commands/spell-implement.md",
622
648
  ".agents/skills/spell-implement/SKILL.md",
649
+ ".arcane/spells/spell-test.md",
623
650
  ".github/prompts/spell-test.prompt.md",
624
651
  ".claude/commands/spell-test.md",
625
652
  ".agents/skills/spell-test/SKILL.md",
653
+ ".arcane/spells/spell-full-cycle.md",
626
654
  ".github/prompts/spell-full-cycle.prompt.md",
627
655
  ".claude/commands/spell-full-cycle.md",
628
656
  ".agents/skills/spell-full-cycle/SKILL.md",
657
+ ".arcane/spells/spell-bug.md",
629
658
  ".github/prompts/spell-bug.prompt.md",
630
659
  ".claude/commands/spell-bug.md",
631
660
  ".agents/skills/spell-bug/SKILL.md",
661
+ ".arcane/spells/spell-bump.md",
632
662
  ".github/prompts/spell-bump.prompt.md",
633
663
  ".claude/commands/spell-bump.md",
634
664
  ".agents/skills/spell-bump/SKILL.md",
665
+ ".arcane/spells/spell-dotnet-expert.md",
635
666
  ".github/prompts/spell-dotnet-expert.prompt.md",
636
667
  ".claude/commands/spell-dotnet-expert.md",
637
668
  ".agents/skills/spell-dotnet-expert/SKILL.md",
669
+ ".arcane/spells/spell-security-review.md",
638
670
  ".github/prompts/spell-security-review.prompt.md",
639
671
  ".claude/commands/spell-security-review.md",
640
672
  ".agents/skills/spell-security-review/SKILL.md",
673
+ ".arcane/spells/spell-ship.md",
641
674
  ".github/prompts/spell-ship.prompt.md",
642
675
  ".claude/commands/spell-ship.md",
643
676
  ".agents/skills/spell-ship/SKILL.md",
677
+ ".arcane/spells/spell-enchant.md",
644
678
  ".github/prompts/spell-enchant.prompt.md",
645
679
  ".claude/commands/spell-enchant.md",
646
680
  ".agents/skills/spell-enchant/SKILL.md",
681
+ ".arcane/spells/spell-generate-bot-icons.md",
647
682
  ".github/prompts/spell-generate-bot-icons.prompt.md",
648
683
  ".claude/commands/spell-generate-bot-icons.md",
649
684
  ".agents/skills/spell-generate-bot-icons/SKILL.md",
685
+ ".arcane/spells/spell-make-discoverable.md",
650
686
  ".github/prompts/spell-make-discoverable.prompt.md",
651
687
  ".claude/commands/spell-make-discoverable.md",
652
688
  ".agents/skills/spell-make-discoverable/SKILL.md",
689
+ ".arcane/spells/spell-scry.md",
653
690
  ".github/prompts/spell-scry.prompt.md",
654
691
  ".claude/commands/spell-scry.md",
655
692
  ".agents/skills/spell-scry/SKILL.md",
693
+ ".arcane/spells/spell-eas-store-deploy.md",
656
694
  ".github/prompts/spell-eas-store-deploy.prompt.md",
657
695
  ".claude/commands/spell-eas-store-deploy.md",
658
696
  ".agents/skills/spell-eas-store-deploy/SKILL.md",
697
+ ".arcane/spells/spell-compliance.md",
659
698
  ".github/prompts/spell-compliance.prompt.md",
660
699
  ".claude/commands/spell-compliance.md",
661
700
  ".agents/skills/spell-compliance/SKILL.md"
@@ -665,6 +704,7 @@ var COMPONENTS = [
665
704
  name: "spells-docs",
666
705
  description: "Documentation and records workflows \u2014 adopt an existing document tree",
667
706
  files: [
707
+ ".arcane/spells/spell-adopt-docs.md",
668
708
  ".github/prompts/spell-adopt-docs.prompt.md",
669
709
  ".claude/commands/spell-adopt-docs.md",
670
710
  ".agents/skills/spell-adopt-docs/SKILL.md"
@@ -674,9 +714,11 @@ var COMPONENTS = [
674
714
  name: "spells-venture",
675
715
  description: "Hub-only venture management",
676
716
  files: [
717
+ ".arcane/spells/spell-summon-venture.md",
677
718
  ".github/prompts/spell-summon-venture.prompt.md",
678
719
  ".claude/commands/spell-summon-venture.md",
679
720
  ".agents/skills/spell-summon-venture/SKILL.md",
721
+ ".arcane/spells/spell-manifest.md",
680
722
  ".github/prompts/spell-manifest.prompt.md",
681
723
  ".claude/commands/spell-manifest.md",
682
724
  ".agents/skills/spell-manifest/SKILL.md"
@@ -686,9 +728,11 @@ var COMPONENTS = [
686
728
  name: "spells-meta",
687
729
  description: "Arcane-about-Arcane \u2014 presentation and documentation drift detection",
688
730
  files: [
731
+ ".arcane/spells/spell-present-arcane.md",
689
732
  ".github/prompts/spell-present-arcane.prompt.md",
690
733
  ".claude/commands/spell-present-arcane.md",
691
734
  ".agents/skills/spell-present-arcane/SKILL.md",
735
+ ".arcane/spells/spell-check-drift.md",
692
736
  ".github/prompts/spell-check-drift.prompt.md",
693
737
  ".claude/commands/spell-check-drift.md",
694
738
  ".agents/skills/spell-check-drift/SKILL.md"
@@ -2682,13 +2726,9 @@ function isSpellComponent(name) {
2682
2726
  function categorizeComponents(components) {
2683
2727
  const groups = [];
2684
2728
  const spellFiles = components.filter((c) => isSpellComponent(c.name)).flatMap((c) => c.files);
2685
- const promptCount = spellFiles.filter((f) => f.startsWith(".github/prompts/")).length;
2686
- if (promptCount > 0) {
2687
- groups.push({ icon: "\u2728", label: "Copilot Spells", count: promptCount });
2688
- }
2689
- const claudeCount = spellFiles.filter((f) => f.startsWith(".claude/commands/")).length;
2690
- if (claudeCount > 0) {
2691
- groups.push({ icon: "\u26A1", label: "Claude Spells", count: claudeCount });
2729
+ const spellCount = spellFiles.filter((f) => f.startsWith(".arcane/spells/")).length;
2730
+ if (spellCount > 0) {
2731
+ groups.push({ icon: "\u2728", label: "Spells (Copilot, Claude Code, Codex)", count: spellCount });
2692
2732
  }
2693
2733
  const governance = components.filter(
2694
2734
  (c) => !isSpellComponent(c.name) && c.name !== "venture-template" && c.name !== "agent-definitions" && c.files.some((f) => f.startsWith(".arcane/governance/"))
@@ -3535,6 +3575,18 @@ async function fetchPublishedFile(version, relativeAssetPath) {
3535
3575
  }
3536
3576
  }
3537
3577
 
3578
+ // src/modules/spell-compiler.ts
3579
+ import { parse as parseYaml2 } from "yaml";
3580
+ var CLIENT_SHIM_PATH_PATTERNS = [
3581
+ /^\.github\/prompts\/spell-[a-z0-9-]+\.prompt\.md$/,
3582
+ /^\.claude\/commands\/spell-[a-z0-9-]+\.md$/,
3583
+ /^\.agents\/skills\/spell-[a-z0-9-]+\/SKILL\.md$/
3584
+ ];
3585
+ function isClientShimPath(path4) {
3586
+ const normalized = path4.replace(/\\/g, "/").replace(/^\.\//, "");
3587
+ return CLIENT_SHIM_PATH_PATTERNS.some((pattern) => pattern.test(normalized));
3588
+ }
3589
+
3538
3590
  // src/commands/update.ts
3539
3591
  function migrateLegacyComponents(components) {
3540
3592
  const out = [];
@@ -3572,6 +3624,23 @@ async function resolveOrphan(targetDir, file, recordedHash, prune) {
3572
3624
  console.log(` Pruned orphaned file: ${file}`);
3573
3625
  return "pruned";
3574
3626
  }
3627
+ async function findMissingTrackedFiles(targetDir, components) {
3628
+ const missing = [];
3629
+ for (const installed of components) {
3630
+ let component;
3631
+ try {
3632
+ component = getComponent(installed.name);
3633
+ } catch {
3634
+ continue;
3635
+ }
3636
+ if (component.initOnly || component.skipExisting) continue;
3637
+ for (const file of installed.files) {
3638
+ if (!component.files.includes(file)) continue;
3639
+ if (!await fileExists(join8(targetDir, file))) missing.push(file);
3640
+ }
3641
+ }
3642
+ return missing;
3643
+ }
3575
3644
  async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3576
3645
  let manifest;
3577
3646
  try {
@@ -3614,9 +3683,17 @@ async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3614
3683
  process.exit(1);
3615
3684
  return;
3616
3685
  }
3686
+ let sameVersionRestore = false;
3617
3687
  if (manifest.version === packageVersion && manifest.components.length > 0) {
3618
- console.log("Already up to date.");
3619
- return;
3688
+ const missing = await findMissingTrackedFiles(targetDir, manifest.components);
3689
+ if (missing.length === 0) {
3690
+ console.log("Already up to date.");
3691
+ return;
3692
+ }
3693
+ sameVersionRestore = true;
3694
+ console.log(
3695
+ `${options.dryRun ? "[dry-run] " : ""}Already at v${packageVersion}, but ${missing.length} tracked file${missing.length === 1 ? " is" : "s are"} missing \u2014 restoring.`
3696
+ );
3620
3697
  }
3621
3698
  if (manifest.components.length === 0) {
3622
3699
  console.log("No components installed. Nothing to update.");
@@ -3625,6 +3702,7 @@ async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3625
3702
  let fileCount = 0;
3626
3703
  const updatedComponents = [];
3627
3704
  const conflictedFiles = [];
3705
+ const customizedShims = [];
3628
3706
  const orphanReport = [];
3629
3707
  const componentsToUpdate = migrateLegacyComponents(manifest.components);
3630
3708
  for (const installed of componentsToUpdate) {
@@ -3657,49 +3735,66 @@ async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3657
3735
  const srcPath = join8(assetsDir, component.sourceOverrides?.[file] ?? file);
3658
3736
  const targetExists = await fileExists(join8(targetDir, file));
3659
3737
  const preserveExisting = Boolean(component.skipExisting) && targetExists;
3738
+ const recordedHash = installed.fileHashes?.[file];
3660
3739
  if (component.initOnly && !targetExists) {
3661
3740
  console.log(
3662
3741
  ` ! Missing: ${file} \u2014 not added automatically, because doing so would change how Git treats existing files. Run "spell add ${component.name}" if you want it.`
3663
3742
  );
3664
3743
  continue;
3665
3744
  }
3745
+ if (sameVersionRestore) {
3746
+ const tracked = installed.files.includes(file);
3747
+ const restorable = tracked && !targetExists && !component.skipExisting;
3748
+ if (!restorable) {
3749
+ if (tracked) {
3750
+ updatedFiles.push(file);
3751
+ if (recordedHash !== void 0) fileHashes[file] = recordedHash;
3752
+ }
3753
+ continue;
3754
+ }
3755
+ }
3756
+ const editedByOperator = recordedHash !== void 0 && targetExists && !preserveExisting && await hashFile(join8(targetDir, file)) !== recordedHash;
3666
3757
  if (preserveExisting) {
3667
3758
  console.log(` ${options.dryRun ? "[dry-run] Would preserve" : "Preserved"}: ${file}`);
3759
+ } else if (editedByOperator && isClientShimPath(file)) {
3760
+ customizedShims.push(file);
3761
+ fileHashes[file] = recordedHash;
3762
+ console.log(
3763
+ ` ${options.dryRun ? "[dry-run] Would keep" : "Kept"} customized (not merged): ${file}`
3764
+ );
3668
3765
  } else if (options.dryRun) {
3669
- console.log(` [dry-run] Would update: ${file}`);
3766
+ console.log(` [dry-run] Would ${sameVersionRestore ? "restore missing" : "update"}: ${file}`);
3670
3767
  fileCount++;
3671
3768
  } else {
3672
- const recordedHash = installed.fileHashes?.[file];
3673
3769
  let handled = false;
3674
- if (recordedHash !== void 0 && targetExists) {
3675
- const currentHash = await hashFile(join8(targetDir, file));
3676
- if (currentHash !== recordedHash) {
3677
- const oldVendorContent = await fetchPublishedFile(installed.installedVersion, file);
3678
- if (oldVendorContent === void 0) {
3679
- console.log(
3680
- ` ! Could not fetch the previously published version of ${file} to merge your edits \u2014 left your version untouched. Update it manually if you want the latest.`
3681
- );
3682
- handled = true;
3770
+ if (editedByOperator) {
3771
+ const oldVendorContent = await fetchPublishedFile(installed.installedVersion, file);
3772
+ if (oldVendorContent === void 0) {
3773
+ console.log(
3774
+ ` ! Could not fetch the previously published version of ${file} to merge your edits \u2014 left your version untouched. Update it manually if you want the latest.`
3775
+ );
3776
+ fileHashes[file] = recordedHash;
3777
+ handled = true;
3778
+ } else {
3779
+ const [currentContent, newContent] = await Promise.all([
3780
+ readFile6(join8(targetDir, file), "utf-8"),
3781
+ readFile6(srcPath, "utf-8")
3782
+ ]);
3783
+ const result = merge3(oldVendorContent, currentContent, newContent);
3784
+ await writeFile8(join8(targetDir, file), result.content, "utf-8");
3785
+ fileHashes[file] = await hashFile(srcPath);
3786
+ if (result.hasConflict) {
3787
+ conflictedFiles.push(file);
3788
+ console.log(` \u26A0 Merge conflict in ${file} \u2014 resolve the <<<<<<< markers before committing.`);
3683
3789
  } else {
3684
- const [currentContent, newContent] = await Promise.all([
3685
- readFile6(join8(targetDir, file), "utf-8"),
3686
- readFile6(srcPath, "utf-8")
3687
- ]);
3688
- const result = merge3(oldVendorContent, currentContent, newContent);
3689
- await writeFile8(join8(targetDir, file), result.content, "utf-8");
3690
- fileHashes[file] = await hashFile(join8(targetDir, file));
3691
- if (result.hasConflict) {
3692
- conflictedFiles.push(file);
3693
- console.log(` \u26A0 Merge conflict in ${file} \u2014 resolve the <<<<<<< markers before committing.`);
3694
- } else {
3695
- console.log(` Merged your edits into: ${file}`);
3696
- }
3697
- handled = true;
3790
+ console.log(` Merged your edits into: ${file}`);
3698
3791
  }
3792
+ handled = true;
3699
3793
  }
3700
3794
  }
3701
3795
  if (!handled) {
3702
3796
  fileHashes[file] = await copyFile(srcPath, targetDir, file, { force: true });
3797
+ if (sameVersionRestore) console.log(` Restored missing: ${file}`);
3703
3798
  }
3704
3799
  fileCount++;
3705
3800
  }
@@ -3752,6 +3847,15 @@ ${verb} ${orphansToReport.length} orphaned file(s) (tracked before this update,
3752
3847
  console.log(" Run `spell update --prune` to remove the ones that are safe to delete.");
3753
3848
  }
3754
3849
  }
3850
+ if (customizedShims.length > 0) {
3851
+ const verb = options.dryRun ? "[dry-run] Would keep" : "Kept";
3852
+ console.log(
3853
+ `
3854
+ ! ${verb} ${customizedShims.length} customized client file(s) untouched (ARC-045): an edited Copilot prompt, Claude command or Codex skill is never merged into the new generated shim, because a shim carries no prose of its own to merge into.
3855
+ ` + customizedShims.map((f) => ` ${f}`).join("\n") + `
3856
+ Each keeps working in its client as-is. To converge: move your edits into the canonical spell (.arcane/spells/<id>.md \u2014 later updates merge edits there), delete the customized file, commit, and run \`spell update\` again \u2014 it restores the generated shim at the current version.`
3857
+ );
3858
+ }
3755
3859
  if (options.dryRun) {
3756
3860
  console.log(
3757
3861
  `