diff --git a/get-shit-done/bin/gsd-tools.js b/get-shit-done/bin/gsd-tools.js
index 3a9e5b72..39ba9b32 100755
--- a/get-shit-done/bin/gsd-tools.js
+++ b/get-shit-done/bin/gsd-tools.js
@@ -160,6 +160,7 @@ function loadConfig(cwd) {
model_profile: 'balanced',
commit_docs: true,
search_gitignored: false,
+ git_tag: true,
branching_strategy: 'none',
phase_branch_template: 'gsd/phase-{phase}-{slug}',
milestone_branch_template: 'gsd/{milestone}-{slug}',
@@ -193,6 +194,7 @@ function loadConfig(cwd) {
model_profile: get('model_profile') ?? defaults.model_profile,
commit_docs: get('commit_docs', { section: 'planning', field: 'commit_docs' }) ?? defaults.commit_docs,
search_gitignored: get('search_gitignored', { section: 'planning', field: 'search_gitignored' }) ?? defaults.search_gitignored,
+ git_tag: get('git_tag', { section: 'planning', field: 'git_tag' }) ?? defaults.git_tag,
branching_strategy: get('branching_strategy', { section: 'git', field: 'branching_strategy' }) ?? defaults.branching_strategy,
phase_branch_template: get('phase_branch_template', { section: 'git', field: 'phase_branch_template' }) ?? defaults.phase_branch_template,
milestone_branch_template: get('milestone_branch_template', { section: 'git', field: 'milestone_branch_template' }) ?? defaults.milestone_branch_template,
@@ -598,6 +600,7 @@ function cmdConfigEnsureSection(cwd, raw) {
model_profile: 'balanced',
commit_docs: true,
search_gitignored: false,
+ git_tag: true,
branching_strategy: 'none',
phase_branch_template: 'gsd/phase-{phase}-{slug}',
milestone_branch_template: 'gsd/{milestone}-{slug}',
diff --git a/get-shit-done/references/planning-config.md b/get-shit-done/references/planning-config.md
index a7f09b26..2a6b1371 100644
--- a/get-shit-done/references/planning-config.md
+++ b/get-shit-done/references/planning-config.md
@@ -6,7 +6,8 @@ Configuration options for `.planning/` directory behavior.
```json
"planning": {
"commit_docs": true,
- "search_gitignored": false
+ "search_gitignored": false,
+ "git_tag": true
},
"git": {
"branching_strategy": "none",
@@ -19,6 +20,7 @@ Configuration options for `.planning/` directory behavior.
|--------|---------|-------------|
| `commit_docs` | `true` | Whether to commit planning artifacts to git |
| `search_gitignored` | `false` | Add `--no-ignore` to broad rg searches |
+| `git_tag` | `true` | Create git tags on milestone completion |
| `git.branching_strategy` | `"none"` | Git branching approach: `"none"`, `"phase"`, or `"milestone"` |
| `git.phase_branch_template` | `"gsd/phase-{phase}-{slug}"` | Branch template for phase strategy |
| `git.milestone_branch_template` | `"gsd/{milestone}-{slug}"` | Branch template for milestone strategy |
diff --git a/get-shit-done/templates/config.json b/get-shit-done/templates/config.json
index 744c2f8c..f76a3b3c 100644
--- a/get-shit-done/templates/config.json
+++ b/get-shit-done/templates/config.json
@@ -8,7 +8,8 @@
},
"planning": {
"commit_docs": true,
- "search_gitignored": false
+ "search_gitignored": false,
+ "git_tag": true
},
"parallelization": {
"enabled": true,
diff --git a/get-shit-done/workflows/complete-milestone.md b/get-shit-done/workflows/complete-milestone.md
index b91e41cc..6842938c 100644
--- a/get-shit-done/workflows/complete-milestone.md
+++ b/get-shit-done/workflows/complete-milestone.md
@@ -531,6 +531,11 @@ fi
+
+Read `planning.git_tag` from `.planning/config.json` (default: `true` if not set).
+If `git_tag` is `false` → skip this step entirely, proceed to `git_commit_milestone`.
+
+
Create git tag:
```bash
diff --git a/get-shit-done/workflows/settings.md b/get-shit-done/workflows/settings.md
index 8966fecf..71f75e5a 100644
--- a/get-shit-done/workflows/settings.md
+++ b/get-shit-done/workflows/settings.md
@@ -30,6 +30,7 @@ Parse current values (default to `true` if not present):
- `workflow.verifier` — spawn verifier during execute-phase
- `model_profile` — which model each agent uses (default: `balanced`)
- `git.branching_strategy` — branching approach (default: `"none"`)
+- `planning.git_tag` — create git tags on milestone completion (default: `true`)
@@ -83,6 +84,15 @@ AskUserQuestion([
{ label: "Per Phase", description: "Create branch for each phase (gsd/phase-{N}-{name})" },
{ label: "Per Milestone", description: "Create branch for entire milestone (gsd/{version}-{name})" }
]
+ },
+ {
+ question: "Create git tags on milestone completion?",
+ header: "Git Tagging",
+ multiSelect: false,
+ options: [
+ { label: "Yes (Recommended)", description: "Tag releases with version (e.g., v1.0) on milestone completion" },
+ { label: "No", description: "Skip git tagging — use if your project doesn't use tags or uses a different convention" }
+ ]
}
])
```
@@ -100,6 +110,10 @@ Merge new settings into existing config.json:
"plan_check": true/false,
"verifier": true/false
},
+ "planning": {
+ ...existing_planning,
+ "git_tag": true/false
+ },
"git": {
"branching_strategy": "none" | "phase" | "milestone"
}
@@ -124,6 +138,7 @@ Display:
| Plan Checker | {On/Off} |
| Execution Verifier | {On/Off} |
| Git Branching | {None/Per Phase/Per Milestone} |
+| Git Tagging | {On/Off} |
These settings apply to future /gsd:plan-phase and /gsd:execute-phase runs.
@@ -139,7 +154,7 @@ Quick commands:
- [ ] Current config read
-- [ ] User presented with 5 settings (profile + 3 workflow toggles + git branching)
+- [ ] User presented with 6 settings (profile + 3 workflow toggles + git branching + git tagging)
- [ ] Config updated with model_profile, workflow, and git sections
- [ ] Changes confirmed to user