@phuc1403/musketeer 0.2.3 → 0.3.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 (37) hide show
  1. package/INSTALLATION.md +10 -0
  2. package/README.md +2 -2
  3. package/manifest.json +17 -4
  4. package/package.json +1 -1
  5. package/src/dotnet-build-props.js +163 -0
  6. package/src/dotnet-fs-scan.js +48 -0
  7. package/src/dotnet-scaffold-copier.js +72 -0
  8. package/src/dotnet-scaffold.js +175 -0
  9. package/src/reconcile.js +24 -0
  10. package/template/.claude/agents/git-manager.md +19 -0
  11. package/template/.claude/skills/adr-writer/SKILL.md +123 -78
  12. package/template/.claude/skills/adr-writer/references/adr-example.md +3 -1
  13. package/template/.claude/skills/adr-writer/references/adr-template.md +37 -46
  14. package/template/.claude/skills/git/SKILL.md +115 -0
  15. package/template/.claude/skills/git/references/branch-management.md +88 -0
  16. package/template/.claude/skills/git/references/commit-standards.md +46 -0
  17. package/template/.claude/skills/git/references/gh-cli-guide.md +109 -0
  18. package/template/.claude/skills/git/references/safety-protocols.md +69 -0
  19. package/template/.claude/skills/git/references/workflow-commit.md +58 -0
  20. package/template/.claude/skills/git/references/workflow-merge.md +48 -0
  21. package/template/.claude/skills/git/references/workflow-pr.md +58 -0
  22. package/template/.claude/skills/git/references/workflow-push.md +52 -0
  23. package/template/.claude/skills/tdd/dotnet-build-config.md +8 -0
  24. package/template/dotnet-scaffold/__SolutionName__.sln +77 -0
  25. package/template/dotnet-scaffold/global.json +6 -0
  26. package/template/dotnet-scaffold/src/__SolutionName__.Api/Program.cs +6 -0
  27. package/template/dotnet-scaffold/src/__SolutionName__.Api/Properties/launchSettings.json +38 -0
  28. package/template/dotnet-scaffold/src/__SolutionName__.Api/__SolutionName__.Api.csproj +15 -0
  29. package/template/dotnet-scaffold/src/__SolutionName__.Api/appsettings.Development.json +8 -0
  30. package/template/dotnet-scaffold/src/__SolutionName__.Api/appsettings.json +9 -0
  31. package/template/dotnet-scaffold/src/__SolutionName__.Application/__SolutionName__.Application.csproj +14 -0
  32. package/template/dotnet-scaffold/src/__SolutionName__.Domain/__SolutionName__.Domain.csproj +24 -0
  33. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/__SolutionName__.Infrastructure.csproj +20 -0
  34. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/__SolutionName__.Api.Tests.csproj +31 -0
  35. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/__SolutionName__.Application.Tests.csproj +29 -0
  36. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/__SolutionName__.Domain.Tests.csproj +29 -0
  37. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/__SolutionName__.Infrastructure.Tests.csproj +29 -0
