arcane-cli 0.38.3 → 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 +6 -0
  3. package/dist/assets/.agents/skills/spell-adopt-docs/SKILL.md +6 -0
  4. package/dist/assets/.agents/skills/spell-arcane-version/SKILL.md +6 -0
  5. package/dist/assets/.agents/skills/spell-architect/SKILL.md +6 -0
  6. package/dist/assets/.agents/skills/spell-brainstorm/SKILL.md +6 -0
  7. package/dist/assets/.agents/skills/spell-bug/SKILL.md +6 -0
  8. package/dist/assets/.agents/skills/spell-bump/SKILL.md +6 -0
  9. package/dist/assets/.agents/skills/spell-check-drift/SKILL.md +6 -0
  10. package/dist/assets/.agents/skills/spell-close-session/SKILL.md +6 -0
  11. package/dist/assets/.agents/skills/spell-commit-work/SKILL.md +6 -0
  12. package/dist/assets/.agents/skills/spell-compliance/SKILL.md +6 -0
  13. package/dist/assets/.agents/skills/spell-create-pull-request/SKILL.md +6 -0
  14. package/dist/assets/.agents/skills/spell-document/SKILL.md +6 -0
  15. package/dist/assets/.agents/skills/spell-dotnet-expert/SKILL.md +6 -0
  16. package/dist/assets/.agents/skills/spell-eas-store-deploy/SKILL.md +6 -0
  17. package/dist/assets/.agents/skills/spell-enchant/SKILL.md +6 -0
  18. package/dist/assets/.agents/skills/spell-explain-concept/SKILL.md +6 -0
  19. package/dist/assets/.agents/skills/spell-feedback/SKILL.md +6 -0
  20. package/dist/assets/.agents/skills/spell-full-cycle/SKILL.md +6 -0
  21. package/dist/assets/.agents/skills/spell-generate-bot-icons/SKILL.md +6 -0
  22. package/dist/assets/.agents/skills/spell-implement/SKILL.md +6 -0
  23. package/dist/assets/.agents/skills/spell-make-discoverable/SKILL.md +6 -0
  24. package/dist/assets/.agents/skills/spell-manifest/SKILL.md +6 -0
  25. package/dist/assets/.agents/skills/spell-open-session/SKILL.md +6 -0
  26. package/dist/assets/.agents/skills/spell-plan/SKILL.md +6 -0
  27. package/dist/assets/.agents/skills/spell-present-arcane/SKILL.md +6 -0
  28. package/dist/assets/.agents/skills/spell-product-review/SKILL.md +6 -0
  29. package/dist/assets/.agents/skills/spell-review/SKILL.md +6 -0
  30. package/dist/assets/.agents/skills/spell-review-batch/SKILL.md +6 -0
  31. package/dist/assets/.agents/skills/spell-save-idea/SKILL.md +6 -0
  32. package/dist/assets/.agents/skills/spell-scope/SKILL.md +6 -0
  33. package/dist/assets/.agents/skills/spell-scry/SKILL.md +6 -0
  34. package/dist/assets/.agents/skills/spell-security-review/SKILL.md +6 -0
  35. package/dist/assets/.agents/skills/spell-ship/SKILL.md +6 -0
  36. package/dist/assets/.agents/skills/spell-status/SKILL.md +6 -0
  37. package/dist/assets/.agents/skills/spell-suggest-feature/SKILL.md +6 -0
  38. package/dist/assets/.agents/skills/spell-summon-venture/SKILL.md +6 -0
  39. package/dist/assets/.agents/skills/spell-sync-pull-request/SKILL.md +6 -0
  40. package/dist/assets/.agents/skills/spell-test/SKILL.md +6 -0
  41. package/dist/assets/.agents/skills/spell-todo/SKILL.md +6 -0
  42. package/dist/assets/.agents/skills/spell-verification-ledger/SKILL.md +6 -0
  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 +7 -0
  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 +195 -49
  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,148 +508,234 @@ 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 BOTH client formats of the same spell: the Copilot
514
- // prompt (.github/prompts/*.prompt.md) and the Claude Code wrapper
515
- // (.claude/commands/*.md). They are never independently selectable -- every
516
- // profile that wanted one always wanted the other -- and pairing them here
517
- // makes it structurally impossible for the two formats of one spell to drift
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
518
+ // (.claude/commands/*.md), and the Codex skill (.agents/skills/*/SKILL.md,
519
+ // CS-01). They are never independently selectable -- every profile that
520
+ // wanted one always wanted the others -- and pairing them here makes it
521
+ // structurally impossible for a spell's source and its shims to drift
518
522
  // apart across profiles.
