From 0fe6dadb71b954048580bae045e364f1767c879d Mon Sep 17 00:00:00 2001 From: bigboateng Date: Tue, 21 Jul 2026 13:08:12 +0100 Subject: [PATCH 1/2] fix: ignore operational directories to prevent primary checkout dirty state --- .../release-notes/2026-07-21-prevent-worktree-dirty-state.md | 3 +++ .../product-engineering-loop/export.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md diff --git a/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md b/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md new file mode 100644 index 000000000..6ad690e1a --- /dev/null +++ b/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md @@ -0,0 +1,3 @@ +### Ignore operational directories to prevent primary checkout dirty state + +Boatstack now automatically ignores `worktrees/`, `features/`, and `intake/` inside the `.product-loop/` directory by explicitly adding them to the generated `.product-loop/.gitignore` file. This prevents these active delivery artifacts from dirtying the primary repository checkout, ensuring commands like `boatstack-update` can run smoothly. diff --git a/labs/12-product-engineering-loop/product-engineering-loop/export.go b/labs/12-product-engineering-loop/product-engineering-loop/export.go index 16d6991a0..04e2b0dd7 100644 --- a/labs/12-product-engineering-loop/product-engineering-loop/export.go +++ b/labs/12-product-engineering-loop/product-engineering-loop/export.go @@ -211,7 +211,7 @@ func BuildExportBundle(configPath string, config ProjectConfig, rawConfig []byte return ExportBundle{}, err } files[".product-loop/project.json"] = projectJSON - files[".product-loop/.gitignore"] = []byte("bin/\n") + files[".product-loop/.gitignore"] = []byte("bin/\nworktrees/\nfeatures/\nintake/\n") files[".product-loop/intake/.gitkeep"] = []byte{} files[".product-loop/hooks/guard.sh"] = guardShellScript() files[".product-loop/hooks/guard.ps1"] = guardPowerShellScript() From 18beeecc3fc84c84a6143d8f19be470e2d926c1a Mon Sep 17 00:00:00 2001 From: bigboateng Date: Tue, 21 Jul 2026 13:18:34 +0100 Subject: [PATCH 2/2] docs: clarify that only worktrees/ is ignored, as ignoring features/ breaks tracking --- .../release-notes/2026-07-21-prevent-worktree-dirty-state.md | 5 +++-- .../product-engineering-loop/export.go | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md b/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md index 6ad690e1a..86529055e 100644 --- a/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md +++ b/labs/12-product-engineering-loop/boatstack-distribution/release-notes/2026-07-21-prevent-worktree-dirty-state.md @@ -1,3 +1,4 @@ -### Ignore operational directories to prevent primary checkout dirty state +### Ignore linked worktrees to prevent primary checkout dirty state + +Boatstack now automatically ignores `worktrees/` inside the `.product-loop/` directory by explicitly adding it to the generated `.product-loop/.gitignore` file. This prevents linked worktree directories from dirtying the primary repository checkout, ensuring commands like `boatstack-update` can run smoothly. Users should still commit or clean up their untracked `features/` and `intake/` copies before updating. -Boatstack now automatically ignores `worktrees/`, `features/`, and `intake/` inside the `.product-loop/` directory by explicitly adding them to the generated `.product-loop/.gitignore` file. This prevents these active delivery artifacts from dirtying the primary repository checkout, ensuring commands like `boatstack-update` can run smoothly. diff --git a/labs/12-product-engineering-loop/product-engineering-loop/export.go b/labs/12-product-engineering-loop/product-engineering-loop/export.go index 04e2b0dd7..7c3b54a87 100644 --- a/labs/12-product-engineering-loop/product-engineering-loop/export.go +++ b/labs/12-product-engineering-loop/product-engineering-loop/export.go @@ -211,7 +211,7 @@ func BuildExportBundle(configPath string, config ProjectConfig, rawConfig []byte return ExportBundle{}, err } files[".product-loop/project.json"] = projectJSON - files[".product-loop/.gitignore"] = []byte("bin/\nworktrees/\nfeatures/\nintake/\n") + files[".product-loop/.gitignore"] = []byte("bin/\nworktrees/\n") files[".product-loop/intake/.gitkeep"] = []byte{} files[".product-loop/hooks/guard.sh"] = guardShellScript() files[".product-loop/hooks/guard.ps1"] = guardPowerShellScript()