thachvd-kit 1.0.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/.shared/ui-ux-pro-max/data/charts.csv +26 -0
- package/.shared/ui-ux-pro-max/data/colors.csv +97 -0
- package/.shared/ui-ux-pro-max/data/icons.csv +101 -0
- package/.shared/ui-ux-pro-max/data/landing.csv +31 -0
- package/.shared/ui-ux-pro-max/data/products.csv +97 -0
- package/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
- package/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.shared/ui-ux-pro-max/data/styles.csv +59 -0
- package/.shared/ui-ux-pro-max/data/typography.csv +58 -0
- package/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
- package/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
- package/.shared/ui-ux-pro-max/scripts/core.py +258 -0
- package/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.shared/ui-ux-pro-max/scripts/search.py +106 -0
- package/ARCHITECTURE.md +288 -0
- package/CLAUDE.md +90 -0
- package/PROJECT_CONTEXT.template.md +68 -0
- package/README.md +69 -0
- package/agents/backend-specialist.md +263 -0
- package/agents/code-archaeologist.md +106 -0
- package/agents/database-architect.md +226 -0
- package/agents/debugger.md +225 -0
- package/agents/devops-engineer.md +242 -0
- package/agents/documentation-writer.md +104 -0
- package/agents/explorer-agent.md +73 -0
- package/agents/frontend-specialist.md +593 -0
- package/agents/game-developer.md +162 -0
- package/agents/mobile-developer.md +377 -0
- package/agents/orchestrator.md +416 -0
- package/agents/penetration-tester.md +188 -0
- package/agents/performance-optimizer.md +187 -0
- package/agents/product-manager.md +112 -0
- package/agents/product-owner.md +95 -0
- package/agents/project-planner.md +406 -0
- package/agents/qa-automation-engineer.md +103 -0
- package/agents/security-auditor.md +170 -0
- package/agents/seo-specialist.md +111 -0
- package/agents/test-engineer.md +158 -0
- package/bin/cli.js +373 -0
- package/kit/PROJECT_CONTEXT.template.md +35 -0
- package/kit/PROMPT_RECIPE.md +52 -0
- package/kit/README.md +32 -0
- package/mcp_config.json +24 -0
- package/package.json +25 -0
- package/rules/GEMINI.md +204 -0
- package/scripts/auto_preview.py +148 -0
- package/scripts/checklist.py +217 -0
- package/scripts/init.py +403 -0
- package/scripts/session_manager.py +120 -0
- package/scripts/verify_all.py +327 -0
- package/skills/api-design/SKILL.md +156 -0
- package/skills/api-patterns/SKILL.md +81 -0
- package/skills/api-patterns/api-style.md +42 -0
- package/skills/api-patterns/auth.md +24 -0
- package/skills/api-patterns/documentation.md +26 -0
- package/skills/api-patterns/graphql.md +41 -0
- package/skills/api-patterns/rate-limiting.md +31 -0
- package/skills/api-patterns/response.md +37 -0
- package/skills/api-patterns/rest.md +40 -0
- package/skills/api-patterns/scripts/api_validator.py +211 -0
- package/skills/api-patterns/security-testing.md +122 -0
- package/skills/api-patterns/trpc.md +41 -0
- package/skills/api-patterns/versioning.md +22 -0
- package/skills/app-builder/SKILL.md +75 -0
- package/skills/app-builder/agent-coordination.md +71 -0
- package/skills/app-builder/feature-building.md +53 -0
- package/skills/app-builder/project-detection.md +34 -0
- package/skills/app-builder/scaffolding.md +118 -0
- package/skills/app-builder/tech-stack.md +40 -0
- package/skills/app-builder/templates/SKILL.md +39 -0
- package/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
- package/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
- package/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
- package/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
- package/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
- package/skills/architecture/SKILL.md +55 -0
- package/skills/architecture/context-discovery.md +43 -0
- package/skills/architecture/examples.md +94 -0
- package/skills/architecture/pattern-selection.md +68 -0
- package/skills/architecture/patterns-reference.md +50 -0
- package/skills/architecture/trade-off-analysis.md +77 -0
- package/skills/bash-linux/SKILL.md +199 -0
- package/skills/behavioral-modes/SKILL.md +242 -0
- package/skills/brainstorming/SKILL.md +163 -0
- package/skills/brainstorming/dynamic-questioning.md +350 -0
- package/skills/clean-code/SKILL.md +201 -0
- package/skills/code-review-checklist/SKILL.md +109 -0
- package/skills/database-design/SKILL.md +52 -0
- package/skills/database-design/database-selection.md +43 -0
- package/skills/database-design/indexing.md +39 -0
- package/skills/database-design/migrations.md +48 -0
- package/skills/database-design/optimization.md +36 -0
- package/skills/database-design/orm-selection.md +30 -0
- package/skills/database-design/schema-design.md +56 -0
- package/skills/database-design/scripts/schema_validator.py +172 -0
- package/skills/deployment-procedures/SKILL.md +241 -0
- package/skills/dispatching-parallel-agents/SKILL.md +112 -0
- package/skills/doc.md +177 -0
- package/skills/docker-patterns/SKILL.md +232 -0
- package/skills/documentation-templates/SKILL.md +194 -0
- package/skills/executing-plans/SKILL.md +61 -0
- package/skills/finishing-a-development-branch/SKILL.md +135 -0
- package/skills/frontend-design/SKILL.md +418 -0
- package/skills/frontend-design/animation-guide.md +331 -0
- package/skills/frontend-design/color-system.md +311 -0
- package/skills/frontend-design/decision-trees.md +418 -0
- package/skills/frontend-design/motion-graphics.md +306 -0
- package/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/skills/frontend-design/typography-system.md +345 -0
- package/skills/frontend-design/ux-psychology.md +1116 -0
- package/skills/frontend-design/visual-effects.md +383 -0
- package/skills/game-development/2d-games/SKILL.md +119 -0
- package/skills/game-development/3d-games/SKILL.md +135 -0
- package/skills/game-development/SKILL.md +167 -0
- package/skills/game-development/game-art/SKILL.md +185 -0
- package/skills/game-development/game-audio/SKILL.md +190 -0
- package/skills/game-development/game-design/SKILL.md +129 -0
- package/skills/game-development/mobile-games/SKILL.md +108 -0
- package/skills/game-development/multiplayer/SKILL.md +132 -0
- package/skills/game-development/pc-games/SKILL.md +144 -0
- package/skills/game-development/vr-ar/SKILL.md +123 -0
- package/skills/game-development/web-games/SKILL.md +150 -0
- package/skills/geo-fundamentals/SKILL.md +156 -0
- package/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/skills/golang-patterns/SKILL.md +226 -0
- package/skills/golang-testing/SKILL.md +182 -0
- package/skills/i18n-localization/SKILL.md +154 -0
- package/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/skills/intelligent-routing/SKILL.md +335 -0
- package/skills/laravel-patterns/SKILL.md +224 -0
- package/skills/laravel-security/SKILL.md +171 -0
- package/skills/laravel-tdd/SKILL.md +149 -0
- package/skills/lint-and-validate/SKILL.md +45 -0
- package/skills/lint-and-validate/scripts/lint_runner.py +184 -0
- package/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/skills/mcp-builder/SKILL.md +176 -0
- package/skills/mobile-design/SKILL.md +394 -0
- package/skills/mobile-design/decision-trees.md +516 -0
- package/skills/mobile-design/mobile-backend.md +491 -0
- package/skills/mobile-design/mobile-color-system.md +420 -0
- package/skills/mobile-design/mobile-debugging.md +122 -0
- package/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/skills/mobile-design/mobile-navigation.md +458 -0
- package/skills/mobile-design/mobile-performance.md +767 -0
- package/skills/mobile-design/mobile-testing.md +356 -0
- package/skills/mobile-design/mobile-typography.md +433 -0
- package/skills/mobile-design/platform-android.md +666 -0
- package/skills/mobile-design/platform-ios.md +561 -0
- package/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/skills/mobile-design/touch-psychology.md +537 -0
- package/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
- package/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
- package/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
- package/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
- package/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
- package/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
- package/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
- package/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
- package/skills/nextjs-react-expert/SKILL.md +286 -0
- package/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
- package/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
- package/skills/nodejs-best-practices/SKILL.md +333 -0
- package/skills/parallel-agents/SKILL.md +175 -0
- package/skills/performance-profiling/SKILL.md +143 -0
- package/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/skills/plan-writing/SKILL.md +152 -0
- package/skills/powershell-windows/SKILL.md +167 -0
- package/skills/project-onboarding/SKILL.md +62 -0
- package/skills/python-patterns/SKILL.md +441 -0
- package/skills/receiving-code-review/SKILL.md +120 -0
- package/skills/red-team-tactics/SKILL.md +199 -0
- package/skills/requesting-code-review/SKILL.md +67 -0
- package/skills/rust-pro/SKILL.md +176 -0
- package/skills/seo-fundamentals/SKILL.md +129 -0
- package/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/skills/server-management/SKILL.md +161 -0
- package/skills/subagent-driven-development/SKILL.md +76 -0
- package/skills/systematic-debugging/SKILL.md +109 -0
- package/skills/tailwind-patterns/SKILL.md +269 -0
- package/skills/tdd-workflow/SKILL.md +149 -0
- package/skills/testing-patterns/SKILL.md +178 -0
- package/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/skills/using-git-worktrees/SKILL.md +122 -0
- package/skills/verification-before-completion/SKILL.md +99 -0
- package/skills/vulnerability-scanner/SKILL.md +276 -0
- package/skills/vulnerability-scanner/checklists.md +121 -0
- package/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/skills/web-design-guidelines/SKILL.md +57 -0
- package/skills/webapp-testing/SKILL.md +187 -0
- package/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/skills/writing-skills/SKILL.md +110 -0
- package/workflows/brainstorm.md +113 -0
- package/workflows/create.md +59 -0
- package/workflows/debug.md +103 -0
- package/workflows/deploy.md +176 -0
- package/workflows/enhance.md +63 -0
- package/workflows/orchestrate.md +237 -0
- package/workflows/plan.md +89 -0
- package/workflows/preview.md +81 -0
- package/workflows/status.md +86 -0
- package/workflows/test.md +144 -0
- package/workflows/ui-ux-pro-max.md +296 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Master Checklist Runner - Antigravity Kit
|
|
4
|
+
==========================================
|
|
5
|
+
|
|
6
|
+
Orchestrates all validation scripts in priority order.
|
|
7
|
+
Use this for incremental validation during development.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
python scripts/checklist.py . # Run core checks
|
|
11
|
+
python scripts/checklist.py . --url <URL> # Include performance checks
|
|
12
|
+
|
|
13
|
+
Priority Order:
|
|
14
|
+
P0: Security Scan (vulnerabilities, secrets)
|
|
15
|
+
P1: Lint & Type Check (code quality)
|
|
16
|
+
P2: Schema Validation (if database exists)
|
|
17
|
+
P3: Test Runner (unit/integration tests)
|
|
18
|
+
P4: UX Audit (psychology laws, accessibility)
|
|
19
|
+
P5: SEO Check (meta tags, structure)
|
|
20
|
+
P6: Performance (lighthouse - requires URL)
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
import sys
|
|
24
|
+
import subprocess
|
|
25
|
+
import argparse
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import List, Tuple, Optional
|
|
28
|
+
|
|
29
|
+
# ANSI colors for terminal output
|
|
30
|
+
class Colors:
|
|
31
|
+
HEADER = '\033[95m'
|
|
32
|
+
BLUE = '\033[94m'
|
|
33
|
+
CYAN = '\033[96m'
|
|
34
|
+
GREEN = '\033[92m'
|
|
35
|
+
YELLOW = '\033[93m'
|
|
36
|
+
RED = '\033[91m'
|
|
37
|
+
ENDC = '\033[0m'
|
|
38
|
+
BOLD = '\033[1m'
|
|
39
|
+
|
|
40
|
+
def print_header(text: str):
|
|
41
|
+
print(f"\n{Colors.BOLD}{Colors.CYAN}{'='*60}{Colors.ENDC}")
|
|
42
|
+
print(f"{Colors.BOLD}{Colors.CYAN}{text.center(60)}{Colors.ENDC}")
|
|
43
|
+
print(f"{Colors.BOLD}{Colors.CYAN}{'='*60}{Colors.ENDC}\n")
|
|
44
|
+
|
|
45
|
+
def print_step(text: str):
|
|
46
|
+
print(f"{Colors.BOLD}{Colors.BLUE}🔄 {text}{Colors.ENDC}")
|
|
47
|
+
|
|
48
|
+
def print_success(text: str):
|
|
49
|
+
print(f"{Colors.GREEN}✅ {text}{Colors.ENDC}")
|
|
50
|
+
|
|
51
|
+
def print_warning(text: str):
|
|
52
|
+
print(f"{Colors.YELLOW}⚠️ {text}{Colors.ENDC}")
|
|
53
|
+
|
|
54
|
+
def print_error(text: str):
|
|
55
|
+
print(f"{Colors.RED}❌ {text}{Colors.ENDC}")
|
|
56
|
+
|
|
57
|
+
# Define priority-ordered checks
|
|
58
|
+
CORE_CHECKS = [
|
|
59
|
+
("Security Scan", ".agent/skills/vulnerability-scanner/scripts/security_scan.py", True),
|
|
60
|
+
("Lint Check", ".agent/skills/lint-and-validate/scripts/lint_runner.py", True),
|
|
61
|
+
("Schema Validation", ".agent/skills/database-design/scripts/schema_validator.py", False),
|
|
62
|
+
("Test Runner", ".agent/skills/testing-patterns/scripts/test_runner.py", False),
|
|
63
|
+
("UX Audit", ".agent/skills/frontend-design/scripts/ux_audit.py", False),
|
|
64
|
+
("SEO Check", ".agent/skills/seo-fundamentals/scripts/seo_checker.py", False),
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
PERFORMANCE_CHECKS = [
|
|
68
|
+
("Lighthouse Audit", ".agent/skills/performance-profiling/scripts/lighthouse_audit.py", True),
|
|
69
|
+
("Playwright E2E", ".agent/skills/webapp-testing/scripts/playwright_runner.py", False),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
def check_script_exists(script_path: Path) -> bool:
|
|
73
|
+
"""Check if script file exists"""
|
|
74
|
+
return script_path.exists() and script_path.is_file()
|
|
75
|
+
|
|
76
|
+
def run_script(name: str, script_path: Path, project_path: str, url: Optional[str] = None) -> dict:
|
|
77
|
+
"""
|
|
78
|
+
Run a validation script and capture results
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
dict with keys: name, passed, output, skipped
|
|
82
|
+
"""
|
|
83
|
+
if not check_script_exists(script_path):
|
|
84
|
+
print_warning(f"{name}: Script not found, skipping")
|
|
85
|
+
return {"name": name, "passed": True, "output": "", "skipped": True}
|
|
86
|
+
|
|
87
|
+
print_step(f"Running: {name}")
|
|
88
|
+
|
|
89
|
+
# Build command
|
|
90
|
+
cmd = ["python", str(script_path), project_path]
|
|
91
|
+
if url and ("lighthouse" in script_path.name.lower() or "playwright" in script_path.name.lower()):
|
|
92
|
+
cmd.append(url)
|
|
93
|
+
|
|
94
|
+
# Run script
|
|
95
|
+
try:
|
|
96
|
+
result = subprocess.run(
|
|
97
|
+
cmd,
|
|
98
|
+
capture_output=True,
|
|
99
|
+
text=True,
|
|
100
|
+
timeout=300 # 5 minute timeout
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
passed = result.returncode == 0
|
|
104
|
+
|
|
105
|
+
if passed:
|
|
106
|
+
print_success(f"{name}: PASSED")
|
|
107
|
+
else:
|
|
108
|
+
print_error(f"{name}: FAILED")
|
|
109
|
+
if result.stderr:
|
|
110
|
+
print(f" Error: {result.stderr[:200]}")
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
"name": name,
|
|
114
|
+
"passed": passed,
|
|
115
|
+
"output": result.stdout,
|
|
116
|
+
"error": result.stderr,
|
|
117
|
+
"skipped": False
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
except subprocess.TimeoutExpired:
|
|
121
|
+
print_error(f"{name}: TIMEOUT (>5 minutes)")
|
|
122
|
+
return {"name": name, "passed": False, "output": "", "error": "Timeout", "skipped": False}
|
|
123
|
+
|
|
124
|
+
except Exception as e:
|
|
125
|
+
print_error(f"{name}: ERROR - {str(e)}")
|
|
126
|
+
return {"name": name, "passed": False, "output": "", "error": str(e), "skipped": False}
|
|
127
|
+
|
|
128
|
+
def print_summary(results: List[dict]):
|
|
129
|
+
"""Print final summary report"""
|
|
130
|
+
print_header("📊 CHECKLIST SUMMARY")
|
|
131
|
+
|
|
132
|
+
passed_count = sum(1 for r in results if r["passed"] and not r.get("skipped"))
|
|
133
|
+
failed_count = sum(1 for r in results if not r["passed"] and not r.get("skipped"))
|
|
134
|
+
skipped_count = sum(1 for r in results if r.get("skipped"))
|
|
135
|
+
|
|
136
|
+
print(f"Total Checks: {len(results)}")
|
|
137
|
+
print(f"{Colors.GREEN}✅ Passed: {passed_count}{Colors.ENDC}")
|
|
138
|
+
print(f"{Colors.RED}❌ Failed: {failed_count}{Colors.ENDC}")
|
|
139
|
+
print(f"{Colors.YELLOW}⏭️ Skipped: {skipped_count}{Colors.ENDC}")
|
|
140
|
+
print()
|
|
141
|
+
|
|
142
|
+
# Detailed results
|
|
143
|
+
for r in results:
|
|
144
|
+
if r.get("skipped"):
|
|
145
|
+
status = f"{Colors.YELLOW}⏭️ {Colors.ENDC}"
|
|
146
|
+
elif r["passed"]:
|
|
147
|
+
status = f"{Colors.GREEN}✅{Colors.ENDC}"
|
|
148
|
+
else:
|
|
149
|
+
status = f"{Colors.RED}❌{Colors.ENDC}"
|
|
150
|
+
|
|
151
|
+
print(f"{status} {r['name']}")
|
|
152
|
+
|
|
153
|
+
print()
|
|
154
|
+
|
|
155
|
+
if failed_count > 0:
|
|
156
|
+
print_error(f"{failed_count} check(s) FAILED - Please fix before proceeding")
|
|
157
|
+
return False
|
|
158
|
+
else:
|
|
159
|
+
print_success("All checks PASSED ✨")
|
|
160
|
+
return True
|
|
161
|
+
|
|
162
|
+
def main():
|
|
163
|
+
parser = argparse.ArgumentParser(
|
|
164
|
+
description="Run Antigravity Kit validation checklist",
|
|
165
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
166
|
+
epilog="""
|
|
167
|
+
Examples:
|
|
168
|
+
python scripts/checklist.py . # Core checks only
|
|
169
|
+
python scripts/checklist.py . --url http://localhost:3000 # Include performance
|
|
170
|
+
"""
|
|
171
|
+
)
|
|
172
|
+
parser.add_argument("project", help="Project path to validate")
|
|
173
|
+
parser.add_argument("--url", help="URL for performance checks (lighthouse, playwright)")
|
|
174
|
+
parser.add_argument("--skip-performance", action="store_true", help="Skip performance checks even if URL provided")
|
|
175
|
+
|
|
176
|
+
args = parser.parse_args()
|
|
177
|
+
|
|
178
|
+
project_path = Path(args.project).resolve()
|
|
179
|
+
|
|
180
|
+
if not project_path.exists():
|
|
181
|
+
print_error(f"Project path does not exist: {project_path}")
|
|
182
|
+
sys.exit(1)
|
|
183
|
+
|
|
184
|
+
print_header("🚀 ANTIGRAVITY KIT - MASTER CHECKLIST")
|
|
185
|
+
print(f"Project: {project_path}")
|
|
186
|
+
print(f"URL: {args.url if args.url else 'Not provided (performance checks skipped)'}")
|
|
187
|
+
|
|
188
|
+
results = []
|
|
189
|
+
|
|
190
|
+
# Run core checks
|
|
191
|
+
print_header("📋 CORE CHECKS")
|
|
192
|
+
for name, script_path, required in CORE_CHECKS:
|
|
193
|
+
script = project_path / script_path
|
|
194
|
+
result = run_script(name, script, str(project_path))
|
|
195
|
+
results.append(result)
|
|
196
|
+
|
|
197
|
+
# If required check fails, stop
|
|
198
|
+
if required and not result["passed"] and not result.get("skipped"):
|
|
199
|
+
print_error(f"CRITICAL: {name} failed. Stopping checklist.")
|
|
200
|
+
print_summary(results)
|
|
201
|
+
sys.exit(1)
|
|
202
|
+
|
|
203
|
+
# Run performance checks if URL provided
|
|
204
|
+
if args.url and not args.skip_performance:
|
|
205
|
+
print_header("⚡ PERFORMANCE CHECKS")
|
|
206
|
+
for name, script_path, required in PERFORMANCE_CHECKS:
|
|
207
|
+
script = project_path / script_path
|
|
208
|
+
result = run_script(name, script, str(project_path), args.url)
|
|
209
|
+
results.append(result)
|
|
210
|
+
|
|
211
|
+
# Print summary
|
|
212
|
+
all_passed = print_summary(results)
|
|
213
|
+
|
|
214
|
+
sys.exit(0 if all_passed else 1)
|
|
215
|
+
|
|
216
|
+
if __name__ == "__main__":
|
|
217
|
+
main()
|
package/scripts/init.py
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
thachvd-kit — Project Init Wizard
|
|
4
|
+
Generates PROJECT_CONTEXT.md and optional platform config files.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python scripts/init.py # Interactive wizard
|
|
8
|
+
python scripts/init.py --platform all # Also generate CLAUDE.md
|
|
9
|
+
python scripts/init.py --platform claude # Only CLAUDE.md
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import sys
|
|
13
|
+
import os
|
|
14
|
+
import argparse
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
|
|
18
|
+
# ─── Color helpers ──────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
def c(text, code): return f"\033[{code}m{text}\033[0m" if sys.stdout.isatty() else text
|
|
21
|
+
def bold(t): return c(t, "1")
|
|
22
|
+
def green(t): return c(t, "32")
|
|
23
|
+
def cyan(t): return c(t, "36")
|
|
24
|
+
def yellow(t): return c(t, "33")
|
|
25
|
+
def dim(t): return c(t, "2")
|
|
26
|
+
|
|
27
|
+
# ─── Input helpers ───────────────────────────────────────────────────────────
|
|
28
|
+
|
|
29
|
+
def ask(prompt, default="", choices=None):
|
|
30
|
+
"""Prompt user for input with optional default and choices."""
|
|
31
|
+
display_default = f" [{dim(default)}]" if default else ""
|
|
32
|
+
if choices:
|
|
33
|
+
print(f"\n {cyan('Options:')} {', '.join(choices)}")
|
|
34
|
+
value = input(f" {bold('→')} {prompt}{display_default}: ").strip()
|
|
35
|
+
return value if value else default
|
|
36
|
+
|
|
37
|
+
def ask_multi(prompt, choices, default=None):
|
|
38
|
+
"""Prompt for comma-separated selection from choices."""
|
|
39
|
+
print(f"\n {cyan('Available:')} {', '.join(f'{i+1}) {c}' for i, c in enumerate(choices))}")
|
|
40
|
+
raw = input(f" {bold('→')} {prompt} (numbers or names, comma-separated) [{dim(default or 'none')}]: ").strip()
|
|
41
|
+
if not raw:
|
|
42
|
+
return default or []
|
|
43
|
+
selected = []
|
|
44
|
+
for part in raw.replace(",", " ").split():
|
|
45
|
+
part = part.strip()
|
|
46
|
+
if part.isdigit():
|
|
47
|
+
idx = int(part) - 1
|
|
48
|
+
if 0 <= idx < len(choices):
|
|
49
|
+
selected.append(choices[idx])
|
|
50
|
+
elif part in choices:
|
|
51
|
+
selected.append(part)
|
|
52
|
+
else:
|
|
53
|
+
selected.append(part) # allow free-text
|
|
54
|
+
return selected
|
|
55
|
+
|
|
56
|
+
def ask_bool(prompt, default=True):
|
|
57
|
+
"""Yes/no prompt."""
|
|
58
|
+
default_str = "Y/n" if default else "y/N"
|
|
59
|
+
val = input(f" {bold('→')} {prompt} [{dim(default_str)}]: ").strip().lower()
|
|
60
|
+
if not val:
|
|
61
|
+
return default
|
|
62
|
+
return val.startswith("y")
|
|
63
|
+
|
|
64
|
+
def section(title):
|
|
65
|
+
print(f"\n{bold(cyan('━━ ' + title + ' '))}")
|
|
66
|
+
|
|
67
|
+
# ─── Skill resolver ──────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
LANG_SKILLS = {
|
|
70
|
+
"typescript": ["nodejs-best-practices", "api-design"],
|
|
71
|
+
"javascript": ["nodejs-best-practices", "api-design"],
|
|
72
|
+
"python": ["python-patterns"],
|
|
73
|
+
"go": ["golang-patterns", "golang-testing"],
|
|
74
|
+
"php": ["laravel-patterns", "laravel-security", "laravel-tdd"],
|
|
75
|
+
"rust": ["rust-pro"],
|
|
76
|
+
"java": ["api-design"],
|
|
77
|
+
"swift": ["mobile-design"],
|
|
78
|
+
"kotlin": ["mobile-design"],
|
|
79
|
+
"csharp": ["api-design"],
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
FRAMEWORK_SKILLS = {
|
|
83
|
+
"vue": ["frontend-design", "tailwind-patterns"],
|
|
84
|
+
"react": ["nextjs-react-expert", "frontend-design"],
|
|
85
|
+
"next": ["nextjs-react-expert", "frontend-design"],
|
|
86
|
+
"nuxt": ["frontend-design"],
|
|
87
|
+
"svelte": ["frontend-design"],
|
|
88
|
+
"laravel": ["laravel-patterns", "laravel-security", "laravel-tdd"],
|
|
89
|
+
"express": ["nodejs-best-practices", "api-design"],
|
|
90
|
+
"fastapi": ["python-patterns", "api-design"],
|
|
91
|
+
"django": ["python-patterns", "api-design"],
|
|
92
|
+
"gin": ["golang-patterns", "golang-testing"],
|
|
93
|
+
"fiber": ["golang-patterns", "golang-testing"],
|
|
94
|
+
"tauri": ["rust-pro", "mobile-design"],
|
|
95
|
+
"flutter": ["mobile-design"],
|
|
96
|
+
"react-native": ["mobile-design"],
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
INFRA_SKILLS = {
|
|
100
|
+
"docker": ["docker-patterns"],
|
|
101
|
+
"aws": ["deployment-procedures", "docker-patterns"],
|
|
102
|
+
"gcp": ["deployment-procedures", "docker-patterns"],
|
|
103
|
+
"azure": ["deployment-procedures", "docker-patterns"],
|
|
104
|
+
"vercel": ["deployment-procedures"],
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
def resolve_skills(data):
|
|
108
|
+
skills = set()
|
|
109
|
+
lang = data.get("primary_language", "").lower()
|
|
110
|
+
if lang in LANG_SKILLS:
|
|
111
|
+
skills.update(LANG_SKILLS[lang])
|
|
112
|
+
for fw in data.get("frameworks", []):
|
|
113
|
+
fw_lower = fw.lower()
|
|
114
|
+
for key, vals in FRAMEWORK_SKILLS.items():
|
|
115
|
+
if key in fw_lower:
|
|
116
|
+
skills.update(vals)
|
|
117
|
+
for infra in data.get("infrastructure", []):
|
|
118
|
+
infra_lower = infra.lower()
|
|
119
|
+
for key, vals in INFRA_SKILLS.items():
|
|
120
|
+
if key in infra_lower:
|
|
121
|
+
skills.update(vals)
|
|
122
|
+
skills.update(["clean-code", "systematic-debugging"])
|
|
123
|
+
return sorted(skills)
|
|
124
|
+
|
|
125
|
+
def resolve_agent_table(data):
|
|
126
|
+
rows = []
|
|
127
|
+
frameworks = [f.lower() for f in data.get("frameworks", [])]
|
|
128
|
+
lang = data.get("primary_language", "").lower()
|
|
129
|
+
|
|
130
|
+
# Determine frontend agent
|
|
131
|
+
frontend_fws = [f for f in frameworks if f in ["vue", "react", "next", "nuxt", "svelte", "angular"]]
|
|
132
|
+
if frontend_fws:
|
|
133
|
+
fe_skills = []
|
|
134
|
+
for fw in frontend_fws:
|
|
135
|
+
fe_skills.extend(FRAMEWORK_SKILLS.get(fw, []))
|
|
136
|
+
rows.append(("Frontend UI", "frontend-specialist", ", ".join(set(fe_skills[:3]))))
|
|
137
|
+
|
|
138
|
+
# Backend
|
|
139
|
+
be_skills = list(LANG_SKILLS.get(lang, ["api-design"]))
|
|
140
|
+
backend_fws = [f for f in frameworks if f in ["laravel", "express", "fastapi", "django", "gin", "fiber"]]
|
|
141
|
+
for fw in backend_fws:
|
|
142
|
+
be_skills.extend(FRAMEWORK_SKILLS.get(fw, []))
|
|
143
|
+
rows.append(("Backend API", "backend-specialist", ", ".join(set(be_skills[:3]))))
|
|
144
|
+
|
|
145
|
+
# Mobile/Desktop
|
|
146
|
+
mobile_fws = [f for f in frameworks if f in ["tauri", "flutter", "react-native"]]
|
|
147
|
+
if mobile_fws:
|
|
148
|
+
mobile_skills = []
|
|
149
|
+
for fw in mobile_fws:
|
|
150
|
+
mobile_skills.extend(FRAMEWORK_SKILLS.get(fw, []))
|
|
151
|
+
rows.append(("Mobile / Desktop", "mobile-developer", ", ".join(set(mobile_skills[:3]))))
|
|
152
|
+
|
|
153
|
+
# DevOps
|
|
154
|
+
if data.get("uses_docker") or data.get("cloud"):
|
|
155
|
+
rows.append(("DevOps / Infra", "devops-engineer", "docker-patterns, deployment-procedures"))
|
|
156
|
+
|
|
157
|
+
rows.append(("Debug", "debugger", "systematic-debugging"))
|
|
158
|
+
rows.append(("Security", "security-auditor", "vulnerability-scanner"))
|
|
159
|
+
rows.append(("Planning", "project-planner", "brainstorming, plan-writing"))
|
|
160
|
+
return rows
|
|
161
|
+
|
|
162
|
+
# ─── Generators ──────────────────────────────────────────────────────────────
|
|
163
|
+
|
|
164
|
+
def generate_project_context(data):
|
|
165
|
+
frameworks = data.get("frameworks", [])
|
|
166
|
+
infrastructure = data.get("infrastructure", [])
|
|
167
|
+
agent_table = resolve_agent_table(data)
|
|
168
|
+
auto_skills = resolve_skills(data)
|
|
169
|
+
|
|
170
|
+
agent_rows = "\n".join(
|
|
171
|
+
f"| {task} | `{agent}` | {skills} |"
|
|
172
|
+
for task, agent, skills in agent_table
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
return f"""# PROJECT_CONTEXT.md
|
|
176
|
+
# Generated by thachvd-kit init wizard on {datetime.now().strftime('%Y-%m-%d')}
|
|
177
|
+
# Edit freely — this is your project's brain.
|
|
178
|
+
|
|
179
|
+
## Project
|
|
180
|
+
|
|
181
|
+
- **Name:** {data['project_name']}
|
|
182
|
+
- **Description:** {data['description']}
|
|
183
|
+
- **Type:** {data['project_type']}
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Stack
|
|
188
|
+
|
|
189
|
+
```yaml
|
|
190
|
+
stack:
|
|
191
|
+
primary_language: {data['primary_language']}
|
|
192
|
+
frameworks: [{', '.join(frameworks)}]
|
|
193
|
+
database: {data.get('database', 'none')}
|
|
194
|
+
infrastructure: [{', '.join(infrastructure)}]
|
|
195
|
+
package_manager: {data.get('package_manager', 'auto-detect')}
|
|
196
|
+
test_framework: {data.get('test_framework', 'auto-detect')}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## Agent Routing
|
|
202
|
+
|
|
203
|
+
| Task Type | Agent | Primary Skills |
|
|
204
|
+
|-----------|-------|----------------|
|
|
205
|
+
{agent_rows}
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Auto-Resolved Skills
|
|
210
|
+
|
|
211
|
+
Based on your stack, these skills will be loaded automatically:
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
{chr(10).join('- ' + s for s in auto_skills)}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Project Conventions
|
|
220
|
+
|
|
221
|
+
- **Max file size:** {data.get('max_file_lines', '300')} lines (then modularize)
|
|
222
|
+
- **Code style:** {data.get('code_style', 'project-standard')}
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## Architecture Notes
|
|
227
|
+
|
|
228
|
+
{data.get('architecture_notes', '<!-- Add architecture notes, key decisions, patterns used -->')}
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Current Phase
|
|
233
|
+
|
|
234
|
+
- **Done:** {data.get('done_phases', '—')}
|
|
235
|
+
- **In Progress:** {data.get('current_phase', 'Initial setup')}
|
|
236
|
+
- **Next:** {data.get('next_phase', '—')}
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Known Issues / Tasks
|
|
241
|
+
|
|
242
|
+
{data.get('known_issues', '<!-- Add known issues or pending tasks -->')}
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
def generate_claude_md(data):
|
|
246
|
+
"""Generate CLAUDE.md for Claude Code / Codex compatibility."""
|
|
247
|
+
return f"""# CLAUDE.md — {data['project_name']}
|
|
248
|
+
# Generated by thachvd-kit. See PROJECT_CONTEXT.md for full stack info.
|
|
249
|
+
# Cross-platform: Claude Code · Codex · OpenCode
|
|
250
|
+
|
|
251
|
+
## Project
|
|
252
|
+
{data['description']}
|
|
253
|
+
Stack: {data['primary_language']} | {', '.join(data.get('frameworks', []))}
|
|
254
|
+
|
|
255
|
+
## Rules
|
|
256
|
+
- Read PROJECT_CONTEXT.md first for stack details and agent routing.
|
|
257
|
+
- Follow skills in .claude/skills/ (or skills/ if using Antigravity).
|
|
258
|
+
- Tests are mandatory. Verify before claiming done.
|
|
259
|
+
- Max {data.get('max_file_lines', '300')} lines per file.
|
|
260
|
+
|
|
261
|
+
## Key Skills
|
|
262
|
+
- Plan: `plan-writing` → `executing-plans`
|
|
263
|
+
- Review: `requesting-code-review` / `receiving-code-review`
|
|
264
|
+
- Quality: `clean-code`, `verification-before-completion`
|
|
265
|
+
- Workflow: `subagent-driven-development`, `finishing-a-development-branch`
|
|
266
|
+
|
|
267
|
+
## Commands
|
|
268
|
+
- `/plan` — Create implementation plan
|
|
269
|
+
- `/debug` — Systematic debugging
|
|
270
|
+
- `/test` — Run test suite
|
|
271
|
+
- `/deploy` — Deploy checklist
|
|
272
|
+
|
|
273
|
+
See PROJECT_CONTEXT.md for full agent routing table.
|
|
274
|
+
"""
|
|
275
|
+
|
|
276
|
+
# ─── Main wizard ─────────────────────────────────────────────────────────────
|
|
277
|
+
|
|
278
|
+
def main():
|
|
279
|
+
parser = argparse.ArgumentParser(description="thachvd-kit project init wizard")
|
|
280
|
+
parser.add_argument("--platform", choices=["antigravity", "claude", "all"], default="antigravity",
|
|
281
|
+
help="Which platform config to generate (default: antigravity)")
|
|
282
|
+
parser.add_argument("--yes", "-y", action="store_true", help="Use defaults without prompting")
|
|
283
|
+
args = parser.parse_args()
|
|
284
|
+
|
|
285
|
+
print(f"""
|
|
286
|
+
{bold(cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'))}
|
|
287
|
+
{bold('thachvd-kit')} — Project Init Wizard
|
|
288
|
+
Generates PROJECT_CONTEXT.md for smart agent routing
|
|
289
|
+
{bold(cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'))}
|
|
290
|
+
""")
|
|
291
|
+
|
|
292
|
+
# Check if PROJECT_CONTEXT.md already exists
|
|
293
|
+
output_path = Path("PROJECT_CONTEXT.md")
|
|
294
|
+
if output_path.exists() and not args.yes:
|
|
295
|
+
overwrite = ask_bool(f"{yellow('PROJECT_CONTEXT.md already exists. Overwrite?')}", default=False)
|
|
296
|
+
if not overwrite:
|
|
297
|
+
print(f"\n {yellow('Aborted.')} Existing PROJECT_CONTEXT.md unchanged.\n")
|
|
298
|
+
sys.exit(0)
|
|
299
|
+
|
|
300
|
+
data = {}
|
|
301
|
+
|
|
302
|
+
# ── Project Info ──────────────────────────────────────────────────────
|
|
303
|
+
section("Project Info")
|
|
304
|
+
data["project_name"] = ask("Project name", default=Path.cwd().name)
|
|
305
|
+
data["description"] = ask("Short description", default="A software project")
|
|
306
|
+
data["project_type"] = ask("Project type",
|
|
307
|
+
default="web-app",
|
|
308
|
+
choices=["web-app", "api", "mobile", "desktop", "cli", "library", "fullstack"])
|
|
309
|
+
|
|
310
|
+
# ── Tech Stack ────────────────────────────────────────────────────────
|
|
311
|
+
section("Tech Stack")
|
|
312
|
+
|
|
313
|
+
LANGUAGES = ["typescript", "javascript", "python", "go", "php", "rust", "java", "swift", "kotlin", "csharp", "c", "cpp"]
|
|
314
|
+
data["primary_language"] = ask("Primary language",
|
|
315
|
+
default="typescript",
|
|
316
|
+
choices=LANGUAGES)
|
|
317
|
+
|
|
318
|
+
FRAMEWORKS = ["vue", "react", "next", "nuxt", "svelte", "angular",
|
|
319
|
+
"laravel", "express", "fastapi", "django", "gin", "fiber", "nestjs",
|
|
320
|
+
"tauri", "flutter", "react-native",
|
|
321
|
+
"none"]
|
|
322
|
+
frameworks = ask_multi("Frameworks (select all that apply)", FRAMEWORKS, default=None)
|
|
323
|
+
data["frameworks"] = frameworks or []
|
|
324
|
+
|
|
325
|
+
DATABASES = ["postgres", "mysql", "sqlite", "mongodb", "redis", "dynamodb", "supabase", "prisma", "none"]
|
|
326
|
+
data["database"] = ask("Database / ORM", default="postgres", choices=DATABASES)
|
|
327
|
+
|
|
328
|
+
PACKAGE_MANAGERS = ["npm", "pnpm", "yarn", "bun", "pip", "uv", "poetry", "go mod", "cargo", "composer", "auto-detect"]
|
|
329
|
+
data["package_manager"] = ask("Package manager", default="auto-detect", choices=PACKAGE_MANAGERS)
|
|
330
|
+
|
|
331
|
+
# ── Infrastructure ────────────────────────────────────────────────────
|
|
332
|
+
section("Infrastructure")
|
|
333
|
+
|
|
334
|
+
data["uses_docker"] = ask_bool("Uses Docker / Docker Compose?", default=True)
|
|
335
|
+
CLOUDS = ["aws", "gcp", "azure", "vercel", "fly", "railway", "digitalocean", "none"]
|
|
336
|
+
cloud = ask("Cloud provider", default="none", choices=CLOUDS)
|
|
337
|
+
data["cloud"] = cloud
|
|
338
|
+
|
|
339
|
+
infrastructure = []
|
|
340
|
+
if data["uses_docker"]: infrastructure.append("docker")
|
|
341
|
+
if cloud != "none": infrastructure.append(cloud)
|
|
342
|
+
data["infrastructure"] = infrastructure
|
|
343
|
+
|
|
344
|
+
CI_CD = ["github-actions", "gitlab-ci", "circleci", "jenkins", "none"]
|
|
345
|
+
data["ci_cd"] = ask("CI/CD", default="github-actions", choices=CI_CD)
|
|
346
|
+
|
|
347
|
+
# ── Testing ───────────────────────────────────────────────────────────
|
|
348
|
+
section("Testing")
|
|
349
|
+
|
|
350
|
+
TEST_FRAMEWORKS = ["jest", "vitest", "pytest", "go test", "phpunit", "pest", "rspec", "junit", "auto-detect"]
|
|
351
|
+
data["test_framework"] = ask("Test framework", default="auto-detect", choices=TEST_FRAMEWORKS)
|
|
352
|
+
|
|
353
|
+
# ── Conventions ───────────────────────────────────────────────────────
|
|
354
|
+
section("Coding Conventions")
|
|
355
|
+
|
|
356
|
+
data["max_file_lines"] = ask("Max lines per file before splitting", default="300")
|
|
357
|
+
data["code_style"] = ask("Code style / linter", default="project-standard",
|
|
358
|
+
choices=["eslint", "prettier", "ruff", "gofmt", "pint", "standard", "project-standard"])
|
|
359
|
+
|
|
360
|
+
# ── Optional fields ───────────────────────────────────────────────────
|
|
361
|
+
section("Architecture (Optional — press Enter to skip)")
|
|
362
|
+
|
|
363
|
+
data["architecture_notes"] = ask("Key architecture notes", default="<!-- Add notes -->")
|
|
364
|
+
data["current_phase"] = ask("Current phase", default="Initial setup")
|
|
365
|
+
data["next_phase"] = ask("Next planned phase", default="—")
|
|
366
|
+
data["known_issues"] = ask("Known issues / tasks", default="<!-- None yet -->")
|
|
367
|
+
|
|
368
|
+
# ── Generate files ────────────────────────────────────────────────────
|
|
369
|
+
section("Generating Files")
|
|
370
|
+
|
|
371
|
+
# PROJECT_CONTEXT.md (always)
|
|
372
|
+
context_content = generate_project_context(data)
|
|
373
|
+
output_path.write_text(context_content, encoding="utf-8")
|
|
374
|
+
print(f" {green('✓')} {bold('PROJECT_CONTEXT.md')} generated")
|
|
375
|
+
|
|
376
|
+
# CLAUDE.md (for Claude Code / Codex)
|
|
377
|
+
if args.platform in ("claude", "all"):
|
|
378
|
+
claude_path = Path("CLAUDE.md")
|
|
379
|
+
claude_path.write_text(generate_claude_md(data), encoding="utf-8")
|
|
380
|
+
print(f" {green('✓')} {bold('CLAUDE.md')} generated (Claude Code / Codex)")
|
|
381
|
+
|
|
382
|
+
# Summary
|
|
383
|
+
auto_skills = resolve_skills(data)
|
|
384
|
+
print(f"""
|
|
385
|
+
{bold(green('━━ Done! ━━'))}
|
|
386
|
+
|
|
387
|
+
{bold('Project:')} {data['project_name']}
|
|
388
|
+
{bold('Stack:')} {data['primary_language']} | {', '.join(data['frameworks']) or 'no framework'}
|
|
389
|
+
{bold('Infra:')} {', '.join(data['infrastructure']) or 'none'}
|
|
390
|
+
|
|
391
|
+
{bold('Auto-resolved skills:')}
|
|
392
|
+
{chr(10).join(f' · {s}' for s in auto_skills)}
|
|
393
|
+
|
|
394
|
+
{bold('Next steps:')}
|
|
395
|
+
1. Review {bold('PROJECT_CONTEXT.md')} and add architecture notes
|
|
396
|
+
2. Open project in your AI editor (Antigravity / Claude Code / Codex)
|
|
397
|
+
3. The agent will read PROJECT_CONTEXT.md on session start
|
|
398
|
+
|
|
399
|
+
{dim(' Tip: Run with --platform all to also generate CLAUDE.md')}
|
|
400
|
+
""")
|
|
401
|
+
|
|
402
|
+
if __name__ == "__main__":
|
|
403
|
+
main()
|