@@ -0,0 +1,109 @@
1
+ # GitHub CLI Guide
2
+
3
+ ## Authentication
4
+ ```bash
5
+ gh auth login # Interactive login
6
+ gh auth status # Check auth state
7
+ gh auth logout # Logout
8
+ ```
9
+
10
+ ## Pull Requests
11
+
12
+ ### Create PR
13
+ ```bash
14
+ # Basic
15
+ gh pr create --base main --head feature-branch --title "feat: add login" --body "Summary"
16
+
17
+ # With HEREDOC body
18
+ gh pr create --base main --title "feat(auth): add OAuth" --body "$(cat <<'EOF'
19
+ ## Summary
20
+ - Added OAuth2 provider support
21
+ - Implemented token refresh
22
+
23
+ ## Test plan
24
+ - [ ] Unit tests pass
25
+ - [ ] Manual login test
26
+ EOF
27
+ )"
28
+
29
+ # Draft mode
30
+ gh pr create --draft --title "WIP: new feature"
31
+
32
+ # Assign reviewers
33
+ gh pr create --reviewer @user1,@user2
34
+
35
+ # Add labels
36
+ gh pr create --label "bug,priority:high"
37
+ ```
38
+
39
+ ### View/Review PR
40
+ ```bash
41
+ gh pr list # List PRs
42
+ gh pr view 123 # View PR details
43
+ gh pr view 123 --web # Open in browser
44
+ gh pr checkout 123 # Checkout PR locally
45
+ gh pr diff 123 # View PR diff
46
+ gh pr status # Your PRs + reviews
47
+ ```
48
+
49
+ ### Merge PR
50
+ ```bash
51
+ gh pr merge 123 # Default merge commit
52
+ gh pr merge 123 --squash # Squash commits
53
+ gh pr merge 123 --rebase # Rebase merge
54
+ gh pr merge 123 --auto # Auto-merge when checks pass
55
+ gh pr merge 123 --delete-branch # Delete branch after
56
+ ```
57
+
58
+ ### PR Comments
59
+ ```bash
60
+ gh pr comment 123 --body "LGTM!"
61
+ gh api repos/{owner}/{repo}/pulls/123/comments # View all
62
+ ```
63
+
64
+ ## Issues
65
+
66
+ ```bash
67
+ gh issue list # List issues
68
+ gh issue view 42 # View issue
69
+ gh issue create --title "Bug" --body "Description"
70
+ gh issue develop 42 -c # Create branch from issue
71
+ ```
72
+
73
+ ## Repository
74
+
75
+ ```bash
76
+ gh repo view # Current repo info
77
+ gh repo clone owner/repo # Clone
78
+ gh browse # Open repo in browser
79
+ gh browse path/to/file:42 # Open file at line
80
+ ```
81
+
82
+ ## Workflow Runs
83
+
84
+ ```bash
85
+ gh run list # List workflow runs
86
+ gh run view <run-id> # View run details
87
+ gh run watch # Watch running workflow
88
+ gh run rerun <run-id> # Rerun failed workflow
89
+ ```
90
+
91
+ ## JSON Output (scripting)
92
+
93
+ ```bash
94
+ gh pr list --json number,title,author
95
+ gh pr view 123 --json commits,reviews
96
+ gh issue list --json number,title --jq '.[].title'
97
+ ```
98
+
99
+ ## Common Patterns
100
+
101
+ ### Create PR with auto-merge
102
+ ```bash
103
+ gh pr create --fill && gh pr merge --auto --squash
104
+ ```
105
+
106
+ ### Close stale PRs
107
+ ```bash
108
+ gh pr list --state open --json number -q '.[].number' | xargs -I {} gh pr close {}
109
+ ```
@@ -0,0 +1,69 @@
1
+ # Git Safety Protocols
2
+
3
+ ## Secret Detection Patterns
4
+
5
+ ### Scan Command
6
+ ```bash
7
+ git diff --cached | grep -iE "(AKIA|api[_-]?key|token|password|secret|credential|private[_-]?key|mongodb://|postgres://|mysql://|redis://|-----BEGIN)"
8
+ ```
9
+
10
+ ### Patterns to Detect
11
+
12
+ | Category | Pattern | Example |
13
+ |----------|---------|---------|
14
+ | API Keys | `api[_-]?key`, `apiKey` | `API_KEY=abc123` |
15
+ | AWS | `AKIA[0-9A-Z]{16}` | `AKIAIOSFODNN7EXAMPLE` |
16
+ | Tokens | `token`, `auth_token`, `jwt` | `AUTH_TOKEN=xyz` |
17
+ | Passwords | `password`, `passwd`, `pwd` | `DB_PASSWORD=secret` |
18
+ | Private Keys | `-----BEGIN PRIVATE KEY-----` | PEM files |
19
+ | DB URLs | `mongodb://`, `postgres://`, `mysql://` | Connection strings |
20
+ | OAuth | `client_secret`, `oauth_token` | `CLIENT_SECRET=abc` |
21
+
22
+ ### Files to Warn About
23
+ - `.env`, `.env.*` (except `.env.example`)
24
+ - `*.key`, `*.pem`, `*.p12`
25
+ - `credentials.json`, `secrets.json`
26
+ - `config/private.*`
27
+
28
+ ### Action on Detection
29
+ 1. **BLOCK commit immediately**
30
+ 2. Show matching lines: `git diff --cached | grep -B2 -A2 <pattern>`
31
+ 3. Suggest: "Add to .gitignore or use environment variables"
32
+ 4. Offer to unstage: `git reset HEAD <file>`
33
+
34
+ ## Branch Protection
35
+
36
+ ### Never Force Push To
37
+ - `main`, `master`, `production`, `prod`, `release/*`
38
+
39
+ ### Pre-Merge Checks
40
+ ```bash
41
+ # Check for conflicts before merge
42
+ git merge --no-commit --no-ff origin/{branch} && git merge --abort
43
+ ```
44
+
45
+ ### Remote-First Operations
46
+ Always use `origin/{branch}` for comparisons:
47
+ - ✅ `git diff origin/main...origin/feature`
48
+ - ❌ `git diff main...HEAD` (includes local uncommitted)
49
+
50
+ ## Error Recovery
51
+
52
+ ### Undo Last Commit (unpushed)
53
+ ```bash
54
+ git reset --soft HEAD~1 # Keep changes staged
55
+ git reset HEAD~1 # Keep changes unstaged
56
+ ```
57
+
58
+ ### Abort Merge
59
+ ```bash
60
+ git merge --abort
61
+ ```
62
+
63
+ ### Discard Local Changes
64
+ ```bash
65
+ git checkout -- <file> # Single file
66
+ git reset --hard HEAD # All files (DANGER)
67
+ ```
68
+
69
+ **Always confirm with user before destructive operations.**
@@ -0,0 +1,58 @@
1
+ # Commit Workflow
2
+
3
+ Execute via `git-manager` subagent.
4
+
5
+ ## Tool 1: Stage + Analyze
6
+ ```bash
7
+ git add -A && \
8
+ echo "=== STAGED ===" && git diff --cached --stat && \
9
+ echo "=== SECURITY ===" && \
10
+ git diff --cached | grep -c -iE "(api[_-]?key|token|password|secret|credential)" | awk '{print "SECRETS:"$1}' && \
11
+ echo "=== GROUPS ===" && \
12
+ git diff --cached --name-only | awk -F'/' '{
13
+ if ($0 ~ /\.(md|txt)$/) print "docs:"$0
14
+ else if ($0 ~ /test|spec/) print "test:"$0
15
+ else if ($0 ~ /\.claude/) print "config:"$0
16
+ else if ($0 ~ /package\.json|lock/) print "deps:"$0
17
+ else print "code:"$0
18
+ }'
19
+ ```
20
+
21
+ **If SECRETS > 0:** STOP, show matches, block commit.
22
+
23
+ ## Tool 2: Split Decision
24
+
25
+ NOTE:
26
+ - Search for related issues on GitHub and add to body.
27
+ - Only use `feat`, `fix`, or `perf` prefixes for files in `.claude` directory (do not use `docs`).
28
+
29
+ **From groups, decide:**
30
+
31
+ **A) Single commit:** Same type/scope, FILES ≤ 3, LINES ≤ 50
32
+
33
+ **B) Multi commit:** Mixed types/scopes, group by:
34
+ - Group 1: `config:` → `chore(config): ...`
35
+ - Group 2: `deps:` → `chore(deps): ...`
36
+ - Group 3: `test:` → `test: ...`
37
+ - Group 4: `code:` → `feat|fix: ...`
38
+ - Group 5: `docs:` → `docs: ...`
39
+
40
+ ## Tool 3: Commit
41
+
42
+ **Single:**
43
+ ```bash
44
+ git commit -m "type(scope): description"
45
+ ```
46
+
47
+ **Multi (sequential):**
48
+ ```bash
49
+ git reset && git add file1 file2 && git commit -m "type(scope): desc"
50
+ ```
51
+ Repeat for each group.
52
+
53
+ ## Tool 4: Push (if requested)
54
+ ```bash
55
+ git push && echo "✓ pushed: yes" || echo "✓ pushed: no"
56
+ ```
57
+
58
+ **Only push if user explicitly requested** ("push", "commit and push").
@@ -0,0 +1,48 @@
1
+ # Merge Workflow
2
+
3
+ Execute via `git-manager` subagent.
4
+
5
+ ## Variables
6
+ - TO_BRANCH: target (defaults to `main`)
7
+ - FROM_BRANCH: source (defaults to current branch)
8
+
9
+ ## Step 1: Sync with Remote
10
+
11
+ **IMPORTANT: Always merge `main` (or any default branch) to current branch first.**
12
+
13
+ ```bash
14
+ git fetch origin
15
+ git checkout {TO_BRANCH}
16
+ git pull origin {TO_BRANCH}
17
+ ```
18
+
19
+ ## Step 2: Merge from REMOTE
20
+ ```bash
21
+ git merge origin/{FROM_BRANCH} --no-ff -m "merge: {FROM_BRANCH} into {TO_BRANCH}"
22
+ ```
23
+
24
+ **Why `origin/{FROM_BRANCH}`:** Ensures merging only committed+pushed changes, not local WIP.
25
+
26
+ ## Step 3: Resolve Conflicts
27
+ If conflicts:
28
+ 1. Resolve manually
29
+ 2. `git add . && git commit`
30
+ 3. If clarifications needed, report to main agent
31
+
32
+ ## Step 4: Push
33
+ ```bash
34
+ git push origin {TO_BRANCH}
35
+ ```
36
+
37
+ ## Pre-Merge Checklist
38
+ - Fetch latest: `git fetch origin`
39
+ - Ensure FROM_BRANCH pushed to remote
40
+ - Check for conflicts: `git merge --no-commit --no-ff origin/{FROM_BRANCH}` then abort
41
+
42
+ ## Error Handling
43
+
44
+ | Error | Action |
45
+ |-------|--------|
46
+ | Merge conflicts | Resolve manually, then commit |
47
+ | Branch not found | Verify branch name, ensure pushed |
48
+ | Push rejected | `git pull --rebase`, retry |
@@ -0,0 +1,58 @@
1
+ # Pull Request Workflow
2
+
3
+ Execute via `git-manager` subagent.
4
+
5
+ ## Variables
6
+ - TO_BRANCH: target (defaults to `main`)
7
+ - FROM_BRANCH: source (defaults to current branch)
8
+
9
+ ## CRITICAL: Use REMOTE diff
10
+ PRs based on remote branches. Local diff includes unpushed changes.
11
+
12
+ ## Tool 1: Sync + Analyze
13
+
14
+ **IMPORTANT: Always merge `main` (or any default branch) to current branch first.**
15
+
16
+ ```bash
17
+ git fetch origin && \
18
+ git push -u origin HEAD 2>/dev/null || true && \
19
+ BASE=${BASE_BRANCH:-main} && \
20
+ HEAD=$(git rev-parse --abbrev-ref HEAD) && \
21
+ echo "=== PR: $HEAD → $BASE ===" && \
22
+ echo "=== COMMITS ===" && \
23
+ git log origin/$BASE...origin/$HEAD --oneline && \
24
+ echo "=== FILES ===" && \
25
+ git diff origin/$BASE...origin/$HEAD --stat
26
+ ```
27
+
28
+ **If "Branch not on remote":** Push first, retry.
29
+
30
+ ## Tool 2: Generate Content
31
+ **Title:** Conventional commit format, <72 chars, NO version numbers
32
+ **Body:** Summary bullets + Test plan checklist
33
+
34
+ ## Tool 3: Create PR
35
+ ```bash
36
+ gh pr create --base $BASE --head $HEAD --title "..." --body "$(cat <<'EOF'
37
+ ## Summary
38
+ - Bullet points
39
+
40
+ ## Test plan
41
+ - [ ] Test item
42
+ EOF
43
+ )"
44
+ ```
45
+
46
+ ## DO NOT use (local comparison)
47
+ - ❌ `git diff main...HEAD`
48
+ - ❌ `git diff --cached`
49
+ - ❌ `git status`
50
+
51
+ ## Error Handling
52
+
53
+ | Error | Action |
54
+ |-------|--------|
55
+ | Branch not on remote | `git push -u origin HEAD`, retry |
56
+ | Empty diff | Warn: "No changes for PR" |
57
+ | Push rejected | `git pull --rebase`, resolve, push |
58
+ | No upstream | `git push -u origin HEAD` |
@@ -0,0 +1,52 @@
1
+ # Push Workflow
2
+
3
+ Execute via `git-manager` subagent.
4
+
5
+ ## Pre-Push Checklist
6
+ 1. All changes committed
7
+ 2. Secrets scanned (see `safety-protocols.md`)
8
+ 3. Branch pushed to remote
9
+
10
+ ## Tool 1: Verify State
11
+ ```bash
12
+ git status && \
13
+ git log origin/$(git rev-parse --abbrev-ref HEAD)..HEAD --oneline 2>/dev/null || echo "NO_UPSTREAM"
14
+ ```
15
+
16
+ **If uncommitted changes:** Warn user, suggest commit first.
17
+ **If NO_UPSTREAM:** Use `git push -u origin HEAD`.
18
+
19
+ ## Tool 2: Push
20
+ ```bash
21
+ git push origin HEAD
22
+ ```
23
+
24
+ **On success:** Report commit hashes pushed.
25
+
26
+ ## Error Handling
27
+
28
+ | Error | Cause | Solution |
29
+ |-------|-------|----------|
30
+ | `rejected - non-fast-forward` | Remote has newer commits | `git pull --rebase`, resolve conflicts, push again |
31
+ | `no upstream branch` | Branch not tracked | `git push -u origin HEAD` |
32
+ | `Authentication failed` | Invalid credentials | Check `gh auth status` or SSH keys |
33
+ | `Repository not found` | Wrong remote URL | Verify `git remote -v` |
34
+ | `Permission denied` | No write access | Check repository permissions |
35
+
36
+ ## Force Push (DANGER)
37
+
38
+ **NEVER force push to main/master/production branches.**
39
+
40
+ If user explicitly requests force push on feature branch:
41
+ ```bash
42
+ git push -f origin HEAD
43
+ ```
44
+
45
+ **Warn user:** "Force push rewrites history. Collaborators may lose work."
46
+
47
+ ## Output Format
48
+ ```
49
+ ✓ pushed: N commits to origin/{branch}
50
+ - abc123 feat(auth): add login
51
+ - def456 fix(api): resolve timeout
52
+ ```
@@ -1,5 +1,13 @@
1
1
  # .NET build configuration (strict gates)