519
523
  {
520
524
  name: "spells-session",
521
525
  description: "Session lifecycle \u2014 open, close, commit, status, version",
522
526
  files: [
527
+ ".arcane/spells/spell-open-session.md",
523
528
  ".github/prompts/spell-open-session.prompt.md",
524
529
  ".claude/commands/spell-open-session.md",
530
+ ".agents/skills/spell-open-session/SKILL.md",
531
+ ".arcane/spells/spell-close-session.md",
525
532
  ".github/prompts/spell-close-session.prompt.md",
526
533
  ".claude/commands/spell-close-session.md",
534
+ ".agents/skills/spell-close-session/SKILL.md",
535
+ ".arcane/spells/spell-commit-work.md",
527
536
  ".github/prompts/spell-commit-work.prompt.md",
528
537
  ".claude/commands/spell-commit-work.md",
538
+ ".agents/skills/spell-commit-work/SKILL.md",
539
+ ".arcane/spells/spell-status.md",
529
540
  ".github/prompts/spell-status.prompt.md",
530
541
  ".claude/commands/spell-status.md",
542
+ ".agents/skills/spell-status/SKILL.md",
543
+ ".arcane/spells/spell-arcane-version.md",
531
544
  ".github/prompts/spell-arcane-version.prompt.md",
532
- ".claude/commands/spell-arcane-version.md"
545
+ ".claude/commands/spell-arcane-version.md",
546
+ ".agents/skills/spell-arcane-version/SKILL.md"
533
547
  ]
534
548
  },
535
549
  {
536
550
  name: "spells-capture",
537
551
  description: "Idea, todo, feedback and explanation capture",
538
552
  files: [
553
+ ".arcane/spells/spell-save-idea.md",
539
554
  ".github/prompts/spell-save-idea.prompt.md",
540
555
  ".claude/commands/spell-save-idea.md",
556
+ ".agents/skills/spell-save-idea/SKILL.md",
557
+ ".arcane/spells/spell-todo.md",
541
558
  ".github/prompts/spell-todo.prompt.md",
542
559
  ".claude/commands/spell-todo.md",
560
+ ".agents/skills/spell-todo/SKILL.md",
561
+ ".arcane/spells/spell-feedback.md",
543
562
  ".github/prompts/spell-feedback.prompt.md",
544
563
  ".claude/commands/spell-feedback.md",
564
+ ".agents/skills/spell-feedback/SKILL.md",
565
+ ".arcane/spells/spell-suggest-feature.md",
545
566
  ".github/prompts/spell-suggest-feature.prompt.md",
546
567
  ".claude/commands/spell-suggest-feature.md",
568
+ ".agents/skills/spell-suggest-feature/SKILL.md",
569
+ ".arcane/spells/spell-document.md",
547
570
  ".github/prompts/spell-document.prompt.md",
548
571
  ".claude/commands/spell-document.md",
572
+ ".agents/skills/spell-document/SKILL.md",
573
+ ".arcane/spells/spell-verification-ledger.md",
549
574
  ".github/prompts/spell-verification-ledger.prompt.md",
550
575
  ".claude/commands/spell-verification-ledger.md",
576
+ ".agents/skills/spell-verification-ledger/SKILL.md",
577
+ ".arcane/spells/spell-brainstorm.md",
551
578
  ".github/prompts/spell-brainstorm.prompt.md",
552
579
  ".claude/commands/spell-brainstorm.md",
580
+ ".agents/skills/spell-brainstorm/SKILL.md",
581
+ ".arcane/spells/spell-explain-concept.md",
553
582
  ".github/prompts/spell-explain-concept.prompt.md",
554
- ".claude/commands/spell-explain-concept.md"
583
+ ".claude/commands/spell-explain-concept.md",
584
+ ".agents/skills/spell-explain-concept/SKILL.md"
555
585
  ]
556
586
  },
557
587
  {
558
588
  name: "spells-delivery",
559
589
  description: "Pull-request lifecycle \u2014 open a PR, sync a stale one, respond to review feedback",
560
590
  files: [
591
+ ".arcane/spells/spell-create-pull-request.md",
561
592
  ".github/prompts/spell-create-pull-request.prompt.md",
562
593
  ".claude/commands/spell-create-pull-request.md",
594
+ ".agents/skills/spell-create-pull-request/SKILL.md",
595
+ ".arcane/spells/spell-sync-pull-request.md",
563
596
  ".github/prompts/spell-sync-pull-request.prompt.md",
564
597
  ".claude/commands/spell-sync-pull-request.md",
598
+ ".agents/skills/spell-sync-pull-request/SKILL.md",
599
+ ".arcane/spells/spell-address-review.md",
565
600
  ".github/prompts/spell-address-review.prompt.md",
566
- ".claude/commands/spell-address-review.md"
601
+ ".claude/commands/spell-address-review.md",
602
+ ".agents/skills/spell-address-review/SKILL.md"
567
603
  ]
568
604
  },
