its-magic 0.1.2-9 → 0.1.3-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1602 -755
- package/bin/its-magic.js +121 -11
- package/bin/postinstall.js +93 -0
- package/installer.ps1 +759 -0
- package/installer.py +1036 -0
- package/installer.sh +649 -0
- package/package.json +18 -14
- package/scripts/check_intake_template_parity.py +312 -0
- package/scripts/doc_profile_lib.py +415 -0
- package/scripts/guard_installer_publish.py +88 -0
- package/scripts/intake_bug_routing_guard.py +67 -0
- package/scripts/intake_evidence_lib.py +802 -0
- package/scripts/intake_evidence_validate.py +73 -0
- package/scripts/materialize_codebase_map.py +184 -0
- package/scripts/remote_config_summary.py +243 -0
- package/template/.cursor/agents/curator.mdc +35 -0
- package/template/.cursor/agents/dev.mdc +29 -0
- package/template/.cursor/agents/po.mdc +141 -0
- package/template/.cursor/agents/qa.mdc +28 -0
- package/template/.cursor/agents/release.mdc +28 -0
- package/template/.cursor/agents/security.mdc +98 -0
- package/template/.cursor/agents/tech-lead.mdc +57 -0
- package/template/.cursor/commands/architecture.md +127 -0
- package/template/.cursor/commands/ask.md +55 -0
- package/template/.cursor/commands/auto.md +533 -0
- package/template/.cursor/commands/discovery.md +47 -0
- package/template/.cursor/commands/execute.md +343 -0
- package/template/.cursor/commands/intake.md +323 -0
- package/template/.cursor/commands/map-codebase.md +46 -0
- package/template/.cursor/commands/memory-audit.md +175 -0
- package/template/.cursor/commands/milestone-complete.md +51 -0
- package/template/.cursor/commands/milestone-start.md +59 -0
- package/template/.cursor/commands/pause.md +64 -0
- package/{.cursor/commands/gsd-phase-context.md → template/.cursor/commands/phase-context.md} +6 -2
- package/template/.cursor/commands/plan-verify.md +34 -0
- package/template/.cursor/commands/qa.md +226 -0
- package/template/.cursor/commands/quick.md +41 -0
- package/template/.cursor/commands/refresh-context.md +82 -0
- package/template/.cursor/commands/release.md +523 -0
- package/template/.cursor/commands/research.md +49 -0
- package/template/.cursor/commands/resume.md +67 -0
- package/template/.cursor/commands/security-review.md +81 -0
- package/template/.cursor/commands/sprint-plan.md +103 -0
- package/template/.cursor/commands/status-reconcile.md +95 -0
- package/template/.cursor/commands/verify-work.md +152 -0
- package/template/.cursor/dev-environment.json.example +22 -0
- package/{.cursor → template/.cursor}/hooks/README.md +3 -2
- package/{.cursor/hooks/gsd-hook.py → template/.cursor/hooks/hook.py} +15 -6
- package/template/.cursor/hooks.json +26 -0
- package/template/.cursor/remote.json +31 -0
- package/template/.cursor/rules/caveman.mdc +184 -0
- package/template/.cursor/rules/coding-standards.mdc +39 -0
- package/template/.cursor/rules/core.mdc +111 -0
- package/template/.cursor/rules/handoffs.mdc +27 -0
- package/template/.cursor/rules/quality.mdc +49 -0
- package/template/.cursor/scratchpad.local.example.md +323 -0
- package/template/.cursor/scratchpad.md +324 -0
- package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/SKILL.md +2 -2
- package/template/.cursorignore +6 -0
- package/template/.env.example +28 -0
- package/template/.github/workflows/ci.yml +194 -0
- package/{.github → template/.github}/workflows/deploy.yml +5 -2
- package/template/.its-magic-version +1 -0
- package/template/CHANGELOG.md +11 -0
- package/template/README.md +1602 -0
- package/template/decisions/DEC-0001.md +11 -0
- package/template/decisions/DEC-0002.md +11 -0
- package/template/docs/developer/README.md +44 -0
- package/template/docs/engineering/architecture.md +9 -0
- package/template/docs/engineering/artifact-ordering-policy.md +48 -0
- package/template/docs/engineering/artifact-ownership-policy.md +57 -0
- package/template/docs/engineering/auto-orchestration-reference.md +1211 -0
- package/{docs → template/docs}/engineering/codebase-map.md +0 -5
- package/template/docs/engineering/compatibility-report.md +20 -0
- package/template/docs/engineering/compatibility-signals.md +7 -0
- package/template/docs/engineering/component-scope-report.md +16 -0
- package/template/docs/engineering/component-scope.md +19 -0
- package/template/docs/engineering/context/installer-owned-paths.manifest +96 -0
- package/template/docs/engineering/context/readme-section-affinity.json +30 -0
- package/template/docs/engineering/decisions.md +16 -0
- package/template/docs/engineering/legacy-drift-audit.md +21 -0
- package/template/docs/engineering/manifests/components/api-gateway.manifest.yaml +12 -0
- package/template/docs/engineering/manifests/registry.manifest.yaml +20 -0
- package/template/docs/engineering/manifests/repo.manifest.yaml +11 -0
- package/template/docs/engineering/phase-context.md +16 -0
- package/template/docs/engineering/release-targets.json +123 -0
- package/template/docs/engineering/research.md +29 -0
- package/template/docs/engineering/runbook.md +2391 -0
- package/template/docs/engineering/runtime-connectivity.md +81 -0
- package/template/docs/engineering/security-review.md +33 -0
- package/template/docs/engineering/spec-pack/README.md +20 -0
- package/template/docs/engineering/state-archive/README.md +15 -0
- package/template/docs/engineering/state.md +20 -0
- package/template/docs/engineering/status-normalization-report.md +19 -0
- package/template/docs/engineering/token-cost-parity-manifest.md +16 -0
- package/template/docs/engineering/us-0084-remote-e2e.md +44 -0
- package/template/docs/product/acceptance.md +1 -0
- package/template/docs/product/backlog.md +5 -0
- package/template/docs/product/vision.md +11 -0
- package/template/docs/user-guides/README.md +40 -0
- package/{handoffs → template/handoffs}/dev_to_qa.md +0 -3
- package/{handoffs → template/handoffs}/po_to_tl.md +0 -3
- package/{handoffs → template/handoffs}/qa_to_dev.md +1 -2
- package/template/handoffs/release_notes.md +51 -0
- package/template/handoffs/release_queue.md +47 -0
- package/template/handoffs/release_to_dev.md +31 -0
- package/template/handoffs/releases/Sxxxx-release-notes.md +62 -0
- package/template/handoffs/releases/vX.Y.Z-release-notes.md.example +21 -0
- package/template/handoffs/resume_brief.md +14 -0
- package/{handoffs → template/handoffs}/tl_to_dev.md +0 -2
- package/template/handoffs/token_cost_runs/README.md +26 -0
- package/template/its_magic/.its-magic-version +1 -0
- package/template/its_magic/README.md +9 -0
- package/template/scripts/auto_outer_driver.py +521 -0
- package/template/scripts/caveman_compress_input.py +903 -0
- package/template/scripts/check_downstream_ci_guard.py +67 -0
- package/template/scripts/check_intake_template_parity.py +312 -0
- package/template/scripts/check_token_cost_parity.py +69 -0
- package/template/scripts/dev_environment_lib.py +601 -0
- package/template/scripts/doc_profile_lib.py +415 -0
- package/template/scripts/downstream_ci_guard_lib.py +222 -0
- package/template/scripts/enforce-triad-hot-surface.py +753 -0
- package/template/scripts/guard_installer_publish.py +88 -0
- package/template/scripts/intake_bug_resume_brief_refresh.py +303 -0
- package/template/scripts/intake_bug_routing_guard.py +67 -0
- package/template/scripts/intake_evidence_lib.py +802 -0
- package/template/scripts/intake_evidence_validate.py +73 -0
- package/template/scripts/materialize_codebase_map.py +184 -0
- package/template/scripts/pack_json_validate.py +130 -0
- package/template/scripts/project_readme_coverage_lib.py +417 -0
- package/template/scripts/readme_feature_coverage_lib.py +608 -0
- package/{scripts → template/scripts}/release-all.sh +27 -4
- package/template/scripts/release_changelog_backfill.py +153 -0
- package/template/scripts/release_changelog_lib.py +544 -0
- package/template/scripts/release_changelog_validate.py +134 -0
- package/template/scripts/remote_config_summary.py +243 -0
- package/template/scripts/sync_push_gates.py +198 -0
- package/template/scripts/token_cost_compare.py +40 -0
- package/template/scripts/token_cost_lib.py +108 -0
- package/template/scripts/uat_probe_lib.py +868 -0
- package/template/scripts/validate-and-push.ps1 +280 -0
- package/template/scripts/validate-and-push.sh +243 -0
- package/template/scripts/validate_doc_profile.py +103 -0
- package/template/scripts/validate_project_readme_coverage.py +151 -0
- package/template/scripts/validate_readme_feature_coverage.py +140 -0
- package/template/sprints/S0001/progress.md +1 -0
- package/template/sprints/S0001/qa-findings.md +9 -0
- package/template/sprints/S0001/release-findings.md +24 -0
- package/template/sprints/S0001/sprint.md +9 -0
- package/template/sprints/S0001/summary.md +7 -0
- package/template/sprints/S0001/tasks.md +1 -0
- package/template/sprints/S0001/uat.json +6 -0
- package/template/sprints/S0001/uat.md +5 -0
- package/template/sprints/quick/Q0001/summary.md +1 -0
- package/{sprints → template/sprints}/quick/Q0001/task.json +0 -1
- package/.cursor/agents/curator.mdc +0 -21
- package/.cursor/agents/dev.mdc +0 -20
- package/.cursor/agents/po.mdc +0 -19
- package/.cursor/agents/qa.mdc +0 -19
- package/.cursor/agents/release.mdc +0 -19
- package/.cursor/agents/tech-lead.mdc +0 -21
- package/.cursor/commands/gsd-architecture.md +0 -29
- package/.cursor/commands/gsd-auto.md +0 -27
- package/.cursor/commands/gsd-discovery.md +0 -27
- package/.cursor/commands/gsd-execute.md +0 -32
- package/.cursor/commands/gsd-intake.md +0 -28
- package/.cursor/commands/gsd-map-codebase.md +0 -25
- package/.cursor/commands/gsd-milestone-complete.md +0 -24
- package/.cursor/commands/gsd-milestone-start.md +0 -26
- package/.cursor/commands/gsd-pause.md +0 -25
- package/.cursor/commands/gsd-plan-verify.md +0 -26
- package/.cursor/commands/gsd-qa.md +0 -28
- package/.cursor/commands/gsd-quick.md +0 -24
- package/.cursor/commands/gsd-refresh-context.md +0 -26
- package/.cursor/commands/gsd-release.md +0 -29
- package/.cursor/commands/gsd-research.md +0 -28
- package/.cursor/commands/gsd-resume.md +0 -26
- package/.cursor/commands/gsd-sprint-plan.md +0 -30
- package/.cursor/commands/gsd-verify-work.md +0 -25
- package/.cursor/hooks.json +0 -26
- package/.cursor/plans/cursor-gsd-team-kit_8cfee9b8.plan.md +0 -57
- package/.cursor/remote.json +0 -18
- package/.cursor/rules/gsd-core.mdc +0 -18
- package/.cursor/rules/gsd-handoffs.mdc +0 -10
- package/.cursor/rules/gsd-quality.mdc +0 -15
- package/.cursor/scratchpad.md +0 -34
- package/.github/workflows/ci.yml +0 -47
- package/decisions/DEC-0001.md +0 -21
- package/decisions/DEC-0002.md +0 -21
- package/docs/engineering/architecture.md +0 -354
- package/docs/engineering/decisions.md +0 -6
- package/docs/engineering/research.md +0 -11
- package/docs/engineering/runbook.md +0 -32
- package/docs/engineering/state.md +0 -33
- package/docs/product/acceptance.md +0 -6
- package/docs/product/backlog.md +0 -7
- package/docs/product/vision.md +0 -46
- package/gsd-installer.ps1 +0 -189
- package/gsd-installer.py +0 -195
- package/gsd-installer.sh +0 -201
- package/handoffs/release_notes.md +0 -14
- package/handoffs/resume_brief.md +0 -8
- package/milestones/M0001/milestone.json +0 -7
- package/milestones/M0001/phases.json +0 -9
- package/milestones/M0001/progress.md +0 -3
- package/milestones/M0001/summary.md +0 -3
- package/scripts/generate-release-notes.ps1 +0 -74
- package/scripts/generate-release-notes.sh +0 -63
- package/scripts/release-all.ps1 +0 -423
- package/sprints/S0001/progress.md +0 -4
- package/sprints/S0001/qa-findings.md +0 -113
- package/sprints/S0001/sprint.md +0 -70
- package/sprints/S0001/summary.md +0 -46
- package/sprints/S0001/tasks.md +0 -35
- package/sprints/S0001/uat.json +0 -8
- package/sprints/S0001/uat.md +0 -8
- package/sprints/quick/Q0001/summary.md +0 -3
- /package/{.cursor/rules/gsd-escalation.mdc → template/.cursor/rules/escalation.mdc} +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/acceptance.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/architecture.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/decision.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/handoff.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/milestone.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/phase-context.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/plan-verify.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/sprint.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.json +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/story.md +0 -0
- /package/{.cursor/skills/gsd-team → template/.cursor/skills/its-magic}/templates/uat.json +0 -0
- /package/{docs → template/docs}/engineering/context/phase-template.json +0 -0
- /package/{docs → template/docs}/engineering/dependencies.json +0 -0
- /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
|
-
|
package/handoffs/resume_brief.md
DELETED
|
@@ -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"
|