@specific.dev/cli 0.1.68 → 0.1.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/admin/404/index.html +1 -1
  2. package/dist/admin/404.html +1 -1
  3. package/dist/admin/__next.!KGRlZmF1bHQp.__PAGE__.txt +1 -1
  4. package/dist/admin/__next.!KGRlZmF1bHQp.txt +1 -1
  5. package/dist/admin/__next._full.txt +1 -1
  6. package/dist/admin/__next._head.txt +1 -1
  7. package/dist/admin/__next._index.txt +1 -1
  8. package/dist/admin/__next._tree.txt +1 -1
  9. package/dist/admin/_not-found/__next._full.txt +1 -1
  10. package/dist/admin/_not-found/__next._head.txt +1 -1
  11. package/dist/admin/_not-found/__next._index.txt +1 -1
  12. package/dist/admin/_not-found/__next._not-found.__PAGE__.txt +1 -1
  13. package/dist/admin/_not-found/__next._not-found.txt +1 -1
  14. package/dist/admin/_not-found/__next._tree.txt +1 -1
  15. package/dist/admin/_not-found/index.html +1 -1
  16. package/dist/admin/_not-found/index.txt +1 -1
  17. package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.__PAGE__.txt +1 -1
  18. package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.txt +1 -1
  19. package/dist/admin/databases/__next.!KGRlZmF1bHQp.txt +1 -1
  20. package/dist/admin/databases/__next._full.txt +1 -1
  21. package/dist/admin/databases/__next._head.txt +1 -1
  22. package/dist/admin/databases/__next._index.txt +1 -1
  23. package/dist/admin/databases/__next._tree.txt +1 -1
  24. package/dist/admin/databases/index.html +1 -1
  25. package/dist/admin/databases/index.txt +1 -1
  26. package/dist/admin/fullscreen/__next._full.txt +1 -1
  27. package/dist/admin/fullscreen/__next._head.txt +1 -1
  28. package/dist/admin/fullscreen/__next._index.txt +1 -1
  29. package/dist/admin/fullscreen/__next._tree.txt +1 -1
  30. package/dist/admin/fullscreen/__next.fullscreen.__PAGE__.txt +1 -1
  31. package/dist/admin/fullscreen/__next.fullscreen.txt +1 -1
  32. package/dist/admin/fullscreen/databases/__next._full.txt +1 -1
  33. package/dist/admin/fullscreen/databases/__next._head.txt +1 -1
  34. package/dist/admin/fullscreen/databases/__next._index.txt +1 -1
  35. package/dist/admin/fullscreen/databases/__next._tree.txt +1 -1
  36. package/dist/admin/fullscreen/databases/__next.fullscreen.databases.__PAGE__.txt +1 -1
  37. package/dist/admin/fullscreen/databases/__next.fullscreen.databases.txt +1 -1
  38. package/dist/admin/fullscreen/databases/__next.fullscreen.txt +1 -1
  39. package/dist/admin/fullscreen/databases/index.html +1 -1
  40. package/dist/admin/fullscreen/databases/index.txt +1 -1
  41. package/dist/admin/fullscreen/index.html +1 -1
  42. package/dist/admin/fullscreen/index.txt +1 -1
  43. package/dist/admin/index.html +1 -1
  44. package/dist/admin/index.txt +1 -1
  45. package/dist/admin/mail/__next.!KGRlZmF1bHQp.mail.__PAGE__.txt +1 -1
  46. package/dist/admin/mail/__next.!KGRlZmF1bHQp.mail.txt +1 -1
  47. package/dist/admin/mail/__next.!KGRlZmF1bHQp.txt +1 -1
  48. package/dist/admin/mail/__next._full.txt +1 -1
  49. package/dist/admin/mail/__next._head.txt +1 -1
  50. package/dist/admin/mail/__next._index.txt +1 -1
  51. package/dist/admin/mail/__next._tree.txt +1 -1
  52. package/dist/admin/mail/index.html +1 -1
  53. package/dist/admin/mail/index.txt +1 -1
  54. package/dist/admin/workflows/__next.!KGRlZmF1bHQp.txt +1 -1
  55. package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.__PAGE__.txt +1 -1
  56. package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.txt +1 -1
  57. package/dist/admin/workflows/__next._full.txt +1 -1
  58. package/dist/admin/workflows/__next._head.txt +1 -1
  59. package/dist/admin/workflows/__next._index.txt +1 -1
  60. package/dist/admin/workflows/__next._tree.txt +1 -1
  61. package/dist/admin/workflows/index.html +1 -1
  62. package/dist/admin/workflows/index.txt +1 -1
  63. package/dist/cli.js +6 -5
  64. package/dist/docs/index.md +1 -0
  65. package/dist/docs/integrations/python.md +220 -0
  66. package/dist/postinstall.js +1 -1
  67. package/package.json +1 -1
  68. /package/dist/admin/_next/static/{w4VP36_YGzWIvqWZUyEgj → gnD4mZgR72Rwh8wIqk2oN}/_buildManifest.js +0 -0
  69. /package/dist/admin/_next/static/{w4VP36_YGzWIvqWZUyEgj → gnD4mZgR72Rwh8wIqk2oN}/_clientMiddlewareManifest.json +0 -0
  70. /package/dist/admin/_next/static/{w4VP36_YGzWIvqWZUyEgj → gnD4mZgR72Rwh8wIqk2oN}/_ssgManifest.js +0 -0