569
605
  {
570
606
  name: "spells-review",
571
607
  description: "Adversarial code review \u2014 requires source and tests, so excluded from docs-only profiles",
572
608
  files: [
609
+ ".arcane/spells/spell-review.md",
573
610
  ".github/prompts/spell-review.prompt.md",
574
611
  ".claude/commands/spell-review.md",
612
+ ".agents/skills/spell-review/SKILL.md",
613
+ ".arcane/spells/spell-review-batch.md",
575
614
  ".github/prompts/spell-review-batch.prompt.md",
576
- ".claude/commands/spell-review-batch.md"
615
+ ".claude/commands/spell-review-batch.md",
616
+ ".agents/skills/spell-review-batch/SKILL.md"
577
617
  ]
578
618
  },
579
619
  {
580
620
  name: "spells-planning",
581
621
  description: "PRD, architecture, scoping and product review",
582
622
  files: [
623
+ ".arcane/spells/spell-plan.md",
583
624
  ".github/prompts/spell-plan.prompt.md",
584
625
  ".claude/commands/spell-plan.md",
626
+ ".agents/skills/spell-plan/SKILL.md",
627
+ ".arcane/spells/spell-architect.md",
585
628
  ".github/prompts/spell-architect.prompt.md",
586
629
  ".claude/commands/spell-architect.md",
630
+ ".agents/skills/spell-architect/SKILL.md",
631
+ ".arcane/spells/spell-scope.md",
587
632
  ".github/prompts/spell-scope.prompt.md",
588
633
  ".claude/commands/spell-scope.md",
634
+ ".agents/skills/spell-scope/SKILL.md",
635
+ ".arcane/spells/spell-product-review.md",
589
636
  ".github/prompts/spell-product-review.prompt.md",
590
- ".claude/commands/spell-product-review.md"
637
+ ".claude/commands/spell-product-review.md",
638
+ ".agents/skills/spell-product-review/SKILL.md"
591
639
  ]
592
640
  },
593
641
  {
594
642
  name: "spells-build",
595
643
  description: "Code and product delivery \u2014 implementation, tests, stack experts, release, deployment, asset tooling",
596
644
  files: [
645
+ ".arcane/spells/spell-implement.md",
597
646
  ".github/prompts/spell-implement.prompt.md",
598
647
  ".claude/commands/spell-implement.md",
648
+ ".agents/skills/spell-implement/SKILL.md",
649
+ ".arcane/spells/spell-test.md",
599
650
  ".github/prompts/spell-test.prompt.md",
600
651
  ".claude/commands/spell-test.md",
652
+ ".agents/skills/spell-test/SKILL.md",
653
+ ".arcane/spells/spell-full-cycle.md",
601
654
  ".github/prompts/spell-full-cycle.prompt.md",
602
655
  ".claude/commands/spell-full-cycle.md",
656
+ ".agents/skills/spell-full-cycle/SKILL.md",
657
+ ".arcane/spells/spell-bug.md",
603
658
  ".github/prompts/spell-bug.prompt.md",
604
659
  ".claude/commands/spell-bug.md",
660
+ ".agents/skills/spell-bug/SKILL.md",
661
+ ".arcane/spells/spell-bump.md",
605
662
  ".github/prompts/spell-bump.prompt.md",
606
663
  ".claude/commands/spell-bump.md",
664
+ ".agents/skills/spell-bump/SKILL.md",
665
+ ".arcane/spells/spell-dotnet-expert.md",
607
666
  ".github/prompts/spell-dotnet-expert.prompt.md",
608
667
  ".claude/commands/spell-dotnet-expert.md",
668
+ ".agents/skills/spell-dotnet-expert/SKILL.md",
669
+ ".arcane/spells/spell-security-review.md",
609
670
  ".github/prompts/spell-security-review.prompt.md",
610
671
  ".claude/commands/spell-security-review.md",
672
+ ".agents/skills/spell-security-review/SKILL.md",
673
+ ".arcane/spells/spell-ship.md",
611
674
  ".github/prompts/spell-ship.prompt.md",
612
675
  ".claude/commands/spell-ship.md",
676
+ ".agents/skills/spell-ship/SKILL.md",
677
+ ".arcane/spells/spell-enchant.md",
613
678
  ".github/prompts/spell-enchant.prompt.md",
614
679
  ".claude/commands/spell-enchant.md",
680
+ ".agents/skills/spell-enchant/SKILL.md",
681
+ ".arcane/spells/spell-generate-bot-icons.md",
615
682
  ".github/prompts/spell-generate-bot-icons.prompt.md",
616
683
  ".claude/commands/spell-generate-bot-icons.md",
684
+ ".agents/skills/spell-generate-bot-icons/SKILL.md",
685
+ ".arcane/spells/spell-make-discoverable.md",
617
686
  ".github/prompts/spell-make-discoverable.prompt.md",
618
687
  ".claude/commands/spell-make-discoverable.md",
688
+ ".agents/skills/spell-make-discoverable/SKILL.md",
689
+ ".arcane/spells/spell-scry.md",
619
690
  ".github/prompts/spell-scry.prompt.md",
620
691
  ".claude/commands/spell-scry.md",
692
+ ".agents/skills/spell-scry/SKILL.md",
693
+ ".arcane/spells/spell-eas-store-deploy.md",
621
694
  ".github/prompts/spell-eas-store-deploy.prompt.md",
622
695
  ".claude/commands/spell-eas-store-deploy.md",
696
+ ".agents/skills/spell-eas-store-deploy/SKILL.md",
697
+ ".arcane/spells/spell-compliance.md",
623
698
  ".github/prompts/spell-compliance.prompt.md",
624
- ".claude/commands/spell-compliance.md"
699
+ ".claude/commands/spell-compliance.md",
700
+ ".agents/skills/spell-compliance/SKILL.md"
625
701
  ]
626
702
  },
