its-magic 0.1.2-9 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +1602 -755
  2. package/bin/its-magic.js +121 -11
  3. package/bin/postinstall.js +21 -0
  4. package/installer.ps1 +759 -0
  5. package/installer.py +981 -0
  6. package/installer.sh +649 -0
  7. package/package.json +18 -14
  8. package/scripts/check_intake_template_parity.py +284 -0
  9. package/scripts/doc_profile_lib.py +415 -0
  10. package/scripts/guard_installer_publish.py +88 -0
  11. package/scripts/intake_bug_routing_guard.py +67 -0
  12. package/scripts/intake_evidence_lib.py +802 -0
  13. package/scripts/intake_evidence_validate.py +73 -0
  14. package/scripts/materialize_codebase_map.py +184 -0
  15. package/scripts/remote_config_summary.py +243 -0
  16. package/template/.cursor/agents/curator.mdc +35 -0
  17. package/template/.cursor/agents/dev.mdc +29 -0
  18. package/template/.cursor/agents/po.mdc +141 -0
  19. package/template/.cursor/agents/qa.mdc +28 -0
  20. package/template/.cursor/agents/release.mdc +28 -0
  21. package/template/.cursor/agents/security.mdc +98 -0
  22. package/template/.cursor/agents/tech-lead.mdc +57 -0
  23. package/template/.cursor/commands/architecture.md +127 -0
  24. package/template/.cursor/commands/ask.md +55 -0
  25. package/template/.cursor/commands/auto.md +533 -0
  26. package/template/.cursor/commands/discovery.md +47 -0
  27. package/template/.cursor/commands/execute.md +343 -0
  28. package/template/.cursor/commands/intake.md +323 -0
  29. package/template/.cursor/commands/map-codebase.md +46 -0
  30. package/template/.cursor/commands/memory-audit.md +175 -0
  31. package/template/.cursor/commands/milestone-complete.md +51 -0
  32. package/template/.cursor/commands/milestone-start.md +59 -0
  33. package/template/.cursor/commands/pause.md +64 -0
  34. package/{.cursor/commands/gsd-phase-context.md → template/.cursor/commands/phase-context.md} +6 -2
  35. package/template/.cursor/commands/plan-verify.md +34 -0
  36. package/template/.cursor/commands/qa.md +226 -0
  37. package/template/.cursor/commands/quick.md +41 -0
  38. package/template/.cursor/commands/refresh-context.md +82 -0
  39. package/template/.cursor/commands/release.md +505 -0
  40. package/template/.cursor/commands/research.md +49 -0
  41. package/template/.cursor/commands/resume.md +67 -0
  42. package/template/.cursor/commands/security-review.md +81 -0
  43. package/template/.cursor/commands/sprint-plan.md +103 -0
  44. package/template/.cursor/commands/status-reconcile.md +95 -0
  45. package/template/.cursor/commands/verify-work.md +152 -0
  46. package/template/.cursor/dev-environment.json.example +22 -0
  47. package/{.cursor → template/.cursor}/hooks/README.md +3 -2
  48. package/{.cursor/hooks/gsd-hook.py → template/.cursor/hooks/hook.py} +15 -6
  49. package/template/.cursor/hooks.json +26 -0
  50. package/template/.cursor/remote.json +31 -0
  51. package/template/.cursor/rules/caveman.mdc +184 -0
  52. package/template/.cursor/rules/coding-standards.mdc +39 -0
  53. package/template/.cursor/rules/core.mdc +111 -0
  54. package/template/.cursor/rules/handoffs.mdc +27 -0
  55. package/template/.cursor/rules/quality.mdc +49 -0
  56. package/template/.cursor/scratchpad.local.example.md +323 -0
  57. package/template/.cursor/scratchpad.md +324 -0
  58. package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/SKILL.md +2 -2
  59. package/template/.cursorignore +6 -0
  60. package/template/.env.example +28 -0
  61. package/template/.github/workflows/ci.yml +194 -0
  62. package/{.github → template/.github}/workflows/deploy.yml +5 -2
  63. package/template/.its-magic-version +1 -0
  64. package/template/README.md +1602 -0
  65. package/template/decisions/DEC-0001.md +11 -0
  66. package/template/decisions/DEC-0002.md +11 -0
  67. package/template/docs/developer/README.md +44 -0
  68. package/template/docs/engineering/architecture.md +9 -0
  69. package/template/docs/engineering/artifact-ordering-policy.md +48 -0
  70. package/template/docs/engineering/artifact-ownership-policy.md +57 -0
  71. package/template/docs/engineering/auto-orchestration-reference.md +1211 -0
  72. package/{docs → template/docs}/engineering/codebase-map.md +0 -5
  73. package/template/docs/engineering/compatibility-report.md +20 -0
  74. package/template/docs/engineering/compatibility-signals.md +7 -0
  75. package/template/docs/engineering/component-scope-report.md +16 -0
  76. package/template/docs/engineering/component-scope.md +19 -0
  77. package/template/docs/engineering/context/installer-owned-paths.manifest +96 -0
  78. package/template/docs/engineering/context/readme-section-affinity.json +30 -0
  79. package/template/docs/engineering/decisions.md +16 -0
  80. package/template/docs/engineering/legacy-drift-audit.md +21 -0
  81. package/template/docs/engineering/manifests/components/api-gateway.manifest.yaml +12 -0
  82. package/template/docs/engineering/manifests/registry.manifest.yaml +20 -0
  83. package/template/docs/engineering/manifests/repo.manifest.yaml +11 -0
  84. package/template/docs/engineering/phase-context.md +16 -0
  85. package/template/docs/engineering/release-targets.json +123 -0
  86. package/template/docs/engineering/research.md +29 -0
  87. package/template/docs/engineering/runbook.md +2320 -0
  88. package/template/docs/engineering/runtime-connectivity.md +81 -0
  89. package/template/docs/engineering/security-review.md +33 -0
  90. package/template/docs/engineering/spec-pack/README.md +20 -0
  91. package/template/docs/engineering/state-archive/README.md +15 -0
  92. package/template/docs/engineering/state.md +20 -0
  93. package/template/docs/engineering/status-normalization-report.md +19 -0
  94. package/template/docs/engineering/token-cost-parity-manifest.md +16 -0
  95. package/template/docs/engineering/us-0084-remote-e2e.md +44 -0
  96. package/template/docs/product/acceptance.md +1 -0
  97. package/template/docs/product/backlog.md +5 -0
  98. package/template/docs/product/vision.md +11 -0
  99. package/template/docs/user-guides/README.md +40 -0
  100. package/{handoffs → template/handoffs}/dev_to_qa.md +0 -3
  101. package/{handoffs → template/handoffs}/po_to_tl.md +0 -3
  102. package/{handoffs → template/handoffs}/qa_to_dev.md +1 -2
  103. package/template/handoffs/release_notes.md +51 -0
  104. package/template/handoffs/release_queue.md +47 -0
  105. package/template/handoffs/release_to_dev.md +31 -0
  106. package/template/handoffs/releases/Sxxxx-release-notes.md +62 -0
  107. package/template/handoffs/resume_brief.md +14 -0
  108. package/{handoffs → template/handoffs}/tl_to_dev.md +0 -2
  109. package/template/handoffs/token_cost_runs/README.md +26 -0
  110. package/template/its_magic/.its-magic-version +1 -0
  111. package/template/its_magic/README.md +9 -0
  112. package/template/scripts/auto_outer_driver.py +521 -0
  113. package/template/scripts/caveman_compress_input.py +903 -0
  114. package/template/scripts/check_downstream_ci_guard.py +67 -0
  115. package/template/scripts/check_intake_template_parity.py +284 -0
  116. package/template/scripts/check_token_cost_parity.py +69 -0
  117. package/template/scripts/dev_environment_lib.py +463 -0
  118. package/template/scripts/doc_profile_lib.py +415 -0
  119. package/template/scripts/downstream_ci_guard_lib.py +222 -0
  120. package/template/scripts/enforce-triad-hot-surface.py +753 -0
  121. package/template/scripts/guard_installer_publish.py +88 -0
  122. package/template/scripts/intake_bug_resume_brief_refresh.py +303 -0
  123. package/template/scripts/intake_bug_routing_guard.py +67 -0
  124. package/template/scripts/intake_evidence_lib.py +802 -0
  125. package/template/scripts/intake_evidence_validate.py +73 -0
  126. package/template/scripts/materialize_codebase_map.py +184 -0
  127. package/template/scripts/pack_json_validate.py +130 -0
  128. package/template/scripts/project_readme_coverage_lib.py +417 -0
  129. package/template/scripts/readme_feature_coverage_lib.py +608 -0
  130. package/template/scripts/remote_config_summary.py +243 -0
  131. package/template/scripts/sync_push_gates.py +198 -0
  132. package/template/scripts/token_cost_compare.py +40 -0
  133. package/template/scripts/token_cost_lib.py +108 -0
  134. package/template/scripts/uat_probe_lib.py +868 -0
  135. package/template/scripts/validate-and-push.ps1 +280 -0
  136. package/template/scripts/validate-and-push.sh +243 -0
  137. package/template/scripts/validate_doc_profile.py +103 -0
  138. package/template/scripts/validate_project_readme_coverage.py +151 -0
  139. package/template/scripts/validate_readme_feature_coverage.py +140 -0
  140. package/template/sprints/S0001/progress.md +1 -0
  141. package/template/sprints/S0001/qa-findings.md +9 -0
  142. package/template/sprints/S0001/release-findings.md +24 -0
  143. package/template/sprints/S0001/sprint.md +9 -0
  144. package/template/sprints/S0001/summary.md +7 -0
  145. package/template/sprints/S0001/tasks.md +1 -0
  146. package/template/sprints/S0001/uat.json +6 -0
  147. package/template/sprints/S0001/uat.md +5 -0
  148. package/template/sprints/quick/Q0001/summary.md +1 -0
  149. package/{sprints → template/sprints}/quick/Q0001/task.json +0 -1
  150. package/.cursor/agents/curator.mdc +0 -21
  151. package/.cursor/agents/dev.mdc +0 -20
  152. package/.cursor/agents/po.mdc +0 -19
  153. package/.cursor/agents/qa.mdc +0 -19
  154. package/.cursor/agents/release.mdc +0 -19
  155. package/.cursor/agents/tech-lead.mdc +0 -21
  156. package/.cursor/commands/gsd-architecture.md +0 -29
  157. package/.cursor/commands/gsd-auto.md +0 -27
  158. package/.cursor/commands/gsd-discovery.md +0 -27
  159. package/.cursor/commands/gsd-execute.md +0 -32
  160. package/.cursor/commands/gsd-intake.md +0 -28
  161. package/.cursor/commands/gsd-map-codebase.md +0 -25
  162. package/.cursor/commands/gsd-milestone-complete.md +0 -24
  163. package/.cursor/commands/gsd-milestone-start.md +0 -26
  164. package/.cursor/commands/gsd-pause.md +0 -25
  165. package/.cursor/commands/gsd-plan-verify.md +0 -26
  166. package/.cursor/commands/gsd-qa.md +0 -28
  167. package/.cursor/commands/gsd-quick.md +0 -24
  168. package/.cursor/commands/gsd-refresh-context.md +0 -26
  169. package/.cursor/commands/gsd-release.md +0 -29
  170. package/.cursor/commands/gsd-research.md +0 -28
  171. package/.cursor/commands/gsd-resume.md +0 -26
  172. package/.cursor/commands/gsd-sprint-plan.md +0 -30
  173. package/.cursor/commands/gsd-verify-work.md +0 -25
  174. package/.cursor/hooks.json +0 -26
  175. package/.cursor/plans/cursor-gsd-team-kit_8cfee9b8.plan.md +0 -57
  176. package/.cursor/remote.json +0 -18
  177. package/.cursor/rules/gsd-core.mdc +0 -18
  178. package/.cursor/rules/gsd-handoffs.mdc +0 -10
  179. package/.cursor/rules/gsd-quality.mdc +0 -15
  180. package/.cursor/scratchpad.md +0 -34
  181. package/.github/workflows/ci.yml +0 -47
  182. package/decisions/DEC-0001.md +0 -21
  183. package/decisions/DEC-0002.md +0 -21
  184. package/docs/engineering/architecture.md +0 -354
  185. package/docs/engineering/decisions.md +0 -6
  186. package/docs/engineering/research.md +0 -11
  187. package/docs/engineering/runbook.md +0 -32
  188. package/docs/engineering/state.md +0 -33
  189. package/docs/product/acceptance.md +0 -6
  190. package/docs/product/backlog.md +0 -7
  191. package/docs/product/vision.md +0 -46
  192. package/gsd-installer.ps1 +0 -189
  193. package/gsd-installer.py +0 -195
  194. package/gsd-installer.sh +0 -201
  195. package/handoffs/release_notes.md +0 -14
  196. package/handoffs/resume_brief.md +0 -8
  197. package/milestones/M0001/milestone.json +0 -7
  198. package/milestones/M0001/phases.json +0 -9
  199. package/milestones/M0001/progress.md +0 -3
  200. package/milestones/M0001/summary.md +0 -3
  201. package/scripts/generate-release-notes.ps1 +0 -74
  202. package/scripts/generate-release-notes.sh +0 -63
  203. package/scripts/release-all.ps1 +0 -423
  204. package/scripts/release-all.sh +0 -226
  205. package/sprints/S0001/progress.md +0 -4
  206. package/sprints/S0001/qa-findings.md +0 -113
  207. package/sprints/S0001/sprint.md +0 -70
  208. package/sprints/S0001/summary.md +0 -46
  209. package/sprints/S0001/tasks.md +0 -35
  210. package/sprints/S0001/uat.json +0 -8
  211. package/sprints/S0001/uat.md +0 -8
  212. package/sprints/quick/Q0001/summary.md +0 -3
  213. /package/{.cursor/rules/gsd-escalation.mdc → template/.cursor/rules/escalation.mdc} +0 -0
  214. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.json +0 -0
  215. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.md +0 -0
  216. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.json +0 -0
  217. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.md +0 -0
  218. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.json +0 -0
  219. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.md +0 -0
  220. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.json +0 -0
  221. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.md +0 -0
  222. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/milestone.json +0 -0
  223. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/phase-context.json +0 -0
  224. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/plan-verify.json +0 -0
  225. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.json +0 -0
  226. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.md +0 -0
  227. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.json +0 -0
  228. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.md +0 -0
  229. /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/uat.json +0 -0
  230. /package/{docs → template/docs}/engineering/context/phase-template.json +0 -0
  231. /package/{docs → template/docs}/engineering/dependencies.json +0 -0
  232. /package/{sprints → template/sprints}/S0001/plan-verify.json +0 -0
