@flisk-sh/flisk 1.3.191 → 1.3.192

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/cli/dist/cli.js CHANGED
@@ -26,7 +26,7 @@ if (process.argv.length === 2) {
26
26
  const templateArg = readOptionValue(process.argv, "--template") ?? (await bareTemplateArg(process.argv));
27
27
  const projectArg = readOptionValue(process.argv, "--project");
28
28
  if (templateArg) {
29
- const { cloneProjectTemplate } = await import("./commands/project.js");
29
+ const { cloneProjectTemplate, templateTargetDir } = await import("./commands/project.js");
30
30
  const { assertMachineReadyOrExit, detectRuntimePrerequisites, formatRuntimeNextSteps } = await import("./utils/cold-preflight.js");
31
31
  const { PROJECT_TEMPLATES } = await import("./utils/project-templates.js");
32
32
  await assertMachineReadyOrExit({ scope: "scaffold" });
@@ -36,18 +36,16 @@ if (templateArg) {
36
36
  if (install === "installed") {
37
37
  console.log("\n\u2714 flisk is installed globally, so `flisk` works from any folder.");
38
38
  }
39
- const destination = resolve(cwd(), projectArg || templateArg);
39
+ const destination = resolve(cwd(), templateTargetDir(templateArg, projectArg));
40
40
  const binPath = process.argv[1];
41
41
  if (binPath && existsSync(destination)) {
42
- const { runStack, findFrontendUrl } = await import("./utils/one-command.js");
42
+ const { runStack } = await import("./utils/one-command.js");
43
43
  const { openUrl } = await import("./utils/url-actions.js");
44
44
  console.log(`\n\u{1F680} Starting the stack in ${destination}...\n`);
45
- const result = await runStack(binPath, destination);
46
- const url = findFrontendUrl(result.output);
47
- if (url) {
45
+ await runStack(binPath, destination, process.env, undefined, (url) => {
46
+ void openUrl(url);
48
47
  console.log(`\n\u{1F310} Opening ${url}`);
49
- await openUrl(url);
50
- }
48
+ });
51
49
  }
52
50
  process.exit(0);
53
51
  }
@@ -78,6 +78,14 @@ function getDefaultCoreServices() {
78
78
  .filter((f) => f.enabled_by_default && f.category === "core")
79
79
  .map((f) => f.name);
80
80
  }
81
+ /** The directory a template lands in: the requested path, or the template's repository name. */
82
+ export function templateTargetDir(templateName, targetDir) {
83
+ if (targetDir)
84
+ return targetDir;
85
+ const template = PROJECT_TEMPLATES[templateName];
86
+ const fromRepo = template?.repo.split("/").pop() ?? templateName;
87
+ return fromRepo.replace(/\.git$/, "");
88
+ }
81
89
  export async function cloneProjectTemplate(templateName, targetDir, runtimeNextSteps) {
82
90
  const template = PROJECT_TEMPLATES[templateName];
83
91
  if (!template) {
@@ -89,7 +97,7 @@ export async function cloneProjectTemplate(templateName, targetDir, runtimeNextS
89
97
  console.log(chalk.gray("\nOr run `flisk project` with no template for a blank project."));
90
98
  process.exit(1);
91
99
  }
92
- const dirName = targetDir || (template.repo.split("/").pop() ?? templateName).replace(/\.git$/, "");
100
+ const dirName = templateTargetDir(templateName, targetDir);
93
101
  if (!isPathSafe(dirName)) {
94
102
  errorFactories.invalidPath(dirName).exit();
95
103
  }
@@ -19,10 +19,11 @@ export function findFrontendUrl(output) {
19
19
  return undefined;
20
20
  }
21
21
  /**
22
- * Runs `flisk up` in the project directory and returns its output. The output is streamed to
23
- * the terminal as it arrives, so the stack keeps its live progress.
22
+ * Runs `flisk up` in the project directory and streams its output to the terminal. The stack
23
+ * keeps running in the foreground, so the caller is told about the frontend URL as soon as it
24
+ * shows up instead of waiting for the process to exit.
24
25
  */
25
- export function runStack(binPath, cwd, env = process.env, spawnFn = spawn) {
26
+ export function runStack(binPath, cwd, env = process.env, spawnFn = spawn, onFrontendUrl) {
26
27
  return new Promise((resolve) => {
27
28
  const child = spawnFn(process.execPath, [binPath, "up"], {
28
29
  cwd,
@@ -30,10 +31,18 @@ export function runStack(binPath, cwd, env = process.env, spawnFn = spawn) {
30
31
  stdio: ["inherit", "pipe", "inherit"],
31
32
  });
32
33
  let output = "";
34
+ let announced = false;
33
35
  child.stdout?.on("data", (chunk) => {
34
36
  const text = String(chunk);
35
37
  output += text;
36
38
  process.stdout.write(text);
39
+ if (!announced) {
40
+ const url = findFrontendUrl(output);
41
+ if (url) {
42
+ announced = true;
43
+ onFrontendUrl?.(url);
44
+ }
45
+ }
37
46
  });
38
47
  child.on("error", (error) => resolve({ code: 1, output: `${output}\n${error.message}` }));
39
48
  child.on("close", (code) => resolve({ code, output }));
@@ -1,26 +1,26 @@
1
1
  import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{a as I}from"./chunk-KGKKDD4K.js";import{I as z,K as G,La as re,M as E,Pa as ae,Qa as se,Sa as ie,Ua as ce,Va as le,W as F,Wa as de,X as B,b as p,ba as f,bb as T,ca as y,cb as pe,da as t,db as q,f as x,ja as ne,jb as N,ka as W,kb as Y,l as U,la as V,n as P,ob as D,pb as J,rb as C,t as R}from"./chunk-V6K6MWSE.js";import{execFileSync as ye}from"node:child_process";import{cpSync as be,existsSync as b,readdirSync as Se,readFileSync as K,writeFileSync as je}from"node:fs";import{basename as _e,dirname as we,join as j,resolve as M}from"node:path";import{cwd as ue}from"node:process";import{fileURLToPath as xe}from"node:url";import{Command as Pe}from"commander";var he="-y, --yes",ke="Skip prompts and confirmations; use defaults";function fe(e,o=ke){return e.option(he,o,!1)}async function ve(e,o=!0){let c=await J({message:e,initial:o});return c||F(),c}function Te(e,o=1){e.valid||E(e.error??"Validation failed",o)}function Ne(e,o,c,a){return e.dryRun?(a?a():(console.log(`Dry run - ${o}`),console.log(`Would run: ${c}`)),!0):!1}async function De(e,o){return await ve(e,!0)?!0:(o&&o(),!1)}var L=new Map;function me(e){e!==void 0?L.delete(e):L.clear()}function Me(e=!1){let o=R(),c=o??"";if(!e){let r=L.get(c);if(r)return r}let{resources:a,problems:l}=o?ae(o):{resources:ie(),problems:[]},d=de(a),n=le(a);se(l);let g=a.filter(r=>!r.stack),m=new Map;for(let r of a)if(r.stack){let _=m.get(r.stack)||[];_.push(r),m.set(r.stack,_)}let k={resources:a,problems:l,stacks:d,stackNames:n,unassignedResources:g,resourcesByStack:m};return L.set(c,k),k}var O={proxy:{name:"proxy",description:"Traefik reverse proxy and API gateway for routing all services",category:"core",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]},verdaccio:{name:"verdaccio",description:"Verdaccio npm registry for package management and local publishing (Premium - requires TDK_LICENSE_KEY)",category:"premium",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[]},[x]:{name:x,description:"PostgreSQL database for data persistence and SQL operations",category:"core",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]},monitoring:{name:"monitoring",description:"SigNoz or SkyWalking observability platform for monitoring and tracing",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[x]},elk:{name:"elk",description:"Elasticsearch, Logstash, Kibana stack for log aggregation and analysis",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[]},debezium:{name:"debezium",description:"Change Data Capture for real-time data streaming from databases",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[x]},"golden-image":{name:"golden-image",description:"Pre-built Docker image layer for faster builds and smaller deployments",category:"optional",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]}};function H(e,o){try{return ce(e,o)}catch{return[]}}function Ee(e){return new Set([...e.phases.pre_alpha.enabledStacks,...e.phases.alpha.enabledStacks,...e.phases.beta.enabledStacks,...e.phases.out_of_scope.enabledStacks])}function Q(e,o){let c=Ee(e),a=o.filter(l=>!c.has(l));return a.length===0?(e.phases.pre_alpha.enabledStacks=Array.from(new Set(e.phases.pre_alpha.enabledStacks)),[]):(e.phases.pre_alpha.enabledStacks=Array.from(new Set([...e.phases.pre_alpha.enabledStacks,...a])),a)}function pt(e,o){let c=j(e,".tdk",U);if(!b(c))return[];let a=N(e),l=Q(a,H(e,o));return l.length>0&&T(c,a),l}function Ce(){return Object.values(O).filter(e=>e.enabled_by_default&&e.category==="core").map(e=>e.name)}async function Oe(e,o,c){let a=I[e];if(!a){console.log(p.red(`
2
+ import{a as O}from"./chunk-KGKKDD4K.js";import{I as z,K as G,La as re,M as E,Pa as ae,Qa as se,Sa as ie,Ua as ce,Va as le,W as T,Wa as de,X as B,b as p,ba as f,bb as N,ca as y,cb as pe,da as t,db as q,f as x,ja as ne,jb as D,ka as W,kb as Y,l as U,la as V,n as P,ob as J,pb as I,rb as C,t as F}from"./chunk-XYFVXSEO.js";import{execFileSync as ye}from"node:child_process";import{cpSync as be,existsSync as b,readdirSync as Se,readFileSync as K,writeFileSync as je}from"node:fs";import{basename as _e,dirname as we,join as j,resolve as M}from"node:path";import{cwd as ue}from"node:process";import{fileURLToPath as xe}from"node:url";import{Command as Pe}from"commander";var he="-y, --yes",ke="Skip prompts and confirmations; use defaults";function fe(e,o=ke){return e.option(he,o,!1)}async function ve(e,o=!0){let c=await I({message:e,initial:o});return c||T(),c}function Ne(e,o=1){e.valid||E(e.error??"Validation failed",o)}function De(e,o,c,a){return e.dryRun?(a?a():(console.log(`Dry run - ${o}`),console.log(`Would run: ${c}`)),!0):!1}async function Je(e,o){return await ve(e,!0)?!0:(o&&o(),!1)}var L=new Map;function me(e){e!==void 0?L.delete(e):L.clear()}function Ue(e=!1){let o=F(),c=o??"";if(!e){let r=L.get(c);if(r)return r}let{resources:a,problems:l}=o?ae(o):{resources:ie(),problems:[]},d=de(a),n=le(a);se(l);let g=a.filter(r=>!r.stack),m=new Map;for(let r of a)if(r.stack){let _=m.get(r.stack)||[];_.push(r),m.set(r.stack,_)}let k={resources:a,problems:l,stacks:d,stackNames:n,unassignedResources:g,resourcesByStack:m};return L.set(c,k),k}var A={proxy:{name:"proxy",description:"Traefik reverse proxy and API gateway for routing all services",category:"core",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]},verdaccio:{name:"verdaccio",description:"Verdaccio npm registry for package management and local publishing (Premium - requires TDK_LICENSE_KEY)",category:"premium",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[]},[x]:{name:x,description:"PostgreSQL database for data persistence and SQL operations",category:"core",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]},monitoring:{name:"monitoring",description:"SigNoz or SkyWalking observability platform for monitoring and tracing",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[x]},elk:{name:"elk",description:"Elasticsearch, Logstash, Kibana stack for log aggregation and analysis",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[]},debezium:{name:"debezium",description:"Change Data Capture for real-time data streaming from databases",category:"optional",phase:"pre_alpha",enabled_by_default:!1,dependsOn:[x]},"golden-image":{name:"golden-image",description:"Pre-built Docker image layer for faster builds and smaller deployments",category:"optional",phase:"pre_alpha",enabled_by_default:!0,dependsOn:[]}};function H(e,o){try{return ce(e,o)}catch{return[]}}function Ee(e){return new Set([...e.phases.pre_alpha.enabledStacks,...e.phases.alpha.enabledStacks,...e.phases.beta.enabledStacks,...e.phases.out_of_scope.enabledStacks])}function Q(e,o){let c=Ee(e),a=o.filter(l=>!c.has(l));return a.length===0?(e.phases.pre_alpha.enabledStacks=Array.from(new Set(e.phases.pre_alpha.enabledStacks)),[]):(e.phases.pre_alpha.enabledStacks=Array.from(new Set([...e.phases.pre_alpha.enabledStacks,...a])),a)}function ft(e,o){let c=j(e,".tdk",U);if(!b(c))return[];let a=D(e),l=Q(a,H(e,o));return l.length>0&&N(c,a),l}function Ce(){return Object.values(A).filter(e=>e.enabled_by_default&&e.category==="core").map(e=>e.name)}function Oe(e,o){return o||(O[e]?.repo.split("/").pop()??e).replace(/\.git$/,"")}async function Ae(e,o,c){let a=O[e];if(!a){console.log(p.red(`
3
3
  \u274C Unknown template: "${e}"`)),console.log(p.yellow(`
4
- Available templates:`));for(let[n,g]of Object.entries(I))console.log(` ${p.cyan(n)} ${p.gray(`- ${g.description}`)}`);console.log(p.gray("\nOr run `flisk project` with no template for a blank project.")),process.exit(1)}let l=o||(a.repo.split("/").pop()??e).replace(/\.git$/,"");re(l)||z.invalidPath(l).exit();let d=M(ue(),l);b(d)&&Se(d).length>0&&z.directoryExists(d).exit(),B(`Cloning template: ${e}`),t(`${a.description}
4
+ Available templates:`));for(let[n,g]of Object.entries(O))console.log(` ${p.cyan(n)} ${p.gray(`- ${g.description}`)}`);console.log(p.gray("\nOr run `flisk project` with no template for a blank project.")),process.exit(1)}let l=Oe(e,o);re(l)||z.invalidPath(l).exit();let d=M(ue(),l);b(d)&&Se(d).length>0&&z.directoryExists(d).exit(),B(`Cloning template: ${e}`),t(`${a.description}
5
5
  `,0),t(`Source: ${a.bundledPath?"bundled Flisk example":a.repo}`,0),t(`Destination: ${d}
6
6
  `,0);try{if(a.bundledPath){let n=M(we(xe(new URL("../dist/commands/project.js",import.meta.url).href)),"../../../");be(M(n,a.bundledPath),d,{recursive:!0});let g=_e(d).replace(/-/g,"_");for(let m of["services/platform/messaging/docker-compose.yml","services/shop/orders-api/service.json","services/shop/orders-api/src/index.ts","services/shop/orders-worker/service.json","services/shop/orders-worker/src/index.ts"]){let k=j(d,m),r=K(k,"utf-8");je(k,r.replaceAll("tdk_example",g))}}else ye("git",["clone",a.repo,d],{stdio:"inherit"})}catch{E(a.bundledPath?"Bundled example copy failed. Reinstall the Flisk CLI package and try again.":"git clone failed. Check you have git installed and network access.")}me(),console.log(p.green(`
7
7
  \u2705 Cloned "${e}" into ${l}/`)),t(`
8
8
  Next steps:`,0),t(`1. cd ${l}`),t("2. flisk doctor # check Docker/Tilt are ready"),t("3. flisk up # start the stack"),t(`
9
- Runtime readiness:`,0);for(let n of c)t(n,0)}var A={version:"1.0",project:{name:"",version:"1.0.0"},phases:{pre_alpha:{name:"Pre-Alpha",description:"Core infrastructure and MVP services",enabledStacks:Ce()},alpha:{name:"Alpha",description:"Essential business services",enabledStacks:[]},beta:{name:"Beta",description:"Extended features",enabledStacks:[]},out_of_scope:{name:"Out of Scope",description:"Future releases",enabledStacks:[]}},optional_infra:{monitoring:!1,elk:!1,debezium:!1,golden_image:!0,verdaccio:!1},discovery:{paths:["services/*/*"]},overrides:{}},ft=fe(new Pe("project")).description("Initialize or validate project-level master configuration").argument("[template]",`Clone a starter example instead of a blank project (${Object.keys(I).join(", ")})`).option("--path <dir>","Directory to clone the template into (default: the template's repo name)").option("--check","Check if master configs exist and are in sync").option("--force","Overwrite existing configuration (dangerous)").option("--config-file <path>","Load project config from existing JSON file").action(async(e,o)=>{let{assertMachineReadyOrExit:c,detectRuntimePrerequisites:a,formatRuntimeNextSteps:l}=await import("./cold-preflight-WDQRF5G6.js");await c({scope:"scaffold"});let d=l(a());if(e){await G(async()=>Oe(e,o.path,d));return}await G(async()=>{let n=R();n||(n=ue(),y(`\u{1F680} Initializing new Flisk project...
9
+ Runtime readiness:`,0);for(let n of c)t(n,0)}var R={version:"1.0",project:{name:"",version:"1.0.0"},phases:{pre_alpha:{name:"Pre-Alpha",description:"Core infrastructure and MVP services",enabledStacks:Ce()},alpha:{name:"Alpha",description:"Essential business services",enabledStacks:[]},beta:{name:"Beta",description:"Extended features",enabledStacks:[]},out_of_scope:{name:"Out of Scope",description:"Future releases",enabledStacks:[]}},optional_infra:{monitoring:!1,elk:!1,debezium:!1,golden_image:!0,verdaccio:!1},discovery:{paths:["services/*/*"]},overrides:{}},mt=fe(new Pe("project")).description("Initialize or validate project-level master configuration").argument("[template]",`Clone a starter example instead of a blank project (${Object.keys(O).join(", ")})`).option("--path <dir>","Directory to clone the template into (default: the template's repo name)").option("--check","Check if master configs exist and are in sync").option("--force","Overwrite existing configuration (dangerous)").option("--config-file <path>","Load project config from existing JSON file").action(async(e,o)=>{let{assertMachineReadyOrExit:c,detectRuntimePrerequisites:a,formatRuntimeNextSteps:l}=await import("./cold-preflight-ZJAU3E7K.js");await c({scope:"scaffold"});let d=l(a());if(e){await G(async()=>Ae(e,o.path,d));return}await G(async()=>{let n=F();n||(n=ue(),y(`\u{1F680} Initializing new Flisk project...
10
10
  `),t(`Location: ${n}
11
- `,0));let g=j(n,".tdk"),m=j(g,U);if(o.check){let i=P.every(u=>b(j(n,".tdk",".tdk-out",u))),h=b(m);if(i&&h){let u=N(n);f("Project configuration is valid"),t(`Project: ${u.project.name}`,3),t(`Phases: ${Object.keys(u.phases).join(", ")}`,3),process.exit(0)}else{if(console.log(p.yellow("\u26A0\uFE0F Project configuration incomplete:")),h||t(".tdk/project.json (not found)",3),!i)for(let u of P.filter(S=>!b(j(n,".tdk/.tdk-out",S))))t(`.tdk/.tdk-out/${u} (not found)`,3);t("Run `flisk project` to create them."),process.exit(1)}}B("Project Configuration"),t(`Project root: ${n}
12
- `,0),b(g)||(pe(g),f("Created: .tdk/ directory"));let k=b(m);if(k&&!o.force){f(".tdk/project.json exists");let i=JSON.parse(K(m,"utf-8")),h=N(n),u=H(n),S=Q(h,u);if((S.length>0||!i.phases)&&T(m,h),S.length>0&&t(`Auto-enabled discovered service stacks: ${S.join(", ")}`,0),y(`
11
+ `,0));let g=j(n,".tdk"),m=j(g,U);if(o.check){let i=P.every(u=>b(j(n,".tdk",".tdk-out",u))),h=b(m);if(i&&h){let u=D(n);f("Project configuration is valid"),t(`Project: ${u.project.name}`,3),t(`Phases: ${Object.keys(u.phases).join(", ")}`,3),process.exit(0)}else{if(console.log(p.yellow("\u26A0\uFE0F Project configuration incomplete:")),h||t(".tdk/project.json (not found)",3),!i)for(let u of P.filter(S=>!b(j(n,".tdk/.tdk-out",S))))t(`.tdk/.tdk-out/${u} (not found)`,3);t("Run `flisk project` to create them."),process.exit(1)}}B("Project Configuration"),t(`Project root: ${n}
12
+ `,0),b(g)||(pe(g),f("Created: .tdk/ directory"));let k=b(m);if(k&&!o.force){f(".tdk/project.json exists");let i=JSON.parse(K(m,"utf-8")),h=D(n),u=H(n),S=Q(h,u);if((S.length>0||!i.phases)&&N(m,h),S.length>0&&t(`Auto-enabled discovered service stacks: ${S.join(", ")}`,0),y(`
13
13
  \u{1F4CB} Regenerating master configuration files...
14
14
  `),await Y(n),V(n))f("Created: .env (the defaults work as-is)");else{let v=W(n);v.length>0&&f(`Updated: .env (added ${v.join(", ")}; existing values unchanged)`)}let $=q(n);$.length>0&&f(`Added to .gitignore: ${$.join(", ")}`),console.log(p.green(`
15
15
  \u2705 Project configuration regenerated!`)),t(`
16
16
  Generated in .tdk/.tdk-out/:`,0);for(let v of P)t(`- ${v}`);t(`
17
17
  Runtime readiness:`,0);for(let v of d)t(v,0);return}if(k&&o.force&&!o.yes&&(console.log(p.red(`
18
- \u26A0\uFE0F WARNING: --force will overwrite .tdk/project.json!`)),!await J({message:"This will reset your project configuration. Continue?",initial:!1}))){F();return}let r,_=H(n);if(o.configFile){let i=M(o.configFile);b(i)||E(`Config file not found: ${i}`);let h=K(i,"utf-8");r=JSON.parse(h),f(`Loaded config from: ${i}`)}else if(o.yes)r=JSON.parse(JSON.stringify(A)),r.project.name=n.split("/").pop()||"my-project",console.log(p.gray("Using default configuration (non-interactive mode)"));else{y(`\u{1F4DD} Project Setup Wizard
19
- `);let i=await D({message:"Project name:",initial:n.split("/").pop()||"my-project",validate:s=>s.trim()!==""||"Project name is required"}),h=await D({message:"Project version:",initial:"1.0.0-alpha"}),u=Object.values(O).filter(s=>s.category==="core"&&s.phase==="pre_alpha"),S=new Set(u.map(s=>s.name)),te=await C({message:"Select Pre-Alpha enabled stacks (core infrastructure):",choices:[...u.map(s=>({title:s.description,value:s.name,selected:s.enabled_by_default})),..._.filter(s=>!S.has(s)).map(s=>({title:`${s} (discovered service stack)`,value:s,selected:!0}))]}),$=await C({message:"Select Alpha enabled stacks (core business):",choices:[{title:"api (Backend API)",value:"api"},{title:"app (Frontend app)",value:"app"}]}),v=await C({message:"Select Beta enabled stacks (extended features):",choices:[{title:"worker (Background jobs)",value:"worker"},{title:"migrator (Database migrations)",value:"migrator"}]}),w=await C({message:"Enable optional infrastructure (high resource):",choices:Object.values(O).filter(s=>s.category==="optional").concat(Object.values(O).filter(s=>s.category==="premium")).map(s=>({title:s.description,value:s.name,selected:s.enabled_by_default}))});y(`
20
- \u{1F4C2} Service discovery`),t("What: folder patterns Flisk scans for a service.json in each match."),t("Where: type one or more globs, comma-separated."),t("How: saved as discovery.paths in .tdk/project.json - editable later."),t(`Example: ${A.discovery.paths.join(", ")}
21
- `);let ge=await D({message:"Folders to scan:",initial:A.discovery.paths.join(", ")});r=JSON.parse(JSON.stringify(A)),r.project.name=i,r.project.version=h,r.phases.pre_alpha.enabledStacks=Array.from(new Set(te)),r.phases.alpha.enabledStacks=Array.from(new Set($)),r.phases.beta.enabledStacks=Array.from(new Set(v)),r.optional_infra.monitoring=w.includes("monitoring"),r.optional_infra.elk=w.includes("elk"),r.optional_infra.debezium=w.includes("debezium"),r.optional_infra.golden_image=w.includes("golden_image"),r.optional_infra.verdaccio=w.includes("verdaccio");let oe=ge.split(",").map(s=>s.trim()).filter(s=>s.length>0);r.discovery.paths=oe.length>0?oe:A.discovery.paths}let X=Q(r,_);if(X.length>0&&t(`Auto-enabled discovered service stacks: ${X.join(", ")}`,0),y(`
18
+ \u26A0\uFE0F WARNING: --force will overwrite .tdk/project.json!`)),!await I({message:"This will reset your project configuration. Continue?",initial:!1}))){T();return}let r,_=H(n);if(o.configFile){let i=M(o.configFile);b(i)||E(`Config file not found: ${i}`);let h=K(i,"utf-8");r=JSON.parse(h),f(`Loaded config from: ${i}`)}else if(o.yes)r=JSON.parse(JSON.stringify(R)),r.project.name=n.split("/").pop()||"my-project",console.log(p.gray("Using default configuration (non-interactive mode)"));else{y(`\u{1F4DD} Project Setup Wizard
19
+ `);let i=await J({message:"Project name:",initial:n.split("/").pop()||"my-project",validate:s=>s.trim()!==""||"Project name is required"}),h=await J({message:"Project version:",initial:"1.0.0-alpha"}),u=Object.values(A).filter(s=>s.category==="core"&&s.phase==="pre_alpha"),S=new Set(u.map(s=>s.name)),te=await C({message:"Select Pre-Alpha enabled stacks (core infrastructure):",choices:[...u.map(s=>({title:s.description,value:s.name,selected:s.enabled_by_default})),..._.filter(s=>!S.has(s)).map(s=>({title:`${s} (discovered service stack)`,value:s,selected:!0}))]}),$=await C({message:"Select Alpha enabled stacks (core business):",choices:[{title:"api (Backend API)",value:"api"},{title:"app (Frontend app)",value:"app"}]}),v=await C({message:"Select Beta enabled stacks (extended features):",choices:[{title:"worker (Background jobs)",value:"worker"},{title:"migrator (Database migrations)",value:"migrator"}]}),w=await C({message:"Enable optional infrastructure (high resource):",choices:Object.values(A).filter(s=>s.category==="optional").concat(Object.values(A).filter(s=>s.category==="premium")).map(s=>({title:s.description,value:s.name,selected:s.enabled_by_default}))});y(`
20
+ \u{1F4C2} Service discovery`),t("What: folder patterns Flisk scans for a service.json in each match."),t("Where: type one or more globs, comma-separated."),t("How: saved as discovery.paths in .tdk/project.json - editable later."),t(`Example: ${R.discovery.paths.join(", ")}
21
+ `);let ge=await J({message:"Folders to scan:",initial:R.discovery.paths.join(", ")});r=JSON.parse(JSON.stringify(R)),r.project.name=i,r.project.version=h,r.phases.pre_alpha.enabledStacks=Array.from(new Set(te)),r.phases.alpha.enabledStacks=Array.from(new Set($)),r.phases.beta.enabledStacks=Array.from(new Set(v)),r.optional_infra.monitoring=w.includes("monitoring"),r.optional_infra.elk=w.includes("elk"),r.optional_infra.debezium=w.includes("debezium"),r.optional_infra.golden_image=w.includes("golden_image"),r.optional_infra.verdaccio=w.includes("verdaccio");let oe=ge.split(",").map(s=>s.trim()).filter(s=>s.length>0);r.discovery.paths=oe.length>0?oe:R.discovery.paths}let X=Q(r,_);if(X.length>0&&t(`Auto-enabled discovered service stacks: ${X.join(", ")}`,0),y(`
22
22
  \u{1F4CB} Creating project configuration...
23
- `),T(m,r),f("Created: .tdk/project.json"),t(`\u2192 Project: ${r.project.name}`),y(`
23
+ `),N(m,r),f("Created: .tdk/project.json"),t(`\u2192 Project: ${r.project.name}`),y(`
24
24
  \u{1F4CB} Generating master configuration files...
25
25
  `),await Y(n),y(`
26
26
  \u{1F527} Setting up environment variables...
@@ -31,4 +31,4 @@ Generated files in .tdk/.tdk-out/:`,0);for(let i of P)t(`- ${i}`);t(`
31
31
  Environment configuration:`,0),t("- .env (contains all required variables)"),t(`
32
32
  Source file:`,0),t("- .tdk/project.json (edit this to change project structure)"),t(`
33
33
  Next steps:`,0),t("1. flisk resource api --type backend --stack app # scaffold a service"),t("2. flisk up app # start it"),t(`
34
- Runtime readiness:`,0);for(let i of d)t(i,0);t("\nAfter editing .tdk/project.json, run `flisk config regenerate`.",0)})});export{me as a,Me as b,fe as c,Te as d,Ne as e,De as f,pt as g,Oe as h,ft as i};
34
+ Runtime readiness:`,0);for(let i of d)t(i,0);t("\nAfter editing .tdk/project.json, run `flisk config regenerate`.",0)})});export{me as a,Ue as b,fe as c,Ne as d,De as e,Je as f,ft as g,Oe as h,Ae as i,mt as j};
@@ -1,5 +1,5 @@
1
1
  import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{Aa as Ut,Ba as Bt,Ca as je,H as X,P as S,Ra as b,Sa as Gt,b as P,d as T,e as de,f as U,fb as Ie,ga as I,h as Rt,i as _,ja as jt,jb as Vt,l as v,m as R,ma as It,n as Re,na as Ce,oa as le,p as Oe,pa as Ft,pb as Jt,qa as Z,r as Ot,t as h,u as Ct,ua as Ae,va as Ht,wa as ue,xa as Mt,y as $,ya as Lt,z as At}from"./chunk-V6K6MWSE.js";import{c as Wt}from"./chunk-42IVF3YT.js";import{execFileSync as Fn}from"node:child_process";import{readFileSync as zi}from"node:fs";import{join as Yi}from"node:path";import{execFileSync as ii,execSync as bn}from"node:child_process";import{existsSync as N,readdirSync as ai,readFileSync as q}from"node:fs";import{join as w,normalize as Pt,relative as bt}from"node:path";import{Command as ci}from"commander";import{existsSync as Gn}from"node:fs";var pe="docs/agent-hosts.md",Fe=`WebContainers cannot run Flisk: there is no Docker daemon or Tilt. Run \`flisk up\` on a machine with Docker. See ${pe}.`,Kt=`Docker is not reachable from this Dev Container. Mount the host Docker socket (-v /var/run/docker.sock:/var/run/docker.sock) or add the docker-outside-of-docker feature to devcontainer.json, then retry. Docker-in-docker is not supported. See ${pe}.`;function Wn(){return{env:process.env,versions:process.versions,platform:process.platform,fileExists:Gn}}function qt(e=Wn()){let{env:t,versions:s,platform:n,fileExists:r}=e;return s.webcontainer?{kind:"webcontainer",canUp:!1}:t.CODESPACES==="true"?{kind:"codespaces",canUp:!0}:t.REMOTE_CONTAINERS||r("/.dockerenv")&&t.DEVCONTAINER?{kind:"devcontainer",canUp:!0}:n==="win32"?{kind:"native-windows",canUp:t.TDK_ALLOW_NATIVE_WINDOWS==="1"}:n==="linux"&&t.WSL_DISTRO_NAME?{kind:"wsl2",canUp:!0}:{kind:"local",canUp:!0}}function zt(e){return e==="devcontainer"||e==="codespaces"}function fe(e){return e.some(t=>I(t.config?.appType)||t.config?.appType==="frontend"||t.config?.appType==="worker")}import{existsSync as Vn,readFileSync as Jn}from"node:fs";import{join as Kn,relative as Yt,resolve as Xt,sep as qn}from"node:path";var zn=2,Zt=["services/*/*"];function Qt(e){return e.split(qn).filter(Boolean)}function Yn(e,t){let s=0,n=0,r=-1,o=0;for(;n<t.length;)if(s<e.length&&e[s]!=="*"&&(e[s]==="?"||e[s]===t[n]))s++,n++;else if(s<e.length&&e[s]==="*")r=s++,o=n;else if(r!==-1)s=r+1,n=++o;else return!1;for(;s<e.length&&e[s]==="*";)s++;return s===e.length}function Xn(e,t){return e.length===t.length&&e.every((s,n)=>Yn(s,t[n]))}function He(e){let t=Kn(e,".tdk",v);if(!Vn(t))return Zt;try{let s=JSON.parse(Jn(t,"utf-8"))?.discovery?.paths;if(Array.isArray(s)&&s.every(n=>typeof n=="string"))return s}catch{}return Zt}function me(e,t,s){let n=Qt(Yt(e,Xt(e,t)));return s.some(r=>{let o=Qt(Yt(e,Xt(e,r)));for(let i=0;i<=zn;i++){let a=n.length-i;if(a>0&&Xn(o,n.slice(0,a)))return!0}return!1})}function la(e,t,s,n){let r=He(e);if(me(e,t,r))return{path:t};let o=`services/${s}/${n}`;return me(e,o,r)?{path:o,adjustedFrom:t}:{path:t}}import{execFile as mr}from"node:child_process";import{promisify as hr}from"node:util";import{execFileSync as is,execSync as te}from"node:child_process";import{existsSync as Me,readdirSync as Zn,readFileSync as Le}from"node:fs";import{join as W}from"node:path";function es(e,t){return e==="pending"||e==="in_progress"||e==="none"||t==="pending"||t==="none"}var ts="container is running, but its health check is failing";function ss(e){let t=e?.runtimeStatus??"";if(t!=="ok")return t;let s=e?.composeResourceInfo?.healthStatus;return s==="unhealthy"?"error":s==="starting"?"pending":t}var Q=1e4,ns=3e3,Qn="http://localhost:4873";function as(e){return`'${e.replace(/'/g,"'\\''")}'`}function ee(e,t,s,n,r){return process.platform==="win32"?is($(t)??t,s,{...r,windowsHide:!0}):e(n,r)}var er=[80,443];function Ue(e){return e.replace(/-/g,"_")}function tr(e,t){let s=new Set(t),n=[];for(let r of e.split(`
2
+ import{Aa as Ut,Ba as Bt,Ca as je,H as X,P as S,Ra as b,Sa as Gt,b as P,d as T,e as de,f as U,fb as Ie,ga as I,h as Rt,i as _,ja as jt,jb as Vt,l as v,m as R,ma as It,n as Re,na as Ce,oa as le,p as Oe,pa as Ft,pb as Jt,qa as Z,r as Ot,t as h,u as Ct,ua as Ae,va as Ht,wa as ue,xa as Mt,y as $,ya as Lt,z as At}from"./chunk-XYFVXSEO.js";import{c as Wt}from"./chunk-42IVF3YT.js";import{execFileSync as Fn}from"node:child_process";import{readFileSync as zi}from"node:fs";import{join as Yi}from"node:path";import{execFileSync as ii,execSync as bn}from"node:child_process";import{existsSync as N,readdirSync as ai,readFileSync as q}from"node:fs";import{join as w,normalize as Pt,relative as bt}from"node:path";import{Command as ci}from"commander";import{existsSync as Gn}from"node:fs";var pe="docs/agent-hosts.md",Fe=`WebContainers cannot run Flisk: there is no Docker daemon or Tilt. Run \`flisk up\` on a machine with Docker. See ${pe}.`,Kt=`Docker is not reachable from this Dev Container. Mount the host Docker socket (-v /var/run/docker.sock:/var/run/docker.sock) or add the docker-outside-of-docker feature to devcontainer.json, then retry. Docker-in-docker is not supported. See ${pe}.`;function Wn(){return{env:process.env,versions:process.versions,platform:process.platform,fileExists:Gn}}function qt(e=Wn()){let{env:t,versions:s,platform:n,fileExists:r}=e;return s.webcontainer?{kind:"webcontainer",canUp:!1}:t.CODESPACES==="true"?{kind:"codespaces",canUp:!0}:t.REMOTE_CONTAINERS||r("/.dockerenv")&&t.DEVCONTAINER?{kind:"devcontainer",canUp:!0}:n==="win32"?{kind:"native-windows",canUp:t.TDK_ALLOW_NATIVE_WINDOWS==="1"}:n==="linux"&&t.WSL_DISTRO_NAME?{kind:"wsl2",canUp:!0}:{kind:"local",canUp:!0}}function zt(e){return e==="devcontainer"||e==="codespaces"}function fe(e){return e.some(t=>I(t.config?.appType)||t.config?.appType==="frontend"||t.config?.appType==="worker")}import{existsSync as Vn,readFileSync as Jn}from"node:fs";import{join as Kn,relative as Yt,resolve as Xt,sep as qn}from"node:path";var zn=2,Zt=["services/*/*"];function Qt(e){return e.split(qn).filter(Boolean)}function Yn(e,t){let s=0,n=0,r=-1,o=0;for(;n<t.length;)if(s<e.length&&e[s]!=="*"&&(e[s]==="?"||e[s]===t[n]))s++,n++;else if(s<e.length&&e[s]==="*")r=s++,o=n;else if(r!==-1)s=r+1,n=++o;else return!1;for(;s<e.length&&e[s]==="*";)s++;return s===e.length}function Xn(e,t){return e.length===t.length&&e.every((s,n)=>Yn(s,t[n]))}function He(e){let t=Kn(e,".tdk",v);if(!Vn(t))return Zt;try{let s=JSON.parse(Jn(t,"utf-8"))?.discovery?.paths;if(Array.isArray(s)&&s.every(n=>typeof n=="string"))return s}catch{}return Zt}function me(e,t,s){let n=Qt(Yt(e,Xt(e,t)));return s.some(r=>{let o=Qt(Yt(e,Xt(e,r)));for(let i=0;i<=zn;i++){let a=n.length-i;if(a>0&&Xn(o,n.slice(0,a)))return!0}return!1})}function la(e,t,s,n){let r=He(e);if(me(e,t,r))return{path:t};let o=`services/${s}/${n}`;return me(e,o,r)?{path:o,adjustedFrom:t}:{path:t}}import{execFile as mr}from"node:child_process";import{promisify as hr}from"node:util";import{execFileSync as is,execSync as te}from"node:child_process";import{existsSync as Me,readdirSync as Zn,readFileSync as Le}from"node:fs";import{join as W}from"node:path";function es(e,t){return e==="pending"||e==="in_progress"||e==="none"||t==="pending"||t==="none"}var ts="container is running, but its health check is failing";function ss(e){let t=e?.runtimeStatus??"";if(t!=="ok")return t;let s=e?.composeResourceInfo?.healthStatus;return s==="unhealthy"?"error":s==="starting"?"pending":t}var Q=1e4,ns=3e3,Qn="http://localhost:4873";function as(e){return`'${e.replace(/'/g,"'\\''")}'`}function ee(e,t,s,n,r){return process.platform==="win32"?is($(t)??t,s,{...r,windowsHide:!0}):e(n,r)}var er=[80,443];function Ue(e){return e.replace(/-/g,"_")}function tr(e,t){let s=new Set(t),n=[];for(let r of e.split(`
3
3
  `)){let o=r.trim();if(!o)continue;let i=o.indexOf(" "),a=i>=0?o.slice(0,i):o,d=i>=0?o.slice(i+1):"",c=[];for(let l of s)d.split(/[\s,]+/).some(f=>f.startsWith(`${l}->`)||f.includes(`:${l}->`))&&c.push(l);c.length>0&&n.push({name:a,ports:d,publishedPorts:c})}return n}function cs(e,t){let s=e.toLowerCase(),n=t.toLowerCase();return s===`${n}_traefik`||s.startsWith(`${n}_traefik`)}function sr(e,t){return e.filter(s=>!cs(s.name,t))}function Be(e){try{let t=e??Gt();return new Set(t.filter(s=>s.config?.sablier?.enable&&s.config?.sablier?.deferStart).map(s=>s.name))}catch{return new Set}}function Ge(e,t=new Set){let n=JSON.parse(e).items??[],r=[],o=0,i=0,a=0;for(let d of n){let c=d.metadata?.name??"unknown",l=d.status?.updateStatus??"",u=ss(d.status),f=u==="error"&&d.status?.runtimeStatus==="ok",y=(d.status?.buildHistory?.[0]?.error??"").trim()||(f?ts:"");if(l==="error"||u==="error"){r.push({name:c,updateStatus:l,runtimeStatus:u,error:y.replace(/\s+/g," ").slice(0,800)});continue}if(l==="ok"&&(u==="ok"||u==="not_applicable")){a+=1;continue}c!=="(Tiltfile)"&&es(l,u)&&(t.has(c)?i+=1:o+=1)}return{failures:r,pendingCount:o,deferredCount:i,okCount:a,total:n.length}}var nr=/failed to resolve source metadata for docker\.io\/library\/([A-Za-z0-9._-]+-l[1-4](?:-[a-z]+)*)(?::[^\s:]+)?:/i;function We(e){let t=e.replace(/\s+/g," ").trim(),s=t.match(/Bind for [^ ]+:(\d+) failed: port is already allocated/i);if(s)return`host port ${s[1]} is already allocated`;if(/port is already allocated/i.test(t))return"a required host port is already allocated";let n=[...t.matchAll(/ConnectionRefused downloading package manifest (@[A-Za-z0-9._/-]+)/gi)].map(a=>a[1]);if(n.length>0){let a=[...new Set(n)],d=a.slice(0,4).join(", "),c=a.length>4?` (+${a.length-4} more)`:"";return`private registry ConnectionRefused for ${d}${c} \u2014 Verdaccio (:4873) is down or unreachable from the build`}let r=t.match(nr);if(r)return`base image ${r[1]} was missing when this build started (the golden layers weren't built yet, or golden-layers-build failed) - Tilt does not retry a failed build by itself`;if(/install-deps\.sh/i.test(t)||/bun install(?: --production)?/i.test(t)||/npm (?:ci|install)/i.test(t))return"dependency install failed during ImageBuild \u2014 usually Verdaccio (:4873) unreachable or missing @scoped packages (ConnectionRefused downloading package manifest)";let o=t.match(/No such image:\s*([^\s]+)/i)?.[1]??t.match(/pull access denied for ([^,:\s]+)/i)?.[1]??void 0,i=t.match(/\bup\s+-d\s+--no-build\s+([A-Za-z0-9._-]+)/i)?.[1];if(o||i||/docker compose .*\bup\s+-d\s+--no-build\b/i.test(t)){let a=o??`${i??"service"}:dev`,d=i?` for ${i}`:"";return`compose run failed because image is missing (${a})${d} \u2014 wait for the ImageBuild resource to finish, then re-trigger the *-run-only resource`}return/bun run build/i.test(t)?"ImageBuild failed during `bun run build` (compile/typecheck) \u2014 open the resource logs in Tilt for the TypeScript/build error":(/ImageBuild:/i.test(t)||/^Command "/i.test(t),t.slice(0,220))}function rs(e){return/ConnectionRefused downloading package manifest|Verdaccio|private registry|dependency install failed during ImageBuild|install-deps\.sh|bun install/i.test(e)}function Ve(e=h()??process.cwd()){let t=W(e,".tdk",v);if(!Me(t))return!1;try{let s=JSON.parse(Le(t,"utf-8"));return s.optional_infra?.verdaccio===!0||Object.values(s.phases??{}).some(n=>(n.enabledStacks??[]).includes("verdaccio"))}catch{return!1}}function ds(e){for(let t of[W(e,".npmrc"),W(e,R)])if(Me(t))try{let s=Le(t,"utf-8");if(/:4873\b/.test(s)||/verdaccio/i.test(s))return!0}catch{}return!1}function rr(e=h()??process.cwd()){return Ve(e)||ds(e)}function Je(e=te,t=h()??process.cwd(),s=process.env.VERDACCIO_URL??process.env.NPM_REGISTRY_URL??Qn,n=!0){if(!n&&!ds(t))return{name:"Private npm registry",didPass:!0,isSkipped:!0,message:"Verdaccio is enabled in the project config but needs a Premium license, so Flisk will not start it - skipped"};if(!rr(t))return{name:"Private npm registry",didPass:!0,isSkipped:!0,message:"Private npm registry (Verdaccio) not enabled for this project - skipped"};let r=!1;try{let a=ee(e,"docker",["ps","--format","{{.Names}}"],"docker ps --format '{{.Names}}'",{stdio:"pipe",encoding:"utf-8",timeout:Q});r=/verdaccio/i.test(a)}catch{}let o=!1,i="";try{let a=process.platform==="win32"?is("curl.exe",["-fsS","-o","NUL","-w","%{http_code}","--max-time","2",s],{stdio:"pipe",encoding:"utf-8",timeout:ns+1e3,windowsHide:!0}).trim():e(`curl -fsS -o /dev/null -w '%{http_code}' --max-time 2 ${as(s)}`,{stdio:"pipe",encoding:"utf-8",timeout:ns+1e3}).trim();o=/^[23]\d\d$/.test(a),i=`HTTP ${a}`}catch(a){i=a instanceof Error?a.message.slice(0,120):"request failed"}return o?{name:"Private npm registry",didPass:!0,message:`Private npm registry reachable at ${s}${r?" (verdaccio container running)":""}`}:r?{name:"Private npm registry",didPass:!1,message:`Verdaccio container is running but ${s} is not responding (${i}). ImageBuilds that install @scoped packages will fail with ConnectionRefused downloading package manifest.`,fix:"Check `docker logs` for the verdaccio container, confirm port 4873 is published, then re-run `flisk doctor`."}:{name:"Private npm registry",didPass:!1,message:`Private npm registry (Verdaccio) is not reachable at ${s}. Docker ImageBuilds will fail with ConnectionRefused downloading package manifests for @flisk-sh/* and project-scoped packages.`,fix:"Start the registry with `bun run verdaccio:start` (or `docker compose -f docker-compose.verdaccio.yml up -d`), publish packages with `bun run publish:all` / `scripts/build/publish-to-verdaccio.sh`, then `tilt trigger` failed resources or re-run `flisk up`."}}function Ke(e=te,t=Z(),s=er){let n=Ue(t),r="";try{r=ee(e,"docker",["ps","--format","{{.Names}}\\t{{.Ports}}"],"docker ps --format '{{.Names}}\\t{{.Ports}}'",{stdio:"pipe",encoding:"utf-8",timeout:Q})}catch{return{name:"Ingress Ports",didPass:!0,isSkipped:!0,message:"Docker not available - skipped ingress port check"}}let o=tr(r,s),i=sr(o,n);if(i.length===0){let d=o.filter(c=>cs(c.name,n));return d.length>0?{name:"Ingress Ports",didPass:!0,message:`Ingress ports ${s.join("/")} held by this project's Traefik (${d.map(c=>c.name).join(", ")})`}:{name:"Ingress Ports",didPass:!0,message:`Ingress ports ${s.join("/")} are free for Traefik`}}return{name:"Ingress Ports",didPass:!1,message:`Traefik cannot bind ingress ports because another container already owns them:
4
4
  ${i.map(d=>{let c=d.publishedPorts.join(", ");return`${d.name} (host ports ${c})`}).join(`
5
5
  `)}`,fix:`Stop the foreign container(s), e.g. \`docker stop ${i[0]?.name}\`, or shut down the other Flisk/Tilt project using that Traefik. Then re-run \`flisk up\`.`}}function or(e){let{status:t}=e;return t===void 0?e.error??"no response":t===404?"HTTP 404: Traefik is answering but has no route for this URL (container not started yet, or not running)":t===502||t===503||t===504?`HTTP ${t}: Traefik found the route but the container isn't answering (still starting, or unhealthy)`:`HTTP ${t}`}function qe(e){let t=e.filter(o=>o.status!==void 0),s=e.filter(o=>!o.ok);if(t.length===0)return{name:"Service Health",didPass:!0,isSkipped:!0,message:`No services responded - skipped ping of ${S(e.length,"service")} (stack may be down, or Traefik never bound :80)`,fix:"If `flisk up` is already running, check Traefik/port 80 in the Tilt UI. Otherwise start with: flisk up"};if(s.length===0)return{name:"Service Health",didPass:!0,message:`All ${S(e.length,"service")} responding on /health`};let n=s.map(o=>`${o.name} (${or(o)})
@@ -3,7 +3,7 @@ import{c as xt,e as vt}from"./chunk-42IVF3YT.js";import{a as Ce}from"./chunk-6EA
3
3
  `:`
4
4
  `)+r,o=n+1,n=e.indexOf(`
5
5
  `,o)}while(n!==-1);return s+=e.slice(o),s}var At=(e=0)=>t=>`\x1B[${t+e}m`,Ie=(e=0)=>t=>`\x1B[${38+e};5;${t}m`,De=(e=0)=>(t,r,n)=>`\x1B[${38+e};2;${t};${r};${n}m`,Wr=e=>`\x1B[58;5;${e<90?e-30:e-90+8}m`,g={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],underlineDouble:["4:2",24],underlineCurly:["4:3",24],underlineDotted:["4:4",24],underlineDashed:["4:5",24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]},underlineColor:{underlineBlack:["58;5;0",59],underlineRed:["58;5;1",59],underlineGreen:["58;5;2",59],underlineYellow:["58;5;3",59],underlineBlue:["58;5;4",59],underlineMagenta:["58;5;5",59],underlineCyan:["58;5;6",59],underlineWhite:["58;5;7",59],underlineBlackBright:["58;5;8",59],underlineGray:["58;5;8",59],underlineGrey:["58;5;8",59],underlineRedBright:["58;5;9",59],underlineGreenBright:["58;5;10",59],underlineYellowBright:["58;5;11",59],underlineBlueBright:["58;5;12",59],underlineMagentaBright:["58;5;13",59],underlineCyanBright:["58;5;14",59],underlineWhiteBright:["58;5;15",59]}},Rt=Object.keys(g.modifier),Ne=Object.keys(g.color),Fe=Object.keys(g.bgColor),Hr=Object.keys(g.underlineColor),$t=[...Ne,...Fe];function Yr(){let e=new Map;for(let[t,r]of Object.entries(g)){for(let[n,o]of Object.entries(r))g[n]={open:`\x1B[${o[0]}m`,close:`\x1B[${o[1]}m`},r[n]=g[n],e.set(Number.parseInt(o[0],10),o[1]);Object.defineProperty(g,t,{value:r,enumerable:!1})}return Object.defineProperty(g,"codes",{value:e,enumerable:!1}),g.color.close="\x1B[39m",g.bgColor.close="\x1B[49m",g.underlineColor.close="\x1B[59m",g.color.ansi=At(),g.color.ansi256=Ie(),g.color.ansi16m=De(),g.bgColor.ansi=At(10),g.bgColor.ansi256=Ie(10),g.bgColor.ansi16m=De(10),g.underlineColor.ansi=Wr,g.underlineColor.ansi256=Ie(20),g.underlineColor.ansi16m=De(20),Object.defineProperties(g,{rgbToAnsi256:{value(t,r,n){return t===r&&r===n?t<8?16:t>248?231:Math.round((t-8)/247*24)+232:16+36*Math.round(t/255*5)+6*Math.round(r/255*5)+Math.round(n/255*5)},enumerable:!1},hexToRgb:{value(t){let r=/[\da-f]{6}|[\da-f]{3}/i.exec(t.toString(16));if(!r)return[0,0,0];let[n]=r;n.length===3&&(n=[...n].map(s=>s+s).join(""));let o=Number.parseInt(n,16);return[o>>16&255,o>>8&255,o&255]},enumerable:!1},hexToAnsi256:{value:t=>g.rgbToAnsi256(...g.hexToRgb(t)),enumerable:!1},ansi256ToAnsi:{value(t){if(t<8)return 30+t;if(t<16)return 90+(t-8);let r,n,o;if(t>=232)r=((t-232)*10+8)/255,n=r,o=r;else{t-=16;let a=t%36;r=Math.floor(t/36)/5,n=Math.floor(a/6)/5,o=a%6/5}let s=Math.max(r,n,o)*2;if(s===0)return 30;let i=30+(Math.round(o)<<2|Math.round(n)<<1|Math.round(r));return s===2&&(i+=60),i},enumerable:!1},rgbToAnsi:{value:(t,r,n)=>g.ansi256ToAnsi(g.rgbToAnsi256(t,r,n)),enumerable:!1},hexToAnsi:{value:t=>g.ansi256ToAnsi(g.hexToAnsi256(t)),enumerable:!1}}),g}var qr=Yr(),O=qr;import je from"node:process";import Jr from"node:os";import Ot from"node:tty";function _(e,t=globalThis.Deno?globalThis.Deno.args:je.argv){let r=e.startsWith("-")?"":e.length===1?"-":"--",n=t.indexOf(r+e),o=t.indexOf("--");return n!==-1&&(o===-1||n<o)}var{env:S}=je,de;_("no-color")||_("no-colors")||_("color=false")||_("color=never")?de=0:(_("color")||_("colors")||_("color=true")||_("color=always"))&&(de=1);function It(){return/^\d+$/.test(S.FORCE_COLOR)}function zr(){if("FORCE_COLOR"in S){if(S.FORCE_COLOR==="false")return 0;if(S.FORCE_COLOR==="true"||S.FORCE_COLOR.length===0)return 1;if(It())return Math.min(Number.parseInt(S.FORCE_COLOR,10),3)}}function Xr(e){return e===0?!1:{level:e,hasBasic:!0,has256:e>=2,has16m:e>=3}}function Qr(e,{streamIsTTY:t,sniffFlags:r=!0}={}){let n=zr();n!==void 0&&(de=n);let o=r?de:n;if(o===0)return 0;if(r){if(_("color=16m")||_("color=full")||_("color=truecolor"))return 3;if(_("color=256"))return 2}if(o!==void 0&&It())return o;if("TF_BUILD"in S&&"AGENT_NAME"in S)return 1;if(e&&!t&&o===void 0)return 0;let s=o||0;if(S.TERM==="dumb")return s;if(je.platform==="win32"){let i=Jr.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in S)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(i=>i in S)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(i=>i in S)||S.CI_NAME==="codeship"?1:s;if("TEAMCITY_VERSION"in S)return/^(?:9\.0*[1-9]\d*\.|\d{2,}\.)/.test(S.TEAMCITY_VERSION)?1:0;if(S.COLORTERM==="truecolor"||S.TERM==="xterm-kitty"||S.TERM==="xterm-ghostty"||S.TERM==="wezterm")return 3;if("TERM_PROGRAM"in S){let i=Number.parseInt((S.TERM_PROGRAM_VERSION||"").split(".",1)[0],10);switch(S.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(?:color)?$/i.test(S.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(S.TERM)||"COLORTERM"in S?1:s}function Ct(e,t={}){let r=Qr(e,{streamIsTTY:e&&e.isTTY,...t});return Xr(r)}var Zr={stdout:Ct({isTTY:Ot.isatty(1)}),stderr:Ct({isTTY:Ot.isatty(2)})},Dt=Zr;var{stdout:Nt,stderr:Ft}=Dt,te=Symbol("GENERATOR"),re=Symbol("STYLER"),me=Symbol("IS_EMPTY"),pe=Symbol("LEVEL"),ne=Object.create(null),jt=e=>{if(!Number.isSafeInteger(e)||e<0||e>3)throw new Error("The `level` should be an integer from 0 to 3")},en={enumerable:!0,get(){return this[pe]},set(e){jt(e),this[pe]=e}},tn=(e,t={})=>{t.level!==void 0&&jt(t.level);let r=Nt?Nt.level:0;e[pe]=t.level===void 0?r:t.level};var rn=e=>{let t=(...r)=>r.join(" ");return tn(t,e),Object.setPrototypeOf(t,oe.prototype),t};function oe(e){return rn(e)}Object.setPrototypeOf(oe.prototype,Function.prototype);for(let[e,t]of Object.entries(O))ne[e]={get(){let r=Le(this,Pt(t.open,t.close,this[re]),this[me]);return Object.defineProperty(this,e,{value:r}),r}};ne.visible={get(){let e=Le(this,this[re],!0);return Object.defineProperty(this,"visible",{value:e}),e}};var nn=(e,t)=>{let r=O[t];if(e==="rgb"){let o=(i,a,l)=>r.ansi(O.rgbToAnsi(i,a,l));return[o,o,(i,a,l)=>r.ansi256(O.rgbToAnsi256(i,a,l)),r.ansi16m]}if(e==="hex"){let o=i=>r.ansi(O.hexToAnsi(i));return[o,o,i=>r.ansi256(O.hexToAnsi256(i)),i=>r.ansi16m(...O.hexToRgb(i))]}let n=o=>r.ansi(O.ansi256ToAnsi(o));return[n,n,r.ansi256,r.ansi256]},on=["rgb","hex","ansi256"];for(let e of on){let t=e[0].toUpperCase()+e.slice(1);for(let[r,n]of[[e,"color"],["bg"+t,"bgColor"],["underline"+t,"underlineColor"]]){let{close:o}=O[n],s=nn(e,n);ne[r]={get(){let i=function(a,l,d){let m=s[this.level](a,l,d);return Le(this,Pt(m,o,this[re]),this[me])};return Object.defineProperty(this,r,{value:i}),i}}}}var sn=Object.defineProperties(()=>{},{...ne,level:{enumerable:!0,get(){return this[te].level},set(e){this[te].level=e}}}),Pt=(e,t,r)=>{let n,o;return r===void 0?(n=e,o=t):(n=r.openAll+e,o=t+r.closeAll),{open:e,close:t,openAll:n,closeAll:o,parent:r}},Le=(e,t,r)=>{let n=(...o)=>o.length===1?Pe(n,""+o[0]):o.length===2?Pe(n,`${o[0]??""} ${o[1]??""}`):Pe(n,o.join(" "));return Object.setPrototypeOf(n,sn),n[te]=e[te]??e,n[re]=t,n[me]=r,n},Pe=(e,t)=>{if(e[te][pe]<=0||!t)return e[me]?"":t;let r=e[re];if(r===void 0)return t;let{openAll:n,closeAll:o}=r;if(t.includes("\x1B"))for(;r!==void 0;)t=wt(t,r.close,r.open),r=r.parent;let s=t.indexOf(`
6
- `);return s!==-1&&(t=_t(t,o,n,s)),n+t+o};Object.defineProperties(oe.prototype,{...ne,level:en});var an=oe(),Ks=oe({level:Ft?Ft.level:0});var p=an;var Ys="Container Runtime",W="bring-your-own";var j="database-management",C=".tiltignore",Lt="service.json",se="docker-compose.yml",ie=".autogenerated",he="TILT_TECH_STACK.star",ge="TILT_RESOURCE_DEFAULTS.star",H="project.json",B="package.json",qs=[he,ge,"spec.master"],Js=["backend","frontend","library","sdk","worker","migrator","mcp","agent",W],zs={backend:["dev","build","start"],worker:["dev","build","start"],migrator:["dev","build","start"],mcp:["dev","build","start"],agent:["dev","build","start"],frontend:["dev","build"],library:["dev","build"],sdk:["dev","build"],[W]:[]};var Me=["monitoring","elk","debezium","golden_image","verdaccio"],E={frontend:{base:3e3,min:3e3,max:3999,range:"3000-3999"},backend:{base:4e3,min:4e3,max:4999,range:"4000-4999"},mcp:{base:4e3,min:4e3,max:5999,range:"4000-5999"},agent:{base:4e3,min:4e3,max:5999,range:"4000-5999"},[W]:{base:4e3,min:4e3,max:5999,range:"4000-5999"},worker:{base:6e3,min:6e3,max:6999,range:"6000-6999"},health:{base:5e3,min:5e3,max:5999,range:"5000-5999"},migrator:{base:7e3,min:7e3,max:7999,range:"7000-7999"}},Ue={tiltUi:10350,traefik:8080},Be="https://flisk.sh/docs/quickstart/";var Mt=["node_modules",".git",".tilt",".tilt-engine","dist","build",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests",".github",".vscode","docs"],Ut=["Dockerfile",se,"docker-compose.yaml","Tiltfile","vite.config.ts","tsconfig.json","tsconfig.build.json"],cn={infra:"\u{1F3D7}\uFE0F",core:"\u{1F527}",api:"\u26A1",app:"\u{1F3A8}",orchestrator:"\u2699\uFE0F"};function Xs(e){let t=e.toLowerCase();for(let[r,n]of Object.entries(cn))if(t.includes(r))return n;return"\u{1F4E6}"}import{existsSync as un}from"node:fs";import{dirname as fn,join as dn,resolve as Gt}from"node:path";import{cwd as pn}from"node:process";var Bt={name:"tdk-cli-internal",private:!0,version:"1.3.191",description:"Flisk CLI \u2014 start services on your machine.",keywords:["flisk","tilt","cli","local-dev","microservices"],homepage:"https://github.com/flisk-sh/flisk#readme",bugs:{url:"https://github.com/flisk-sh/flisk/issues"},repository:{type:"git",url:"git+https://github.com/flisk-sh/flisk.git",directory:"cli"},license:"MIT",author:"Flisk Team",type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",bin:{flisk:"bin/tdk.js"},files:["dist","dist-bundle","bin","templates","README.md","Tiltfile","engine","discovery","specs","ext","!ext/ide-components/code_executor","shared-platform-engineering/docker-templates"],scripts:{build:"tsc && node scripts/bundle.mjs","build:watch":"tsc --watch","check:dist":"npm run build && ../scripts/check-cli-dist.sh",lint:"biome check .","lint:fix":"biome check . --write",typecheck:"tsc --project tsconfig.typecheck.json",clean:"rm -rf dist",dev:"bun run build:watch",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage --coverage.reportOnFailure --coverage.reporter=text --coverage.reporter=html --coverage.reporter=json-summary --coverage.reporter=json --coverage.reportsDirectory=coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",prepack:"../scripts/stage-npm-engine.sh && npm run build"},dependencies:{commander:"^15.0.0",handlebars:"^4.7.8"},devDependencies:{"@biomejs/biome":"^2.5.13","@types/node":"^22.0.0","@types/react":"^19.3.0","@vitest/coverage-v8":"^5.0.2",ajv:"^8.17.1",chalk:"^6.0.1",esbuild:"^0.28.2",ink:"^8.0.0",knip:"^6.38.0",react:"^19.3.0","react-devtools-core":"^8.0.0",typescript:"^7.0.2",vite:"^8.3.3",vitest:"^5.0.0"},engines:{node:">=22.12.0"}};function D(e=pn()){let t=Gt(e),r=Gt("/");for(;t!==r;){if(un(dn(t,".tdk",H)))return t;let n=fn(t);if(n===t)break;t=n}return null}var Se=null;function mn(){if(Se)return Se;let e=Bt;if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid package.json: expected object");let t=e;return Se={name:String(t.name??"@flisk-sh/flisk"),version:String(t.version??"0.0.0"),fullPackage:t},Se}function si(){return mn().version}import{existsSync as Vt}from"node:fs";import{delimiter as Kt,extname as Wt,join as Ht}from"node:path";import{delimiter as ci,extname as hn}from"node:path";function ae(){return process.platform==="win32"}function gn(e){return e==="linux"?"linux":e==="darwin"?"darwin":e==="win32"?"windows":null}function Sn(e){return e==="x64"?"amd64":e==="arm64"?"arm64":null}function yn(e,t){let r=gn(e),n=Sn(t);if(!r||!n||r==="windows"&&n!=="amd64")return null;let o=`tdk-${r}-${n}`;return r==="windows"?`${o}.exe`:o}function li(){return yn(process.platform,process.arch)}function ui(){return ae()?"tdk.exe":"flisk"}function Ge(e,t=ae()){return t?hn(e)?[e]:[e,`${e}.exe`,`${e}.cmd`,`${e}.bat`]:[e]}function ye(e){let t=process.env.PATH??process.env.Path??"",r=ae(),n=Ge(e,r);if(r&&!Wt(e))for(let o of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let s=o.toLowerCase();s&&!n.includes(`${e}${s}`)&&n.push(`${e}${s}`)}for(let o of t.split(Kt))if(o)for(let s of n){let i=Ht(o,s);if(Vt(i))return i}return null}function hi(e){let t=process.env.PATH??process.env.Path??"",r=ae(),n=Ge(e,r);if(r&&!Wt(e))for(let i of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let a=i.toLowerCase();a&&!n.includes(`${e}${a}`)&&n.push(`${e}${a}`)}let o=[],s=new Set;for(let i of t.split(Kt))if(i)for(let a of n){let l=Ht(i,a);if(!Vt(l))continue;let d=r?l.toLowerCase():l;s.has(d)||(s.add(d),o.push(l))}return o}import{execFileSync as En,execSync as kn}from"node:child_process";var Yt=1e4;function qt(){let e=!1;if(process.platform==="win32")try{return En(ye("docker")??"docker",["ps"],{stdio:"ignore",timeout:Yt,windowsHide:!0}),"running"}catch(t){return t.code==="ETIMEDOUT"?"unresponsive":"missing"}for(let t of["docker ps","colima status","podman ps"])try{return kn(t,{stdio:"ignore",timeout:Yt}),"running"}catch(r){r.code==="ETIMEDOUT"&&(e=!0)}return e?"unresponsive":"missing"}function Ee(e,t){return e[t]??0}function Tn(e,t){let r=Array.from({length:t.length+1},(n,o)=>o);for(let n=1;n<=e.length;n++){let o=[n];for(let s=1;s<=t.length;s++){let i=e[n-1]===t[s-1]?0:1;o[s]=Math.min(Ee(o,s-1)+1,Ee(r,s)+1,Ee(r,s-1)+i)}r=o}return Ee(r,t.length)}function bn(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length-1;r++)if(e[r]!==t[r]&&e[r]===t[r+1]&&e[r+1]===t[r]&&e.slice(0,r)===t.slice(0,r)&&e.slice(r+2)===t.slice(r+2))return!0;return!1}function Jt(e,t){if(e.length<2||t.length===0||t.includes(e))return;let r=e.toLowerCase(),n,o=Number.POSITIVE_INFINITY;for(let s of t){if(s.length===0)continue;let i=s.toLowerCase(),a=bn(r,i)?1:Tn(r,i),l=Math.max(1,Math.min(2,Math.floor(Math.max(r.length,i.length)/3)));a>l||(a<o||a===o&&(n===void 0||s<n))&&(n=s,o=a)}return n}import{spawn as xn}from"node:child_process";import{join as vn}from"node:path";function wn(e,t=[],r={}){return new Promise((n,o)=>{let s=[e,...t];r.verbose&&console.log(`Executing: tilt ${s.join(" ")}`);let i=xn(ye("tilt")??"tilt",s,{stdio:r.inheritStdio?"inherit":"pipe",shell:!1,windowsHide:process.platform==="win32",timeout:r.timeoutMs}),a="",l="";r.inheritStdio||(i.stdout?.on("data",d=>{a+=d.toString()}),i.stderr?.on("data",d=>{l+=d.toString()})),i.on("close",d=>{n({exitCode:d??1,stdout:a,stderr:l})}),i.on("error",d=>{o(new Error(`Failed to spawn tilt: ${d.message}`))})})}async function zt(){try{return(await wn("version",[],{inheritStdio:!1,timeoutMs:1e4})).exitCode===0}catch{return!1}}function _n(){let e=D();if(!e)throw N.notInProject();return vn(e,".tdk",".tdk-out","Tiltfile")}function Xt(e){let t=_n();e.push("-f",t)}function _i(e,t={}){let r=[];return Xt(r),t.focusTargets&&t.focusTargets.length>0&&r.push("--",`--focus=${t.focusTargets.join(",")}`),r.push(...e),t.verbose&&!t.quiet&&r.push("--verbose"),t.watch&&r.push("--watch"),r}function Ai(e={}){let t=[];return Xt(t),e.focusTargets&&e.focusTargets.length>0&&t.push("--",`--focus=${e.focusTargets.join(",")}`),t}function Qt(e){return e instanceof Error?e.message:String(e)}function Fi(e,t){if(process.env.TDK_VERBOSE){let r=t!==void 0?`: ${Qt(t)}`:"";console.warn(p.gray(`${e}${r}`))}}var A=class extends Error{suggestions;exitCode;constructor(t,r=[],n=1){super(t),this.name="TdkError",this.suggestions=r,this.exitCode=n}display(){We(this.message,void 0,this.suggestions)}exit(){this.display(),process.exit(this.exitCode)}},Ke=class extends Error{code;constructor(t=1){super(`process.exit(${t})`),this.name="ProcessExitError",this.code=t}};function Ve(e,t,r=!1){let n=new Set;for(let o of e){let s=Jt(o,t);s&&n.add(r?`Did you mean "${s}" for "${o}"?`:`Did you mean "${s}"?`)}return[...n]}var N={tiltNotInstalled:()=>new A("Tilt CLI is not installed",["Install Tilt: `brew install tilt` (macOS)","Or download from: https://docs.tilt.dev/install.html","Verify with: `tilt version`",`Setup guide: ${Be}`]),dockerNotAvailable:()=>new A("Docker (or a compatible container runtime) is not running",["Start Docker Desktop, then verify with: `docker ps`","Or start Colima: `colima start`","Or start the Docker service on Linux: `sudo systemctl start docker`",`Setup guide: ${Be}`]),dockerNotResponding:()=>new A("Docker is running but not responding (`docker ps` hung for 10s)",["Quit and reopen Docker Desktop, or run `colima restart`","Then verify with: `docker ps`"]),stackNotFound:(e,t=[])=>new A(`Stack "${e}" not found`,[...Ve([e],t),"Run `flisk stacks` to see available stacks","Run `flisk stack` to assign resources to a stack"]),resourceNotFound:(e,t=[])=>new A(`Resource "${e}" not found`,[...Ve([e],t),"Run `flisk resources` to list all resources","Check the resource name spelling"]),unknownServices:(e,t)=>{let r=Ve(e,t,e.length>1);return new A(`Unknown service ${e.join(", ")}. Valid names: ${t.join(", ")}`,r,2)},directoryExists:e=>new A(`Directory already exists: ${e}`,["Use `--path` to specify a different location","Remove the existing directory if no longer needed"]),invalidPath:e=>new A(`Invalid path: ${e}`,["Path must be within the project directory",'Path cannot contain special characters like <>:"|?*']),notInProject:()=>new A("Could not find project root (no .tdk/project.json found)",["Run this from within a Flisk project","Run `flisk project --yes` to initialize a new project"])};function ji(){let e=D();return e||N.notInProject().exit()}function An(e){e instanceof A&&e.exit(),We(Qt(e)),process.exit(1)}async function Rn(e,t){try{return await e()}catch(r){if(r instanceof Ke)throw r;return t?.verbose&&r instanceof Error&&r.stack&&console.error(p.gray(r.stack)),An(r)}}async function Pi(e,t){let r=[],n=qt();return n==="unresponsive"?r.push(N.dockerNotResponding()):n==="missing"&&r.push(N.dockerNotAvailable()),await zt()||r.push(N.tiltNotInstalled()),r.length>0&&(console.error(p.red(`
6
+ `);return s!==-1&&(t=_t(t,o,n,s)),n+t+o};Object.defineProperties(oe.prototype,{...ne,level:en});var an=oe(),Ks=oe({level:Ft?Ft.level:0});var p=an;var Ys="Container Runtime",W="bring-your-own";var j="database-management",C=".tiltignore",Lt="service.json",se="docker-compose.yml",ie=".autogenerated",he="TILT_TECH_STACK.star",ge="TILT_RESOURCE_DEFAULTS.star",H="project.json",B="package.json",qs=[he,ge,"spec.master"],Js=["backend","frontend","library","sdk","worker","migrator","mcp","agent",W],zs={backend:["dev","build","start"],worker:["dev","build","start"],migrator:["dev","build","start"],mcp:["dev","build","start"],agent:["dev","build","start"],frontend:["dev","build"],library:["dev","build"],sdk:["dev","build"],[W]:[]};var Me=["monitoring","elk","debezium","golden_image","verdaccio"],E={frontend:{base:3e3,min:3e3,max:3999,range:"3000-3999"},backend:{base:4e3,min:4e3,max:4999,range:"4000-4999"},mcp:{base:4e3,min:4e3,max:5999,range:"4000-5999"},agent:{base:4e3,min:4e3,max:5999,range:"4000-5999"},[W]:{base:4e3,min:4e3,max:5999,range:"4000-5999"},worker:{base:6e3,min:6e3,max:6999,range:"6000-6999"},health:{base:5e3,min:5e3,max:5999,range:"5000-5999"},migrator:{base:7e3,min:7e3,max:7999,range:"7000-7999"}},Ue={tiltUi:10350,traefik:8080},Be="https://flisk.sh/docs/quickstart/";var Mt=["node_modules",".git",".tilt",".tilt-engine","dist","build",".prisma",".turbo","coverage","tmp","temp","__tests__","test","tests",".github",".vscode","docs"],Ut=["Dockerfile",se,"docker-compose.yaml","Tiltfile","vite.config.ts","tsconfig.json","tsconfig.build.json"],cn={infra:"\u{1F3D7}\uFE0F",core:"\u{1F527}",api:"\u26A1",app:"\u{1F3A8}",orchestrator:"\u2699\uFE0F"};function Xs(e){let t=e.toLowerCase();for(let[r,n]of Object.entries(cn))if(t.includes(r))return n;return"\u{1F4E6}"}import{existsSync as un}from"node:fs";import{dirname as fn,join as dn,resolve as Gt}from"node:path";import{cwd as pn}from"node:process";var Bt={name:"tdk-cli-internal",private:!0,version:"1.3.192",description:"Flisk CLI \u2014 start services on your machine.",keywords:["flisk","tilt","cli","local-dev","microservices"],homepage:"https://github.com/flisk-sh/flisk#readme",bugs:{url:"https://github.com/flisk-sh/flisk/issues"},repository:{type:"git",url:"git+https://github.com/flisk-sh/flisk.git",directory:"cli"},license:"MIT",author:"Flisk Team",type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",bin:{flisk:"bin/tdk.js"},files:["dist","dist-bundle","bin","templates","README.md","Tiltfile","engine","discovery","specs","ext","!ext/ide-components/code_executor","shared-platform-engineering/docker-templates"],scripts:{build:"tsc && node scripts/bundle.mjs","build:watch":"tsc --watch","check:dist":"npm run build && ../scripts/check-cli-dist.sh",lint:"biome check .","lint:fix":"biome check . --write",typecheck:"tsc --project tsconfig.typecheck.json",clean:"rm -rf dist",dev:"bun run build:watch",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage --coverage.reportOnFailure --coverage.reporter=text --coverage.reporter=html --coverage.reporter=json-summary --coverage.reporter=json --coverage.reportsDirectory=coverage --reporter=default --reporter=json --outputFile.json=test-results/vitest.json",prepack:"../scripts/stage-npm-engine.sh && npm run build"},dependencies:{commander:"^15.0.0",handlebars:"^4.7.8"},devDependencies:{"@biomejs/biome":"^2.5.13","@types/node":"^22.0.0","@types/react":"^19.3.0","@vitest/coverage-v8":"^5.0.2",ajv:"^8.17.1",chalk:"^6.0.1",esbuild:"^0.28.2",ink:"^8.0.0",knip:"^6.38.0",react:"^19.3.0","react-devtools-core":"^8.0.0",typescript:"^7.0.2",vite:"^8.3.3",vitest:"^5.0.0"},engines:{node:">=22.12.0"}};function D(e=pn()){let t=Gt(e),r=Gt("/");for(;t!==r;){if(un(dn(t,".tdk",H)))return t;let n=fn(t);if(n===t)break;t=n}return null}var Se=null;function mn(){if(Se)return Se;let e=Bt;if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid package.json: expected object");let t=e;return Se={name:String(t.name??"@flisk-sh/flisk"),version:String(t.version??"0.0.0"),fullPackage:t},Se}function si(){return mn().version}import{existsSync as Vt}from"node:fs";import{delimiter as Kt,extname as Wt,join as Ht}from"node:path";import{delimiter as ci,extname as hn}from"node:path";function ae(){return process.platform==="win32"}function gn(e){return e==="linux"?"linux":e==="darwin"?"darwin":e==="win32"?"windows":null}function Sn(e){return e==="x64"?"amd64":e==="arm64"?"arm64":null}function yn(e,t){let r=gn(e),n=Sn(t);if(!r||!n||r==="windows"&&n!=="amd64")return null;let o=`tdk-${r}-${n}`;return r==="windows"?`${o}.exe`:o}function li(){return yn(process.platform,process.arch)}function ui(){return ae()?"tdk.exe":"flisk"}function Ge(e,t=ae()){return t?hn(e)?[e]:[e,`${e}.exe`,`${e}.cmd`,`${e}.bat`]:[e]}function ye(e){let t=process.env.PATH??process.env.Path??"",r=ae(),n=Ge(e,r);if(r&&!Wt(e))for(let o of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let s=o.toLowerCase();s&&!n.includes(`${e}${s}`)&&n.push(`${e}${s}`)}for(let o of t.split(Kt))if(o)for(let s of n){let i=Ht(o,s);if(Vt(i))return i}return null}function hi(e){let t=process.env.PATH??process.env.Path??"",r=ae(),n=Ge(e,r);if(r&&!Wt(e))for(let i of(process.env.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";")){let a=i.toLowerCase();a&&!n.includes(`${e}${a}`)&&n.push(`${e}${a}`)}let o=[],s=new Set;for(let i of t.split(Kt))if(i)for(let a of n){let l=Ht(i,a);if(!Vt(l))continue;let d=r?l.toLowerCase():l;s.has(d)||(s.add(d),o.push(l))}return o}import{execFileSync as En,execSync as kn}from"node:child_process";var Yt=1e4;function qt(){let e=!1;if(process.platform==="win32")try{return En(ye("docker")??"docker",["ps"],{stdio:"ignore",timeout:Yt,windowsHide:!0}),"running"}catch(t){return t.code==="ETIMEDOUT"?"unresponsive":"missing"}for(let t of["docker ps","colima status","podman ps"])try{return kn(t,{stdio:"ignore",timeout:Yt}),"running"}catch(r){r.code==="ETIMEDOUT"&&(e=!0)}return e?"unresponsive":"missing"}function Ee(e,t){return e[t]??0}function Tn(e,t){let r=Array.from({length:t.length+1},(n,o)=>o);for(let n=1;n<=e.length;n++){let o=[n];for(let s=1;s<=t.length;s++){let i=e[n-1]===t[s-1]?0:1;o[s]=Math.min(Ee(o,s-1)+1,Ee(r,s)+1,Ee(r,s-1)+i)}r=o}return Ee(r,t.length)}function bn(e,t){if(e.length!==t.length)return!1;for(let r=0;r<e.length-1;r++)if(e[r]!==t[r]&&e[r]===t[r+1]&&e[r+1]===t[r]&&e.slice(0,r)===t.slice(0,r)&&e.slice(r+2)===t.slice(r+2))return!0;return!1}function Jt(e,t){if(e.length<2||t.length===0||t.includes(e))return;let r=e.toLowerCase(),n,o=Number.POSITIVE_INFINITY;for(let s of t){if(s.length===0)continue;let i=s.toLowerCase(),a=bn(r,i)?1:Tn(r,i),l=Math.max(1,Math.min(2,Math.floor(Math.max(r.length,i.length)/3)));a>l||(a<o||a===o&&(n===void 0||s<n))&&(n=s,o=a)}return n}import{spawn as xn}from"node:child_process";import{join as vn}from"node:path";function wn(e,t=[],r={}){return new Promise((n,o)=>{let s=[e,...t];r.verbose&&console.log(`Executing: tilt ${s.join(" ")}`);let i=xn(ye("tilt")??"tilt",s,{stdio:r.inheritStdio?"inherit":"pipe",shell:!1,windowsHide:process.platform==="win32",timeout:r.timeoutMs}),a="",l="";r.inheritStdio||(i.stdout?.on("data",d=>{a+=d.toString()}),i.stderr?.on("data",d=>{l+=d.toString()})),i.on("close",d=>{n({exitCode:d??1,stdout:a,stderr:l})}),i.on("error",d=>{o(new Error(`Failed to spawn tilt: ${d.message}`))})})}async function zt(){try{return(await wn("version",[],{inheritStdio:!1,timeoutMs:1e4})).exitCode===0}catch{return!1}}function _n(){let e=D();if(!e)throw N.notInProject();return vn(e,".tdk",".tdk-out","Tiltfile")}function Xt(e){let t=_n();e.push("-f",t)}function _i(e,t={}){let r=[];return Xt(r),t.focusTargets&&t.focusTargets.length>0&&r.push("--",`--focus=${t.focusTargets.join(",")}`),r.push(...e),t.verbose&&!t.quiet&&r.push("--verbose"),t.watch&&r.push("--watch"),r}function Ai(e={}){let t=[];return Xt(t),e.focusTargets&&e.focusTargets.length>0&&t.push("--",`--focus=${e.focusTargets.join(",")}`),t}function Qt(e){return e instanceof Error?e.message:String(e)}function Fi(e,t){if(process.env.TDK_VERBOSE){let r=t!==void 0?`: ${Qt(t)}`:"";console.warn(p.gray(`${e}${r}`))}}var A=class extends Error{suggestions;exitCode;constructor(t,r=[],n=1){super(t),this.name="TdkError",this.suggestions=r,this.exitCode=n}display(){We(this.message,void 0,this.suggestions)}exit(){this.display(),process.exit(this.exitCode)}},Ke=class extends Error{code;constructor(t=1){super(`process.exit(${t})`),this.name="ProcessExitError",this.code=t}};function Ve(e,t,r=!1){let n=new Set;for(let o of e){let s=Jt(o,t);s&&n.add(r?`Did you mean "${s}" for "${o}"?`:`Did you mean "${s}"?`)}return[...n]}var N={tiltNotInstalled:()=>new A("Tilt CLI is not installed",["Install Tilt: `brew install tilt` (macOS)","Or download from: https://docs.tilt.dev/install.html","Verify with: `tilt version`",`Setup guide: ${Be}`]),dockerNotAvailable:()=>new A("Docker (or a compatible container runtime) is not running",["Start Docker Desktop, then verify with: `docker ps`","Or start Colima: `colima start`","Or start the Docker service on Linux: `sudo systemctl start docker`",`Setup guide: ${Be}`]),dockerNotResponding:()=>new A("Docker is running but not responding (`docker ps` hung for 10s)",["Quit and reopen Docker Desktop, or run `colima restart`","Then verify with: `docker ps`"]),stackNotFound:(e,t=[])=>new A(`Stack "${e}" not found`,[...Ve([e],t),"Run `flisk stacks` to see available stacks","Run `flisk stack` to assign resources to a stack"]),resourceNotFound:(e,t=[])=>new A(`Resource "${e}" not found`,[...Ve([e],t),"Run `flisk resources` to list all resources","Check the resource name spelling"]),unknownServices:(e,t)=>{let r=Ve(e,t,e.length>1);return new A(`Unknown service ${e.join(", ")}. Valid names: ${t.join(", ")}`,r,2)},directoryExists:e=>new A(`Directory already exists: ${e}`,["Use `--path` to specify a different location","Remove the existing directory if no longer needed"]),invalidPath:e=>new A(`Invalid path: ${e}`,["Path must be within the project directory",'Path cannot contain special characters like <>:"|?*']),notInProject:()=>new A("Could not find project root (no .tdk/project.json found)",["Run this from within a Flisk project","Run `flisk project --yes` to initialize a new project"])};function ji(){let e=D();return e||N.notInProject().exit()}function An(e){e instanceof A&&e.exit(),We(Qt(e)),process.exit(1)}async function Rn(e,t){try{return await e()}catch(r){if(r instanceof Ke)throw r;return t?.verbose&&r instanceof Error&&r.stack&&console.error(p.gray(r.stack)),An(r)}}async function Pi(e,t){let r=[],n=qt();return n==="unresponsive"?r.push(N.dockerNotResponding()):n==="missing"&&r.push(N.dockerNotAvailable()),await zt()||r.push(N.tiltNotInstalled()),r.length>0&&(console.error(p.red(`
7
7
  Flisk can't start - missing prerequisites:
8
8
  `)),r.forEach((o,s)=>{s>0&&console.error(""),o.display()}),console.error(p.gray("\nRun `flisk doctor` for a full environment check.")),process.exit(1)),Rn(e,t)}function Li(e,t=1,r){We(e,void 0,r),process.exit(t)}function We(e,t,r){if(console.error(p.red(`\u274C ${e}`)),t&&console.error(p.gray(` ${t}`)),r&&r.length>0){console.error(p.yellow(`
9
9
  \u{1F4A1} Suggestions:`));for(let n of r)console.error(p.cyan(` \u2192 ${n}`))}}function Mi(e,t){console.error(p.red(`