@atlashub/smartstack-cli 3.39.0 → 3.41.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/.documentation/apex.html +644 -644
- package/.documentation/css/styles.css +2320 -2320
- package/.documentation/init.html +1377 -1377
- package/.documentation/js/app.js +780 -780
- package/.documentation/prd-json-v2.0.0.md +396 -396
- package/.documentation/testing-ba-e2e.md +462 -462
- package/config/default-config.json +95 -95
- package/config/mcp-defaults.json +62 -62
- package/config/settings.json +53 -53
- package/config/settings.local.example.json +16 -16
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +6 -4
- package/dist/mcp-entry.mjs.map +1 -1
- package/package.json +115 -115
- package/scripts/extract-api-endpoints.ts +325 -325
- package/scripts/extract-business-rules.ts +440 -440
- package/scripts/generate-doc-with-mock-ui.ts +804 -804
- package/scripts/health-check.sh +168 -168
- package/scripts/postinstall.js +18 -18
- package/templates/agents/action.md +37 -37
- package/templates/agents/ba-reader.md +378 -378
- package/templates/agents/ba-writer.md +861 -861
- package/templates/agents/code-reviewer.md +163 -163
- package/templates/agents/db-reader.md +149 -149
- package/templates/agents/docs-context-reader.md +143 -143
- package/templates/agents/docs-sync-checker.md +122 -122
- package/templates/agents/efcore/conflicts.md +95 -84
- package/templates/agents/efcore/db-deploy.md +85 -74
- package/templates/agents/efcore/db-reset.md +96 -85
- package/templates/agents/efcore/db-seed.md +72 -61
- package/templates/agents/efcore/db-status.md +97 -86
- package/templates/agents/efcore/migration.md +197 -186
- package/templates/agents/efcore/rebase-snapshot.md +119 -108
- package/templates/agents/efcore/scan.md +103 -92
- package/templates/agents/efcore/squash.md +172 -161
- package/templates/agents/explore-codebase.md +66 -66
- package/templates/agents/explore-docs.md +98 -98
- package/templates/agents/fix-grammar.md +50 -50
- package/templates/agents/gitflow/abort.md +45 -45
- package/templates/agents/gitflow/cleanup.md +96 -96
- package/templates/agents/gitflow/commit.md +236 -236
- package/templates/agents/gitflow/exec.md +48 -48
- package/templates/agents/gitflow/finish.md +146 -146
- package/templates/agents/gitflow/init-clone.md +199 -199
- package/templates/agents/gitflow/init-detect.md +137 -137
- package/templates/agents/gitflow/init-validate.md +225 -225
- package/templates/agents/gitflow/init.md +340 -340
- package/templates/agents/gitflow/merge.md +145 -145
- package/templates/agents/gitflow/plan.md +42 -42
- package/templates/agents/gitflow/pr.md +191 -191
- package/templates/agents/gitflow/review.md +49 -49
- package/templates/agents/gitflow/start.md +147 -147
- package/templates/agents/gitflow/status.md +95 -95
- package/templates/agents/mcp-healthcheck.md +163 -163
- package/templates/agents/snipper.md +37 -37
- package/templates/agents/websearch.md +46 -46
- package/templates/hooks/appsettings-guard.sh +76 -76
- package/templates/hooks/docs-drift-check.md +96 -96
- package/templates/hooks/ef-migration-check.md +139 -139
- package/templates/hooks/hooks.json +58 -58
- package/templates/hooks/mcp-check.md +64 -64
- package/templates/hooks/ralph-mcp-logger.sh +46 -46
- package/templates/hooks/ralph-session-end.sh +69 -69
- package/templates/hooks/stop-hook.sh +177 -177
- package/templates/hooks/wsl-dotnet-cleanup.sh +24 -24
- package/templates/mcp-scaffolding/component.tsx.hbs +318 -318
- package/templates/mcp-scaffolding/controller.cs.hbs +192 -192
- package/templates/mcp-scaffolding/entity-extension.cs.hbs +239 -239
- package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +116 -116
- package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -133
- package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +126 -126
- package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +261 -261
- package/templates/mcp-scaffolding/service-extension.cs.hbs +53 -53
- package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +436 -436
- package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +239 -239
- package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +441 -441
- package/templates/mcp-scaffolding/tests/security.test.cs.hbs +442 -442
- package/templates/mcp-scaffolding/tests/service.test.cs.hbs +402 -402
- package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +428 -428
- package/templates/project/DependencyInjection.Application.cs.template +25 -25
- package/templates/project/DependencyInjection.Infrastructure.cs.template +61 -61
- package/templates/project/DesignTimeExtensionsDbContextFactory.cs.template +70 -70
- package/templates/project/ExampleEntity.cs.template +116 -116
- package/templates/project/ExampleEntityConfiguration.cs.template +64 -64
- package/templates/project/ExampleService.cs.template +146 -146
- package/templates/project/ExtensionsDbContext.cs.template +41 -41
- package/templates/project/IExtensionsDbContext.cs.template +22 -22
- package/templates/project/Program.cs.template +47 -47
- package/templates/project/README.md +79 -79
- package/templates/project/api.ts.template +12 -12
- package/templates/project/appsettings.json.template +170 -170
- package/templates/project/claude-settings.json.template +5 -5
- package/templates/project/test-frontend/msw/handlers.ts +58 -58
- package/templates/project/test-frontend/msw/server.ts +25 -25
- package/templates/project/test-frontend/setup.ts +16 -16
- package/templates/project/test-frontend/test-utils.tsx +59 -59
- package/templates/project/test-frontend/vitest.config.ts +31 -31
- package/templates/ralph/README.md +93 -93
- package/templates/ralph/ralph.config.yaml +113 -113
- package/templates/scripts/setup-ralph-loop.sh +173 -173
- package/templates/skills/_resources/config-safety.md +61 -61
- package/templates/skills/_resources/context-digest-template.md +53 -53
- package/templates/skills/_resources/doc-context-cache.md +60 -60
- package/templates/skills/_resources/docs-manifest-schema.md +155 -155
- package/templates/skills/_resources/formatting-guide.md +124 -124
- package/templates/skills/_resources/mcp-validate-documentation-spec.md +181 -181
- package/templates/skills/_shared.md +228 -228
- package/templates/skills/admin/SKILL.md +48 -48
- package/templates/skills/ai-prompt/SKILL.md +107 -107
- package/templates/skills/ai-prompt/steps/step-00-init.md +47 -47
- package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -122
- package/templates/skills/apex/SKILL.md +168 -168
- package/templates/skills/apex/_shared.md +141 -141
- package/templates/skills/apex/references/agent-teams-protocol.md +164 -164
- package/templates/skills/apex/references/analysis-methods.md +141 -141
- package/templates/skills/apex/references/challenge-questions.md +145 -145
- package/templates/skills/apex/references/code-generation.md +412 -412
- package/templates/skills/apex/references/core-seed-data.md +1437 -1437
- package/templates/skills/apex/references/error-classification.md +144 -144
- package/templates/skills/apex/references/examine-build-validation.md +82 -82
- package/templates/skills/apex/references/execution-frontend-gates.md +177 -177
- package/templates/skills/apex/references/execution-frontend-patterns.md +105 -105
- package/templates/skills/apex/references/execution-layer1-rules.md +96 -96
- package/templates/skills/apex/references/initialization-challenge-flow.md +110 -110
- package/templates/skills/apex/references/planning-layer-mapping.md +151 -151
- package/templates/skills/apex/references/post-checks.md +1584 -1584
- package/templates/skills/apex/references/smartstack-api.md +1053 -1053
- package/templates/skills/apex/references/smartstack-frontend.md +1571 -1571
- package/templates/skills/apex/references/smartstack-layers.md +402 -402
- package/templates/skills/apex/steps/step-00-init.md +307 -307
- package/templates/skills/apex/steps/step-01-analyze.md +165 -165
- package/templates/skills/apex/steps/step-02-plan.md +144 -144
- package/templates/skills/apex/steps/step-03-execute.md +328 -328
- package/templates/skills/apex/steps/step-04-examine.md +263 -263
- package/templates/skills/apex/steps/step-05-deep-review.md +129 -129
- package/templates/skills/apex/steps/step-06-resolve.md +101 -101
- package/templates/skills/apex/steps/step-07-tests.md +238 -238
- package/templates/skills/apex/steps/step-08-run-tests.md +125 -125
- package/templates/skills/application/SKILL.md +4 -4
- package/templates/skills/application/references/application-roles-template.md +227 -227
- package/templates/skills/application/references/backend-controller-hierarchy.md +58 -58
- package/templates/skills/application/references/backend-entity-seeding.md +72 -72
- package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -83
- package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -79
- package/templates/skills/application/references/backend-verification.md +88 -88
- package/templates/skills/application/references/frontend-i18n-and-output.md +67 -67
- package/templates/skills/application/references/frontend-route-naming.md +117 -117
- package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -107
- package/templates/skills/application/references/frontend-verification.md +156 -156
- package/templates/skills/application/references/migration-checklist-troubleshooting.md +1 -1
- package/templates/skills/application/references/provider-template.md +177 -177
- package/templates/skills/application/references/roles-client-project-handling.md +55 -55
- package/templates/skills/application/references/roles-fallback-procedure.md +149 -149
- package/templates/skills/application/references/test-coverage-requirements.md +213 -213
- package/templates/skills/application/references/test-frontend.md +73 -73
- package/templates/skills/application/references/test-prerequisites.md +72 -72
- package/templates/skills/application/steps/step-05-frontend.md +176 -176
- package/templates/skills/application/steps/step-06-migration.md +193 -193
- package/templates/skills/application/steps/step-07-tests.md +356 -356
- package/templates/skills/application/steps/step-08-documentation.md +137 -137
- package/templates/skills/application/templates-backend.md +463 -463
- package/templates/skills/application/templates-frontend.md +685 -685
- package/templates/skills/application/templates-i18n.md +520 -520
- package/templates/skills/application/templates-seed.md +1096 -1096
- package/templates/skills/business-analyse/SKILL.md +327 -327
- package/templates/skills/business-analyse/_architecture.md +123 -123
- package/templates/skills/business-analyse/_elicitation.md +206 -206
- package/templates/skills/business-analyse/_module-loop.md +115 -115
- package/templates/skills/business-analyse/_shared.md +383 -383
- package/templates/skills/business-analyse/_suggestions.md +34 -34
- package/templates/skills/business-analyse/html/ba-interactive.html +4477 -4477
- package/templates/skills/business-analyse/html/build-html.js +77 -77
- package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +150 -150
- package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +227 -227
- package/templates/skills/business-analyse/html/src/scripts/03-render-cadrage.js +199 -199
- package/templates/skills/business-analyse/html/src/scripts/04-render-modules.js +205 -205
- package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +647 -647
- package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +195 -195
- package/templates/skills/business-analyse/html/src/scripts/07-render-handoff.js +92 -92
- package/templates/skills/business-analyse/html/src/scripts/08-editing.js +135 -135
- package/templates/skills/business-analyse/html/src/scripts/09-export.js +168 -168
- package/templates/skills/business-analyse/html/src/scripts/10-comments.js +171 -171
- package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +166 -166
- package/templates/skills/business-analyse/html/src/styles/01-variables.css +38 -38
- package/templates/skills/business-analyse/html/src/styles/02-layout.css +101 -101
- package/templates/skills/business-analyse/html/src/styles/03-navigation.css +120 -120
- package/templates/skills/business-analyse/html/src/styles/04-cards.css +196 -196
- package/templates/skills/business-analyse/html/src/styles/05-modules.css +454 -454
- package/templates/skills/business-analyse/html/src/styles/06-wireframes.css +272 -272
- package/templates/skills/business-analyse/html/src/styles/07-comments.css +184 -184
- package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +241 -241
- package/templates/skills/business-analyse/html/src/template.html +516 -516
- package/templates/skills/business-analyse/patterns/suggestion-catalog.md +546 -546
- package/templates/skills/business-analyse/questionnaire/00-application.md +160 -160
- package/templates/skills/business-analyse/questionnaire/00b-project.md +85 -85
- package/templates/skills/business-analyse/questionnaire/01-context.md +185 -185
- package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +189 -189
- package/templates/skills/business-analyse/questionnaire/03-scope.md +164 -164
- package/templates/skills/business-analyse/questionnaire/04-data.md +88 -88
- package/templates/skills/business-analyse/questionnaire/05-integrations.md +58 -58
- package/templates/skills/business-analyse/questionnaire/06-security.md +68 -68
- package/templates/skills/business-analyse/questionnaire/07-ui.md +76 -76
- package/templates/skills/business-analyse/questionnaire/08-performance.md +42 -42
- package/templates/skills/business-analyse/questionnaire/09-constraints.md +45 -45
- package/templates/skills/business-analyse/questionnaire/10-documentation.md +43 -43
- package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +59 -59
- package/templates/skills/business-analyse/questionnaire/12-migration.md +58 -58
- package/templates/skills/business-analyse/questionnaire/13-cross-module.md +69 -69
- package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +135 -135
- package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +136 -136
- package/templates/skills/business-analyse/questionnaire.md +337 -337
- package/templates/skills/business-analyse/react/application-viewer.md +242 -242
- package/templates/skills/business-analyse/react/components.md +551 -551
- package/templates/skills/business-analyse/react/i18n-template.md +306 -306
- package/templates/skills/business-analyse/references/acceptance-criteria.md +169 -169
- package/templates/skills/business-analyse/references/agent-module-prompt.md +362 -362
- package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +557 -557
- package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -190
- package/templates/skills/business-analyse/references/cache-warming-strategy.md +566 -566
- package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -41
- package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -74
- package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +115 -115
- package/templates/skills/business-analyse/references/cadrage-shared-modules.md +68 -69
- package/templates/skills/business-analyse/references/cadrage-structure-cards.md +85 -85
- package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -297
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +107 -107
- package/templates/skills/business-analyse/references/deploy-data-build.md +180 -180
- package/templates/skills/business-analyse/references/deploy-modes.md +118 -118
- package/templates/skills/business-analyse/references/detection-strategies.md +424 -424
- package/templates/skills/business-analyse/references/entity-architecture-decision.md +218 -218
- package/templates/skills/business-analyse/references/handoff-file-templates.md +120 -120
- package/templates/skills/business-analyse/references/handoff-mappings.md +81 -81
- package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -312
- package/templates/skills/business-analyse/references/html-data-mapping.md +299 -299
- package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -65
- package/templates/skills/business-analyse/references/naming-conventions.md +243 -243
- package/templates/skills/business-analyse/references/prd-generation.md +258 -258
- package/templates/skills/business-analyse/references/review-data-mapping.md +363 -363
- package/templates/skills/business-analyse/references/robustness-checks.md +542 -542
- package/templates/skills/business-analyse/references/spec-auto-inference.md +111 -111
- package/templates/skills/business-analyse/references/team-orchestration.md +1022 -1022
- package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -85
- package/templates/skills/business-analyse/references/ui-resource-cards.md +259 -259
- package/templates/skills/business-analyse/references/validate-incremental-html.md +121 -121
- package/templates/skills/business-analyse/references/validation-checklist.md +347 -347
- package/templates/skills/business-analyse/references/wireframe-svg-style-guide.md +335 -335
- package/templates/skills/business-analyse/schemas/application-schema.json +453 -453
- package/templates/skills/business-analyse/schemas/feature-schema.json +53 -53
- package/templates/skills/business-analyse/schemas/project-schema.json +485 -485
- package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +201 -201
- package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +82 -82
- package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +80 -80
- package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +70 -70
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +547 -547
- package/templates/skills/business-analyse/schemas/sections/validation-schema.json +93 -93
- package/templates/skills/business-analyse/schemas/shared/common-defs.json +226 -226
- package/templates/skills/business-analyse/steps/step-00-init.md +575 -576
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +767 -767
- package/templates/skills/business-analyse/steps/step-01b-applications.md +419 -419
- package/templates/skills/business-analyse/steps/step-02-decomposition.md +387 -387
- package/templates/skills/business-analyse/steps/step-03a-data.md +16 -16
- package/templates/skills/business-analyse/steps/step-03a1-setup.md +506 -506
- package/templates/skills/business-analyse/steps/step-03a2-analysis.md +252 -252
- package/templates/skills/business-analyse/steps/step-03b-ui.md +425 -425
- package/templates/skills/business-analyse/steps/step-03c-compile.md +611 -611
- package/templates/skills/business-analyse/steps/step-03d-validate.md +783 -783
- package/templates/skills/business-analyse/steps/step-04-consolidation.md +17 -17
- package/templates/skills/business-analyse/steps/step-04a-collect.md +415 -415
- package/templates/skills/business-analyse/steps/step-04b-analyze.md +163 -163
- package/templates/skills/business-analyse/steps/step-04c-decide.md +186 -186
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +840 -840
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +522 -522
- package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +703 -703
- package/templates/skills/business-analyse/steps/step-06-review.md +278 -278
- package/templates/skills/business-analyse/templates/tpl-frd.md +168 -168
- package/templates/skills/business-analyse/templates/tpl-handoff.md +186 -186
- package/templates/skills/business-analyse/templates/tpl-launch-displays.md +59 -59
- package/templates/skills/business-analyse/templates/tpl-progress.md +172 -172
- package/templates/skills/business-analyse/templates-frd.md +476 -476
- package/templates/skills/business-analyse/templates-react.md +574 -574
- package/templates/skills/cc-agent/SKILL.md +129 -129
- package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -95
- package/templates/skills/cc-agent/references/agent-frontmatter.md +213 -213
- package/templates/skills/cc-agent/references/permission-modes.md +102 -102
- package/templates/skills/cc-agent/references/tools-reference.md +144 -144
- package/templates/skills/cc-agent/steps/step-00-init.md +134 -134
- package/templates/skills/cc-agent/steps/step-01-design.md +186 -186
- package/templates/skills/cc-agent/steps/step-02-generate.md +131 -131
- package/templates/skills/cc-agent/steps/step-03-validate.md +130 -130
- package/templates/skills/cc-agent/templates/agent-categorized.md +67 -67
- package/templates/skills/cc-agent/templates/agent-standalone.md +56 -56
- package/templates/skills/cc-agent/templates/agent-with-skills.md +94 -94
- package/templates/skills/cc-audit/SKILL.md +108 -108
- package/templates/skills/cc-audit/references/agent-checklist.md +91 -91
- package/templates/skills/cc-audit/references/hook-checklist.md +110 -110
- package/templates/skills/cc-audit/references/skill-checklist.md +70 -70
- package/templates/skills/cc-audit/steps/step-00-init.md +98 -98
- package/templates/skills/cc-audit/steps/step-01-scan.md +142 -142
- package/templates/skills/cc-audit/steps/step-02-analyze.md +158 -158
- package/templates/skills/cc-audit/steps/step-03-report.md +142 -142
- package/templates/skills/cc-skill/SKILL.md +134 -134
- package/templates/skills/cc-skill/references/best-practices.md +167 -167
- package/templates/skills/cc-skill/references/frontmatter-reference.md +182 -182
- package/templates/skills/cc-skill/references/skill-patterns.md +199 -199
- package/templates/skills/cc-skill/steps/step-00-init.md +119 -119
- package/templates/skills/cc-skill/steps/step-01-design.md +199 -199
- package/templates/skills/cc-skill/steps/step-02-generate.md +145 -145
- package/templates/skills/cc-skill/steps/step-03-steps.md +151 -151
- package/templates/skills/cc-skill/steps/step-04-validate.md +124 -124
- package/templates/skills/cc-skill/templates/skill-forked.md +85 -85
- package/templates/skills/cc-skill/templates/skill-progressive.md +102 -102
- package/templates/skills/cc-skill/templates/skill-simple.md +75 -75
- package/templates/skills/cc-skill/templates/step-template.md +82 -82
- package/templates/skills/check-version/SKILL.md +196 -196
- package/templates/skills/controller/SKILL.md +162 -162
- package/templates/skills/controller/postman-templates.md +614 -614
- package/templates/skills/controller/references/controller-code-templates.md +159 -159
- package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -209
- package/templates/skills/controller/references/permission-sync-templates.md +149 -149
- package/templates/skills/controller/steps/step-00-init.md +193 -191
- package/templates/skills/controller/steps/step-01-analyze.md +146 -146
- package/templates/skills/controller/steps/step-02-plan.md +176 -176
- package/templates/skills/controller/steps/step-03-generate.md +189 -189
- package/templates/skills/controller/steps/step-04-perms.md +80 -80
- package/templates/skills/controller/steps/step-05-validate.md +107 -107
- package/templates/skills/controller/templates.md +1555 -1555
- package/templates/skills/debug/SKILL.md +70 -70
- package/templates/skills/debug/references/team-protocol.md +232 -232
- package/templates/skills/debug/steps/step-00-init.md +57 -57
- package/templates/skills/debug/steps/step-01-analyze.md +219 -219
- package/templates/skills/debug/steps/step-02-resolve.md +85 -85
- package/templates/skills/documentation/SKILL.md +132 -132
- package/templates/skills/documentation/data-schema.md +227 -227
- package/templates/skills/documentation/steps/step-00-init.md +70 -70
- package/templates/skills/documentation/steps/step-01-scan.md +113 -113
- package/templates/skills/documentation/steps/step-02-generate.md +231 -231
- package/templates/skills/documentation/steps/step-03-validate.md +251 -238
- package/templates/skills/documentation/templates.md +662 -663
- package/templates/skills/efcore/SKILL.md +168 -167
- package/templates/skills/efcore/references/both-contexts.md +32 -32
- package/templates/skills/efcore/references/database-operations.md +67 -67
- package/templates/skills/efcore/references/destructive-operations.md +38 -38
- package/templates/skills/efcore/references/reset-operations.md +81 -81
- package/templates/skills/efcore/references/seed-methods.md +86 -86
- package/templates/skills/efcore/references/shared-init-functions.md +250 -250
- package/templates/skills/efcore/references/sql-objects-injection.md +61 -61
- package/templates/skills/efcore/references/troubleshooting.md +81 -81
- package/templates/skills/efcore/references/zero-downtime-patterns.md +227 -227
- package/templates/skills/efcore/steps/db/step-deploy.md +217 -217
- package/templates/skills/efcore/steps/db/step-reset.md +186 -186
- package/templates/skills/efcore/steps/db/step-seed.md +166 -166
- package/templates/skills/efcore/steps/db/step-status.md +173 -173
- package/templates/skills/efcore/steps/migration/step-00-init.md +102 -102
- package/templates/skills/efcore/steps/migration/step-01-check.md +164 -164
- package/templates/skills/efcore/steps/migration/step-02-create.md +160 -160
- package/templates/skills/efcore/steps/migration/step-03-validate.md +168 -168
- package/templates/skills/efcore/steps/rebase-snapshot/step-00-init.md +173 -173
- package/templates/skills/efcore/steps/rebase-snapshot/step-01-backup.md +100 -100
- package/templates/skills/efcore/steps/rebase-snapshot/step-02-fetch.md +115 -115
- package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +112 -112
- package/templates/skills/efcore/steps/rebase-snapshot/step-04-validate.md +157 -157
- package/templates/skills/efcore/steps/shared/step-00-init.md +131 -131
- package/templates/skills/efcore/steps/squash/step-00-init.md +141 -141
- package/templates/skills/efcore/steps/squash/step-01-backup.md +120 -120
- package/templates/skills/efcore/steps/squash/step-02-fetch.md +168 -168
- package/templates/skills/efcore/steps/squash/step-03-create.md +184 -184
- package/templates/skills/efcore/steps/squash/step-04-validate.md +174 -174
- package/templates/skills/explore/SKILL.md +98 -98
- package/templates/skills/feature-full/SKILL.md +111 -111
- package/templates/skills/feature-full/steps/step-00-init.md +57 -57
- package/templates/skills/feature-full/steps/step-01-implementation.md +120 -120
- package/templates/skills/gitflow/SKILL.md +377 -377
- package/templates/skills/gitflow/_shared.md +620 -620
- package/templates/skills/gitflow/phases/abort.md +189 -189
- package/templates/skills/gitflow/phases/cleanup.md +234 -234
- package/templates/skills/gitflow/phases/status.md +192 -192
- package/templates/skills/gitflow/references/commit-message-generation.md +58 -58
- package/templates/skills/gitflow/references/commit-migration-validation.md +49 -49
- package/templates/skills/gitflow/references/finish-cleanup.md +55 -55
- package/templates/skills/gitflow/references/finish-version-bumping.md +45 -45
- package/templates/skills/gitflow/references/init-config-template.md +135 -135
- package/templates/skills/gitflow/references/init-environment-detection.md +41 -41
- package/templates/skills/gitflow/references/init-name-normalization.md +103 -103
- package/templates/skills/gitflow/references/init-questions.md +185 -185
- package/templates/skills/gitflow/references/init-structure-creation.md +75 -75
- package/templates/skills/gitflow/references/init-version-detection.md +21 -21
- package/templates/skills/gitflow/references/init-workspace-detection.md +43 -43
- package/templates/skills/gitflow/references/merge-ci-status.md +36 -36
- package/templates/skills/gitflow/references/merge-execution.md +62 -62
- package/templates/skills/gitflow/references/merge-pr-context.md +76 -76
- package/templates/skills/gitflow/references/plan-template.md +69 -69
- package/templates/skills/gitflow/references/pr-build-checks.md +60 -60
- package/templates/skills/gitflow/references/pr-generation.md +58 -58
- package/templates/skills/gitflow/references/start-branch-normalization.md +28 -28
- package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -70
- package/templates/skills/gitflow/references/start-local-config.md +113 -113
- package/templates/skills/gitflow/references/start-worktree-creation.md +50 -50
- package/templates/skills/gitflow/references/sync-push-verify.md +44 -44
- package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -38
- package/templates/skills/gitflow/steps/step-commit.md +199 -199
- package/templates/skills/gitflow/steps/step-finish.md +147 -147
- package/templates/skills/gitflow/steps/step-init.md +190 -190
- package/templates/skills/gitflow/steps/step-merge.md +85 -85
- package/templates/skills/gitflow/steps/step-plan.md +151 -151
- package/templates/skills/gitflow/steps/step-pr.md +199 -199
- package/templates/skills/gitflow/steps/step-start.md +195 -195
- package/templates/skills/gitflow/steps/step-sync.md +161 -161
- package/templates/skills/gitflow/templates/config.json +72 -72
- package/templates/skills/mcp/SKILL.md +62 -62
- package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -108
- package/templates/skills/mcp/steps/step-02-tools.md +73 -73
- package/templates/skills/notification/SKILL.md +173 -173
- package/templates/skills/quick-search/SKILL.md +99 -99
- package/templates/skills/ralph-loop/SKILL.md +234 -234
- package/templates/skills/ralph-loop/references/category-completeness.md +185 -185
- package/templates/skills/ralph-loop/references/category-rules.md +96 -96
- package/templates/skills/ralph-loop/references/compact-loop.md +300 -300
- package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -127
- package/templates/skills/ralph-loop/references/module-transition.md +151 -151
- package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -171
- package/templates/skills/ralph-loop/references/parallel-execution.md +246 -246
- package/templates/skills/ralph-loop/references/section-splitting.md +439 -439
- package/templates/skills/ralph-loop/references/task-transform-legacy.md +256 -256
- package/templates/skills/ralph-loop/references/team-orchestration.md +547 -547
- package/templates/skills/ralph-loop/steps/step-00-init.md +150 -150
- package/templates/skills/ralph-loop/steps/step-01-task.md +174 -174
- package/templates/skills/ralph-loop/steps/step-02-execute.md +177 -177
- package/templates/skills/ralph-loop/steps/step-03-commit.md +92 -92
- package/templates/skills/ralph-loop/steps/step-04-check.md +207 -207
- package/templates/skills/ralph-loop/steps/step-05-report.md +175 -175
- package/templates/skills/refactor/SKILL.md +56 -56
- package/templates/skills/refactor/steps/step-01-discover.md +60 -60
- package/templates/skills/refactor/steps/step-02-execute.md +67 -67
- package/templates/skills/review-code/SKILL.md +95 -94
- package/templates/skills/review-code/references/clean-code-principles.md +292 -292
- package/templates/skills/review-code/references/code-quality-metrics.md +174 -174
- package/templates/skills/review-code/references/feedback-patterns.md +149 -149
- package/templates/skills/review-code/references/owasp-api-top10.md +243 -243
- package/templates/skills/review-code/references/security-checklist.md +212 -212
- package/templates/skills/review-code/steps/step-01-smartstack.md +96 -96
- package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -80
- package/templates/skills/review-code/steps/step-03-react.md +44 -44
- package/templates/skills/ui-components/SKILL.md +137 -137
- package/templates/skills/ui-components/accessibility.md +170 -170
- package/templates/skills/ui-components/patterns/dashboard-chart.md +327 -327
- package/templates/skills/ui-components/patterns/data-table.md +39 -39
- package/templates/skills/ui-components/patterns/entity-card.md +77 -77
- package/templates/skills/ui-components/patterns/grid-layout.md +91 -91
- package/templates/skills/ui-components/patterns/kanban.md +43 -43
- package/templates/skills/ui-components/responsive-guidelines.md +278 -278
- package/templates/skills/ui-components/style-guide.md +113 -113
- package/templates/skills/utils/SKILL.md +44 -44
- package/templates/skills/utils/subcommands/test-web-config.md +152 -152
- package/templates/skills/utils/subcommands/test-web.md +123 -123
- package/templates/skills/validate/SKILL.md +181 -181
- package/templates/skills/validate-feature/SKILL.md +101 -101
- package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -140
- package/templates/skills/validate-feature/references/db-validation-checks.md +180 -180
- package/templates/skills/validate-feature/steps/step-00-dependencies.md +121 -121
- package/templates/skills/validate-feature/steps/step-01-compile.md +39 -39
- package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -45
- package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -53
- package/templates/skills/validate-feature/steps/step-04-api-smoke.md +94 -94
- package/templates/skills/validate-feature/steps/step-05-db-validation.md +149 -149
- package/templates/skills/workflow/SKILL.md +127 -127
- package/templates/skills/workflow/steps/step-00-init.md +57 -57
- package/templates/skills/workflow/steps/step-01-implementation.md +84 -84
- package/templates/test-web/api-health.json +38 -38
- package/templates/test-web/minimal.json +19 -19
- package/templates/test-web/npm-package.json +46 -46
- package/templates/test-web/seo-check.json +54 -54
|
@@ -1,620 +1,620 @@
|
|
|
1
|
-
# GitFlow - Shared Functions
|
|
2
|
-
|
|
3
|
-
> **Usage:** This file contains reusable functions. Reference with `{{REF:section_name}}` in other files.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## DETECT_PLATFORM
|
|
8
|
-
|
|
9
|
-
Detects the current platform (WSL, Windows, macOS, Linux) and shell environment.
|
|
10
|
-
Must be called before any path operations.
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
detect_platform() {
|
|
14
|
-
# WSL detection (highest priority - WSL reports as Linux but needs path translation)
|
|
15
|
-
if [ -f /proc/version ] && grep -qi "microsoft\|wsl" /proc/version 2>/dev/null; then
|
|
16
|
-
GF_PLATFORM="wsl"
|
|
17
|
-
GF_SHELL="bash"
|
|
18
|
-
elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "mingw"* ]] || [[ "$OSTYPE" == "cygwin" ]]; then
|
|
19
|
-
GF_PLATFORM="windows"
|
|
20
|
-
GF_SHELL="gitbash"
|
|
21
|
-
elif [[ -n "$WINDIR" ]] || [[ -n "$SystemRoot" ]]; then
|
|
22
|
-
GF_PLATFORM="windows"
|
|
23
|
-
GF_SHELL="powershell"
|
|
24
|
-
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
25
|
-
GF_PLATFORM="macos"
|
|
26
|
-
GF_SHELL="zsh"
|
|
27
|
-
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
28
|
-
GF_PLATFORM="linux"
|
|
29
|
-
GF_SHELL="bash"
|
|
30
|
-
else
|
|
31
|
-
GF_PLATFORM="unknown"
|
|
32
|
-
GF_SHELL="bash"
|
|
33
|
-
fi
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## NORMALIZE_PATH
|
|
40
|
-
|
|
41
|
-
Path translation functions for cross-platform compatibility (Windows ↔ WSL ↔ POSIX).
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# Translates a path to the format expected by the CURRENT platform
|
|
45
|
-
normalize_path_for_platform() {
|
|
46
|
-
local input_path="$1"
|
|
47
|
-
case "$GF_PLATFORM" in
|
|
48
|
-
wsl)
|
|
49
|
-
# Windows path → WSL path: D:\foo\bar or D:/foo/bar → /mnt/d/foo/bar
|
|
50
|
-
if [[ "$input_path" =~ ^[A-Za-z]:[\\/] ]]; then
|
|
51
|
-
local drive=$(echo "${input_path:0:1}" | tr '[:upper:]' '[:lower:]')
|
|
52
|
-
local rest="${input_path:2}"
|
|
53
|
-
rest="${rest//\\//}"
|
|
54
|
-
echo "/mnt/$drive$rest"
|
|
55
|
-
else
|
|
56
|
-
echo "$input_path"
|
|
57
|
-
fi
|
|
58
|
-
;;
|
|
59
|
-
*)
|
|
60
|
-
# WSL path → Windows path: /mnt/d/foo → D:/foo
|
|
61
|
-
if [[ "$input_path" =~ ^/mnt/([a-z])/(.*) ]]; then
|
|
62
|
-
local drive=$(echo "${BASH_REMATCH[1]}" | tr '[:lower:]' '[:upper:]')
|
|
63
|
-
echo "${drive}:/${BASH_REMATCH[2]}"
|
|
64
|
-
else
|
|
65
|
-
# Normalize backslashes to forward slashes
|
|
66
|
-
echo "${input_path//\\//}"
|
|
67
|
-
fi
|
|
68
|
-
;;
|
|
69
|
-
esac
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
# Translates a path to storage-neutral format for config.json (forward slashes, drive letter)
|
|
73
|
-
# Always converts WSL paths to Windows-style, regardless of current platform
|
|
74
|
-
normalize_path_for_storage() {
|
|
75
|
-
local input_path="$1"
|
|
76
|
-
# WSL path → Windows-style: /mnt/d/foo → D:/foo (always, regardless of platform)
|
|
77
|
-
if [[ "$input_path" =~ ^/mnt/([a-z])/(.*) ]]; then
|
|
78
|
-
local drive=$(echo "${BASH_REMATCH[1]}" | tr '[:lower:]' '[:upper:]')
|
|
79
|
-
echo "${drive}:/${BASH_REMATCH[2]}"
|
|
80
|
-
elif [[ "$input_path" =~ ^[A-Za-z]:[\\/] ]]; then
|
|
81
|
-
# Normalize backslashes only
|
|
82
|
-
echo "${input_path//\\//}"
|
|
83
|
-
else
|
|
84
|
-
echo "$input_path"
|
|
85
|
-
fi
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
# Returns current directory in platform-appropriate format
|
|
89
|
-
get_current_dir() {
|
|
90
|
-
local raw_pwd
|
|
91
|
-
raw_pwd="$(pwd)"
|
|
92
|
-
normalize_path_for_platform "$raw_pwd"
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## DETECT_PROVIDER
|
|
99
|
-
|
|
100
|
-
Detects GitHub or Azure DevOps from remote URL.
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
detect_git_provider() {
|
|
104
|
-
REMOTE_URL=$(git remote get-url origin 2>/dev/null || echo "")
|
|
105
|
-
|
|
106
|
-
if [[ "$REMOTE_URL" == *"dev.azure.com"* ]] || [[ "$REMOTE_URL" == *"visualstudio.com"* ]]; then
|
|
107
|
-
GIT_PROVIDER="azuredevops"
|
|
108
|
-
[[ "$REMOTE_URL" =~ dev\.azure\.com/([^/]+)/([^/]+)/_git/([^/]+) ]] && {
|
|
109
|
-
AZURE_ORG="${BASH_REMATCH[1]}"
|
|
110
|
-
AZURE_PROJECT="${BASH_REMATCH[2]}"
|
|
111
|
-
AZURE_REPO="${BASH_REMATCH[3]}"
|
|
112
|
-
}
|
|
113
|
-
elif [[ "$REMOTE_URL" == *"github.com"* ]]; then
|
|
114
|
-
GIT_PROVIDER="github"
|
|
115
|
-
else
|
|
116
|
-
GIT_PROVIDER="unknown"
|
|
117
|
-
fi
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
## NORMALIZE_NAME
|
|
124
|
-
|
|
125
|
-
Normalizes a branch name (accents, spaces, special characters).
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
normalize_branch_name() {
|
|
129
|
-
local input="$1" max_length="${2:-50}"
|
|
130
|
-
echo "$input" | tr '[:upper:]' '[:lower:]' | \
|
|
131
|
-
sed 'y/àâäéèêëïîôùûüçœæ/aaaeeeeiioouucoa/' | \
|
|
132
|
-
sed "s/[ _']/-/g" | sed 's/[^a-z0-9-]//g' | \
|
|
133
|
-
sed 's/--*/-/g' | sed 's/^-//;s/-$//' | cut -c1-$max_length | sed 's/-$//'
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## RESOLVE_CONFIG_PATH
|
|
140
|
-
|
|
141
|
-
Resolves the config.json path regardless of current working directory.
|
|
142
|
-
Searches in: pwd, develop worktree, then git root.
|
|
143
|
-
|
|
144
|
-
```bash
|
|
145
|
-
resolve_gitflow_config_path() {
|
|
146
|
-
# Ensure git is accessible (cross-platform worktree repair)
|
|
147
|
-
preflight_git_check 2>/dev/null
|
|
148
|
-
|
|
149
|
-
# 1. Try current directory
|
|
150
|
-
[ -f ".claude/gitflow/config.json" ] && { echo ".claude/gitflow/config.json"; return 0; }
|
|
151
|
-
|
|
152
|
-
# 2. Try to find develop worktree from git worktree list
|
|
153
|
-
local DEVELOP_PATH
|
|
154
|
-
DEVELOP_PATH=$(git worktree list --porcelain 2>/dev/null | grep -A1 "branch refs/heads/develop" | grep "^worktree " | sed 's/^worktree //')
|
|
155
|
-
[ -n "$DEVELOP_PATH" ] && [ -f "$DEVELOP_PATH/.claude/gitflow/config.json" ] && {
|
|
156
|
-
echo "$DEVELOP_PATH/.claude/gitflow/config.json"
|
|
157
|
-
return 0
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
# 3. Try git toplevel
|
|
161
|
-
local GIT_ROOT
|
|
162
|
-
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
163
|
-
[ -n "$GIT_ROOT" ] && [ -f "$GIT_ROOT/.claude/gitflow/config.json" ] && {
|
|
164
|
-
echo "$GIT_ROOT/.claude/gitflow/config.json"
|
|
165
|
-
return 0
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
return 1
|
|
169
|
-
}
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
## READ_GITFLOW_CONFIG
|
|
175
|
-
|
|
176
|
-
Reads GitFlow configuration from config.json. Exposes all variables needed by steps and phases.
|
|
177
|
-
|
|
178
|
-
```bash
|
|
179
|
-
read_gitflow_config() {
|
|
180
|
-
# Detect platform first (needed for path translation)
|
|
181
|
-
detect_platform
|
|
182
|
-
|
|
183
|
-
local CONFIG_FILE
|
|
184
|
-
CONFIG_FILE=$(resolve_gitflow_config_path) || {
|
|
185
|
-
echo "❌ GitFlow config not found. Run /gitflow init first."
|
|
186
|
-
return 1
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
# Config version
|
|
190
|
-
GF_CONFIG_VERSION=$(grep -oP '"version":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
191
|
-
|
|
192
|
-
# Repository
|
|
193
|
-
GF_PROJECT_NAME=$(grep -oP '"name":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
194
|
-
GF_ROOT_FOLDER=$(grep -oP '"rootFolder":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
195
|
-
GF_REMOTE_URL=$(grep -oP '"remoteUrl":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
196
|
-
|
|
197
|
-
# Git provider and branches
|
|
198
|
-
GF_PROVIDER=$(grep -oP '"provider":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
199
|
-
GF_MAIN_BRANCH=$(grep -oP '"main":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
200
|
-
GF_DEVELOP_BRANCH=$(grep -oP '"develop":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
201
|
-
|
|
202
|
-
# Prefixes
|
|
203
|
-
GF_FEATURE_PREFIX=$(grep -oP '"feature":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
204
|
-
GF_RELEASE_PREFIX=$(grep -oP '"release":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
205
|
-
GF_HOTFIX_PREFIX=$(grep -oP '"hotfix":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
206
|
-
|
|
207
|
-
# Worktrees
|
|
208
|
-
GF_WORKTREE_MODE=$(grep -oP '"mode":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
209
|
-
GF_MAIN_PATH=$(grep -A1 '"structure"' "$CONFIG_FILE" | grep -oP '"main":\s*"\K[^"]+' | head -1)
|
|
210
|
-
GF_DEVELOP_PATH=$(grep -A2 '"structure"' "$CONFIG_FILE" | grep -oP '"develop":\s*"\K[^"]+' | head -1)
|
|
211
|
-
GF_FEATURES_PATH=$(grep -oP '"features":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
212
|
-
GF_RELEASES_PATH=$(grep -oP '"releases":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
213
|
-
GF_HOTFIXES_PATH=$(grep -oP '"hotfixes":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
214
|
-
|
|
215
|
-
# Language
|
|
216
|
-
GF_LANG=$(grep -oP '"code":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
217
|
-
|
|
218
|
-
# Versioning
|
|
219
|
-
GF_VERSION=$(grep -oP '"current":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
220
|
-
GF_TAG_PREFIX=$(grep -oP '"tagPrefix":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
221
|
-
|
|
222
|
-
# Platform (v2.1.0+, optional)
|
|
223
|
-
GF_CONFIG_PLATFORM=$(grep -oP '"detected":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
224
|
-
GF_CONFIG_PLATFORM=${GF_CONFIG_PLATFORM:-$GF_PLATFORM}
|
|
225
|
-
|
|
226
|
-
# Workspace (v2.1.0+, optional)
|
|
227
|
-
GF_WORKSPACE_PATH=$(grep -A1 '"workspace"' "$CONFIG_FILE" | grep -oP '"path":\s*"\K[^"]+' | head -1)
|
|
228
|
-
GF_WORKSPACE_NAME=$(grep -A2 '"workspace"' "$CONFIG_FILE" | grep -oP '"name":\s*"\K[^"]+' | head -1)
|
|
229
|
-
|
|
230
|
-
# Defaults for missing values
|
|
231
|
-
GF_LANG=${GF_LANG:-en}
|
|
232
|
-
GF_WORKTREE_MODE=${GF_WORKTREE_MODE:-organized}
|
|
233
|
-
GF_MAIN_BRANCH=${GF_MAIN_BRANCH:-main}
|
|
234
|
-
GF_DEVELOP_BRANCH=${GF_DEVELOP_BRANCH:-develop}
|
|
235
|
-
GF_FEATURE_PREFIX=${GF_FEATURE_PREFIX:-feature/}
|
|
236
|
-
GF_RELEASE_PREFIX=${GF_RELEASE_PREFIX:-release/}
|
|
237
|
-
GF_HOTFIX_PREFIX=${GF_HOTFIX_PREFIX:-hotfix/}
|
|
238
|
-
GF_TAG_PREFIX=${GF_TAG_PREFIX:-v}
|
|
239
|
-
GF_VERSION=${GF_VERSION:-0.1.0}
|
|
240
|
-
|
|
241
|
-
# Translate all stored paths to current platform format
|
|
242
|
-
# This ensures WSL paths are /mnt/d/... and Windows paths use forward slashes
|
|
243
|
-
GF_ROOT_FOLDER=$(normalize_path_for_platform "$GF_ROOT_FOLDER")
|
|
244
|
-
GF_MAIN_PATH=$(normalize_path_for_platform "$GF_MAIN_PATH")
|
|
245
|
-
GF_DEVELOP_PATH=$(normalize_path_for_platform "$GF_DEVELOP_PATH")
|
|
246
|
-
GF_FEATURES_PATH=$(normalize_path_for_platform "$GF_FEATURES_PATH")
|
|
247
|
-
GF_RELEASES_PATH=$(normalize_path_for_platform "$GF_RELEASES_PATH")
|
|
248
|
-
GF_HOTFIXES_PATH=$(normalize_path_for_platform "$GF_HOTFIXES_PATH")
|
|
249
|
-
[ -n "$GF_WORKSPACE_PATH" ] && GF_WORKSPACE_PATH=$(normalize_path_for_platform "$GF_WORKSPACE_PATH")
|
|
250
|
-
|
|
251
|
-
# Export config file path for steps that need to update it
|
|
252
|
-
GF_CONFIG_FILE="$CONFIG_FILE"
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## DETECT_WORKTREE_MODE
|
|
259
|
-
|
|
260
|
-
Detects worktree mode. Reads config first, falls back to filesystem detection.
|
|
261
|
-
|
|
262
|
-
```bash
|
|
263
|
-
detect_worktree_mode() {
|
|
264
|
-
# 1. Try config first (authoritative)
|
|
265
|
-
local CONFIG_FILE
|
|
266
|
-
CONFIG_FILE=$(resolve_gitflow_config_path 2>/dev/null)
|
|
267
|
-
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
|
|
268
|
-
WORKTREE_MODE=$(grep -oP '"mode":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
269
|
-
[ -n "$WORKTREE_MODE" ] && return 0
|
|
270
|
-
fi
|
|
271
|
-
|
|
272
|
-
# 2. Fallback: filesystem detection
|
|
273
|
-
if [ -d "../features" ] && [ -d "../releases" ] && [ -d "../hotfixes" ]; then
|
|
274
|
-
WORKTREE_MODE="organized"
|
|
275
|
-
elif [ -d "../01-Main" ] && [ -d "../02-Develop" ]; then
|
|
276
|
-
WORKTREE_MODE="organized"
|
|
277
|
-
elif [ -d "../worktrees" ]; then
|
|
278
|
-
WORKTREE_MODE="adjacent"
|
|
279
|
-
else
|
|
280
|
-
WORKTREE_MODE="organized"
|
|
281
|
-
fi
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## CLEANUP_WORKTREE
|
|
288
|
-
|
|
289
|
-
Cleans up a worktree for a given branch. Uses config paths when available.
|
|
290
|
-
|
|
291
|
-
```bash
|
|
292
|
-
cleanup_worktree_for_branch() {
|
|
293
|
-
local BRANCH=$1 WORKTREE_PATH=""
|
|
294
|
-
|
|
295
|
-
# Try config-based paths first (absolute, reliable)
|
|
296
|
-
read_gitflow_config 2>/dev/null
|
|
297
|
-
if [ -n "$GF_FEATURES_PATH" ]; then
|
|
298
|
-
case "$BRANCH" in
|
|
299
|
-
feature/*) WORKTREE_PATH="$GF_FEATURES_PATH/${BRANCH#feature/}" ;;
|
|
300
|
-
release/*) WORKTREE_PATH="$GF_RELEASES_PATH/${BRANCH#release/}" ;;
|
|
301
|
-
hotfix/*) WORKTREE_PATH="$GF_HOTFIXES_PATH/${BRANCH#hotfix/}" ;;
|
|
302
|
-
esac
|
|
303
|
-
else
|
|
304
|
-
# Fallback: relative paths
|
|
305
|
-
case "$BRANCH" in
|
|
306
|
-
feature/*) WORKTREE_PATH="../features/${BRANCH#feature/}" ;;
|
|
307
|
-
release/*) WORKTREE_PATH="../releases/${BRANCH#release/}" ;;
|
|
308
|
-
hotfix/*) WORKTREE_PATH="../hotfixes/${BRANCH#hotfix/}" ;;
|
|
309
|
-
esac
|
|
310
|
-
fi
|
|
311
|
-
|
|
312
|
-
[ -n "$WORKTREE_PATH" ] && [ -d "$WORKTREE_PATH" ] && {
|
|
313
|
-
git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || rm -rf "$WORKTREE_PATH"
|
|
314
|
-
git worktree prune
|
|
315
|
-
echo "✓ Worktree cleaned: $WORKTREE_PATH"
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## VALIDATE_WORKTREE_PATH
|
|
323
|
-
|
|
324
|
-
Validates that a worktree path follows config conventions. Only `01-Main` and `02-Develop` may use numbered prefixes. All other worktrees (features, releases, hotfixes) MUST use config paths (`features/{name}`, `releases/v{version}`, `hotfixes/{name}`).
|
|
325
|
-
|
|
326
|
-
```bash
|
|
327
|
-
validate_worktree_path() {
|
|
328
|
-
local WORKTREE_PATH="$1"
|
|
329
|
-
local BASENAME=$(basename "$WORKTREE_PATH")
|
|
330
|
-
|
|
331
|
-
# Only 01-Main and 02-Develop may use numbered prefixes
|
|
332
|
-
if [[ "$BASENAME" =~ ^[0-9]{2}- ]] && [[ "$BASENAME" != "01-Main" ]] && [[ "$BASENAME" != "02-Develop" ]]; then
|
|
333
|
-
echo "ERROR: Invalid numbered worktree directory: $BASENAME"
|
|
334
|
-
echo " Path: $WORKTREE_PATH"
|
|
335
|
-
echo " FORBIDDEN: Numbered directories like 03-Release, 04-Feature, 05-Hotfix"
|
|
336
|
-
echo " REQUIRED: Use config paths → features/{name}, releases/v{version}, hotfixes/{name}"
|
|
337
|
-
return 1
|
|
338
|
-
fi
|
|
339
|
-
return 0
|
|
340
|
-
}
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
## REPAIR_WORKTREE_PATHS
|
|
346
|
-
|
|
347
|
-
Converts worktree metadata paths to **relative paths** for cross-platform compatibility (Windows + WSL).
|
|
348
|
-
Absolute paths (Windows `D:/...` or POSIX `/mnt/d/...`) break when switching environments.
|
|
349
|
-
Relative paths work everywhere without repair.
|
|
350
|
-
|
|
351
|
-
Scans `.bare/worktrees/*/gitdir` and the corresponding `{worktree}/.git` files.
|
|
352
|
-
|
|
353
|
-
```bash
|
|
354
|
-
repair_worktree_paths() {
|
|
355
|
-
local BARE_DIR="$1" # Path to .bare directory
|
|
356
|
-
local WORKTREES_DIR="$BARE_DIR/worktrees"
|
|
357
|
-
[ ! -d "$WORKTREES_DIR" ] && return 0
|
|
358
|
-
|
|
359
|
-
local REPAIRED=0
|
|
360
|
-
for wt_dir in "$WORKTREES_DIR"/*/; do
|
|
361
|
-
[ ! -d "$wt_dir" ] && continue
|
|
362
|
-
local wt_name=$(basename "$wt_dir")
|
|
363
|
-
local gitdir_file="$wt_dir/gitdir"
|
|
364
|
-
[ ! -f "$gitdir_file" ] && continue
|
|
365
|
-
|
|
366
|
-
# Read stored path (may be Windows absolute, POSIX absolute, or already relative)
|
|
367
|
-
local stored_path=$(cat "$gitdir_file" | tr -d '\n\r')
|
|
368
|
-
|
|
369
|
-
# Resolve to current platform absolute path for realpath computation
|
|
370
|
-
local resolved_path="$stored_path"
|
|
371
|
-
local is_abs=false
|
|
372
|
-
if [[ "$stored_path" =~ ^[A-Za-z]:[\\/] ]]; then
|
|
373
|
-
is_abs=true
|
|
374
|
-
resolved_path=$(normalize_path_for_platform "$stored_path")
|
|
375
|
-
elif [[ "$stored_path" =~ ^/ ]]; then
|
|
376
|
-
is_abs=true
|
|
377
|
-
resolved_path=$(normalize_path_for_platform "$stored_path")
|
|
378
|
-
fi
|
|
379
|
-
if [ "$is_abs" = "false" ]; then
|
|
380
|
-
# Already relative - resolve from gitdir_file location to get absolute
|
|
381
|
-
resolved_path=$(realpath -m "$wt_dir/$stored_path")
|
|
382
|
-
fi
|
|
383
|
-
|
|
384
|
-
# Get worktree real directory (parent of .git file)
|
|
385
|
-
local wt_real_dir=$(dirname "$resolved_path")
|
|
386
|
-
[ ! -d "$wt_real_dir" ] && continue
|
|
387
|
-
|
|
388
|
-
# Compute relative path: .bare/worktrees/{name}/ → worktree/.git
|
|
389
|
-
local bare_wt_abs=$(realpath -m "$wt_dir")
|
|
390
|
-
local wt_abs=$(realpath -m "$wt_real_dir")
|
|
391
|
-
local rel_gitdir=$(realpath -m --relative-to="$bare_wt_abs" "$wt_abs/.git")
|
|
392
|
-
|
|
393
|
-
if [ "$stored_path" != "$rel_gitdir" ]; then
|
|
394
|
-
printf '%s\n' "$rel_gitdir" > "$gitdir_file"
|
|
395
|
-
echo "REPAIRED: $wt_name/gitdir → $rel_gitdir"
|
|
396
|
-
REPAIRED=$((REPAIRED + 1))
|
|
397
|
-
fi
|
|
398
|
-
|
|
399
|
-
# Fix the worktree's .git pseudo-file → relative path to .bare/worktrees/{name}
|
|
400
|
-
if [ -f "$wt_real_dir/.git" ]; then
|
|
401
|
-
local git_content=$(cat "$wt_real_dir/.git" | tr -d '\n\r')
|
|
402
|
-
local git_path="${git_content#gitdir: }"
|
|
403
|
-
local rel_bare=$(realpath -m --relative-to="$wt_abs" "$bare_wt_abs")
|
|
404
|
-
|
|
405
|
-
if [ "$git_path" != "$rel_bare" ]; then
|
|
406
|
-
printf 'gitdir: %s\n' "$rel_bare" > "$wt_real_dir/.git"
|
|
407
|
-
echo "REPAIRED: $wt_name/.git → $rel_bare"
|
|
408
|
-
REPAIRED=$((REPAIRED + 1))
|
|
409
|
-
fi
|
|
410
|
-
fi
|
|
411
|
-
done
|
|
412
|
-
|
|
413
|
-
[ "$REPAIRED" -gt 0 ] && echo "Worktree paths: $REPAIRED file(s) repaired"
|
|
414
|
-
}
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
---
|
|
418
|
-
|
|
419
|
-
## PREFLIGHT_GIT_CHECK
|
|
420
|
-
|
|
421
|
-
Lightweight check to ensure git is accessible in the current worktree. If git fails (cross-platform path issue), locates `.bare` and calls `repair_worktree_paths`. Must be called before any git operation in agents that may run in worktrees created from a different environment (Windows vs WSL).
|
|
422
|
-
|
|
423
|
-
```bash
|
|
424
|
-
preflight_git_check() {
|
|
425
|
-
# Quick test: if git works, nothing to do
|
|
426
|
-
git rev-parse --git-dir >/dev/null 2>&1 && return 0
|
|
427
|
-
|
|
428
|
-
echo "Git inaccessible — attempting worktree path repair..."
|
|
429
|
-
|
|
430
|
-
# Find .bare directory by walking up
|
|
431
|
-
local BARE_DIR=""
|
|
432
|
-
local DIR="$(pwd)"
|
|
433
|
-
while [ "$DIR" != "/" ]; do
|
|
434
|
-
[ -d "$DIR/.bare" ] && { BARE_DIR="$DIR/.bare"; break; }
|
|
435
|
-
DIR=$(dirname "$DIR")
|
|
436
|
-
done
|
|
437
|
-
|
|
438
|
-
if [ -z "$BARE_DIR" ]; then
|
|
439
|
-
echo "ERROR: No .bare directory found. Not a GitFlow worktree."
|
|
440
|
-
return 1
|
|
441
|
-
fi
|
|
442
|
-
|
|
443
|
-
# Ensure platform is detected
|
|
444
|
-
[ -z "$GF_PLATFORM" ] && detect_platform
|
|
445
|
-
|
|
446
|
-
# Repair all worktree paths to relative format
|
|
447
|
-
repair_worktree_paths "$BARE_DIR"
|
|
448
|
-
|
|
449
|
-
# Verify repair
|
|
450
|
-
if git rev-parse --git-dir >/dev/null 2>&1; then
|
|
451
|
-
echo "Worktree paths repaired successfully."
|
|
452
|
-
return 0
|
|
453
|
-
else
|
|
454
|
-
echo "ERROR: Worktree repair failed. Run /gitflow init to reconfigure."
|
|
455
|
-
return 1
|
|
456
|
-
fi
|
|
457
|
-
}
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
---
|
|
461
|
-
|
|
462
|
-
## RESOLVE_WORKSPACE
|
|
463
|
-
|
|
464
|
-
Resolves the workspace JSON file by walking up the directory tree.
|
|
465
|
-
|
|
466
|
-
```bash
|
|
467
|
-
resolve_workspace_path() {
|
|
468
|
-
local dir="$(pwd)"
|
|
469
|
-
while [ "$dir" != "/" ] && [ "$dir" != "." ]; do
|
|
470
|
-
[ -f "$dir/.smartstack-workspace.json" ] && {
|
|
471
|
-
echo "$dir/.smartstack-workspace.json"
|
|
472
|
-
return 0
|
|
473
|
-
}
|
|
474
|
-
dir=$(dirname "$dir")
|
|
475
|
-
done
|
|
476
|
-
return 1
|
|
477
|
-
}
|
|
478
|
-
```
|
|
479
|
-
|
|
480
|
-
---
|
|
481
|
-
|
|
482
|
-
## SYNC_REMOTE
|
|
483
|
-
|
|
484
|
-
Syncs with remote and displays status.
|
|
485
|
-
|
|
486
|
-
```bash
|
|
487
|
-
sync_with_remote() {
|
|
488
|
-
git fetch --all --quiet
|
|
489
|
-
local BRANCH=$(git branch --show-current)
|
|
490
|
-
local AHEAD=$(git rev-list --count origin/$BRANCH..HEAD 2>/dev/null || echo "0")
|
|
491
|
-
local BEHIND=$(git rev-list --count HEAD..origin/$BRANCH 2>/dev/null || echo "0")
|
|
492
|
-
|
|
493
|
-
[ "$BEHIND" -gt 0 ] && echo "⚠️ $BRANCH: $BEHIND commit(s) behind"
|
|
494
|
-
[ "$AHEAD" -gt 0 ] && echo "ℹ️ $BRANCH: $AHEAD commit(s) not pushed"
|
|
495
|
-
}
|
|
496
|
-
```
|
|
497
|
-
|
|
498
|
-
---
|
|
499
|
-
|
|
500
|
-
## CONFIG_TEMPLATE
|
|
501
|
-
|
|
502
|
-
GitFlow configuration JSON template v2.1.0 (aligned with `templates/config.json`).
|
|
503
|
-
|
|
504
|
-
```json
|
|
505
|
-
{
|
|
506
|
-
"version": "2.1.0",
|
|
507
|
-
"platform": {
|
|
508
|
-
"detected": "",
|
|
509
|
-
"shell": "",
|
|
510
|
-
"detectedAt": ""
|
|
511
|
-
},
|
|
512
|
-
"workspace": {
|
|
513
|
-
"path": "",
|
|
514
|
-
"name": ""
|
|
515
|
-
},
|
|
516
|
-
"repository": {
|
|
517
|
-
"name": "",
|
|
518
|
-
"rootFolder": "",
|
|
519
|
-
"nameVariants": {
|
|
520
|
-
"pascalCaseDot": "",
|
|
521
|
-
"pascalCase": "",
|
|
522
|
-
"kebabCase": "",
|
|
523
|
-
"snakeCase": "",
|
|
524
|
-
"displayName": ""
|
|
525
|
-
},
|
|
526
|
-
"defaultBranch": "main",
|
|
527
|
-
"remoteUrl": ""
|
|
528
|
-
},
|
|
529
|
-
"git": {
|
|
530
|
-
"provider": "",
|
|
531
|
-
"branches": {
|
|
532
|
-
"main": "main",
|
|
533
|
-
"develop": "develop"
|
|
534
|
-
},
|
|
535
|
-
"prefixes": {
|
|
536
|
-
"feature": "feature/",
|
|
537
|
-
"release": "release/",
|
|
538
|
-
"hotfix": "hotfix/"
|
|
539
|
-
}
|
|
540
|
-
},
|
|
541
|
-
"worktrees": {
|
|
542
|
-
"enabled": true,
|
|
543
|
-
"mode": "organized",
|
|
544
|
-
"structure": {
|
|
545
|
-
"main": "",
|
|
546
|
-
"develop": "",
|
|
547
|
-
"features": "",
|
|
548
|
-
"releases": "",
|
|
549
|
-
"hotfixes": ""
|
|
550
|
-
}
|
|
551
|
-
},
|
|
552
|
-
"versioning": {
|
|
553
|
-
"strategy": "semver",
|
|
554
|
-
"current": "0.1.0",
|
|
555
|
-
"tagPrefix": "v",
|
|
556
|
-
"sources": ["csproj", "package.json", "VERSION"]
|
|
557
|
-
},
|
|
558
|
-
"efcore": {
|
|
559
|
-
"enabled": true,
|
|
560
|
-
"validateOnCommit": true,
|
|
561
|
-
"blockDestructive": true,
|
|
562
|
-
"migrationNaming": "{context}_v{version}_{sequence}_{Description}",
|
|
563
|
-
"migrationNamingSquash": "{context}_v{version}",
|
|
564
|
-
"squashBeforePR": true
|
|
565
|
-
},
|
|
566
|
-
"workflow": {
|
|
567
|
-
"push": {
|
|
568
|
-
"afterCommit": "worktree"
|
|
569
|
-
},
|
|
570
|
-
"pr": {
|
|
571
|
-
"autoLabels": true,
|
|
572
|
-
"requireReview": true
|
|
573
|
-
}
|
|
574
|
-
},
|
|
575
|
-
"language": {
|
|
576
|
-
"code": "en"
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
**worktrees.mode options:**
|
|
582
|
-
- `organized`: Uses absolute paths from config (`structure.features`, etc.)
|
|
583
|
-
- `adjacent`: `{rootFolder}/worktrees/{type}/`
|
|
584
|
-
- `disabled`: No worktrees
|
|
585
|
-
|
|
586
|
-
---
|
|
587
|
-
|
|
588
|
-
## PR_COMMANDS
|
|
589
|
-
|
|
590
|
-
PR commands by provider.
|
|
591
|
-
|
|
592
|
-
### GitHub
|
|
593
|
-
```bash
|
|
594
|
-
gh pr create --title "$TITLE" --body "$BODY" --base "$BASE"
|
|
595
|
-
gh pr view $NUMBER --json state,mergeable,reviews
|
|
596
|
-
gh pr merge $NUMBER --squash --delete-branch
|
|
597
|
-
```
|
|
598
|
-
|
|
599
|
-
### Azure DevOps
|
|
600
|
-
```bash
|
|
601
|
-
az repos pr create --title "$TITLE" --description "$BODY" --source-branch "$SOURCE" --target-branch "$BASE"
|
|
602
|
-
az repos pr show --id $NUMBER --query "{status:status,mergeStatus:mergeStatus}"
|
|
603
|
-
az repos pr update --id $NUMBER --status completed --squash true --delete-source-branch true
|
|
604
|
-
```
|
|
605
|
-
|
|
606
|
-
---
|
|
607
|
-
|
|
608
|
-
## OUTPUT_FORMAT
|
|
609
|
-
|
|
610
|
-
Standard output format (replaces ASCII art).
|
|
611
|
-
|
|
612
|
-
```bash
|
|
613
|
-
output_header() { echo -e "\n## $1\n"; }
|
|
614
|
-
output_section() { echo "### $1"; }
|
|
615
|
-
output_item() { echo "- $1"; }
|
|
616
|
-
output_success() { echo "✓ $1"; }
|
|
617
|
-
output_warning() { echo "⚠️ $1"; }
|
|
618
|
-
output_error() { echo "❌ $1"; }
|
|
619
|
-
output_next() { echo "→ Next: $1"; }
|
|
620
|
-
```
|
|
1
|
+
# GitFlow - Shared Functions
|
|
2
|
+
|
|
3
|
+
> **Usage:** This file contains reusable functions. Reference with `{{REF:section_name}}` in other files.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## DETECT_PLATFORM
|
|
8
|
+
|
|
9
|
+
Detects the current platform (WSL, Windows, macOS, Linux) and shell environment.
|
|
10
|
+
Must be called before any path operations.
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
detect_platform() {
|
|
14
|
+
# WSL detection (highest priority - WSL reports as Linux but needs path translation)
|
|
15
|
+
if [ -f /proc/version ] && grep -qi "microsoft\|wsl" /proc/version 2>/dev/null; then
|
|
16
|
+
GF_PLATFORM="wsl"
|
|
17
|
+
GF_SHELL="bash"
|
|
18
|
+
elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "mingw"* ]] || [[ "$OSTYPE" == "cygwin" ]]; then
|
|
19
|
+
GF_PLATFORM="windows"
|
|
20
|
+
GF_SHELL="gitbash"
|
|
21
|
+
elif [[ -n "$WINDIR" ]] || [[ -n "$SystemRoot" ]]; then
|
|
22
|
+
GF_PLATFORM="windows"
|
|
23
|
+
GF_SHELL="powershell"
|
|
24
|
+
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
|
25
|
+
GF_PLATFORM="macos"
|
|
26
|
+
GF_SHELL="zsh"
|
|
27
|
+
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
|
28
|
+
GF_PLATFORM="linux"
|
|
29
|
+
GF_SHELL="bash"
|
|
30
|
+
else
|
|
31
|
+
GF_PLATFORM="unknown"
|
|
32
|
+
GF_SHELL="bash"
|
|
33
|
+
fi
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## NORMALIZE_PATH
|
|
40
|
+
|
|
41
|
+
Path translation functions for cross-platform compatibility (Windows ↔ WSL ↔ POSIX).
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Translates a path to the format expected by the CURRENT platform
|
|
45
|
+
normalize_path_for_platform() {
|
|
46
|
+
local input_path="$1"
|
|
47
|
+
case "$GF_PLATFORM" in
|
|
48
|
+
wsl)
|
|
49
|
+
# Windows path → WSL path: D:\foo\bar or D:/foo/bar → /mnt/d/foo/bar
|
|
50
|
+
if [[ "$input_path" =~ ^[A-Za-z]:[\\/] ]]; then
|
|
51
|
+
local drive=$(echo "${input_path:0:1}" | tr '[:upper:]' '[:lower:]')
|
|
52
|
+
local rest="${input_path:2}"
|
|
53
|
+
rest="${rest//\\//}"
|
|
54
|
+
echo "/mnt/$drive$rest"
|
|
55
|
+
else
|
|
56
|
+
echo "$input_path"
|
|
57
|
+
fi
|
|
58
|
+
;;
|
|
59
|
+
*)
|
|
60
|
+
# WSL path → Windows path: /mnt/d/foo → D:/foo
|
|
61
|
+
if [[ "$input_path" =~ ^/mnt/([a-z])/(.*) ]]; then
|
|
62
|
+
local drive=$(echo "${BASH_REMATCH[1]}" | tr '[:lower:]' '[:upper:]')
|
|
63
|
+
echo "${drive}:/${BASH_REMATCH[2]}"
|
|
64
|
+
else
|
|
65
|
+
# Normalize backslashes to forward slashes
|
|
66
|
+
echo "${input_path//\\//}"
|
|
67
|
+
fi
|
|
68
|
+
;;
|
|
69
|
+
esac
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# Translates a path to storage-neutral format for config.json (forward slashes, drive letter)
|
|
73
|
+
# Always converts WSL paths to Windows-style, regardless of current platform
|
|
74
|
+
normalize_path_for_storage() {
|
|
75
|
+
local input_path="$1"
|
|
76
|
+
# WSL path → Windows-style: /mnt/d/foo → D:/foo (always, regardless of platform)
|
|
77
|
+
if [[ "$input_path" =~ ^/mnt/([a-z])/(.*) ]]; then
|
|
78
|
+
local drive=$(echo "${BASH_REMATCH[1]}" | tr '[:lower:]' '[:upper:]')
|
|
79
|
+
echo "${drive}:/${BASH_REMATCH[2]}"
|
|
80
|
+
elif [[ "$input_path" =~ ^[A-Za-z]:[\\/] ]]; then
|
|
81
|
+
# Normalize backslashes only
|
|
82
|
+
echo "${input_path//\\//}"
|
|
83
|
+
else
|
|
84
|
+
echo "$input_path"
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
# Returns current directory in platform-appropriate format
|
|
89
|
+
get_current_dir() {
|
|
90
|
+
local raw_pwd
|
|
91
|
+
raw_pwd="$(pwd)"
|
|
92
|
+
normalize_path_for_platform "$raw_pwd"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## DETECT_PROVIDER
|
|
99
|
+
|
|
100
|
+
Detects GitHub or Azure DevOps from remote URL.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
detect_git_provider() {
|
|
104
|
+
REMOTE_URL=$(git remote get-url origin 2>/dev/null || echo "")
|
|
105
|
+
|
|
106
|
+
if [[ "$REMOTE_URL" == *"dev.azure.com"* ]] || [[ "$REMOTE_URL" == *"visualstudio.com"* ]]; then
|
|
107
|
+
GIT_PROVIDER="azuredevops"
|
|
108
|
+
[[ "$REMOTE_URL" =~ dev\.azure\.com/([^/]+)/([^/]+)/_git/([^/]+) ]] && {
|
|
109
|
+
AZURE_ORG="${BASH_REMATCH[1]}"
|
|
110
|
+
AZURE_PROJECT="${BASH_REMATCH[2]}"
|
|
111
|
+
AZURE_REPO="${BASH_REMATCH[3]}"
|
|
112
|
+
}
|
|
113
|
+
elif [[ "$REMOTE_URL" == *"github.com"* ]]; then
|
|
114
|
+
GIT_PROVIDER="github"
|
|
115
|
+
else
|
|
116
|
+
GIT_PROVIDER="unknown"
|
|
117
|
+
fi
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## NORMALIZE_NAME
|
|
124
|
+
|
|
125
|
+
Normalizes a branch name (accents, spaces, special characters).
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
normalize_branch_name() {
|
|
129
|
+
local input="$1" max_length="${2:-50}"
|
|
130
|
+
echo "$input" | tr '[:upper:]' '[:lower:]' | \
|
|
131
|
+
sed 'y/àâäéèêëïîôùûüçœæ/aaaeeeeiioouucoa/' | \
|
|
132
|
+
sed "s/[ _']/-/g" | sed 's/[^a-z0-9-]//g' | \
|
|
133
|
+
sed 's/--*/-/g' | sed 's/^-//;s/-$//' | cut -c1-$max_length | sed 's/-$//'
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## RESOLVE_CONFIG_PATH
|
|
140
|
+
|
|
141
|
+
Resolves the config.json path regardless of current working directory.
|
|
142
|
+
Searches in: pwd, develop worktree, then git root.
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
resolve_gitflow_config_path() {
|
|
146
|
+
# Ensure git is accessible (cross-platform worktree repair)
|
|
147
|
+
preflight_git_check 2>/dev/null
|
|
148
|
+
|
|
149
|
+
# 1. Try current directory
|
|
150
|
+
[ -f ".claude/gitflow/config.json" ] && { echo ".claude/gitflow/config.json"; return 0; }
|
|
151
|
+
|
|
152
|
+
# 2. Try to find develop worktree from git worktree list
|
|
153
|
+
local DEVELOP_PATH
|
|
154
|
+
DEVELOP_PATH=$(git worktree list --porcelain 2>/dev/null | grep -A1 "branch refs/heads/develop" | grep "^worktree " | sed 's/^worktree //')
|
|
155
|
+
[ -n "$DEVELOP_PATH" ] && [ -f "$DEVELOP_PATH/.claude/gitflow/config.json" ] && {
|
|
156
|
+
echo "$DEVELOP_PATH/.claude/gitflow/config.json"
|
|
157
|
+
return 0
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# 3. Try git toplevel
|
|
161
|
+
local GIT_ROOT
|
|
162
|
+
GIT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
163
|
+
[ -n "$GIT_ROOT" ] && [ -f "$GIT_ROOT/.claude/gitflow/config.json" ] && {
|
|
164
|
+
echo "$GIT_ROOT/.claude/gitflow/config.json"
|
|
165
|
+
return 0
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return 1
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## READ_GITFLOW_CONFIG
|
|
175
|
+
|
|
176
|
+
Reads GitFlow configuration from config.json. Exposes all variables needed by steps and phases.
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
read_gitflow_config() {
|
|
180
|
+
# Detect platform first (needed for path translation)
|
|
181
|
+
detect_platform
|
|
182
|
+
|
|
183
|
+
local CONFIG_FILE
|
|
184
|
+
CONFIG_FILE=$(resolve_gitflow_config_path) || {
|
|
185
|
+
echo "❌ GitFlow config not found. Run /gitflow init first."
|
|
186
|
+
return 1
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Config version
|
|
190
|
+
GF_CONFIG_VERSION=$(grep -oP '"version":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
191
|
+
|
|
192
|
+
# Repository
|
|
193
|
+
GF_PROJECT_NAME=$(grep -oP '"name":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
194
|
+
GF_ROOT_FOLDER=$(grep -oP '"rootFolder":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
195
|
+
GF_REMOTE_URL=$(grep -oP '"remoteUrl":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
196
|
+
|
|
197
|
+
# Git provider and branches
|
|
198
|
+
GF_PROVIDER=$(grep -oP '"provider":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
199
|
+
GF_MAIN_BRANCH=$(grep -oP '"main":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
200
|
+
GF_DEVELOP_BRANCH=$(grep -oP '"develop":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
201
|
+
|
|
202
|
+
# Prefixes
|
|
203
|
+
GF_FEATURE_PREFIX=$(grep -oP '"feature":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
204
|
+
GF_RELEASE_PREFIX=$(grep -oP '"release":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
205
|
+
GF_HOTFIX_PREFIX=$(grep -oP '"hotfix":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
206
|
+
|
|
207
|
+
# Worktrees
|
|
208
|
+
GF_WORKTREE_MODE=$(grep -oP '"mode":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
209
|
+
GF_MAIN_PATH=$(grep -A1 '"structure"' "$CONFIG_FILE" | grep -oP '"main":\s*"\K[^"]+' | head -1)
|
|
210
|
+
GF_DEVELOP_PATH=$(grep -A2 '"structure"' "$CONFIG_FILE" | grep -oP '"develop":\s*"\K[^"]+' | head -1)
|
|
211
|
+
GF_FEATURES_PATH=$(grep -oP '"features":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
212
|
+
GF_RELEASES_PATH=$(grep -oP '"releases":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
213
|
+
GF_HOTFIXES_PATH=$(grep -oP '"hotfixes":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
214
|
+
|
|
215
|
+
# Language
|
|
216
|
+
GF_LANG=$(grep -oP '"code":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
217
|
+
|
|
218
|
+
# Versioning
|
|
219
|
+
GF_VERSION=$(grep -oP '"current":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
220
|
+
GF_TAG_PREFIX=$(grep -oP '"tagPrefix":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
221
|
+
|
|
222
|
+
# Platform (v2.1.0+, optional)
|
|
223
|
+
GF_CONFIG_PLATFORM=$(grep -oP '"detected":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
224
|
+
GF_CONFIG_PLATFORM=${GF_CONFIG_PLATFORM:-$GF_PLATFORM}
|
|
225
|
+
|
|
226
|
+
# Workspace (v2.1.0+, optional)
|
|
227
|
+
GF_WORKSPACE_PATH=$(grep -A1 '"workspace"' "$CONFIG_FILE" | grep -oP '"path":\s*"\K[^"]+' | head -1)
|
|
228
|
+
GF_WORKSPACE_NAME=$(grep -A2 '"workspace"' "$CONFIG_FILE" | grep -oP '"name":\s*"\K[^"]+' | head -1)
|
|
229
|
+
|
|
230
|
+
# Defaults for missing values
|
|
231
|
+
GF_LANG=${GF_LANG:-en}
|
|
232
|
+
GF_WORKTREE_MODE=${GF_WORKTREE_MODE:-organized}
|
|
233
|
+
GF_MAIN_BRANCH=${GF_MAIN_BRANCH:-main}
|
|
234
|
+
GF_DEVELOP_BRANCH=${GF_DEVELOP_BRANCH:-develop}
|
|
235
|
+
GF_FEATURE_PREFIX=${GF_FEATURE_PREFIX:-feature/}
|
|
236
|
+
GF_RELEASE_PREFIX=${GF_RELEASE_PREFIX:-release/}
|
|
237
|
+
GF_HOTFIX_PREFIX=${GF_HOTFIX_PREFIX:-hotfix/}
|
|
238
|
+
GF_TAG_PREFIX=${GF_TAG_PREFIX:-v}
|
|
239
|
+
GF_VERSION=${GF_VERSION:-0.1.0}
|
|
240
|
+
|
|
241
|
+
# Translate all stored paths to current platform format
|
|
242
|
+
# This ensures WSL paths are /mnt/d/... and Windows paths use forward slashes
|
|
243
|
+
GF_ROOT_FOLDER=$(normalize_path_for_platform "$GF_ROOT_FOLDER")
|
|
244
|
+
GF_MAIN_PATH=$(normalize_path_for_platform "$GF_MAIN_PATH")
|
|
245
|
+
GF_DEVELOP_PATH=$(normalize_path_for_platform "$GF_DEVELOP_PATH")
|
|
246
|
+
GF_FEATURES_PATH=$(normalize_path_for_platform "$GF_FEATURES_PATH")
|
|
247
|
+
GF_RELEASES_PATH=$(normalize_path_for_platform "$GF_RELEASES_PATH")
|
|
248
|
+
GF_HOTFIXES_PATH=$(normalize_path_for_platform "$GF_HOTFIXES_PATH")
|
|
249
|
+
[ -n "$GF_WORKSPACE_PATH" ] && GF_WORKSPACE_PATH=$(normalize_path_for_platform "$GF_WORKSPACE_PATH")
|
|
250
|
+
|
|
251
|
+
# Export config file path for steps that need to update it
|
|
252
|
+
GF_CONFIG_FILE="$CONFIG_FILE"
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## DETECT_WORKTREE_MODE
|
|
259
|
+
|
|
260
|
+
Detects worktree mode. Reads config first, falls back to filesystem detection.
|
|
261
|
+
|
|
262
|
+
```bash
|
|
263
|
+
detect_worktree_mode() {
|
|
264
|
+
# 1. Try config first (authoritative)
|
|
265
|
+
local CONFIG_FILE
|
|
266
|
+
CONFIG_FILE=$(resolve_gitflow_config_path 2>/dev/null)
|
|
267
|
+
if [ -n "$CONFIG_FILE" ] && [ -f "$CONFIG_FILE" ]; then
|
|
268
|
+
WORKTREE_MODE=$(grep -oP '"mode":\s*"\K[^"]+' "$CONFIG_FILE" | head -1)
|
|
269
|
+
[ -n "$WORKTREE_MODE" ] && return 0
|
|
270
|
+
fi
|
|
271
|
+
|
|
272
|
+
# 2. Fallback: filesystem detection
|
|
273
|
+
if [ -d "../features" ] && [ -d "../releases" ] && [ -d "../hotfixes" ]; then
|
|
274
|
+
WORKTREE_MODE="organized"
|
|
275
|
+
elif [ -d "../01-Main" ] && [ -d "../02-Develop" ]; then
|
|
276
|
+
WORKTREE_MODE="organized"
|
|
277
|
+
elif [ -d "../worktrees" ]; then
|
|
278
|
+
WORKTREE_MODE="adjacent"
|
|
279
|
+
else
|
|
280
|
+
WORKTREE_MODE="organized"
|
|
281
|
+
fi
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## CLEANUP_WORKTREE
|
|
288
|
+
|
|
289
|
+
Cleans up a worktree for a given branch. Uses config paths when available.
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
cleanup_worktree_for_branch() {
|
|
293
|
+
local BRANCH=$1 WORKTREE_PATH=""
|
|
294
|
+
|
|
295
|
+
# Try config-based paths first (absolute, reliable)
|
|
296
|
+
read_gitflow_config 2>/dev/null
|
|
297
|
+
if [ -n "$GF_FEATURES_PATH" ]; then
|
|
298
|
+
case "$BRANCH" in
|
|
299
|
+
feature/*) WORKTREE_PATH="$GF_FEATURES_PATH/${BRANCH#feature/}" ;;
|
|
300
|
+
release/*) WORKTREE_PATH="$GF_RELEASES_PATH/${BRANCH#release/}" ;;
|
|
301
|
+
hotfix/*) WORKTREE_PATH="$GF_HOTFIXES_PATH/${BRANCH#hotfix/}" ;;
|
|
302
|
+
esac
|
|
303
|
+
else
|
|
304
|
+
# Fallback: relative paths
|
|
305
|
+
case "$BRANCH" in
|
|
306
|
+
feature/*) WORKTREE_PATH="../features/${BRANCH#feature/}" ;;
|
|
307
|
+
release/*) WORKTREE_PATH="../releases/${BRANCH#release/}" ;;
|
|
308
|
+
hotfix/*) WORKTREE_PATH="../hotfixes/${BRANCH#hotfix/}" ;;
|
|
309
|
+
esac
|
|
310
|
+
fi
|
|
311
|
+
|
|
312
|
+
[ -n "$WORKTREE_PATH" ] && [ -d "$WORKTREE_PATH" ] && {
|
|
313
|
+
git worktree remove "$WORKTREE_PATH" --force 2>/dev/null || rm -rf "$WORKTREE_PATH"
|
|
314
|
+
git worktree prune
|
|
315
|
+
echo "✓ Worktree cleaned: $WORKTREE_PATH"
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## VALIDATE_WORKTREE_PATH
|
|
323
|
+
|
|
324
|
+
Validates that a worktree path follows config conventions. Only `01-Main` and `02-Develop` may use numbered prefixes. All other worktrees (features, releases, hotfixes) MUST use config paths (`features/{name}`, `releases/v{version}`, `hotfixes/{name}`).
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
validate_worktree_path() {
|
|
328
|
+
local WORKTREE_PATH="$1"
|
|
329
|
+
local BASENAME=$(basename "$WORKTREE_PATH")
|
|
330
|
+
|
|
331
|
+
# Only 01-Main and 02-Develop may use numbered prefixes
|
|
332
|
+
if [[ "$BASENAME" =~ ^[0-9]{2}- ]] && [[ "$BASENAME" != "01-Main" ]] && [[ "$BASENAME" != "02-Develop" ]]; then
|
|
333
|
+
echo "ERROR: Invalid numbered worktree directory: $BASENAME"
|
|
334
|
+
echo " Path: $WORKTREE_PATH"
|
|
335
|
+
echo " FORBIDDEN: Numbered directories like 03-Release, 04-Feature, 05-Hotfix"
|
|
336
|
+
echo " REQUIRED: Use config paths → features/{name}, releases/v{version}, hotfixes/{name}"
|
|
337
|
+
return 1
|
|
338
|
+
fi
|
|
339
|
+
return 0
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## REPAIR_WORKTREE_PATHS
|
|
346
|
+
|
|
347
|
+
Converts worktree metadata paths to **relative paths** for cross-platform compatibility (Windows + WSL).
|
|
348
|
+
Absolute paths (Windows `D:/...` or POSIX `/mnt/d/...`) break when switching environments.
|
|
349
|
+
Relative paths work everywhere without repair.
|
|
350
|
+
|
|
351
|
+
Scans `.bare/worktrees/*/gitdir` and the corresponding `{worktree}/.git` files.
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
repair_worktree_paths() {
|
|
355
|
+
local BARE_DIR="$1" # Path to .bare directory
|
|
356
|
+
local WORKTREES_DIR="$BARE_DIR/worktrees"
|
|
357
|
+
[ ! -d "$WORKTREES_DIR" ] && return 0
|
|
358
|
+
|
|
359
|
+
local REPAIRED=0
|
|
360
|
+
for wt_dir in "$WORKTREES_DIR"/*/; do
|
|
361
|
+
[ ! -d "$wt_dir" ] && continue
|
|
362
|
+
local wt_name=$(basename "$wt_dir")
|
|
363
|
+
local gitdir_file="$wt_dir/gitdir"
|
|
364
|
+
[ ! -f "$gitdir_file" ] && continue
|
|
365
|
+
|
|
366
|
+
# Read stored path (may be Windows absolute, POSIX absolute, or already relative)
|
|
367
|
+
local stored_path=$(cat "$gitdir_file" | tr -d '\n\r')
|
|
368
|
+
|
|
369
|
+
# Resolve to current platform absolute path for realpath computation
|
|
370
|
+
local resolved_path="$stored_path"
|
|
371
|
+
local is_abs=false
|
|
372
|
+
if [[ "$stored_path" =~ ^[A-Za-z]:[\\/] ]]; then
|
|
373
|
+
is_abs=true
|
|
374
|
+
resolved_path=$(normalize_path_for_platform "$stored_path")
|
|
375
|
+
elif [[ "$stored_path" =~ ^/ ]]; then
|
|
376
|
+
is_abs=true
|
|
377
|
+
resolved_path=$(normalize_path_for_platform "$stored_path")
|
|
378
|
+
fi
|
|
379
|
+
if [ "$is_abs" = "false" ]; then
|
|
380
|
+
# Already relative - resolve from gitdir_file location to get absolute
|
|
381
|
+
resolved_path=$(realpath -m "$wt_dir/$stored_path")
|
|
382
|
+
fi
|
|
383
|
+
|
|
384
|
+
# Get worktree real directory (parent of .git file)
|
|
385
|
+
local wt_real_dir=$(dirname "$resolved_path")
|
|
386
|
+
[ ! -d "$wt_real_dir" ] && continue
|
|
387
|
+
|
|
388
|
+
# Compute relative path: .bare/worktrees/{name}/ → worktree/.git
|
|
389
|
+
local bare_wt_abs=$(realpath -m "$wt_dir")
|
|
390
|
+
local wt_abs=$(realpath -m "$wt_real_dir")
|
|
391
|
+
local rel_gitdir=$(realpath -m --relative-to="$bare_wt_abs" "$wt_abs/.git")
|
|
392
|
+
|
|
393
|
+
if [ "$stored_path" != "$rel_gitdir" ]; then
|
|
394
|
+
printf '%s\n' "$rel_gitdir" > "$gitdir_file"
|
|
395
|
+
echo "REPAIRED: $wt_name/gitdir → $rel_gitdir"
|
|
396
|
+
REPAIRED=$((REPAIRED + 1))
|
|
397
|
+
fi
|
|
398
|
+
|
|
399
|
+
# Fix the worktree's .git pseudo-file → relative path to .bare/worktrees/{name}
|
|
400
|
+
if [ -f "$wt_real_dir/.git" ]; then
|
|
401
|
+
local git_content=$(cat "$wt_real_dir/.git" | tr -d '\n\r')
|
|
402
|
+
local git_path="${git_content#gitdir: }"
|
|
403
|
+
local rel_bare=$(realpath -m --relative-to="$wt_abs" "$bare_wt_abs")
|
|
404
|
+
|
|
405
|
+
if [ "$git_path" != "$rel_bare" ]; then
|
|
406
|
+
printf 'gitdir: %s\n' "$rel_bare" > "$wt_real_dir/.git"
|
|
407
|
+
echo "REPAIRED: $wt_name/.git → $rel_bare"
|
|
408
|
+
REPAIRED=$((REPAIRED + 1))
|
|
409
|
+
fi
|
|
410
|
+
fi
|
|
411
|
+
done
|
|
412
|
+
|
|
413
|
+
[ "$REPAIRED" -gt 0 ] && echo "Worktree paths: $REPAIRED file(s) repaired"
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## PREFLIGHT_GIT_CHECK
|
|
420
|
+
|
|
421
|
+
Lightweight check to ensure git is accessible in the current worktree. If git fails (cross-platform path issue), locates `.bare` and calls `repair_worktree_paths`. Must be called before any git operation in agents that may run in worktrees created from a different environment (Windows vs WSL).
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
preflight_git_check() {
|
|
425
|
+
# Quick test: if git works, nothing to do
|
|
426
|
+
git rev-parse --git-dir >/dev/null 2>&1 && return 0
|
|
427
|
+
|
|
428
|
+
echo "Git inaccessible — attempting worktree path repair..."
|
|
429
|
+
|
|
430
|
+
# Find .bare directory by walking up
|
|
431
|
+
local BARE_DIR=""
|
|
432
|
+
local DIR="$(pwd)"
|
|
433
|
+
while [ "$DIR" != "/" ]; do
|
|
434
|
+
[ -d "$DIR/.bare" ] && { BARE_DIR="$DIR/.bare"; break; }
|
|
435
|
+
DIR=$(dirname "$DIR")
|
|
436
|
+
done
|
|
437
|
+
|
|
438
|
+
if [ -z "$BARE_DIR" ]; then
|
|
439
|
+
echo "ERROR: No .bare directory found. Not a GitFlow worktree."
|
|
440
|
+
return 1
|
|
441
|
+
fi
|
|
442
|
+
|
|
443
|
+
# Ensure platform is detected
|
|
444
|
+
[ -z "$GF_PLATFORM" ] && detect_platform
|
|
445
|
+
|
|
446
|
+
# Repair all worktree paths to relative format
|
|
447
|
+
repair_worktree_paths "$BARE_DIR"
|
|
448
|
+
|
|
449
|
+
# Verify repair
|
|
450
|
+
if git rev-parse --git-dir >/dev/null 2>&1; then
|
|
451
|
+
echo "Worktree paths repaired successfully."
|
|
452
|
+
return 0
|
|
453
|
+
else
|
|
454
|
+
echo "ERROR: Worktree repair failed. Run /gitflow init to reconfigure."
|
|
455
|
+
return 1
|
|
456
|
+
fi
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
462
|
+
## RESOLVE_WORKSPACE
|
|
463
|
+
|
|
464
|
+
Resolves the workspace JSON file by walking up the directory tree.
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
resolve_workspace_path() {
|
|
468
|
+
local dir="$(pwd)"
|
|
469
|
+
while [ "$dir" != "/" ] && [ "$dir" != "." ]; do
|
|
470
|
+
[ -f "$dir/.smartstack-workspace.json" ] && {
|
|
471
|
+
echo "$dir/.smartstack-workspace.json"
|
|
472
|
+
return 0
|
|
473
|
+
}
|
|
474
|
+
dir=$(dirname "$dir")
|
|
475
|
+
done
|
|
476
|
+
return 1
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
## SYNC_REMOTE
|
|
483
|
+
|
|
484
|
+
Syncs with remote and displays status.
|
|
485
|
+
|
|
486
|
+
```bash
|
|
487
|
+
sync_with_remote() {
|
|
488
|
+
git fetch --all --quiet
|
|
489
|
+
local BRANCH=$(git branch --show-current)
|
|
490
|
+
local AHEAD=$(git rev-list --count origin/$BRANCH..HEAD 2>/dev/null || echo "0")
|
|
491
|
+
local BEHIND=$(git rev-list --count HEAD..origin/$BRANCH 2>/dev/null || echo "0")
|
|
492
|
+
|
|
493
|
+
[ "$BEHIND" -gt 0 ] && echo "⚠️ $BRANCH: $BEHIND commit(s) behind"
|
|
494
|
+
[ "$AHEAD" -gt 0 ] && echo "ℹ️ $BRANCH: $AHEAD commit(s) not pushed"
|
|
495
|
+
}
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
---
|
|
499
|
+
|
|
500
|
+
## CONFIG_TEMPLATE
|
|
501
|
+
|
|
502
|
+
GitFlow configuration JSON template v2.1.0 (aligned with `templates/config.json`).
|
|
503
|
+
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"version": "2.1.0",
|
|
507
|
+
"platform": {
|
|
508
|
+
"detected": "",
|
|
509
|
+
"shell": "",
|
|
510
|
+
"detectedAt": ""
|
|
511
|
+
},
|
|
512
|
+
"workspace": {
|
|
513
|
+
"path": "",
|
|
514
|
+
"name": ""
|
|
515
|
+
},
|
|
516
|
+
"repository": {
|
|
517
|
+
"name": "",
|
|
518
|
+
"rootFolder": "",
|
|
519
|
+
"nameVariants": {
|
|
520
|
+
"pascalCaseDot": "",
|
|
521
|
+
"pascalCase": "",
|
|
522
|
+
"kebabCase": "",
|
|
523
|
+
"snakeCase": "",
|
|
524
|
+
"displayName": ""
|
|
525
|
+
},
|
|
526
|
+
"defaultBranch": "main",
|
|
527
|
+
"remoteUrl": ""
|
|
528
|
+
},
|
|
529
|
+
"git": {
|
|
530
|
+
"provider": "",
|
|
531
|
+
"branches": {
|
|
532
|
+
"main": "main",
|
|
533
|
+
"develop": "develop"
|
|
534
|
+
},
|
|
535
|
+
"prefixes": {
|
|
536
|
+
"feature": "feature/",
|
|
537
|
+
"release": "release/",
|
|
538
|
+
"hotfix": "hotfix/"
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
"worktrees": {
|
|
542
|
+
"enabled": true,
|
|
543
|
+
"mode": "organized",
|
|
544
|
+
"structure": {
|
|
545
|
+
"main": "",
|
|
546
|
+
"develop": "",
|
|
547
|
+
"features": "",
|
|
548
|
+
"releases": "",
|
|
549
|
+
"hotfixes": ""
|
|
550
|
+
}
|
|
551
|
+
},
|
|
552
|
+
"versioning": {
|
|
553
|
+
"strategy": "semver",
|
|
554
|
+
"current": "0.1.0",
|
|
555
|
+
"tagPrefix": "v",
|
|
556
|
+
"sources": ["csproj", "package.json", "VERSION"]
|
|
557
|
+
},
|
|
558
|
+
"efcore": {
|
|
559
|
+
"enabled": true,
|
|
560
|
+
"validateOnCommit": true,
|
|
561
|
+
"blockDestructive": true,
|
|
562
|
+
"migrationNaming": "{context}_v{version}_{sequence}_{Description}",
|
|
563
|
+
"migrationNamingSquash": "{context}_v{version}",
|
|
564
|
+
"squashBeforePR": true
|
|
565
|
+
},
|
|
566
|
+
"workflow": {
|
|
567
|
+
"push": {
|
|
568
|
+
"afterCommit": "worktree"
|
|
569
|
+
},
|
|
570
|
+
"pr": {
|
|
571
|
+
"autoLabels": true,
|
|
572
|
+
"requireReview": true
|
|
573
|
+
}
|
|
574
|
+
},
|
|
575
|
+
"language": {
|
|
576
|
+
"code": "en"
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
**worktrees.mode options:**
|
|
582
|
+
- `organized`: Uses absolute paths from config (`structure.features`, etc.)
|
|
583
|
+
- `adjacent`: `{rootFolder}/worktrees/{type}/`
|
|
584
|
+
- `disabled`: No worktrees
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## PR_COMMANDS
|
|
589
|
+
|
|
590
|
+
PR commands by provider.
|
|
591
|
+
|
|
592
|
+
### GitHub
|
|
593
|
+
```bash
|
|
594
|
+
gh pr create --title "$TITLE" --body "$BODY" --base "$BASE"
|
|
595
|
+
gh pr view $NUMBER --json state,mergeable,reviews
|
|
596
|
+
gh pr merge $NUMBER --squash --delete-branch
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### Azure DevOps
|
|
600
|
+
```bash
|
|
601
|
+
az repos pr create --title "$TITLE" --description "$BODY" --source-branch "$SOURCE" --target-branch "$BASE"
|
|
602
|
+
az repos pr show --id $NUMBER --query "{status:status,mergeStatus:mergeStatus}"
|
|
603
|
+
az repos pr update --id $NUMBER --status completed --squash true --delete-source-branch true
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
---
|
|
607
|
+
|
|
608
|
+
## OUTPUT_FORMAT
|
|
609
|
+
|
|
610
|
+
Standard output format (replaces ASCII art).
|
|
611
|
+
|
|
612
|
+
```bash
|
|
613
|
+
output_header() { echo -e "\n## $1\n"; }
|
|
614
|
+
output_section() { echo "### $1"; }
|
|
615
|
+
output_item() { echo "- $1"; }
|
|
616
|
+
output_success() { echo "✓ $1"; }
|
|
617
|
+
output_warning() { echo "⚠️ $1"; }
|
|
618
|
+
output_error() { echo "❌ $1"; }
|
|
619
|
+
output_next() { echo "→ Next: $1"; }
|
|
620
|
+
```
|