2
2
 
3
+ > **Note:** `musketeer muster`'s `dotnet` company now automates step 3's first 4 properties only
4
+ > (`TreatWarningsAsErrors`, `EnforceCodeStyleInBuild`, `AnalysisLevel`, `AnalysisModeSecurity`) —
5
+ > merged into root `Directory.Build.props` at muster time for any project with `dotnet` selected
6
+ > (set `MUSKETEER_SKIP_DOTNET_PROPS=1` to opt out). The 3 language-default properties
7
+ > (`Nullable`/`LangVersion`/`ImplicitUsings`) are NOT auto-merged into an existing solution's root
8
+ > file — those steps below remain fully manual (a fresh `musketeer`-scaffolded skeleton does set
9
+ > them, but per-`.csproj`, not here). Steps 1, 2, and 4 also remain manual either way.
10
+
3
11
  Treat the build as a quality gate. When working in a .NET solution under the **dotnet** company,
4
12
  ensure the repo enforces warnings-as-errors, code-style, and full security analysis via a root
5
13
  `Directory.Build.props`.
@@ -0,0 +1,77 @@
1
+ Microsoft Visual Studio Solution File, Format Version 12.00
2
+ # Visual Studio Version 17
3
+ VisualStudioVersion = 17.0.31903.59
4
+ MinimumVisualStudioVersion = 10.0.40219.1
5
+ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "__SlnFolderGuid_Src__"
6
+ EndProject
7
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Domain", "src\__SolutionName__.Domain\__SolutionName__.Domain.csproj", "__ProjectGuid_Domain__"
8
+ EndProject
9
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Application", "src\__SolutionName__.Application\__SolutionName__.Application.csproj", "__ProjectGuid_Application__"
10
+ EndProject
11
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Infrastructure", "src\__SolutionName__.Infrastructure\__SolutionName__.Infrastructure.csproj", "__ProjectGuid_Infrastructure__"
12
+ EndProject
13
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Api", "src\__SolutionName__.Api\__SolutionName__.Api.csproj", "__ProjectGuid_Api__"
14
+ EndProject
15
+ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "__SlnFolderGuid_Tests__"
16
+ EndProject
17
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Domain.Tests", "tests\__SolutionName__.Domain.Tests\__SolutionName__.Domain.Tests.csproj", "__ProjectGuid_DomainTests__"
18
+ EndProject
19
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Application.Tests", "tests\__SolutionName__.Application.Tests\__SolutionName__.Application.Tests.csproj", "__ProjectGuid_ApplicationTests__"
20
+ EndProject
21
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Infrastructure.Tests", "tests\__SolutionName__.Infrastructure.Tests\__SolutionName__.Infrastructure.Tests.csproj", "__ProjectGuid_InfrastructureTests__"
22
+ EndProject
23
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "__SolutionName__.Api.Tests", "tests\__SolutionName__.Api.Tests\__SolutionName__.Api.Tests.csproj", "__ProjectGuid_ApiTests__"
24
+ EndProject
25
+ Global
26
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
27
+ Debug|Any CPU = Debug|Any CPU
28
+ Release|Any CPU = Release|Any CPU
29
+ EndGlobalSection
30
+ GlobalSection(SolutionProperties) = preSolution
31
+ HideSolutionNode = FALSE
32
+ EndGlobalSection
33
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
34
+ __ProjectGuid_Domain__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
35
+ __ProjectGuid_Domain__.Debug|Any CPU.Build.0 = Debug|Any CPU
36
+ __ProjectGuid_Domain__.Release|Any CPU.ActiveCfg = Release|Any CPU
37
+ __ProjectGuid_Domain__.Release|Any CPU.Build.0 = Release|Any CPU
38
+ __ProjectGuid_Application__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
39
+ __ProjectGuid_Application__.Debug|Any CPU.Build.0 = Debug|Any CPU
40
+ __ProjectGuid_Application__.Release|Any CPU.ActiveCfg = Release|Any CPU
41
+ __ProjectGuid_Application__.Release|Any CPU.Build.0 = Release|Any CPU
42
+ __ProjectGuid_Infrastructure__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
43
+ __ProjectGuid_Infrastructure__.Debug|Any CPU.Build.0 = Debug|Any CPU
44
+ __ProjectGuid_Infrastructure__.Release|Any CPU.ActiveCfg = Release|Any CPU
45
+ __ProjectGuid_Infrastructure__.Release|Any CPU.Build.0 = Release|Any CPU
46
+ __ProjectGuid_Api__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
47
+ __ProjectGuid_Api__.Debug|Any CPU.Build.0 = Debug|Any CPU
48
+ __ProjectGuid_Api__.Release|Any CPU.ActiveCfg = Release|Any CPU
49
+ __ProjectGuid_Api__.Release|Any CPU.Build.0 = Release|Any CPU
50
+ __ProjectGuid_DomainTests__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
51
+ __ProjectGuid_DomainTests__.Debug|Any CPU.Build.0 = Debug|Any CPU
52
+ __ProjectGuid_DomainTests__.Release|Any CPU.ActiveCfg = Release|Any CPU
53
+ __ProjectGuid_DomainTests__.Release|Any CPU.Build.0 = Release|Any CPU
54
+ __ProjectGuid_ApplicationTests__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
55
+ __ProjectGuid_ApplicationTests__.Debug|Any CPU.Build.0 = Debug|Any CPU
56
+ __ProjectGuid_ApplicationTests__.Release|Any CPU.ActiveCfg = Release|Any CPU
57
+ __ProjectGuid_ApplicationTests__.Release|Any CPU.Build.0 = Release|Any CPU
58
+ __ProjectGuid_InfrastructureTests__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
59
+ __ProjectGuid_InfrastructureTests__.Debug|Any CPU.Build.0 = Debug|Any CPU
60
+ __ProjectGuid_InfrastructureTests__.Release|Any CPU.ActiveCfg = Release|Any CPU
61
+ __ProjectGuid_InfrastructureTests__.Release|Any CPU.Build.0 = Release|Any CPU
62
+ __ProjectGuid_ApiTests__.Debug|Any CPU.ActiveCfg = Debug|Any CPU
63
+ __ProjectGuid_ApiTests__.Debug|Any CPU.Build.0 = Debug|Any CPU
64
+ __ProjectGuid_ApiTests__.Release|Any CPU.ActiveCfg = Release|Any CPU
65
+ __ProjectGuid_ApiTests__.Release|Any CPU.Build.0 = Release|Any CPU
66
+ EndGlobalSection
67
+ GlobalSection(NestedProjects) = preSolution
68
+ __ProjectGuid_Domain__ = __SlnFolderGuid_Src__
69
+ __ProjectGuid_Application__ = __SlnFolderGuid_Src__
70
+ __ProjectGuid_Infrastructure__ = __SlnFolderGuid_Src__
71
+ __ProjectGuid_Api__ = __SlnFolderGuid_Src__
72
+ __ProjectGuid_DomainTests__ = __SlnFolderGuid_Tests__
73
+ __ProjectGuid_ApplicationTests__ = __SlnFolderGuid_Tests__
74
+ __ProjectGuid_InfrastructureTests__ = __SlnFolderGuid_Tests__
75
+ __ProjectGuid_ApiTests__ = __SlnFolderGuid_Tests__
76
+ EndGlobalSection
77
+ EndGlobal
@@ -0,0 +1,6 @@
1
+ {
2
+ "sdk": {
3
+ "version": "10.0.100",
4
+ "rollForward": "latestFeature"
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ var builder = WebApplication.CreateBuilder(args);
2
+ var app = builder.Build();
3
+
4
+ app.MapGet("/", () => "Hello World!");
5
+
6
+ app.Run();
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "http://json.schemastore.org/launchsettings.json",
3
+ "iisSettings": {
4
+ "windowsAuthentication": false,
5
+ "anonymousAuthentication": true,
6
+ "iisExpress": {
7
+ "applicationUrl": "http://localhost:54976",
8
+ "sslPort": 44329
9
+ }
10
+ },
11
+ "profiles": {
12
+ "http": {
13
+ "commandName": "Project",
14
+ "dotnetRunMessages": true,
15
+ "launchBrowser": true,
16
+ "applicationUrl": "http://localhost:5093",
17
+ "environmentVariables": {
18
+ "ASPNETCORE_ENVIRONMENT": "Development"
19
+ }
20
+ },
21
+ "https": {
22
+ "commandName": "Project",
23
+ "dotnetRunMessages": true,
24
+ "launchBrowser": true,
25
+ "applicationUrl": "https://localhost:7192;http://localhost:5093",
26
+ "environmentVariables": {
27
+ "ASPNETCORE_ENVIRONMENT": "Development"
28
+ }
29
+ },
30
+ "IIS Express": {
31
+ "commandName": "IISExpress",
32
+ "launchBrowser": true,
33
+ "environmentVariables": {
34
+ "ASPNETCORE_ENVIRONMENT": "Development"
35
+ }
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,15 @@
1
+ <Project Sdk="Microsoft.NET.Sdk.Web">
2
+
3
+ <ItemGroup>
4
+ <ProjectReference Include="..\__SolutionName__.Application\__SolutionName__.Application.csproj" />
5
+ <ProjectReference Include="..\__SolutionName__.Infrastructure\__SolutionName__.Infrastructure.csproj" />
6
+ </ItemGroup>
7
+
8
+ <PropertyGroup>
9
+ <TargetFramework>net10.0</TargetFramework>
10
+ <LangVersion>latest</LangVersion>
11
+ <Nullable>enable</Nullable>
12
+ <ImplicitUsings>enable</ImplicitUsings>
13
+ </PropertyGroup>
14
+
15
+ </Project>
@@ -0,0 +1,8 @@
1
+ {
2
+ "Logging": {
3
+ "LogLevel": {
4
+ "Default": "Information",
5
+ "Microsoft.AspNetCore": "Warning"
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "Logging": {
3
+ "LogLevel": {
4
+ "Default": "Information",
5
+ "Microsoft.AspNetCore": "Warning"
6
+ }
7
+ },
8
+ "AllowedHosts": "*"
9
+ }
@@ -0,0 +1,14 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <ItemGroup>
4
+ <ProjectReference Include="..\__SolutionName__.Domain\__SolutionName__.Domain.csproj" />
5
+ </ItemGroup>
6
+
7
+ <PropertyGroup>
8
+ <TargetFramework>net10.0</TargetFramework>
9
+ <LangVersion>latest</LangVersion>
10
+ <Nullable>enable</Nullable>
11
+ <ImplicitUsings>enable</ImplicitUsings>
12
+ </PropertyGroup>
13
+
14
+ </Project>
@@ -0,0 +1,24 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <!--
4
+ __SolutionName__.Domain enforces ZERO framework dependencies (Clean Architecture
5
+ rule). No PackageReference to Microsoft.*, EntityFrameworkCore, AspNetCore, etc.
6
+ The build target below fails the build if any PackageReference is ever added here.
7
+ -->
8
+ <Target Name="EnforceDomainHasNoFrameworkDependencies" BeforeTargets="Build">
9
+ <ItemGroup>
10
+ <_ForbiddenRef Include="@(PackageReference)" />
11
+ </ItemGroup>
12
+ <Error
13
+ Condition="'@(_ForbiddenRef)' != ''"
14
+ Text="__SolutionName__.Domain MUST NOT have PackageReferences (Clean Architecture rule). Found: @(_ForbiddenRef)" />
15
+ </Target>
16
+
17
+ <PropertyGroup>
18
+ <TargetFramework>net10.0</TargetFramework>
19
+ <LangVersion>latest</LangVersion>
20
+ <Nullable>enable</Nullable>
21
+ <ImplicitUsings>enable</ImplicitUsings>
22
+ </PropertyGroup>
23
+
24
+ </Project>
@@ -0,0 +1,20 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <ItemGroup>
4
+ <ProjectReference Include="..\__SolutionName__.Application\__SolutionName__.Application.csproj" />
5
+ </ItemGroup>
6
+
7
+ <ItemGroup>
8
+ <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.0" />
9
+ <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" />
10
+ <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
11
+ </ItemGroup>
12
+
13
+ <PropertyGroup>
14
+ <TargetFramework>net10.0</TargetFramework>
15
+ <LangVersion>latest</LangVersion>
16
+ <Nullable>enable</Nullable>
17
+ <ImplicitUsings>enable</ImplicitUsings>
18
+ </PropertyGroup>
19
+
20
+ </Project>
@@ -0,0 +1,31 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <PropertyGroup>
4
+ <TargetFramework>net10.0</TargetFramework>
5
+ <LangVersion>latest</LangVersion>
6
+ <Nullable>enable</Nullable>
7
+ <ImplicitUsings>enable</ImplicitUsings>
8
+
9
+ <IsPackable>false</IsPackable>
10
+ <IsTestProject>true</IsTestProject>
11
+ </PropertyGroup>
12
+
13
+ <ItemGroup>
14
+ <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.0" />
15
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.7.0" />
16
+ <PackageReference Include="NSubstitute" Version="5.3.0" />
17
+ <PackageReference Include="Shouldly" Version="4.3.0" />
18
+ <PackageReference Include="xunit" Version="2.9.3" />
19
+ <PackageReference Include="xunit.runner.visualstudio" Version="3.1.5" />
20
+ </ItemGroup>
21
+
22
+ <ItemGroup>
23
+ <Using Include="Xunit" />
24
+ </ItemGroup>
25
+
26
+ <ItemGroup>
27
+ <ProjectReference Include="..\..\src\__SolutionName__.Api\__SolutionName__.Api.csproj" />
28
+ <ProjectReference Include="..\..\src\__SolutionName__.Infrastructure\__SolutionName__.Infrastructure.csproj" />
29
+ </ItemGroup>
30
+
31
+ </Project>