627
703
  {
628
704
  name: "spells-docs",
629
705
  description: "Documentation and records workflows \u2014 adopt an existing document tree",
630
706
  files: [
707
+ ".arcane/spells/spell-adopt-docs.md",
631
708
  ".github/prompts/spell-adopt-docs.prompt.md",
632
- ".claude/commands/spell-adopt-docs.md"
709
+ ".claude/commands/spell-adopt-docs.md",
710
+ ".agents/skills/spell-adopt-docs/SKILL.md"
633
711
  ]
634
712
  },
635
713
  {
636
714
  name: "spells-venture",
637
715
  description: "Hub-only venture management",
638
716
  files: [
717
+ ".arcane/spells/spell-summon-venture.md",
639
718
  ".github/prompts/spell-summon-venture.prompt.md",
640
719
  ".claude/commands/spell-summon-venture.md",
720
+ ".agents/skills/spell-summon-venture/SKILL.md",
721
+ ".arcane/spells/spell-manifest.md",
641
722
  ".github/prompts/spell-manifest.prompt.md",
642
- ".claude/commands/spell-manifest.md"
723
+ ".claude/commands/spell-manifest.md",
724
+ ".agents/skills/spell-manifest/SKILL.md"
643
725
  ]
644
726
  },
645
727
  {
646
728
  name: "spells-meta",
647
729
  description: "Arcane-about-Arcane \u2014 presentation and documentation drift detection",
648
730
  files: [
731
+ ".arcane/spells/spell-present-arcane.md",
649
732
  ".github/prompts/spell-present-arcane.prompt.md",
650
733
  ".claude/commands/spell-present-arcane.md",
734
+ ".agents/skills/spell-present-arcane/SKILL.md",
735
+ ".arcane/spells/spell-check-drift.md",
651
736
  ".github/prompts/spell-check-drift.prompt.md",
652
- ".claude/commands/spell-check-drift.md"
737
+ ".claude/commands/spell-check-drift.md",
738
+ ".agents/skills/spell-check-drift/SKILL.md"
653
739
  ]
654
740
  },
655
741
  // Templates
@@ -2640,13 +2726,9 @@ function isSpellComponent(name) {
2640
2726
  function categorizeComponents(components) {
2641
2727
  const groups = [];
2642
2728
  const spellFiles = components.filter((c) => isSpellComponent(c.name)).flatMap((c) => c.files);
2643
- const promptCount = spellFiles.filter((f) => f.startsWith(".github/prompts/")).length;
2644
- if (promptCount > 0) {
2645
- groups.push({ icon: "\u2728", label: "Copilot Spells", count: promptCount });
2646
- }
2647
- const claudeCount = spellFiles.filter((f) => f.startsWith(".claude/commands/")).length;
2648
- if (claudeCount > 0) {
2649
- 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 });
2650
2732
  }
2651
2733
  const governance = components.filter(
2652
2734
  (c) => !isSpellComponent(c.name) && c.name !== "venture-template" && c.name !== "agent-definitions" && c.files.some((f) => f.startsWith(".arcane/governance/"))
@@ -3493,6 +3575,18 @@ async function fetchPublishedFile(version, relativeAssetPath) {
3493
3575
  }
3494
3576
  }
