@phuc1403/musketeer 0.9.0 → 0.11.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.
- package/INSTALLATION.md +53 -52
- package/README.md +1 -1
- package/bin/musketeer.js +168 -168
- package/manifest.json +19 -2
- package/package.json +48 -48
- package/src/dotnet-scaffold-copier.js +79 -79
- package/src/provisioner/detect.js +93 -93
- package/src/self-update.js +77 -77
- package/template/.claude/agents/git-manager.md +18 -18
- package/template/.claude/agents/hallmark-auditor.md +78 -78
- package/template/.claude/agents/researcher.md +33 -33
- package/template/.claude/hooks/block-unsafe-adr-title.cjs +85 -85
- package/template/.claude/hooks/init-adr-dir.cjs +173 -173
- package/template/.claude/hooks/inject-adr-flags.cjs +94 -94
- package/template/.claude/hooks/lib/adr/command-scan.cjs +115 -115
- package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -357
- package/template/.claude/hooks/lib/git-info-cache.cjs +191 -191
- package/template/.claude/hooks/sync-adr-toc.cjs +146 -146
- package/template/.claude/hooks/usage-quota-cache-refresh.cjs +166 -166
- package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -66
- package/template/.claude/hooks/validate-cml-hook.js +146 -145
- package/template/.claude/skills/adr-writer/SKILL.md +48 -48
- package/template/.claude/skills/adr-writer/references/adr-example.md +35 -35
- package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +215 -215
- package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +29 -29
- package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +40 -40
- package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -171
- package/template/.claude/skills/context-map/SKILL.md +80 -80
- package/template/.claude/skills/context-map/example.cml +106 -106
- package/template/.claude/skills/context-map/reference/Bounded Context/Bounded Context.md +40 -40
- package/template/.claude/skills/context-map/reference/Bounded Context/businessModel.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context/domainVisionStatement.md +2 -2
- package/template/.claude/skills/context-map/reference/Bounded Context/evolution.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context/implementationTechnology.md +1 -1
- package/template/.claude/skills/context-map/reference/Bounded Context/implements.md +1 -1
- package/template/.claude/skills/context-map/reference/Bounded Context/knowledgeLevel.md +4 -4
- package/template/.claude/skills/context-map/reference/Bounded Context/realizes.md +9 -9
- package/template/.claude/skills/context-map/reference/Bounded Context/refines.md +10 -10
- package/template/.claude/skills/context-map/reference/Bounded Context/responsibilities.md +26 -26
- package/template/.claude/skills/context-map/reference/Bounded Context/type.md +23 -23
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Anticorruption Layer.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Bounded Context Relationship.md +12 -12
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Conformist.md +5 -5
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Customer-Supplier (C-S).md +22 -22
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Open Host Service.md +4 -4
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Partnership (P).md +13 -13
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Published Language.md +4 -4
- package/template/.claude/skills/context-map/reference/Bounded Context Relationship/Shared Kernel (SK).md +12 -12
- package/template/.claude/skills/context-map/reference/Context Map.md +62 -62
- package/template/.claude/skills/context-map/reference/Domain/Domain.md +30 -30
- package/template/.claude/skills/context-map/reference/Domain/supports.md +33 -33
- package/template/.claude/skills/context-map/reference/Domain/type.md +3 -3
- package/template/.claude/skills/context-map/reference/Semantic Rules.md +32 -32
- package/template/.claude/skills/hallmark/SKILL.md +552 -552
- package/template/.claude/skills/hallmark/references/anti-patterns.md +412 -412
- package/template/.claude/skills/hallmark/references/assets.md +406 -406
- package/template/.claude/skills/hallmark/references/color.md +95 -95
- package/template/.claude/skills/hallmark/references/component-cookbook.md +256 -256
- package/template/.claude/skills/hallmark/references/components/c1-outlined-chip.md +12 -12
- package/template/.claude/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -16
- package/template/.claude/skills/hallmark/references/components/c3-typographic-link.md +8 -8
- package/template/.claude/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -16
- package/template/.claude/skills/hallmark/references/components/f1-bento-grid.md +20 -20
- package/template/.claude/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -20
- package/template/.claude/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -11
- package/template/.claude/skills/hallmark/references/components/f4-step-sequence.md +11 -11
- package/template/.claude/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -11
- package/template/.claude/skills/hallmark/references/components/f6-product-card-grid.md +41 -41
- package/template/.claude/skills/hallmark/references/components/ft1-mast-headed.md +13 -13
- package/template/.claude/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -10
- package/template/.claude/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -12
- package/template/.claude/skills/hallmark/references/components/ft4-dense-typographic.md +10 -10
- package/template/.claude/skills/hallmark/references/components/ft5-statement.md +21 -21
- package/template/.claude/skills/hallmark/references/components/ft6-letter-close.md +19 -19
- package/template/.claude/skills/hallmark/references/components/ft7-newsletter-first.md +27 -27
- package/template/.claude/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -25
- package/template/.claude/skills/hallmark/references/components/h1-marquee.md +15 -15
- package/template/.claude/skills/hallmark/references/components/h2-split-diptych.md +15 -15
- package/template/.claude/skills/hallmark/references/components/h3-quote-led.md +11 -11
- package/template/.claude/skills/hallmark/references/components/h4-stat-led.md +14 -14
- package/template/.claude/skills/hallmark/references/components/h5-letter-hero.md +11 -11
- package/template/.claude/skills/hallmark/references/components/h6-photographic-fold.md +16 -16
- package/template/.claude/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -27
- package/template/.claude/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -23
- package/template/.claude/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -27
- package/template/.claude/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -12
- package/template/.claude/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -19
- package/template/.claude/skills/hallmark/references/components/n2-floating-chip.md +14 -14
- package/template/.claude/skills/hallmark/references/components/n3-side-rail.md +14 -14
- package/template/.claude/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -9
- package/template/.claude/skills/hallmark/references/components/n5-floating-pill.md +28 -28
- package/template/.claude/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -24
- package/template/.claude/skills/hallmark/references/components/n7-brutal-slab.md +22 -22
- package/template/.claude/skills/hallmark/references/components/n8-terminal-command.md +21 -21
- package/template/.claude/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -17
- package/template/.claude/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -15
- package/template/.claude/skills/hallmark/references/components/s2-hanging.md +13 -13
- package/template/.claude/skills/hallmark/references/components/s3-sticky-pinned.md +19 -19
- package/template/.claude/skills/hallmark/references/components/s4-inline-no-break.md +11 -11
- package/template/.claude/skills/hallmark/references/components/s5-bottom-anchored.md +13 -13
- package/template/.claude/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -12
- package/template/.claude/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -19
- package/template/.claude/skills/hallmark/references/components/t3-single-huge-quote.md +11 -11
- package/template/.claude/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -14
- package/template/.claude/skills/hallmark/references/contract.md +24 -24
- package/template/.claude/skills/hallmark/references/copy.md +182 -182
- package/template/.claude/skills/hallmark/references/custom-craft.md +626 -626
- package/template/.claude/skills/hallmark/references/custom-theme.md +329 -329
- package/template/.claude/skills/hallmark/references/design-md.md +116 -116
- package/template/.claude/skills/hallmark/references/export-formats.md +328 -328
- package/template/.claude/skills/hallmark/references/floating-nav.md +89 -89
- package/template/.claude/skills/hallmark/references/genres/atmospheric.md +65 -65
- package/template/.claude/skills/hallmark/references/genres/editorial.md +70 -70
- package/template/.claude/skills/hallmark/references/genres/modern-minimal.md +67 -67
- package/template/.claude/skills/hallmark/references/genres/playful.md +65 -65
- package/template/.claude/skills/hallmark/references/hero-enrichment.md +474 -474
- package/template/.claude/skills/hallmark/references/imagery-kit.md +170 -170
- package/template/.claude/skills/hallmark/references/interaction-and-states.md +207 -207
- package/template/.claude/skills/hallmark/references/layout-and-space.md +111 -111
- package/template/.claude/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -35
- package/template/.claude/skills/hallmark/references/macrostructures/02-long-document.md +34 -34
- package/template/.claude/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -31
- package/template/.claude/skills/hallmark/references/macrostructures/04-stat-led.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/05-workbench.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -33
- package/template/.claude/skills/hallmark/references/macrostructures/07-manifesto.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/08-photographic.md +34 -34
- package/template/.claude/skills/hallmark/references/macrostructures/09-quote-led.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/10-specimen.md +32 -32
- package/template/.claude/skills/hallmark/references/macrostructures/11-catalogue.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/12-letter.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/13-index-first.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/15-split-studio.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures/21-component-playground.md +23 -23
- package/template/.claude/skills/hallmark/references/macrostructures.md +89 -89
- package/template/.claude/skills/hallmark/references/microinteractions.md +260 -260
- package/template/.claude/skills/hallmark/references/motion.md +109 -109
- package/template/.claude/skills/hallmark/references/preview-examples.md +49 -49
- package/template/.claude/skills/hallmark/references/responsive.md +138 -138
- package/template/.claude/skills/hallmark/references/slop-test.md +205 -205
- package/template/.claude/skills/hallmark/references/structure.md +164 -164
- package/template/.claude/skills/hallmark/references/study.md +511 -511
- package/template/.claude/skills/hallmark/references/typography.md +243 -243
- package/template/.claude/skills/hallmark/references/verbs/audit.md +25 -25
- package/template/.claude/skills/hallmark/references/verbs/redesign.md +269 -269
- package/template/.claude/skills/hallmark-loop/SKILL.md +105 -105
- package/template/.claude/skills/hallmark-loop/references/auditor-call.md +60 -60
- package/template/.claude/skills/hallmark-loop/references/capture.md +78 -78
- package/template/.claude/skills/hallmark-loop/references/loop-control.md +79 -79
- package/template/.claude/skills/handoff/SKILL.md +15 -15
- package/template/.claude/skills/knowledge-crunching/SKILL.md +94 -94
- package/template/.claude/skills/logical-components/.gitattributes +2 -0
- package/template/.claude/skills/logical-components/SKILL.md +102 -0
- package/template/.claude/skills/logical-components/references/component-classifier-prompt.md +53 -0
- package/template/.claude/skills/logical-components/references/responsibility-agent-prompt.md +67 -0
- package/template/.claude/skills/logical-components/references/responsibility-verifier-prompt.md +39 -0
- package/template/.claude/skills/logical-components/scripts/Directory.Build.props +7 -0
- package/template/.claude/skills/logical-components/scripts/Directory.Packages.props +8 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/BatchPlanning.cs +69 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/BatchesCommand.cs +39 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/CandidatesCommand.cs +70 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/CitableSource.cs +39 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/Citation.cs +37 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ClassifyBatchesCommand.cs +65 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ClassifyMergeCommand.cs +187 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ComponentDiscovery.cs +166 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ComponentRule.cs +87 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ComponentsFile.cs +83 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/CouplingResolver.cs +196 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/DisplayName.cs +14 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/EdgeExtraction.cs +111 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ExtractCommand.cs +72 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ExtractConfig.cs +79 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/LogicalComponents.csproj +15 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/MarkdownRenderer.cs +73 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/MemberUseResolution.cs +203 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/MemberUses.cs +155 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/PortResolution.cs +75 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/Program.cs +27 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ProjectFilters.cs +76 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/PruneCommand.cs +132 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/RenderCommand.cs +173 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ResponsibilityBatches.cs +84 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/ResponsibilityValidation.cs +178 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/SeamDispatch.cs +59 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/SymbolNames.cs +53 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/TypeMap.cs +75 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/WalkRoots.cs +63 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents/WorkspaceLoader.cs +227 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/AssignIdsTests.cs +41 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/BatchPlanningTests.cs +82 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CandidatesCommandTests.cs +34 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CitationTests.cs +42 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ClassifyCommandsTests.cs +176 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ComponentDiscoveryTests.cs +190 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/CouplingExtractionTests.cs +174 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/DisplayNameTests.cs +17 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ExtractConfigTests.cs +72 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/FixturePaths.cs +32 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/LogicalComponents.Tests.csproj +23 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/MarkdownRendererTests.cs +50 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ProjectFiltersTests.cs +65 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/PruneCommandTests.cs +119 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/RenderCommandTests.cs +162 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/RenderGoldenTests.cs +34 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/RenderTestData.cs +49 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/ResponsibilityValidationTests.cs +227 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/SampleAppWorkspace.cs +27 -0
- package/template/.claude/skills/logical-components/scripts/LogicalComponents.Tests/WorkspaceLoaderTests.cs +87 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/BrokenApp/src/Broken.Application/Broken.Application.csproj +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/BrokenApp/src/Broken.Application/Broken.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/MultiTargetApp.slnx +6 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Legacy.FSharp/Legacy.FSharp.fsproj +8 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Legacy.FSharp/Library.fs +5 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Multi.Application/Multi.Application.csproj +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/MultiTargetApp/src/Multi.Application/Scheduling.cs +14 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application/Solo.Application.csproj +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application/SoloGreeting.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application.Tests/FakeGreeting.cs +6 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/NoSolutionApp/src/Solo.Application.Tests/Solo.Application.Tests.csproj +11 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/components.json +63 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/expected.md +28 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/repo/src/App/OrderAcceptance.cs +16 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/repo/src/Infra/OrderQueue.cs +10 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/RenderGolden/resp/batch-01.json +18 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/SampleApp.slnx +10 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/logical-components.json +78 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/CandidateCases.cs +37 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/CouplingCases.cs +33 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/DependencyInjection.cs +18 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/EdgeCases.cs +63 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/LoudNotifying.Base.cs +5 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/LoudNotifying.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderAcceptance.cs +17 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderOptions.cs +9 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderRejectedException.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderRequest.cs +4 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderRunning.cs +18 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/OrderValidation.cs +6 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/Ports.cs +19 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/PriceRules.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReceiptPrinting.Totals.cs +6 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReceiptPrinting.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReviewCases.cs +107 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/ReviewFixCases.cs +143 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/RunClock.cs +12 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/Sample.Application.csproj +10 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Application/SeeThroughCases.cs +89 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Billing.Application/OrderRunning.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Billing.Application/Sample.Billing.Application.csproj +11 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/ForwardedNotifier.cs +8 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/InfrastructureDependencyInjection.cs +16 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/Mailer.cs +6 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/OrderQueue.cs +11 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/QueueEntry.cs +4 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/QueueStore.cs +8 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/ReviewCases.cs +35 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/ReviewFixCases.cs +13 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/Sample.Infrastructure.csproj +13 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/SeeThroughCases.cs +18 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/src/Sample.Infrastructure/UnreachedPlumbing.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/tests/Sample.Tests/FakeOrderQueue.cs +11 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SampleApp/tests/Sample.Tests/Sample.Tests.csproj +11 -0
- package/template/.claude/skills/logical-components/scripts/fixtures/SharedOutsideRepo/SharedClock.cs +7 -0
- package/template/.claude/skills/logical-components/scripts/global.json +5 -0
- package/template/.claude/skills/logical-components/scripts/smoke-sample.sh +26 -0
- package/template/.claude/skills/research/SKILL.md +69 -69
- package/template/.claude/skills/tdd/SKILL.md +142 -142
- package/template/.claude/skills/tdd/deep-modules.md +15 -15
- package/template/.claude/skills/tdd/interface-design.md +31 -31
- package/template/.claude/skills/tdd/mocking.md +59 -59
- package/template/.claude/skills/tdd/refactoring.md +10 -10
- package/template/.claude/skills/tdd/tests.md +61 -61
- package/template/.claude/statusline.cjs +100 -37
package/INSTALLATION.md
CHANGED
|
@@ -1,52 +1,53 @@
|
|
|
1
|
-
# Prerequisites & Auto-Install
|
|
2
|
-
|
|
3
|
-
`musketeer` auto-installs the external prerequisites required by your selected company
|
|
4
|
-
(announced before each install, never silent). When no OS package manager is available — or
|
|
5
|
-
an elevation prompt is refused — it falls back to printing the exact manual command below.
|
|
6
|
-
|
|
7
|
-
> Filled in detail during Phase 06 (provisioner) / Phase 08 (publish).
|
|
8
|
-
|
|
9
|
-
## Per-prerequisite matrix
|
|
10
|
-
|
|
11
|
-
| Prereq | Needed by | Windows | macOS | Linux |
|
|
12
|
-
|--------|-----------|---------|-------|-------|
|
|
13
|
-
| Node 18+ | core | `winget install OpenJS.NodeJS.LTS` | `brew install node` | NodeSource / distro |
|
|
14
|
-
| git | core, code-review | `winget install Git.Git` | `brew install git` | `apt/dnf/pacman install git` |
|
|
15
|
-
| Python 3.8+ | core (skill-creator) | `winget install Python.Python.3.12` | `brew install python@3.12` | `apt install python3 python3-pip` |
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
>
|
|
22
|
-
>
|
|
23
|
-
>
|
|
24
|
-
>
|
|
25
|
-
>
|
|
26
|
-
>
|
|
27
|
-
>
|
|
28
|
-
>
|
|
29
|
-
>
|
|
30
|
-
>
|
|
31
|
-
>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
musketeer muster --
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
1
|
+
# Prerequisites & Auto-Install
|
|
2
|
+
|
|
3
|
+
`musketeer` auto-installs the external prerequisites required by your selected company
|
|
4
|
+
(announced before each install, never silent). When no OS package manager is available — or
|
|
5
|
+
an elevation prompt is refused — it falls back to printing the exact manual command below.
|
|
6
|
+
|
|
7
|
+
> Filled in detail during Phase 06 (provisioner) / Phase 08 (publish).
|
|
8
|
+
|
|
9
|
+
## Per-prerequisite matrix
|
|
10
|
+
|
|
11
|
+
| Prereq | Needed by | Windows | macOS | Linux |
|
|
12
|
+
|--------|-----------|---------|-------|-------|
|
|
13
|
+
| Node 18+ | core | `winget install OpenJS.NodeJS.LTS` | `brew install node` | NodeSource / distro |
|
|
14
|
+
| git | core, code-review | `winget install Git.Git` | `brew install git` | `apt/dnf/pacman install git` |
|
|
15
|
+
| Python 3.8+ | core (skill-creator) | `winget install Python.Python.3.12` | `brew install python@3.12` | `apt install python3 python3-pip` |
|
|
16
|
+
| .NET SDK 10+ | dotnet (logical-components) | `winget install Microsoft.DotNet.SDK.10` | `brew install --cask dotnet-sdk` | `apt install dotnet-sdk-10.0` |
|
|
17
|
+
| Java 8+ | architecture (context-map) | `winget install Microsoft.OpenJDK` | `brew install --cask temurin` | `apt install openjdk-17-jdk` |
|
|
18
|
+
| adr-tools | architecture (adr-writer) | `npm i -g @meza/adr-tools@2` | `npm i -g @meza/adr-tools@2` | `npm i -g @meza/adr-tools@2` |
|
|
19
|
+
| gh | code-review (PR mode) | `winget install GitHub.cli` | `brew install gh` | `apt install gh` |
|
|
20
|
+
|
|
21
|
+
> `adr-tools` is [`@meza/adr-tools`](https://www.npmjs.com/package/@meza/adr-tools) — the maintained
|
|
22
|
+
> Node port of `npryce/adr-tools`. Same `adr` binary, same `.adr-dir`, same `NNNN-slug.md` files, so
|
|
23
|
+
> existing ADRs carry over untouched. One npm command on every platform: no Git Bash, no admin
|
|
24
|
+
> rights, no release zip.
|
|
25
|
+
>
|
|
26
|
+
> It is the one prereq that needs **Node >= 22.13.0** (musketeer itself still only needs 18). It is
|
|
27
|
+
> installed as a prereq rather than bundled: it is GPL-3.0 and musketeer is MIT, so musketeer
|
|
28
|
+
> invokes it as a subprocess instead of depending on it.
|
|
29
|
+
>
|
|
30
|
+
> Upgrading from `npryce/adr-tools`? Remove the old scripts first. They install as loose files in
|
|
31
|
+
> `~/bin` or Git's `usr/bin`, and if either is earlier on your `PATH` the old `adr` keeps winning —
|
|
32
|
+
> most visibly inside Git Bash.
|
|
33
|
+
|
|
34
|
+
### Running muster without a terminal
|
|
35
|
+
|
|
36
|
+
`musketeer muster` opens a picker, which needs a terminal. For CI, onboarding scripts, and agent
|
|
37
|
+
sessions, name the company instead and the picker is skipped:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
musketeer muster --company architecture,dotnet # set the company to exactly these
|
|
41
|
+
musketeer muster --keep # refresh the company already in .musketeer.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`--keep` is the one to reach for after upgrading the CLI: it re-applies the latest templates
|
|
45
|
+
without changing which musketeers are installed. Both flags survive the self-update re-exec.
|
|
46
|
+
|
|
47
|
+
The `apt`/`brew` prereq installs can still prompt for `sudo` or wait on input. Pre-install them, or
|
|
48
|
+
set `MUSKETEER_SKIP_INSTALL=1` to print the manual command instead of running it.
|
|
49
|
+
|
|
50
|
+
## Secrets (never auto-installed)
|
|
51
|
+
|
|
52
|
+
- `ANTHROPIC_API_KEY` — needed only by skill-creator's improve/loop scripts. You will be
|
|
53
|
+
prompted / shown how to set it; musketeer never writes it to the repo.
|
package/README.md
CHANGED
|
@@ -38,7 +38,7 @@ musketeers are in this project; promote = upgrade the binary._
|
|
|
38
38
|
| **architecture** | off | adr-writer, architecture-characteristic-writer, context-map · CML validation hook |
|
|
39
39
|
| **hallmark** | off | hallmark, hallmark-explore, hallmark-loop · auditor/explorer agents |
|
|
40
40
|
| **code-review** | off | code-review skill + code-reviewer agent |
|
|
41
|
-
| **dotnet** | off | tdd, knowledge-crunching · EF migration guard hook · always merges 4 quality-gate props into root `Directory.Build.props` (`MUSKETEER_SKIP_DOTNET_PROPS=1` to skip) · scaffolds a generic `src`/`tests` Clean Architecture skeleton when the project is blank |
|
|
41
|
+
| **dotnet** | off | tdd, knowledge-crunching, logical-components · EF migration guard hook · always merges 4 quality-gate props into root `Directory.Build.props` (`MUSKETEER_SKIP_DOTNET_PROPS=1` to skip) · scaffolds a generic `src`/`tests` Clean Architecture skeleton when the project is blank |
|
|
42
42
|
| **design-docs** | off | inject-design-docs SessionStart hook |
|
|
43
43
|
|
|
44
44
|
The muster starts every musketeer **unselected**, except ones you already installed (pre-checked from
|
package/bin/musketeer.js
CHANGED
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
const { parseArgs } = require('node:util');
|
|
5
|
-
|
|
6
|
-
const USAGE = `musketeer — scaffold a curated company of Claude Code musketeers into ./.claude
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
musketeer muster Self-update to latest, then pick your company and refresh all selected skills
|
|
10
|
-
musketeer muster --keep
|
|
11
|
-
Refresh the company already recorded in .musketeer.json, no picker
|
|
12
|
-
musketeer muster --company a,b
|
|
13
|
-
Set the company to exactly these musketeers, no picker
|
|
14
|
-
musketeer promote Update the musketeer CLI itself to the latest published version
|
|
15
|
-
musketeer Show this help
|
|
16
|
-
musketeer --help Show this help
|
|
17
|
-
|
|
18
|
-
Notes:
|
|
19
|
-
* "muster" changes which musketeers are in THIS project; "promote" upgrades the CLI itself.
|
|
20
|
-
* On confirm, muster REFRESHES every selected musketeer's files to the latest template (overwrites local edits).
|
|
21
|
-
* muster auto-updates the CLI to the latest published version first (set MUSKETEER_NO_SELF_UPDATE=1 to skip).
|
|
22
|
-
* "core" is always installed and locked — it cannot be removed.
|
|
23
|
-
* The muster is multi-select: check every musketeer you want, then confirm.
|
|
24
|
-
* settings.json is GENERATED per-selection; missing prereqs are auto-installed (announced).
|
|
25
|
-
* --keep and --company skip the picker, so muster runs in CI and other sessions with no terminal.
|
|
26
|
-
* Without either flag and without a terminal, muster stops and tells you which flag to use.`;
|
|
27
|
-
|
|
28
|
-
function parse(argv) {
|
|
29
|
-
return parseArgs({
|
|
30
|
-
args: argv,
|
|
31
|
-
options: {
|
|
32
|
-
help: { type: 'boolean', short: 'h', default: false },
|
|
33
|
-
company: { type: 'string' },
|
|
34
|
-
keep: { type: 'boolean', default: false },
|
|
35
|
-
},
|
|
36
|
-
allowPositionals: true,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Work out what this muster should do before anything touches the disk.
|
|
42
|
-
*
|
|
43
|
-
* Bare `muster` opens the picker, which needs a terminal. Under CI, or any
|
|
44
|
-
* agent without one, the picker used to die inside its own TTY setup with no
|
|
45
|
-
* hint that a flag could have avoided it. Both flags skip the picker: --company
|
|
46
|
-
* states the company outright, --keep reconciles the one already recorded.
|
|
47
|
-
*
|
|
48
|
-
* `forward` is what the self-update must replay when it re-execs the newer
|
|
49
|
-
* binary, so a scripted run does not land back at the picker.
|
|
50
|
-
*
|
|
51
|
-
* @param {{company?:string, keep:boolean}} values parsed flags
|
|
52
|
-
* @param {{isTTY:boolean, projectDir:string, readLockfile:function}} ctx
|
|
53
|
-
* @returns {{desiredIds:?string[], interactive:boolean, forward:string[]}}
|
|
54
|
-
*/
|
|
55
|
-
function resolveMusterPlan(values, ctx) {
|
|
56
|
-
if (values.company !== undefined && values.keep) {
|
|
57
|
-
throw new Error('Use either --company or --keep, not both: one sets the company, the other keeps it.');
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (values.company !== undefined) {
|
|
61
|
-
const ids = values.company
|
|
62
|
-
.split(',')
|
|
63
|
-
.map((s) => s.trim())
|
|
64
|
-
.filter(Boolean);
|
|
65
|
-
if (ids.length === 0) {
|
|
66
|
-
throw new Error('--company needs at least one musketeer, for example: --company architecture,dotnet');
|
|
67
|
-
}
|
|
68
|
-
return { desiredIds: ids, interactive: false, forward: [`--company=${ids.join(',')}`] };
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (values.keep) {
|
|
72
|
-
const prev = ctx.readLockfile(ctx.projectDir);
|
|
73
|
-
if (!prev.musketeers || prev.musketeers.length === 0) {
|
|
74
|
-
throw new Error(
|
|
75
|
-
'No company recorded in .musketeer.json, so there is nothing for --keep to keep. ' +
|
|
76
|
-
'Name one with --company, for example: --company architecture,dotnet'
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
return { desiredIds: prev.musketeers, interactive: false, forward: ['--keep'] };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (!ctx.isTTY) {
|
|
83
|
-
throw new Error(
|
|
84
|
-
'muster needs a terminal for its picker, and this session has none. ' +
|
|
85
|
-
'Refresh the company already recorded with `musketeer muster --keep`, ' +
|
|
86
|
-
'or state one with `musketeer muster --company architecture,dotnet`.'
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return { desiredIds: null, interactive: true, forward: [] };
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async function main(argv = process.argv.slice(2)) {
|
|
94
|
-
let parsed;
|
|
95
|
-
try {
|
|
96
|
-
parsed = parse(argv);
|
|
97
|
-
} catch (err) {
|
|
98
|
-
process.stderr.write(`${err.message}\n\n${USAGE}\n`);
|
|
99
|
-
process.exitCode = 2;
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const { values, positionals } = parsed;
|
|
104
|
-
const command = positionals[0];
|
|
105
|
-
|
|
106
|
-
// `musketeer` alone (or --help) → usage.
|
|
107
|
-
if (values.help || !command) {
|
|
108
|
-
process.stdout.write(`${USAGE}\n`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (command === 'muster') {
|
|
113
|
-
const { readLockfile } = require('../src/lockfile');
|
|
114
|
-
let plan;
|
|
115
|
-
try {
|
|
116
|
-
plan = resolveMusterPlan(values, {
|
|
117
|
-
isTTY: !!process.stdin.isTTY,
|
|
118
|
-
projectDir: process.cwd(),
|
|
119
|
-
readLockfile,
|
|
120
|
-
});
|
|
121
|
-
} catch (err) {
|
|
122
|
-
process.stderr.write(`${err.message}\n`);
|
|
123
|
-
process.exitCode = 2;
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// Pull the latest published version first, so the picker refreshes installed
|
|
128
|
-
// skills to the newest template (not a stale package's). Re-execs when behind.
|
|
129
|
-
const { ensureLatest } = require('../src/self-update');
|
|
130
|
-
const reexecCode = ensureLatest({ args: plan.forward });
|
|
131
|
-
if (reexecCode !== null) {
|
|
132
|
-
if (reexecCode !== 0) {
|
|
133
|
-
// The update landed, the refresh did not. Say so: the CLI is now newer
|
|
134
|
-
// than the templates in this project, and nothing announced the split.
|
|
135
|
-
process.stderr.write(
|
|
136
|
-
'The CLI was updated but this project was not refreshed — nothing in .claude changed. ' +
|
|
137
|
-
'Re-run `musketeer muster` once the problem above is resolved.\n'
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
process.exitCode = reexecCode;
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
// Lazy-require so help never pays the cost of loading the engine/manifest.
|
|
144
|
-
const reconcile = require('../src/reconcile');
|
|
145
|
-
await reconcile.run({ desiredIds: plan.desiredIds, interactive: plan.interactive });
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
if (command === 'promote') {
|
|
150
|
-
const promote = require('../src/promote');
|
|
151
|
-
await promote.run();
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
process.stderr.write(`Unknown command "${command}".\n\n${USAGE}\n`);
|
|
156
|
-
process.exitCode = 2;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Only run as a command. Requiring this file (the tests do, for
|
|
160
|
-
// resolveMusterPlan) must not start a muster.
|
|
161
|
-
if (require.main === module) {
|
|
162
|
-
main().catch((err) => {
|
|
163
|
-
process.stderr.write(`musketeer: ${err && err.message ? err.message : err}\n`);
|
|
164
|
-
process.exitCode = 1;
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
module.exports = { resolveMusterPlan, main };
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const { parseArgs } = require('node:util');
|
|
5
|
+
|
|
6
|
+
const USAGE = `musketeer — scaffold a curated company of Claude Code musketeers into ./.claude
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
musketeer muster Self-update to latest, then pick your company and refresh all selected skills
|
|
10
|
+
musketeer muster --keep
|
|
11
|
+
Refresh the company already recorded in .musketeer.json, no picker
|
|
12
|
+
musketeer muster --company a,b
|
|
13
|
+
Set the company to exactly these musketeers, no picker
|
|
14
|
+
musketeer promote Update the musketeer CLI itself to the latest published version
|
|
15
|
+
musketeer Show this help
|
|
16
|
+
musketeer --help Show this help
|
|
17
|
+
|
|
18
|
+
Notes:
|
|
19
|
+
* "muster" changes which musketeers are in THIS project; "promote" upgrades the CLI itself.
|
|
20
|
+
* On confirm, muster REFRESHES every selected musketeer's files to the latest template (overwrites local edits).
|
|
21
|
+
* muster auto-updates the CLI to the latest published version first (set MUSKETEER_NO_SELF_UPDATE=1 to skip).
|
|
22
|
+
* "core" is always installed and locked — it cannot be removed.
|
|
23
|
+
* The muster is multi-select: check every musketeer you want, then confirm.
|
|
24
|
+
* settings.json is GENERATED per-selection; missing prereqs are auto-installed (announced).
|
|
25
|
+
* --keep and --company skip the picker, so muster runs in CI and other sessions with no terminal.
|
|
26
|
+
* Without either flag and without a terminal, muster stops and tells you which flag to use.`;
|
|
27
|
+
|
|
28
|
+
function parse(argv) {
|
|
29
|
+
return parseArgs({
|
|
30
|
+
args: argv,
|
|
31
|
+
options: {
|
|
32
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
33
|
+
company: { type: 'string' },
|
|
34
|
+
keep: { type: 'boolean', default: false },
|
|
35
|
+
},
|
|
36
|
+
allowPositionals: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Work out what this muster should do before anything touches the disk.
|
|
42
|
+
*
|
|
43
|
+
* Bare `muster` opens the picker, which needs a terminal. Under CI, or any
|
|
44
|
+
* agent without one, the picker used to die inside its own TTY setup with no
|
|
45
|
+
* hint that a flag could have avoided it. Both flags skip the picker: --company
|
|
46
|
+
* states the company outright, --keep reconciles the one already recorded.
|
|
47
|
+
*
|
|
48
|
+
* `forward` is what the self-update must replay when it re-execs the newer
|
|
49
|
+
* binary, so a scripted run does not land back at the picker.
|
|
50
|
+
*
|
|
51
|
+
* @param {{company?:string, keep:boolean}} values parsed flags
|
|
52
|
+
* @param {{isTTY:boolean, projectDir:string, readLockfile:function}} ctx
|
|
53
|
+
* @returns {{desiredIds:?string[], interactive:boolean, forward:string[]}}
|
|
54
|
+
*/
|
|
55
|
+
function resolveMusterPlan(values, ctx) {
|
|
56
|
+
if (values.company !== undefined && values.keep) {
|
|
57
|
+
throw new Error('Use either --company or --keep, not both: one sets the company, the other keeps it.');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (values.company !== undefined) {
|
|
61
|
+
const ids = values.company
|
|
62
|
+
.split(',')
|
|
63
|
+
.map((s) => s.trim())
|
|
64
|
+
.filter(Boolean);
|
|
65
|
+
if (ids.length === 0) {
|
|
66
|
+
throw new Error('--company needs at least one musketeer, for example: --company architecture,dotnet');
|
|
67
|
+
}
|
|
68
|
+
return { desiredIds: ids, interactive: false, forward: [`--company=${ids.join(',')}`] };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (values.keep) {
|
|
72
|
+
const prev = ctx.readLockfile(ctx.projectDir);
|
|
73
|
+
if (!prev.musketeers || prev.musketeers.length === 0) {
|
|
74
|
+
throw new Error(
|
|
75
|
+
'No company recorded in .musketeer.json, so there is nothing for --keep to keep. ' +
|
|
76
|
+
'Name one with --company, for example: --company architecture,dotnet'
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return { desiredIds: prev.musketeers, interactive: false, forward: ['--keep'] };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!ctx.isTTY) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
'muster needs a terminal for its picker, and this session has none. ' +
|
|
85
|
+
'Refresh the company already recorded with `musketeer muster --keep`, ' +
|
|
86
|
+
'or state one with `musketeer muster --company architecture,dotnet`.'
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return { desiredIds: null, interactive: true, forward: [] };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async function main(argv = process.argv.slice(2)) {
|
|
94
|
+
let parsed;
|
|
95
|
+
try {
|
|
96
|
+
parsed = parse(argv);
|
|
97
|
+
} catch (err) {
|
|
98
|
+
process.stderr.write(`${err.message}\n\n${USAGE}\n`);
|
|
99
|
+
process.exitCode = 2;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const { values, positionals } = parsed;
|
|
104
|
+
const command = positionals[0];
|
|
105
|
+
|
|
106
|
+
// `musketeer` alone (or --help) → usage.
|
|
107
|
+
if (values.help || !command) {
|
|
108
|
+
process.stdout.write(`${USAGE}\n`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (command === 'muster') {
|
|
113
|
+
const { readLockfile } = require('../src/lockfile');
|
|
114
|
+
let plan;
|
|
115
|
+
try {
|
|
116
|
+
plan = resolveMusterPlan(values, {
|
|
117
|
+
isTTY: !!process.stdin.isTTY,
|
|
118
|
+
projectDir: process.cwd(),
|
|
119
|
+
readLockfile,
|
|
120
|
+
});
|
|
121
|
+
} catch (err) {
|
|
122
|
+
process.stderr.write(`${err.message}\n`);
|
|
123
|
+
process.exitCode = 2;
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Pull the latest published version first, so the picker refreshes installed
|
|
128
|
+
// skills to the newest template (not a stale package's). Re-execs when behind.
|
|
129
|
+
const { ensureLatest } = require('../src/self-update');
|
|
130
|
+
const reexecCode = ensureLatest({ args: plan.forward });
|
|
131
|
+
if (reexecCode !== null) {
|
|
132
|
+
if (reexecCode !== 0) {
|
|
133
|
+
// The update landed, the refresh did not. Say so: the CLI is now newer
|
|
134
|
+
// than the templates in this project, and nothing announced the split.
|
|
135
|
+
process.stderr.write(
|
|
136
|
+
'The CLI was updated but this project was not refreshed — nothing in .claude changed. ' +
|
|
137
|
+
'Re-run `musketeer muster` once the problem above is resolved.\n'
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
process.exitCode = reexecCode;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Lazy-require so help never pays the cost of loading the engine/manifest.
|
|
144
|
+
const reconcile = require('../src/reconcile');
|
|
145
|
+
await reconcile.run({ desiredIds: plan.desiredIds, interactive: plan.interactive });
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (command === 'promote') {
|
|
150
|
+
const promote = require('../src/promote');
|
|
151
|
+
await promote.run();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
process.stderr.write(`Unknown command "${command}".\n\n${USAGE}\n`);
|
|
156
|
+
process.exitCode = 2;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Only run as a command. Requiring this file (the tests do, for
|
|
160
|
+
// resolveMusterPlan) must not start a muster.
|
|
161
|
+
if (require.main === module) {
|
|
162
|
+
main().catch((err) => {
|
|
163
|
+
process.stderr.write(`musketeer: ${err && err.message ? err.message : err}\n`);
|
|
164
|
+
process.exitCode = 1;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
module.exports = { resolveMusterPlan, main };
|
package/manifest.json
CHANGED
|
@@ -171,12 +171,13 @@
|
|
|
171
171
|
},
|
|
172
172
|
"dotnet": {
|
|
173
173
|
"label": "dotnet",
|
|
174
|
-
"description": ".NET extras: tdd, knowledge-crunching + EF migration-guard & ubiquitous-language auto-load hooks. Muster also always merges 4 quality-gate MSBuild properties into root Directory.Build.props (any dotnet-selected project, set MUSKETEER_SKIP_DOTNET_PROPS=1 to skip) and scaffolds a generic src/tests Clean Architecture skeleton when the project is genuinely blank.",
|
|
174
|
+
"description": ".NET extras: tdd, knowledge-crunching, logical-components + EF migration-guard & ubiquitous-language auto-load hooks. Muster also always merges 4 quality-gate MSBuild properties into root Directory.Build.props (any dotnet-selected project, set MUSKETEER_SKIP_DOTNET_PROPS=1 to skip) and scaffolds a generic src/tests Clean Architecture skeleton when the project is genuinely blank.",
|
|
175
175
|
"locked": false,
|
|
176
176
|
"deps": [],
|
|
177
177
|
"files": [
|
|
178
178
|
"skills/tdd/**",
|
|
179
179
|
"skills/knowledge-crunching/**",
|
|
180
|
+
"skills/logical-components/**",
|
|
180
181
|
"hooks/block-migration-edits.cjs",
|
|
181
182
|
"hooks/inject-ubiquitous-language.cjs"
|
|
182
183
|
],
|
|
@@ -196,7 +197,9 @@
|
|
|
196
197
|
"statusMessage": "Loading ubiquitous language"
|
|
197
198
|
}
|
|
198
199
|
],
|
|
199
|
-
"prereqs": [
|
|
200
|
+
"prereqs": [
|
|
201
|
+
"dotnet"
|
|
202
|
+
]
|
|
200
203
|
},
|
|
201
204
|
"design-docs": {
|
|
202
205
|
"label": "design-docs",
|
|
@@ -289,6 +292,20 @@
|
|
|
289
292
|
}
|
|
290
293
|
}
|
|
291
294
|
},
|
|
295
|
+
"dotnet": {
|
|
296
|
+
"detect": "dotnet --version",
|
|
297
|
+
"minVersion": "10",
|
|
298
|
+
"kind": "package",
|
|
299
|
+
"install": {
|
|
300
|
+
"win": "winget install -e --id Microsoft.DotNet.SDK.10",
|
|
301
|
+
"mac": "brew install --cask dotnet-sdk",
|
|
302
|
+
"linux": {
|
|
303
|
+
"apt": "sudo apt-get install -y dotnet-sdk-10.0",
|
|
304
|
+
"dnf": "sudo dnf install -y dotnet-sdk-10.0",
|
|
305
|
+
"pacman": "sudo pacman -S --noconfirm dotnet-sdk"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
},
|
|
292
309
|
"cm-cli": {
|
|
293
310
|
"kind": "note",
|
|
294
311
|
"needs": [
|
package/package.json
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@phuc1403/musketeer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Distributable custom Claude Code harness — one declarative command scaffolds a curated company of musketeers (skills/agents/hooks) into any project's .claude/.",
|
|
5
|
-
"type": "commonjs",
|
|
6
|
-
"bin": {
|
|
7
|
-
"musketeer": "bin/musketeer.js"
|
|
8
|
-
},
|
|
9
|
-
"engines": {
|
|
10
|
-
"node": ">=18"
|
|
11
|
-
},
|
|
12
|
-
"scripts": {
|
|
13
|
-
"test": "node --test"
|
|
14
|
-
},
|
|
15
|
-
"files": [
|
|
16
|
-
"bin",
|
|
17
|
-
"src",
|
|
18
|
-
"manifest.json",
|
|
19
|
-
"template",
|
|
20
|
-
"README.md",
|
|
21
|
-
"INSTALLATION.md",
|
|
22
|
-
"LICENSE",
|
|
23
|
-
"!template/**/bin",
|
|
24
|
-
"!template/**/obj"
|
|
25
|
-
],
|
|
26
|
-
"keywords": [
|
|
27
|
-
"claude",
|
|
28
|
-
"claude-code",
|
|
29
|
-
"harness",
|
|
30
|
-
"scaffolder",
|
|
31
|
-
"cli",
|
|
32
|
-
"skills",
|
|
33
|
-
"agents",
|
|
34
|
-
"hooks"
|
|
35
|
-
],
|
|
36
|
-
"license": "MIT",
|
|
37
|
-
"repository": {
|
|
38
|
-
"type": "git",
|
|
39
|
-
"url": "git+https://github.com/phamhongphuc1403/musketeer.git"
|
|
40
|
-
},
|
|
41
|
-
"bugs": {
|
|
42
|
-
"url": "https://github.com/phamhongphuc1403/musketeer/issues"
|
|
43
|
-
},
|
|
44
|
-
"homepage": "https://github.com/phamhongphuc1403/musketeer#readme",
|
|
45
|
-
"dependencies": {
|
|
46
|
-
"@clack/prompts": "^0.7.0"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@phuc1403/musketeer",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "Distributable custom Claude Code harness — one declarative command scaffolds a curated company of musketeers (skills/agents/hooks) into any project's .claude/.",
|
|
5
|
+
"type": "commonjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"musketeer": "bin/musketeer.js"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=18"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"test": "node --test"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"bin",
|
|
17
|
+
"src",
|
|
18
|
+
"manifest.json",
|
|
19
|
+
"template",
|
|
20
|
+
"README.md",
|
|
21
|
+
"INSTALLATION.md",
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"!template/**/bin",
|
|
24
|
+
"!template/**/obj"
|
|
25
|
+
],
|
|
26
|
+
"keywords": [
|
|
27
|
+
"claude",
|
|
28
|
+
"claude-code",
|
|
29
|
+
"harness",
|
|
30
|
+
"scaffolder",
|
|
31
|
+
"cli",
|
|
32
|
+
"skills",
|
|
33
|
+
"agents",
|
|
34
|
+
"hooks"
|
|
35
|
+
],
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/phamhongphuc1403/musketeer.git"
|
|
40
|
+
},
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/phamhongphuc1403/musketeer/issues"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/phamhongphuc1403/musketeer#readme",
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@clack/prompts": "^0.7.0"
|
|
47
|
+
}
|
|
48
|
+
}
|