package/dist/cli.js CHANGED
@@ -184496,7 +184496,7 @@ function trackEvent(event, properties) {
184496
184496
  event,
184497
184497
  properties: {
184498
184498
  ...properties,
184499
- cli_version: "0.1.68",
184499
+ cli_version: "0.1.69",
184500
184500
  platform: process.platform,
184501
184501
  node_version: process.version,
184502
184502
  project_id: getProjectId(),
@@ -194601,8 +194601,8 @@ function compareVersions(a, b) {
194601
194601
  return 0;
194602
194602
  }
194603
194603
  async function checkForUpdate() {
194604
- const currentVersion = "0.1.68";
194605
- const response = await fetch(`${BINARIES_BASE_URL}/latest`);
194604
+ const currentVersion = "0.1.69";
194605
+ const response = await fetch(`${BINARIES_BASE_URL}/latest?t=${Date.now()}`);
194606
194606
  if (!response.ok) {
194607
194607
  throw new Error(`Failed to check for updates: HTTP ${response.status}`);
194608
194608
  }
@@ -194739,7 +194739,8 @@ function UpdateUI() {
194739
194739
  if (cancelled) return;
194740
194740
  trackEvent("cli_updated", {
194741
194741
  from_version: state.checkResult.currentVersion,
194742
- to_version: state.checkResult.latestVersion
194742
+ to_version: state.checkResult.latestVersion,
194743
+ source: "manual"
194743
194744
  });
194744
194745
  writeCheckTimestamp();
194745
194746
  setState((s) => ({ ...s, phase: "success" }));
@@ -194799,7 +194800,7 @@ function updateCommand() {
194799
194800
  var program = new Command();
194800
194801
  var env = "production";
194801
194802
  var envLabel = env !== "production" ? `[${env.toUpperCase()}] ` : "";
194802
- program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.68").enablePositionalOptions();
194803
+ program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.69").enablePositionalOptions();
194803
194804
  program.command("init").description("Initialize project for use with a coding agent").option("--agent <name...>", "Agents to configure (cursor, claude, codex, other)").action((options2) => initCommand(options2));
194804
194805
  program.command("docs [topic]").description("Fetch LLM-optimized documentation").action(docsCommand);
194805
194806
  program.command("check").description("Validate specific.hcl configuration").action(checkCommand);
@@ -35,6 +35,7 @@ A full development environment can be started with `specific dev`. To deploy any
35
35
 
36
36
  The following is a list of common frameworks and libraries with guidance on how to use them with Specific:
37
37
 
38
+ - [Python](/integrations/python): Flask, FastAPI, Django, and other Python frameworks
38
39
  - [Next.js](/integrations/nextjs): full-stack React framework
39
40
  - [Drizzle ORM](/integrations/drizzle): TypeScript ORM with type safety
40
41
  - [Prisma](/integrations/prisma): TypeScript ORM with auto-generated client
@@ -0,0 +1,220 @@
1
+ # Python
2
+
3
+ Python is supported out of the box with Specific. This guide covers running Python services with virtual environments, module resolution, and common frameworks.
4
+
5
+ ## Basic configuration
6
+
7
+ Use `base = "python"` for builds. For development, point the dev command at your virtual environment's Python binary:
8
+
9
+ ```hcl
10
+ build "api" {
11
+ base = "python"
12
+ }
13
+
14
+ service "api" {
15
+ build = build.api
16
+ command = "python app.py"
17
+
18
+ endpoint {
19
+ public = true
20
+ }
21
+
22
+ env = {
23
+ PORT = port
24
+ DATABASE_URL = postgres.main.url
25
+ }
26
+
27
+ dev {
28
+ command = ".venv/bin/python app.py"
29
+ }
30
+ }
31
+
32
+ postgres "main" {}
33
+ ```
34
+
35
+ In production, `base = "python"` handles dependency installation automatically (see [Builds](/builds) for details). In development, you manage your own virtual environment.
36
+
37
+ ## Virtual environments
38
+
39
+ Create a virtual environment in your project before running `specific dev`:
40
+
41
+ ```sh
42
+ python3 -m venv .venv
43
+ .venv/bin/pip install -r requirements.txt
44
+ ```
45
+
46
+ Or with `uv`:
47
+
48
+ ```sh
49
+ uv venv .venv
50
+ uv pip install -r requirements.txt
51
+ ```
52
+
53
+ There are two ways to reference the venv in your dev command:
54
+
55
+ **Direct path (recommended):**
56
+
57
+ ```hcl
58
+ dev {
59
+ command = ".venv/bin/python app.py"
60
+ }
61
+ ```
62
+
63
+ **Shell activation:**
64
+
65
+ ```hcl
66
+ dev {
67
+ command = "source .venv/bin/activate && python app.py"
68
+ }
69
+ ```
70
+
71
+ Both work because service commands run in a shell. The direct path is simpler and avoids potential issues with shell activation scripts.
72
+
73
+ ## Module resolution
74
+
75
+ Python module imports work naturally because `specific dev` sets the working directory to the service's `root` (or the project root if no `root` is set). Standard imports resolve as expected:
76
+
77
+ ```
78
+ myproject/
79
+ specific.hcl
80
+ app.py
81
+ myapp/
82
+ __init__.py
83
+ utils.py
84
+ ```
85
+
86
+ ```python
87
+ # app.py
88
+ from myapp.utils import get_greeting # works
89
+ ```
90
+
91
+ You can also use `python -m` to run modules:
92
+
93
+ ```hcl
94
+ dev {
95
+ command = ".venv/bin/python -m myapp"
96
+ }
97
+ ```
98
+
99
+ ## Monorepo support
100
+
101
+ For monorepos, use `root` to set the working directory. The venv path is relative to `root`:
102
+
103
+ ```hcl
104
+ build "api" {
105
+ base = "python"
106
+ root = "backend"
107
+ }
108
+
109
+ service "api" {
110
+ build = build.api
111
+ command = "python app.py"
112
+
113
+ endpoint {
114
+ public = true
115
+ }
116
+
117
+ env = {
118
+ PORT = port
119
+ }
120
+
121
+ dev {
122
+ command = ".venv/bin/python app.py"
123
+ }
124
+ }
125
+ ```
126
+
127
+ Here `.venv/bin/python` resolves to `backend/.venv/bin/python`.
128
+
129
+ ## Common frameworks
130
+
131
+ ### Flask
132
+
133
+ ```hcl
134
+ build "api" {
135
+ base = "python"
136
+ }
137
+
138
+ service "api" {
139
+ build = build.api
140
+ command = "flask run --host 0.0.0.0 --port $PORT"
141
+
142
+ endpoint {
143
+ public = true
144
+ }
145
+
146
+ env = {
147
+ PORT = port
148
+ FLASK_APP = "app"
149
+ }
150
+
151
+ dev {
152
+ command = ".venv/bin/flask run --host 0.0.0.0 --port $PORT --reload"
153
+ }
154
+ }
155
+ ```
156
+
157
+ ### FastAPI with uvicorn
158
+
159
+ ```hcl
160
+ build "api" {
161
+ base = "python"
162
+ }
163
+
164
+ service "api" {
165
+ build = build.api
166
+ command = "uvicorn app:app --host 0.0.0.0 --port $PORT"
167
+
168
+ endpoint {
169
+ public = true
170
+ }
171
+
172
+ env = {
173
+ PORT = port
174
+ }
175
+
176
+ dev {
177
+ command = ".venv/bin/uvicorn app:app --host 0.0.0.0 --port $PORT --reload"
178
+ }
179
+ }
180
+ ```
181
+
182
+ ### Django
183
+
184
+ ```hcl
185
+ build "web" {
186
+ base = "python"
187
+ }
188
+
189
+ service "web" {
190
+ build = build.web
191
+ command = "gunicorn myproject.wsgi --bind 0.0.0.0:$PORT"
192
+
193
+ endpoint {
194
+ public = true
195
+ }
196
+
197
+ env = {
198
+ PORT = port
199
+ DATABASE_URL = postgres.main.url
200
+ }
201
+
202
+ pre_deploy {
203
+ command = "python manage.py migrate"
204
+ }
205
+
206
+ dev {
207
+ command = ".venv/bin/python manage.py runserver 0.0.0.0:$PORT"
208
+ }
209
+ }
210
+
211
+ postgres "main" {}
212
+ ```
213
+
214
+ ## Database migrations
215
+
216
+ Use `pre_deploy` hooks for production migrations and `specific exec` for development:
217
+
218
+ ```sh
219
+ specific exec api -- .venv/bin/python manage.py migrate
220
+ ```
@@ -111,7 +111,7 @@ function trackEvent(event, properties) {
111
111
  event,
112
112
  properties: {
113
113
  ...properties,
114
- cli_version: "0.1.68",
114
+ cli_version: "0.1.69",
115
115
  platform: process.platform,
116
116
  node_version: process.version,
117
117
  project_id: getProjectId(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specific.dev/cli",
3
- "version": "0.1.68",
3
+ "version": "0.1.69",
4
4
  "description": "CLI for Specific infrastructure-as-code",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",