@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.
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 +21 -14
  64. package/dist/docs/integrations/drizzle.md +5 -3
  65. package/dist/docs/postgres.md +1 -0
  66. package/dist/postinstall.js +1 -1
  67. package/package.json +1 -1
  68. /package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_buildManifest.js +0 -0
  69. /package/dist/admin/_next/static/{hBmPSh2M5utps8oJiVAZU → INncXQw3wVVZnWCSKeBPi}/_clientMiddlewareManifest.json +0 -0
  70. /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
- return keychainCert === diskCert;
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 -d -r trustRoot -k "${getLoginKeychainPath()}" "${certPath}"`;
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.82",
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
- render4(/* @__PURE__ */ React6.createElement(DevUI, { instanceKey, tunnelEnabled }));
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.82";
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.82").enablePositionalOptions();
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
- Use `specific exec` to push schema changes and generate migrations:
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 (for rapid iteration)
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
- # If user is relying on Drizzle migrations, generate them once done with schema changes
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
 
@@ -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
 
@@ -126,7 +126,7 @@ function trackEvent(event, properties) {
126
126
  event,
127
127
  properties: {
128
128
  ...properties,
129
- cli_version: "0.1.82",
129
+ cli_version: "0.1.84",
130
130
  platform: process.platform,
131
131
  node_version: process.version,
132
132
  project_id: getProjectId()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specific.dev/cli",
3
- "version": "0.1.82",
3
+ "version": "0.1.84",
4
4
  "description": "CLI for Specific infrastructure-as-code",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",