@specific.dev/cli 0.1.82 → 0.1.84
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/dist/admin/404/index.html +1 -1
- package/dist/admin/404.html +1 -1
- package/dist/admin/__next.!KGRlZmF1bHQp.__PAGE__.txt +1 -1
- package/dist/admin/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/__next._full.txt +1 -1
- package/dist/admin/__next._head.txt +1 -1
- package/dist/admin/__next._index.txt +1 -1
- package/dist/admin/__next._tree.txt +1 -1
- package/dist/admin/_not-found/__next._full.txt +1 -1
- package/dist/admin/_not-found/__next._head.txt +1 -1
- package/dist/admin/_not-found/__next._index.txt +1 -1
- package/dist/admin/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/admin/_not-found/__next._not-found.txt +1 -1
- package/dist/admin/_not-found/__next._tree.txt +1 -1
- package/dist/admin/_not-found/index.html +1 -1
- package/dist/admin/_not-found/index.txt +1 -1
- package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.__PAGE__.txt +1 -1
- package/dist/admin/databases/__next.!KGRlZmF1bHQp.databases.txt +1 -1
- package/dist/admin/databases/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/databases/__next._full.txt +1 -1
- package/dist/admin/databases/__next._head.txt +1 -1
- package/dist/admin/databases/__next._index.txt +1 -1
- package/dist/admin/databases/__next._tree.txt +1 -1
- package/dist/admin/databases/index.html +1 -1
- package/dist/admin/databases/index.txt +1 -1
- package/dist/admin/fullscreen/__next._full.txt +1 -1
- package/dist/admin/fullscreen/__next._head.txt +1 -1
- package/dist/admin/fullscreen/__next._index.txt +1 -1
- package/dist/admin/fullscreen/__next._tree.txt +1 -1
- package/dist/admin/fullscreen/__next.fullscreen.__PAGE__.txt +1 -1
- package/dist/admin/fullscreen/__next.fullscreen.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._full.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._head.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._index.txt +1 -1
- package/dist/admin/fullscreen/databases/__next._tree.txt +1 -1
- package/dist/admin/fullscreen/databases/__next.fullscreen.databases.__PAGE__.txt +1 -1
- package/dist/admin/fullscreen/databases/__next.fullscreen.databases.txt +1 -1
- package/dist/admin/fullscreen/databases/__next.fullscreen.txt +1 -1
- package/dist/admin/fullscreen/databases/index.html +1 -1
- package/dist/admin/fullscreen/databases/index.txt +1 -1
- package/dist/admin/fullscreen/index.html +1 -1
- package/dist/admin/fullscreen/index.txt +1 -1
- package/dist/admin/index.html +1 -1
- package/dist/admin/index.txt +1 -1
- package/dist/admin/mail/__next.!KGRlZmF1bHQp.mail.__PAGE__.txt +1 -1
- package/dist/admin/mail/__next.!KGRlZmF1bHQp.mail.txt +1 -1
- package/dist/admin/mail/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/mail/__next._full.txt +1 -1
- package/dist/admin/mail/__next._head.txt +1 -1
- package/dist/admin/mail/__next._index.txt +1 -1
- package/dist/admin/mail/__next._tree.txt +1 -1
- package/dist/admin/mail/index.html +1 -1
- package/dist/admin/mail/index.txt +1 -1
- package/dist/admin/workflows/__next.!KGRlZmF1bHQp.txt +1 -1
- package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.__PAGE__.txt +1 -1
- package/dist/admin/workflows/__next.!KGRlZmF1bHQp.workflows.txt +1 -1
- package/dist/admin/workflows/__next._full.txt +1 -1
- package/dist/admin/workflows/__next._head.txt +1 -1
- package/dist/admin/workflows/__next._index.txt +1 -1
- package/dist/admin/workflows/__next._tree.txt +1 -1
- package/dist/admin/workflows/index.html +1 -1
- package/dist/admin/workflows/index.txt +1 -1
- package/dist/cli.js +21 -14
- package/dist/docs/integrations/drizzle.md +5 -3
- package/dist/docs/postgres.md +1 -0
- package/dist/postinstall.js +1 -1
- package/package.json +1 -1
- /package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_buildManifest.js +0 -0
- /package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_clientMiddlewareManifest.json +0 -0
- /package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -183482,7 +183482,19 @@ function caInstalledInTrustStore() {
|
|
|
183482
183482
|
`security find-certificate -c "Specific Local Development CA" -p "${getLoginKeychainPath()}"`,
|
|
183483
183483
|
{ encoding: "utf-8" }
|
|
183484
183484
|
).replace(/\r\n/g, "\n").trim();
|
|
183485
|
-
|
|
183485
|
+
if (keychainCert !== diskCert) {
|
|
183486
|
+
return false;
|
|
183487
|
+
}
|
|
183488
|
+
const trustOutput = execSync(
|
|
183489
|
+
`security dump-trust-settings 2>&1`,
|
|
183490
|
+
{ encoding: "utf-8" }
|
|
183491
|
+
);
|
|
183492
|
+
const caSection = trustOutput.split("Specific Local Development CA");
|
|
183493
|
+
if (caSection.length < 2) {
|
|
183494
|
+
return false;
|
|
183495
|
+
}
|
|
183496
|
+
const afterCA = caSection[1].split(/^Cert \d+:/m)[0];
|
|
183497
|
+
return afterCA.includes("Policy OID");
|
|
183486
183498
|
} else if (platform8 === "linux") {
|
|
183487
183499
|
const trustPaths = [
|
|
183488
183500
|
"/usr/local/share/ca-certificates/specific-local-ca.crt",
|
|
@@ -183601,7 +183613,7 @@ function getCADeleteCommand() {
|
|
|
183601
183613
|
return `security delete-certificate -c "Specific Local Development CA" "${getLoginKeychainPath()}"`;
|
|
183602
183614
|
}
|
|
183603
183615
|
function getCATrustCommand(certPath) {
|
|
183604
|
-
return `security add-trusted-cert -
|
|
183616
|
+
return `security add-trusted-cert -r trustRoot -p ssl -p basic -k "${getLoginKeychainPath()}" "${certPath}"`;
|
|
183605
183617
|
}
|
|
183606
183618
|
function getCAInstallCommands(certPath) {
|
|
183607
183619
|
const platform8 = os.platform();
|
|
@@ -184669,7 +184681,7 @@ function trackEvent(event, properties) {
|
|
|
184669
184681
|
event,
|
|
184670
184682
|
properties: {
|
|
184671
184683
|
...properties,
|
|
184672
|
-
cli_version: "0.1.
|
|
184684
|
+
cli_version: "0.1.84",
|
|
184673
184685
|
platform: process.platform,
|
|
184674
184686
|
node_version: process.version,
|
|
184675
184687
|
project_id: getProjectId()
|
|
@@ -186528,6 +186540,7 @@ function checkCommand() {
|
|
|
186528
186540
|
import React6, { useState as useState5, useEffect as useEffect3, useRef } from "react";
|
|
186529
186541
|
import { render as render4, Text as Text6, Box as Box6, useApp as useApp2, Static, useInput as useInput4 } from "ink";
|
|
186530
186542
|
import Spinner4 from "ink-spinner";
|
|
186543
|
+
import { Readable as Readable2 } from "stream";
|
|
186531
186544
|
import * as fs24 from "fs";
|
|
186532
186545
|
import * as os11 from "os";
|
|
186533
186546
|
import * as path20 from "path";
|
|
@@ -192747,14 +192760,6 @@ Add them to the config block in specific.local`);
|
|
|
192747
192760
|
},
|
|
192748
192761
|
{ key: "admin-space", content: /* @__PURE__ */ React6.createElement(Text6, null, " ") }
|
|
192749
192762
|
] : [],
|
|
192750
|
-
// Dashboard link (only when project is linked)
|
|
192751
|
-
...projectId ? [
|
|
192752
|
-
{
|
|
192753
|
-
key: "dashboard",
|
|
192754
|
-
content: /* @__PURE__ */ React6.createElement(Text6, null, /* @__PURE__ */ React6.createElement(Text6, { bold: true }, "Dashboard:"), /* @__PURE__ */ React6.createElement(Text6, null, " "), /* @__PURE__ */ React6.createElement(Text6, { bold: true }, "https://dashboard.specific.dev/projects/", projectId))
|
|
192755
|
-
},
|
|
192756
|
-
{ key: "dashboard-space", content: /* @__PURE__ */ React6.createElement(Text6, null, " ") }
|
|
192757
|
-
] : [],
|
|
192758
192763
|
// Services section - different rendering for tunnel mode vs local mode
|
|
192759
192764
|
...tunnelEnabled ? (
|
|
192760
192765
|
// Tunnel mode: show tunnel URLs for public services
|
|
@@ -192855,7 +192860,9 @@ Add them to the config block in specific.local`);
|
|
|
192855
192860
|
return /* @__PURE__ */ React6.createElement(Box6, { flexDirection: "column" }, /* @__PURE__ */ React6.createElement(Static, { items: staticItems }, (item) => /* @__PURE__ */ React6.createElement(Box6, { key: item.key }, item.content)));
|
|
192856
192861
|
}
|
|
192857
192862
|
function devCommand(instanceKey, tunnelEnabled = false) {
|
|
192858
|
-
|
|
192863
|
+
const options2 = isInteractive() ? {} : { stdin: new Readable2({ read() {
|
|
192864
|
+
} }) };
|
|
192865
|
+
render4(/* @__PURE__ */ React6.createElement(DevUI, { instanceKey, tunnelEnabled }), options2);
|
|
192859
192866
|
}
|
|
192860
192867
|
|
|
192861
192868
|
// src/lib/dev/git-worktree.ts
|
|
@@ -194752,7 +194759,7 @@ function compareVersions(a, b) {
|
|
|
194752
194759
|
return 0;
|
|
194753
194760
|
}
|
|
194754
194761
|
async function checkForUpdate() {
|
|
194755
|
-
const currentVersion = "0.1.
|
|
194762
|
+
const currentVersion = "0.1.84";
|
|
194756
194763
|
const response = await fetch(`${BINARIES_BASE_URL}/latest?t=${Date.now()}`);
|
|
194757
194764
|
if (!response.ok) {
|
|
194758
194765
|
throw new Error(`Failed to check for updates: HTTP ${response.status}`);
|
|
@@ -194951,7 +194958,7 @@ function updateCommand() {
|
|
|
194951
194958
|
var program = new Command();
|
|
194952
194959
|
var env = "production";
|
|
194953
194960
|
var envLabel = env !== "production" ? `[${env.toUpperCase()}] ` : "";
|
|
194954
|
-
program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.
|
|
194961
|
+
program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.84").enablePositionalOptions();
|
|
194955
194962
|
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));
|
|
194956
194963
|
program.command("docs [topic]").description("Fetch LLM-optimized documentation").action(docsCommand);
|
|
194957
194964
|
program.command("check").description("Validate specific.hcl configuration").action(checkCommand);
|
|
@@ -56,13 +56,15 @@ export default defineConfig({
|
|
|
56
56
|
|
|
57
57
|
## Development
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
**`push` vs `migrate`:** `push` applies schema changes directly to the local database without creating migration files — use it only during local development for rapid iteration. `migrate` runs migration files and is used in production (via `pre_deploy`).
|
|
60
|
+
|
|
61
|
+
**`generate` is required:** Always run `drizzle-kit generate` after making any schema changes. This creates the migration files that `drizzle-kit migrate` applies during deployment. Without this step, schema changes won't be deployed.
|
|
60
62
|
|
|
61
63
|
```bash
|
|
62
|
-
# Push schema directly to local database (
|
|
64
|
+
# Push schema directly to local database (local dev only, no migration files created)
|
|
63
65
|
specific exec api -- npx drizzle-kit push
|
|
64
66
|
|
|
65
|
-
#
|
|
67
|
+
# Generate migration files — ALWAYS run this after schema changes, before committing
|
|
66
68
|
specific exec api -- npx drizzle-kit generate
|
|
67
69
|
```
|
|
68
70
|
|
package/dist/docs/postgres.md
CHANGED
|
@@ -41,6 +41,7 @@ postgres "main" {}
|
|
|
41
41
|
The following PostgreSQL extensions are available in both development and production (Neon):
|
|
42
42
|
|
|
43
43
|
- **pgvector** (`vector`) - Vector similarity search. Enable with `CREATE EXTENSION vector;` in a migration. See https://github.com/pgvector/pgvector for full documentation.
|
|
44
|
+
- **pg_search** (`pg_search`) - Full-text search with BM25 ranking, powered by ParadeDB. Enable with `CREATE EXTENSION pg_search;` in a migration. See https://docs.paradedb.com/documentation/getting-started/quickstart for full documentation.
|
|
44
45
|
|
|
45
46
|
## Querying the database
|
|
46
47
|
|
package/dist/postinstall.js
CHANGED
package/package.json
CHANGED
/package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_buildManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_ssgManifest.js
RENAMED
|
File without changes
|