package/gsd-installer.py DELETED
@@ -1,195 +0,0 @@
1
- import argparse
2
- import os
3
- import shutil
4
- import sys
5
- from datetime import datetime
6
-
7
-
8
- def normalize(path):
9
- return os.path.normpath(os.path.abspath(path))
10
-
11
-
12
- def list_source_files(source_root, include_paths):
13
- files = []
14
- for rel in include_paths:
15
- src = os.path.join(source_root, rel)
16
- if os.path.isfile(src):
17
- files.append(rel)
18
- elif os.path.isdir(src):
19
- for root, _, filenames in os.walk(src):
20
- for name in filenames:
21
- full = os.path.join(root, name)
22
- rel_path = os.path.relpath(full, source_root)
23
- files.append(rel_path)
24
- return sorted(set(files))
25
-
26
-
27
- def ensure_parent(path):
28
- parent = os.path.dirname(path)
29
- if parent and not os.path.isdir(parent):
30
- os.makedirs(parent, exist_ok=True)
31
-
32
-
33
- def backup_files(target_root, rel_paths):
34
- timestamp = datetime.utcnow().strftime("%Y%m%d-%H%M%SZ")
35
- backup_root = os.path.join(target_root, "gsd-backups", timestamp)
36
- for rel in rel_paths:
37
- src = os.path.join(target_root, rel)
38
- if os.path.isfile(src):
39
- dst = os.path.join(backup_root, rel)
40
- ensure_parent(dst)
41
- shutil.copy2(src, dst)
42
- return backup_root
43
-
44
-
45
- def choose_mode():
46
- print("Select install mode:")
47
- print("1) missing-only (copy only files that do not exist)")
48
- print("2) overwrite-all (replace existing files)")
49
- print("3) interactive (prompt per file)")
50
- choice = input("Enter 1, 2, or 3: ").strip()
51
- if choice == "1":
52
- return "missing"
53
- if choice == "2":
54
- return "overwrite"
55
- return "interactive"
56
-
57
-
58
- def prompt_yes_no(label, default=False):
59
- suffix = "Y/n" if default else "y/N"
60
- value = input(f"{label} [{suffix}]: ").strip().lower()
61
- if not value:
62
- return default
63
- return value in ("y", "yes")
64
-
65
-
66
- def main():
67
- parser = argparse.ArgumentParser(description="Install GSD toolkit into a repo")
68
- parser.add_argument("--target", help="Target repository path")
69
- parser.add_argument(
70
- "--mode",
71
- choices=["missing", "overwrite", "interactive"],
72
- help="Install mode",
73
- )
74
- parser.add_argument(
75
- "--backup",
76
- action="store_true",
77
- help="Backup files before overwriting",
78
- )
79
- parser.add_argument(
80
- "--create",
81
- action="store_true",
82
- help="Create target directory if missing",
83
- )
84
- args = parser.parse_args()
85
-
86
- source_root = normalize(os.path.dirname(__file__))
87
- target_root = normalize(args.target) if args.target else None
88
-
89
- if not target_root:
90
- target_root = normalize(input("Target repository path: ").strip())
91
-
92
- if not os.path.isdir(target_root):
93
- if args.create or prompt_yes_no("Target missing. Create?", default=False):
94
- os.makedirs(target_root, exist_ok=True)
95
- else:
96
- print("Target directory does not exist.")
97
- return 1
98
-
99
- mode = args.mode or choose_mode()
100
- backup_enabled = args.backup
101
- if mode in ("overwrite", "interactive") and not args.backup:
102
- backup_enabled = prompt_yes_no("Backup existing files before overwrite?", False)
103
-
104
- include_paths = [
105
- ".cursor/commands",
106
- ".cursor/rules",
107
- ".cursor/skills",
108
- ".cursor/agents",
109
- ".cursor/hooks",
110
- ".cursor/hooks.json",
111
- ".cursor/scratchpad.md",
112
- "docs",
113
- "sprints",
114
- "handoffs",
115
- "decisions",
116
- ".github/workflows",
117
- "README.md",
118
- "gsd-installer.py",
119
- ]
120
-
121
- files = list_source_files(source_root, include_paths)
122
- if not files:
123
- print("No source files found to install.")
124
- return 1
125
-
126
- overwrite_candidates = []
127
- if backup_enabled and mode == "overwrite":
128
- for rel in files:
129
- if os.path.isfile(os.path.join(target_root, rel)):
130
- overwrite_candidates.append(rel)
131
- if overwrite_candidates:
132
- backup_root = backup_files(target_root, overwrite_candidates)
133
- print(f"Backup created at: {backup_root}")
134
-
135
- for rel in files:
136
- src = os.path.join(source_root, rel)
137
- dst = os.path.join(target_root, rel)
138
- exists = os.path.isfile(dst)
139
-
140
- if mode == "missing":
141
- if exists:
142
- continue
143
- ensure_parent(dst)
144
- shutil.copy2(src, dst)
145
- continue
146
-
147
- if mode == "overwrite":
148
- ensure_parent(dst)
149
- shutil.copy2(src, dst)
150
- continue
151
-
152
- if mode == "interactive":
153
- if not exists:
154
- ensure_parent(dst)
155
- shutil.copy2(src, dst)
156
- continue
157
- answer = input(f"File exists: {rel} | [o]verwrite [s]kip [q]uit: ").strip().lower()
158
- if answer == "q":
159
- print("Aborted.")
160
- return 1
161
- if answer == "o":
162
- if backup_enabled:
163
- backup_root = backup_files(target_root, [rel])
164
- print(f"Backed up: {rel} -> {backup_root}")
165
- ensure_parent(dst)
166
- shutil.copy2(src, dst)
167
- else:
168
- continue
169
-
170
- show_banner()
171
- return 0
172
-
173
-
174
- def show_banner():
175
- M = "\033[1;35m"
176
- C = "\033[1;36m"
177
- Y = "\033[1;33m"
178
- G = "\033[1;32m"
179
- R = "\033[0m"
180
- print()
181
- print(f"{M} ██╗████████╗███████╗ ███╗ ███╗ █████╗ ██████╗ ██╗ ██████╗{R}")
182
- print(f"{M} ██║╚══██╔══╝██╔════╝ ████╗ ████║██╔══██╗██╔════╝ ██║██╔════╝{R}")
183
- print(f"{M} ██║ ██║ ███████╗█████╗██╔████╔██║███████║██║ ███╗██║██║ {R}")
184
- print(f"{C} ██║ ██║ ╚════██║╚════╝██║╚██╔╝██║██╔══██║██║ ██║██║██║ {R}")
185
- print(f"{C} ██║ ██║ ███████║ ██║ ╚═╝ ██║██║ ██║╚██████╔╝██║╚██████╗{R}")
186
- print(f"{C} ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝{R}")
187
- print()
188
- print(f"{Y} AI dev team{R}")
189
- print(f"{G} Installation complete!{R}")
190
- print()
191
-
192
-
193
- if __name__ == "__main__":
194
- raise SystemExit(main())
195
-
package/gsd-installer.sh DELETED
@@ -1,201 +0,0 @@
1
- #!/usr/bin/env sh
2
- set -e
3
-
4
-
5
- ensure_parent() {
6
- dir=$(dirname "$1")
7
- [ -d "$dir" ] || mkdir -p "$dir"
8
- }
9
-
10
- list_source_files() {
11
- source_root="$1"
12
- shift
13
- for rel in "$@"; do
14
- src="$source_root/$rel"
15
- if [ -f "$src" ]; then
16
- echo "$rel"
17
- elif [ -d "$src" ]; then
18
- find "$src" -type f | sed "s|^$source_root/||"
19
- fi
20
- done | sort -u
21
- }
22
-
23
- backup_files() {
24
- target_root="$1"
25
- shift
26
- timestamp=$(date -u +"%Y%m%d-%H%M%SZ")
27
- backup_root="$target_root/gsd-backups/$timestamp"
28
- for rel in "$@"; do
29
- src="$target_root/$rel"
30
- if [ -f "$src" ]; then
31
- dst="$backup_root/$rel"
32
- ensure_parent "$dst"
33
- cp -p "$src" "$dst"
34
- fi
35
- done
36
- echo "$backup_root"
37
- }
38
-
39
- choose_mode() {
40
- printf "%s\n" "Select install mode:"
41
- printf "%s\n" "1) missing-only (copy only files that do not exist)"
42
- printf "%s\n" "2) overwrite-all (replace existing files)"
43
- printf "%s\n" "3) interactive (prompt per file)"
44
- printf "%s" "Enter 1, 2, or 3: "
45
- read -r choice
46
- case "$choice" in
47
- 1) echo "missing" ;;
48
- 2) echo "overwrite" ;;
49
- *) echo "interactive" ;;
50
- esac
51
- }
52
-
53
- prompt_yes_no() {
54
- label="$1"
55
- default="$2"
56
- suffix="y/N"
57
- [ "$default" = "true" ] && suffix="Y/n"
58
- printf "%s [%s]: " "$label" "$suffix"
59
- read -r value
60
- value=$(printf "%s" "$value" | tr 'A-Z' 'a-z')
61
- if [ -z "$value" ]; then
62
- [ "$default" = "true" ] && return 0 || return 1
63
- fi
64
- [ "$value" = "y" ] || [ "$value" = "yes" ]
65
- }
66
-
67
- TARGET=""
68
- MODE=""
69
- BACKUP="false"
70
- CREATE="false"
71
-
72
- while [ $# -gt 0 ]; do
73
- case "$1" in
74
- --target) TARGET="$2"; shift 2 ;;
75
- --mode) MODE="$2"; shift 2 ;;
76
- --backup) BACKUP="true"; shift 1 ;;
77
- --create) CREATE="true"; shift 1 ;;
78
- *) shift 1 ;;
79
- esac
80
- done
81
-
82
- SOURCE_ROOT=$(cd "$(dirname "$0")" && pwd)
83
-
84
- if [ -z "$TARGET" ]; then
85
- printf "%s" "Target repository path: "
86
- read -r TARGET
87
- fi
88
-
89
- if [ ! -d "$TARGET" ]; then
90
- if [ "$CREATE" = "true" ] || prompt_yes_no "Target missing. Create?" "false"; then
91
- mkdir -p "$TARGET"
92
- else
93
- printf "%s\n" "Target directory does not exist."
94
- exit 1
95
- fi
96
- fi
97
- TARGET_ROOT=$(cd "$TARGET" && pwd)
98
-
99
- if [ -z "$MODE" ]; then
100
- MODE=$(choose_mode)
101
- fi
102
-
103
- if [ "$MODE" = "overwrite" ] || [ "$MODE" = "interactive" ]; then
104
- if [ "$BACKUP" = "false" ]; then
105
- if prompt_yes_no "Backup existing files before overwrite?" "false"; then
106
- BACKUP="true"
107
- fi
108
- fi
109
- fi
110
-
111
- INCLUDE_PATHS="
112
- .cursor/commands
113
- .cursor/rules
114
- .cursor/skills
115
- .cursor/agents
116
- .cursor/hooks
117
- .cursor/hooks.json
118
- .cursor/scratchpad.md
119
- docs
120
- sprints
121
- handoffs
122
- decisions
123
- .github/workflows
124
- README.md
125
- gsd-installer.py
126
- gsd-installer.ps1
127
- gsd-installer.sh
128
- "
129
-
130
- FILES=$(list_source_files "$SOURCE_ROOT" $INCLUDE_PATHS)
131
- if [ -z "$FILES" ]; then
132
- printf "%s\n" "No source files found to install."
133
- exit 1
134
- fi
135
-
136
- if [ "$BACKUP" = "true" ] && [ "$MODE" = "overwrite" ]; then
137
- overwrite_candidates=""
138
- for rel in $FILES; do
139
- [ -f "$TARGET_ROOT/$rel" ] && overwrite_candidates="$overwrite_candidates $rel"
140
- done
141
- if [ -n "$overwrite_candidates" ]; then
142
- backup_root=$(backup_files "$TARGET_ROOT" $overwrite_candidates)
143
- printf "%s\n" "Backup created at: $backup_root"
144
- fi
145
- fi
146
-
147
- for rel in $FILES; do
148
- src="$SOURCE_ROOT/$rel"
149
- dst="$TARGET_ROOT/$rel"
150
- if [ "$MODE" = "missing" ]; then
151
- [ -f "$dst" ] && continue
152
- ensure_parent "$dst"
153
- cp -p "$src" "$dst"
154
- continue
155
- fi
156
- if [ "$MODE" = "overwrite" ]; then
157
- ensure_parent "$dst"
158
- cp -p "$src" "$dst"
159
- continue
160
- fi
161
- if [ "$MODE" = "interactive" ]; then
162
- if [ ! -f "$dst" ]; then
163
- ensure_parent "$dst"
164
- cp -p "$src" "$dst"
165
- continue
166
- fi
167
- printf "%s" "File exists: $rel | [o]verwrite [s]kip [q]uit: "
168
- read -r answer
169
- answer=$(printf "%s" "$answer" | tr 'A-Z' 'a-z')
170
- if [ "$answer" = "q" ]; then
171
- printf "%s\n" "Aborted."
172
- exit 1
173
- fi
174
- if [ "$answer" = "o" ]; then
175
- if [ "$BACKUP" = "true" ]; then
176
- backup_root=$(backup_files "$TARGET_ROOT" "$rel")
177
- printf "%s\n" "Backed up: $rel -> $backup_root"
178
- fi
179
- ensure_parent "$dst"
180
- cp -p "$src" "$dst"
181
- fi
182
- fi
183
- done
184
-
185
- show_banner() {
186
- printf "\n"
187
- printf "\033[1;35m ██╗████████╗███████╗ ███╗ ███╗ █████╗ ██████╗ ██╗ ██████╗\033[0m\n"
188
- printf "\033[1;35m ██║╚══██╔══╝██╔════╝ ████╗ ████║██╔══██╗██╔════╝ ██║██╔════╝\033[0m\n"
189
- printf "\033[1;35m ██║ ██║ ███████╗█████╗██╔████╔██║███████║██║ ███╗██║██║ \033[0m\n"
190
- printf "\033[1;36m ██║ ██║ ╚════██║╚════╝██║╚██╔╝██║██╔══██║██║ ██║██║██║ \033[0m\n"
191
- printf "\033[1;36m ██║ ██║ ███████║ ██║ ╚═╝ ██║██║ ██║╚██████╔╝██║╚██████╗\033[0m\n"
192
- printf "\033[1;36m ╚═╝ ╚═╝ ╚══════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝\033[0m\n"
193
- printf "\n"
194
- printf "\033[1;33m AI dev team\033[0m\n"
195
- printf "\033[1;32m Installation complete!\033[0m\n"
196
- printf "\n"
197
- }
198
-
199
- show_banner
200
- exit 0
201
-
@@ -1,14 +0,0 @@
1
- # Release Notes
2
-
3
- ## Summary
4
- - ...
5
-
6
- ## Changes
7
- - ...
8
-
9
- ## Known issues
10
- - ...
11
-
12
- ## Deploy steps
13
- - ...
14
-
@@ -1,8 +0,0 @@
1
- # Resume Brief
2
-
3
- ## Current status
4
- - ...
5
-
6
- ## Next actions
7
- - ...
8
-
@@ -1,7 +0,0 @@
1
- {
2
- "id": "M0001",
3
- "name": "",
4
- "goal": "",
5
- "scope": [],
6
- "status": "active"
7
- }
@@ -1,9 +0,0 @@
1
- {
2
- "milestone": "M0001",
3
- "phases": [
4
- {
5
- "name": "intake",
6
- "status": "pending"
7
- }
8
- ]
9
- }
@@ -1,3 +0,0 @@
1
- # Milestone Progress
2
-
3
- - ...
@@ -1,3 +0,0 @@
1
- # Milestone Summary
2
-
3
- - ...
@@ -1,74 +0,0 @@
1
- Param(
2
- [string]$RepoRoot,
3
- [string]$Version = "v0.0.0",
4
- [string]$Sprint = "S0001"
5
- )
6
-
7
- $ErrorActionPreference = "Stop"
8
-
9
- function Resolve-RepoRoot {
10
- if ($RepoRoot) { return (Resolve-Path $RepoRoot).Path }
11
- return (Resolve-Path (Join-Path $PSScriptRoot "..")).Path
12
- }
13
-
14
- function Read-IfExists($Path) {
15
- if (Test-Path $Path -PathType Leaf) {
16
- return Get-Content -Path $Path -Raw
17
- }
18
- return ""
19
- }
20
-
21
- $root = Resolve-RepoRoot
22
- $summaryPath = Join-Path $root "sprints\$Sprint\summary.md"
23
- $qaPath = Join-Path $root "sprints\$Sprint\qa-findings.md"
24
- $runbookPath = Join-Path $root "docs\engineering\runbook.md"
25
- $outPath = Join-Path $root "handoffs\release_notes.md"
26
-
27
- $summary = Read-IfExists $summaryPath
28
- $qa = Read-IfExists $qaPath
29
- $runbook = Read-IfExists $runbookPath
30
-
31
- $gitChanges = ""
32
- if (Get-Command git -ErrorAction SilentlyContinue) {
33
- try {
34
- $isRepo = git -C $root rev-parse --is-inside-work-tree 2>$null
35
- if ($isRepo -eq "true") {
36
- $gitChanges = git -C $root log -n 20 --pretty=format:"- %s"
37
- }
38
- } catch {}
39
- }
40
-
41
- $timestamp = (Get-Date).ToString("yyyy-MM-dd")
42
-
43
- @"
44
- # Release Notes — $Version
45
-
46
- **Sprint:** $Sprint
47
- **Date:** $timestamp
48
-
49
- ---
50
-
51
- ## Summary
52
-
53
- ${summary.Trim()}
54
-
55
- ---
56
-
57
- ## Changes (last 20 commits)
58
-
59
- ${gitChanges.Trim()}
60
-
61
- ---
62
-
63
- ## QA Findings (from sprint)
64
-
65
- ${qa.Trim()}
66
-
67
- ---
68
-
69
- ## Runbook Notes
70
-
71
- ${runbook.Trim()}
72
- "@ | Set-Content -Path $outPath
73
-
74
- Write-Host "Release notes written to: $outPath"
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env sh
2
- set -e
3
-
4
- ROOT="${1:-$(cd "$(dirname "$0")/.." && pwd)}"
5
- VERSION="${2:-v0.0.0}"
6
- SPRINT="${3:-S0001}"
7
-
8
- SUMMARY_PATH="$ROOT/sprints/$SPRINT/summary.md"
9
- QA_PATH="$ROOT/sprints/$SPRINT/qa-findings.md"
10
- RUNBOOK_PATH="$ROOT/docs/engineering/runbook.md"
11
- OUT_PATH="$ROOT/handoffs/release_notes.md"
12
-
13
- read_if_exists() {
14
- if [ -f "$1" ]; then
15
- cat "$1"
16
- fi
17
- }
18
-
19
- summary="$(read_if_exists "$SUMMARY_PATH")"
20
- qa="$(read_if_exists "$QA_PATH")"
21
- runbook="$(read_if_exists "$RUNBOOK_PATH")"
22
-
23
- git_changes=""
24
- if command -v git >/dev/null 2>&1; then
25
- if git -C "$ROOT" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
26
- git_changes="$(git -C "$ROOT" log -n 20 --pretty=format:"- %s")"
27
- fi
28
- fi
29
-
30
- timestamp="$(date +"%Y-%m-%d")"
31
-
32
- cat > "$OUT_PATH" <<EOF
33
- # Release Notes — $VERSION
34
-
35
- **Sprint:** $SPRINT
36
- **Date:** $timestamp
37
-
38
- ---
39
-
40
- ## Summary
41
-
42
- $summary
43
-
44
- ---
45
-
46
- ## Changes (last 20 commits)
47
-
48
- $git_changes
49
-
50
- ---
51
-
52
- ## QA Findings (from sprint)
53
-
54
- $qa
55
-
56
- ---
57
-
58
- ## Runbook Notes
59
-
60
- $runbook
61
- EOF
62
-
63
- echo "Release notes written to: $OUT_PATH"