3495
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
+
3496
3590
  // src/commands/update.ts
3497
3591
  function migrateLegacyComponents(components) {
3498
3592
  const out = [];
@@ -3530,6 +3624,23 @@ async function resolveOrphan(targetDir, file, recordedHash, prune) {
3530
3624
  console.log(` Pruned orphaned file: ${file}`);
3531
3625
  return "pruned";
3532
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
+ }
3533
3644
  async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3534
3645
  let manifest;
3535
3646
  try {
@@ -3572,9 +3683,17 @@ async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3572
3683
  process.exit(1);
3573
3684
  return;
3574
3685
  }
3686
+ let sameVersionRestore = false;
3575
3687
  if (manifest.version === packageVersion && manifest.components.length > 0) {
3576
- console.log("Already up to date.");
3577
- 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
+ );
3578
3697
  }
3579
3698
  if (manifest.components.length === 0) {
3580
3699
  console.log("No components installed. Nothing to update.");
@@ -3583,6 +3702,7 @@ async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3583
3702
  let fileCount = 0;
3584
3703
  const updatedComponents = [];
3585
3704
  const conflictedFiles = [];
3705
+ const customizedShims = [];
3586
3706
  const orphanReport = [];
3587
3707
  const componentsToUpdate = migrateLegacyComponents(manifest.components);
3588
3708
  for (const installed of componentsToUpdate) {
@@ -3615,49 +3735,66 @@ async function runUpdate(options, targetDir, assetsDir, packageVersion) {
3615
3735
  const srcPath = join8(assetsDir, component.sourceOverrides?.[file] ?? file);
3616
3736
  const targetExists = await fileExists(join8(targetDir, file));
3617
3737
  const preserveExisting = Boolean(component.skipExisting) && targetExists;
3738
+ const recordedHash = installed.fileHashes?.[file];
3618
3739
  if (component.initOnly && !targetExists) {
3619
3740
  console.log(
3620
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.`
3621
3742
  );
3622
3743
  continue;
3623
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;
3624
3757
  if (preserveExisting) {
3625
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
+ );
3626
3765
  } else if (options.dryRun) {
3627
- console.log(` [dry-run] Would update: ${file}`);
3766
+ console.log(` [dry-run] Would ${sameVersionRestore ? "restore missing" : "update"}: ${file}`);
3628
3767
  fileCount++;
3629
3768
  } else {
3630
- const recordedHash = installed.fileHashes?.[file];
3631
3769
  let handled = false;
3632
- if (recordedHash !== void 0 && targetExists) {
3633
- const currentHash = await hashFile(join8(targetDir, file));
3634
- if (currentHash !== recordedHash) {
3635
- const oldVendorContent = await fetchPublishedFile(installed.installedVersion, file);
3636
- if (oldVendorContent === void 0) {
3637
- console.log(
3638
- ` ! 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.`
3639
- );
3640
- 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.`);
3641
3789
  } else {
3642
- const [currentContent, newContent] = await Promise.all([
3643
- readFile6(join8(targetDir, file), "utf-8"),
3644
- readFile6(srcPath, "utf-8")
3645
- ]);
3646
- const result = merge3(oldVendorContent, currentContent, newContent);
3647
- await writeFile8(join8(targetDir, file), result.content, "utf-8");
3648
- fileHashes[file] = await hashFile(join8(targetDir, file));
3649
- if (result.hasConflict) {
3650
- conflictedFiles.push(file);
3651
- console.log(` \u26A0 Merge conflict in ${file} \u2014 resolve the <<<<<<< markers before committing.`);
3652
- } else {
3653
- console.log(` Merged your edits into: ${file}`);
3654
- }
3655
- handled = true;
3790
+ console.log(` Merged your edits into: ${file}`);
3656
3791
  }
3792
+ handled = true;
3657
3793
  }
3658
3794
  }
3659
3795
  if (!handled) {
3660
3796
  fileHashes[file] = await copyFile(srcPath, targetDir, file, { force: true });
3797
+ if (sameVersionRestore) console.log(` Restored missing: ${file}`);
3661
3798
  }
3662
3799
  fileCount++;
3663
3800
  }
@@ -3710,6 +3847,15 @@ ${verb} ${orphansToReport.length} orphaned file(s) (tracked before this update,
3710
3847
  console.log(" Run `spell update --prune` to remove the ones that are safe to delete.");
3711
3848
  }
3712
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
+ }
3713
3859
  if (options.dryRun) {
3714
3860
  console.log(
3715
3861
  `