@specific.dev/cli 0.1.99 → 0.1.101
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 +36 -27
- package/package.json +1 -1
- /package/dist/admin/_next/static/{NFsFtqgp4maBtNqB-mqEU → rjO2iSMpFz_HoesjH1XgE}/_buildManifest.js +0 -0
- /package/dist/admin/_next/static/{NFsFtqgp4maBtNqB-mqEU → rjO2iSMpFz_HoesjH1XgE}/_clientMiddlewareManifest.json +0 -0
- /package/dist/admin/_next/static/{NFsFtqgp4maBtNqB-mqEU → rjO2iSMpFz_HoesjH1XgE}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -368427,6 +368427,9 @@ function parseServices(serviceData) {
|
|
|
368427
368427
|
if (fieldObj.command) {
|
|
368428
368428
|
service.command = String(fieldObj.command);
|
|
368429
368429
|
}
|
|
368430
|
+
if (service.build && !service.command) {
|
|
368431
|
+
throw new Error(`Service "${name}" has a "build" but no "command". Services with a build must specify a command to run.`);
|
|
368432
|
+
}
|
|
368430
368433
|
if (fieldObj.root) {
|
|
368431
368434
|
service.root = String(fieldObj.root);
|
|
368432
368435
|
}
|
|
@@ -368445,9 +368448,6 @@ function parseServices(serviceData) {
|
|
|
368445
368448
|
} else {
|
|
368446
368449
|
service.endpoints = endpoints;
|
|
368447
368450
|
}
|
|
368448
|
-
if (fieldObj.serve) {
|
|
368449
|
-
service.serve = String(fieldObj.serve);
|
|
368450
|
-
}
|
|
368451
368451
|
const env2 = parseEnv(fieldObj.env);
|
|
368452
368452
|
if (env2) {
|
|
368453
368453
|
service.env = env2;
|
|
@@ -370503,8 +370503,8 @@ async function startMailServer(mail, smtpPort, apiPort) {
|
|
|
370503
370503
|
from: parsed.from?.text ?? "",
|
|
370504
370504
|
to: Array.isArray(parsed.to) ? parsed.to.map((addr) => addr.text) : parsed.to ? [parsed.to.text] : [],
|
|
370505
370505
|
subject: parsed.subject ?? "(no subject)",
|
|
370506
|
-
text: parsed.text,
|
|
370507
|
-
|
|
370506
|
+
...parsed.text !== void 0 ? { text: parsed.text } : {},
|
|
370507
|
+
...typeof parsed.html === "string" ? { html: parsed.html } : {},
|
|
370508
370508
|
date: parsed.date ?? /* @__PURE__ */ new Date()
|
|
370509
370509
|
};
|
|
370510
370510
|
emails.push(email);
|
|
@@ -372273,7 +372273,6 @@ Add them to the config block in specific.local`
|
|
|
372273
372273
|
const serviceEndpoints = /* @__PURE__ */ new Map();
|
|
372274
372274
|
const serviceEndpointPorts = /* @__PURE__ */ new Map();
|
|
372275
372275
|
for (const service of config.services) {
|
|
372276
|
-
if (service.serve) continue;
|
|
372277
372276
|
if (!service.command && !service.dev?.command) continue;
|
|
372278
372277
|
const endpointPorts = /* @__PURE__ */ new Map();
|
|
372279
372278
|
const endpointInfos = [];
|
|
@@ -372347,9 +372346,6 @@ Add them to the config block in specific.local`
|
|
|
372347
372346
|
};
|
|
372348
372347
|
for (const service of config.services) {
|
|
372349
372348
|
if (this.cancelled) break;
|
|
372350
|
-
if (service.serve) {
|
|
372351
|
-
continue;
|
|
372352
|
-
}
|
|
372353
372349
|
if (!service.command && !service.dev?.command) {
|
|
372354
372350
|
continue;
|
|
372355
372351
|
}
|
|
@@ -372400,7 +372396,6 @@ Add them to the config block in specific.local`
|
|
|
372400
372396
|
await Promise.all(this.services.map((s) => s.stop()));
|
|
372401
372397
|
const newServices = [];
|
|
372402
372398
|
for (const service of config.services) {
|
|
372403
|
-
if (service.serve) continue;
|
|
372404
372399
|
if (!service.command && !service.dev?.command) continue;
|
|
372405
372400
|
try {
|
|
372406
372401
|
const endpointPorts = serviceEndpointPorts.get(service.name) || /* @__PURE__ */ new Map();
|
|
@@ -372519,13 +372514,13 @@ Add them to the config block in specific.local`
|
|
|
372519
372514
|
const getState = () => ({
|
|
372520
372515
|
status: "running",
|
|
372521
372516
|
services: config.services.filter(
|
|
372522
|
-
(svc) => runningServicePorts.has(svc.name)
|
|
372517
|
+
(svc) => runningServicePorts.has(svc.name)
|
|
372523
372518
|
).map((svc) => {
|
|
372524
372519
|
const build = svc.build ? buildsByName.get(svc.build.name) : void 0;
|
|
372525
372520
|
return {
|
|
372526
372521
|
name: svc.name,
|
|
372527
372522
|
port: runningServicePorts.get(svc.name),
|
|
372528
|
-
exposed:
|
|
372523
|
+
exposed: svc.endpoints.some((e) => e.public),
|
|
372529
372524
|
env: build?.env ? { ...build.env, ...svc.env } : svc.env
|
|
372530
372525
|
};
|
|
372531
372526
|
}),
|
|
@@ -372536,12 +372531,11 @@ Add them to the config block in specific.local`
|
|
|
372536
372531
|
host: r.host,
|
|
372537
372532
|
syncEnabled: r.type === "postgres" && syncDatabases.has(name)
|
|
372538
372533
|
})),
|
|
372539
|
-
projectId: void 0,
|
|
372540
372534
|
hasTemporal,
|
|
372541
372535
|
hasMail,
|
|
372542
|
-
mailApiUrl,
|
|
372543
|
-
drizzleGatewayPort: this.drizzleGateway
|
|
372544
|
-
temporalUiPort
|
|
372536
|
+
...mailApiUrl !== void 0 ? { mailApiUrl } : {},
|
|
372537
|
+
...this.drizzleGateway ? { drizzleGatewayPort: this.drizzleGateway.port } : {},
|
|
372538
|
+
...temporalUiPort !== void 0 ? { temporalUiPort } : {}
|
|
372545
372539
|
});
|
|
372546
372540
|
const adminPort = portAllocator.getAdminPort();
|
|
372547
372541
|
const adminServer = await startAdminServer(getState, adminPort);
|
|
@@ -372656,6 +372650,7 @@ var WORKOS_CLIENT_ID = "client_01K4HSP8CE0R73V7Z67WE9CC86";
|
|
|
372656
372650
|
function getTokenExpiresAt(accessToken) {
|
|
372657
372651
|
try {
|
|
372658
372652
|
const payload = accessToken.split(".")[1];
|
|
372653
|
+
if (!payload) return null;
|
|
372659
372654
|
const decoded = JSON.parse(Buffer.from(payload, "base64url").toString());
|
|
372660
372655
|
if (typeof decoded.exp === "number") {
|
|
372661
372656
|
return decoded.exp * 1e3;
|
|
@@ -373038,7 +373033,7 @@ function trackEvent(event, properties) {
|
|
|
373038
373033
|
event,
|
|
373039
373034
|
properties: {
|
|
373040
373035
|
...properties,
|
|
373041
|
-
cli_version: "0.1.
|
|
373036
|
+
cli_version: "0.1.101",
|
|
373042
373037
|
platform: process.platform,
|
|
373043
373038
|
node_version: process.version,
|
|
373044
373039
|
project_id: getProjectId()
|
|
@@ -373883,6 +373878,9 @@ function parseServices2(serviceData) {
|
|
|
373883
373878
|
if (fieldObj.command) {
|
|
373884
373879
|
service.command = String(fieldObj.command);
|
|
373885
373880
|
}
|
|
373881
|
+
if (service.build && !service.command) {
|
|
373882
|
+
throw new Error(`Service "${name}" has a "build" but no "command". Services with a build must specify a command to run.`);
|
|
373883
|
+
}
|
|
373886
373884
|
if (fieldObj.root) {
|
|
373887
373885
|
service.root = String(fieldObj.root);
|
|
373888
373886
|
}
|
|
@@ -373901,9 +373899,6 @@ function parseServices2(serviceData) {
|
|
|
373901
373899
|
} else {
|
|
373902
373900
|
service.endpoints = endpoints;
|
|
373903
373901
|
}
|
|
373904
|
-
if (fieldObj.serve) {
|
|
373905
|
-
service.serve = String(fieldObj.serve);
|
|
373906
|
-
}
|
|
373907
373902
|
const env2 = parseEnv2(fieldObj.env);
|
|
373908
373903
|
if (env2) {
|
|
373909
373904
|
service.env = env2;
|
|
@@ -375662,7 +375657,10 @@ function DeployUI({ environment, config }) {
|
|
|
375662
375657
|
{
|
|
375663
375658
|
key: currentConfig,
|
|
375664
375659
|
configName: currentConfig,
|
|
375665
|
-
|
|
375660
|
+
...(() => {
|
|
375661
|
+
const d = config.configs?.find((c) => c.name === currentConfig)?.default;
|
|
375662
|
+
return d !== void 0 ? { defaultValue: d } : {};
|
|
375663
|
+
})(),
|
|
375666
375664
|
onSubmit: handleConfigSubmit,
|
|
375667
375665
|
onCancel: handleConfigCancel
|
|
375668
375666
|
}
|
|
@@ -375820,7 +375818,8 @@ async function execCommand(serviceName, command, instanceKey = "default") {
|
|
|
375820
375818
|
postgres: required.postgres,
|
|
375821
375819
|
redis: required.redis,
|
|
375822
375820
|
storage: required.storage,
|
|
375823
|
-
temporal: required.temporal
|
|
375821
|
+
temporal: required.temporal,
|
|
375822
|
+
mail: []
|
|
375824
375823
|
},
|
|
375825
375824
|
stateManager,
|
|
375826
375825
|
dataDir: `.specific/keys/${instanceKey}/data`,
|
|
@@ -375992,7 +375991,8 @@ async function psqlCommand(databaseName, instanceKey = "default", extraArgs = []
|
|
|
375992
375991
|
postgres: [targetDb],
|
|
375993
375992
|
redis: [],
|
|
375994
375993
|
storage: [],
|
|
375995
|
-
temporal: []
|
|
375994
|
+
temporal: [],
|
|
375995
|
+
mail: []
|
|
375996
375996
|
},
|
|
375997
375997
|
stateManager,
|
|
375998
375998
|
dataDir: `.specific/keys/${instanceKey}/data`,
|
|
@@ -376068,6 +376068,14 @@ var VALID_ACTIONS = ["start", "complete", "status", "abort", "check"];
|
|
|
376068
376068
|
var MIGRATION_SUBCOMMANDS = ["start", "complete", "abort"];
|
|
376069
376069
|
var OFFLINE_ACTIONS = ["check"];
|
|
376070
376070
|
async function reshapeCommand(action, databaseName, instanceKey = "default") {
|
|
376071
|
+
if (action === "docs") {
|
|
376072
|
+
console.error(
|
|
376073
|
+
`Use 'specific docs' for Reshape documentation:
|
|
376074
|
+
|
|
376075
|
+
specific docs postgres/reshape`
|
|
376076
|
+
);
|
|
376077
|
+
process.exit(1);
|
|
376078
|
+
}
|
|
376071
376079
|
if (!VALID_ACTIONS.includes(action)) {
|
|
376072
376080
|
console.error(
|
|
376073
376081
|
`Error: Invalid action "${action}". Valid actions: ${VALID_ACTIONS.join(", ")}`
|
|
@@ -376186,7 +376194,8 @@ async function reshapeCommand(action, databaseName, instanceKey = "default") {
|
|
|
376186
376194
|
postgres: [targetDb],
|
|
376187
376195
|
redis: [],
|
|
376188
376196
|
storage: [],
|
|
376189
|
-
temporal: []
|
|
376197
|
+
temporal: [],
|
|
376198
|
+
mail: []
|
|
376190
376199
|
},
|
|
376191
376200
|
stateManager,
|
|
376192
376201
|
dataDir: `.specific/keys/${instanceKey}/data`,
|
|
@@ -376516,7 +376525,7 @@ function compareVersions(a, b) {
|
|
|
376516
376525
|
return 0;
|
|
376517
376526
|
}
|
|
376518
376527
|
async function checkForUpdate() {
|
|
376519
|
-
const currentVersion = "0.1.
|
|
376528
|
+
const currentVersion = "0.1.101";
|
|
376520
376529
|
const response = await fetch(`${BINARIES_BASE_URL}/latest?t=${Date.now()}`);
|
|
376521
376530
|
if (!response.ok) {
|
|
376522
376531
|
throw new Error(`Failed to check for updates: HTTP ${response.status}`);
|
|
@@ -376663,7 +376672,7 @@ function UpdateUI() {
|
|
|
376663
376672
|
if (cancelled) return;
|
|
376664
376673
|
setState({
|
|
376665
376674
|
phase: "error",
|
|
376666
|
-
checkResult: state.checkResult,
|
|
376675
|
+
...state.checkResult ? { checkResult: state.checkResult } : {},
|
|
376667
376676
|
error: err instanceof Error ? err.message : String(err)
|
|
376668
376677
|
});
|
|
376669
376678
|
}
|
|
@@ -376715,7 +376724,7 @@ function updateCommand() {
|
|
|
376715
376724
|
var program = new Command();
|
|
376716
376725
|
var env = "production";
|
|
376717
376726
|
var envLabel = env !== "production" ? `[${env.toUpperCase()}] ` : "";
|
|
376718
|
-
program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.
|
|
376727
|
+
program.name("specific").description(`${envLabel}Infrastructure-as-code for coding agents`).version("0.1.101").enablePositionalOptions();
|
|
376719
376728
|
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));
|
|
376720
376729
|
program.command("docs [topic]").description("Fetch LLM-optimized documentation").action(docsCommand);
|
|
376721
376730
|
program.command("check").description("Validate specific.hcl configuration").action(checkCommand);
|
package/package.json
CHANGED
/package/dist/admin/_next/static/{NFsFtqgp4maBtNqB-mqEU → rjO2iSMpFz_HoesjH1XgE}/_buildManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/dist/admin/_next/static/{NFsFtqgp4maBtNqB-mqEU → rjO2iSMpFz_HoesjH1XgE}/_ssgManifest.js
RENAMED
|
File without changes
|