@@ -0,0 +1,212 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Boilerworks MCP server — exposes the CLI as tools for AI agents."""
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from __future__ import annotations
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import json
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from pathlib import Path
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from typing import Annotated
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from mcp.server.fastmcp import FastMCP
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mcp = FastMCP(
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "boilerworks",
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ instructions=(
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Boilerworks provides 26 production-ready project templates structured for AI-assisted development. "
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Use list_templates to explore options, create_manifest to build a boilerworks.yaml, "
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "and init_project to scaffold the project on disk."
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ),
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Templates ─────────────────────────────────────────────────────────────────
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def list_templates(
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size: Annotated[str | None, "Filter by size: full | micro | edge"] = None,
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ language: Annotated[str | None, "Filter by language: python | typescript | ruby | php | java | go | elixir | rust | svelte"] = None,
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ status: Annotated[str | None, "Filter by status: done | building | planned"] = None,
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """List all available Boilerworks templates, optionally filtered."""
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from boilerworks.registry import Registry
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ registry = Registry()
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ templates = registry.list_all()
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if size:
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ templates = [t for t in templates if t.size == size]
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if language:
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ templates = [t for t in templates if t.language == language]
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if status:
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ templates = [t for t in templates if t.status == status]
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "name": t.name,
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "size": t.size,
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "language": t.language,
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "backend": t.backend,
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "frontend": t.frontend,
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "status": t.status,
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "best_for": t.best_for,
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for t in templates
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ]
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return json.dumps(rows, indent=2)
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def get_template(
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ name: Annotated[str, "Template name, e.g. django-nextjs"],
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Get full details for a specific Boilerworks template."""
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from boilerworks.registry import Registry
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ registry = Registry()
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ template = registry.get_by_name(name)
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if template is None:
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ valid = ", ".join(sorted(registry.names()))
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return f"Template '{name}' not found. Available: {valid}"
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return json.dumps(template.model_dump(), indent=2)
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def search_templates(
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ query: Annotated[str, "Search query matched against name, description, and best_for"],
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Search templates by keyword."""
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from boilerworks.registry import Registry
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ registry = Registry()
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = registry.search(query)
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if not results:
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return f"No templates matched '{query}'."
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [{"name": t.name, "size": t.size, "backend": t.backend, "frontend": t.frontend, "best_for": t.best_for} for t in results]
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return json.dumps(rows, indent=2)
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Manifest ──────────────────────────────────────────────────────────────────
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def create_manifest(
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ project: Annotated[str, "Project slug (lowercase, letters/digits/hyphens)"],
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ family: Annotated[str, "Template family name, e.g. django-nextjs"],
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size: Annotated[str, "Template size: full | micro | edge"],
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cloud: Annotated[str | None, "Cloud provider: aws | gcp | azure"] = None,
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ region: Annotated[str | None, "Cloud region, e.g. us-east-1"] = None,
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ topology: Annotated[str, "standard | api-only | omni"] = "standard",
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ domain: Annotated[str | None, "Production domain, e.g. myapp.com"] = None,
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ops: Annotated[bool, "Include Terraform infrastructure repo"] = False,
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mobile: Annotated[bool, "Include mobile app template (Full only)"] = False,
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ web_presence: Annotated[bool, "Include marketing site template (Full only)"] = False,
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ compliance: Annotated[list[str] | None, "Compliance requirements: soc2 | hipaa | pci-dss | gdpr"] = None,
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email: Annotated[str | None, "Email service: ses | sendgrid | mailgun"] = None,
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ storage: Annotated[str | None, "File storage: s3 | gcs | azure-blob"] = None,
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ search: Annotated[str | None, "Search engine: opensearch | meilisearch"] = None,
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cache: Annotated[str, "Cache: redis | memcached"] = "redis",
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ database: Annotated[str, "Database: postgres | mysql | sqlite"] = "postgres",
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e2e: Annotated[str | None, "E2E framework: playwright | cypress"] = None,
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Build and validate a boilerworks.yaml manifest. Returns the YAML content ready to write to disk."""
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from boilerworks.manifest import BoilerworksManifest, DataConfig, ServicesConfig, TestingConfig
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ try:
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manifest = BoilerworksManifest(
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ project=project,
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ family=family,
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size=size,
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ topology=topology,
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cloud=cloud,
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ops=ops,
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ region=region,
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ domain=domain,
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mobile=mobile,
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ web_presence=web_presence,
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ compliance=compliance or [],
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ services=ServicesConfig(
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email=email,
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ storage=storage,
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ search=search,
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cache=cache,
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ),
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ data=DataConfig(database=database),
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testing=TestingConfig(e2e=e2e),
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ except Exception as exc:
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return f"Invalid manifest: {exc}"
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return manifest.to_yaml()
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def validate_manifest(
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ yaml_content: Annotated[str, "Contents of a boilerworks.yaml file to validate"],
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Validate a boilerworks.yaml manifest. Returns 'valid' or a description of the errors."""
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from boilerworks.manifest import BoilerworksManifest
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ try:
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ BoilerworksManifest.from_yaml(yaml_content)
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return "valid"
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ except Exception as exc:
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return f"invalid: {exc}"
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Project generation ─────────────────────────────────────────────────────────
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def _run_cli(args: list[str], manifest_yaml: str) -> str:
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Write manifest to a temp file, run the boilerworks CLI, return combined output."""
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import subprocess
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import sys
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import tempfile
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f:
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.write(manifest_yaml)
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tmp_path = f.name
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ try:
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = subprocess.run(
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [sys.executable, "-m", "boilerworks.cli"] + args + ["--manifest", tmp_path],
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ capture_output=True,
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ text=True,
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ output = (result.stdout + result.stderr).strip()
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return output or ("OK" if result.returncode == 0 else "Command failed with no output.")
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ finally:
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Path(tmp_path).unlink(missing_ok=True)
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def dry_run(
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manifest_yaml: Annotated[str, "Contents of a boilerworks.yaml manifest"],
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ output_dir: Annotated[str, "Directory where the project would be created"] = ".",
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Preview what boilerworks init would do without writing any files."""
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return _run_cli(["init", "--dry-run", "--output", output_dir], manifest_yaml)
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @mcp.tool()
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def init_project(
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manifest_yaml: Annotated[str, "Contents of a boilerworks.yaml manifest"],
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ output_dir: Annotated[str, "Directory to generate the project in"] = ".",
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ) -> str:
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Scaffold a new project from a boilerworks.yaml manifest.
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Clones the template, applies substitutions, and runs git init.
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Requires network access (GitHub). This may take 10-30 seconds.
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return _run_cli(["init", "--output", output_dir], manifest_yaml)
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def main() -> None:
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mcp.run()
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if __name__ == "__main__":
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ main()