@flisk-sh/flisk 1.3.198 → 1.3.200

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 (33) hide show
  1. package/cli/dist/cli.js +63 -15
  2. package/cli/dist/commands/open.js +8 -0
  3. package/cli/dist/utils/one-command.js +80 -0
  4. package/cli/dist/utils/project-templates.js +14 -0
  5. package/cli/dist/utils/stack-progress.js +64 -0
  6. package/cli/dist-bundle/{chunk-KBGQ4NJE.js → chunk-DS47LHYF.js} +1 -1
  7. package/cli/dist-bundle/chunk-EICMGZXL.js +5 -0
  8. package/cli/dist-bundle/chunk-GEXOZCEQ.js +2 -0
  9. package/cli/dist-bundle/chunk-H446NBVS.js +71 -0
  10. package/cli/dist-bundle/chunk-IYZENTVI.js +34 -0
  11. package/cli/dist-bundle/{chunk-US4D5GJJ.js → chunk-LMHKXU2Q.js} +1 -1
  12. package/cli/dist-bundle/chunk-RMZQU74X.js +366 -0
  13. package/cli/dist-bundle/chunk-RWNIFXXG.js +4 -0
  14. package/cli/dist-bundle/chunk-WUO7C6WO.js +2 -0
  15. package/cli/dist-bundle/cli.js +266 -266
  16. package/cli/dist-bundle/cold-preflight-LPH7WF3B.js +2 -0
  17. package/cli/dist-bundle/one-command-YP6L6MMM.js +5 -0
  18. package/cli/dist-bundle/open-PF6BGKCR.js +2 -0
  19. package/cli/dist-bundle/project-2TVWT57J.js +2 -0
  20. package/cli/dist-bundle/stack-progress-UVREHNNB.js +2 -0
  21. package/cli/dist-bundle/tilt-port-owner-7O5FOW5C.js +2 -0
  22. package/cli/package.json +1 -1
  23. package/package.json +1 -1
  24. package/cli/dist-bundle/chunk-DWHA5YKT.js +0 -435
  25. package/cli/dist-bundle/chunk-KGKKDD4K.js +0 -2
  26. package/cli/dist-bundle/chunk-SB5WAMSU.js +0 -5
  27. package/cli/dist-bundle/chunk-WPQOTHB5.js +0 -4
  28. package/cli/dist-bundle/chunk-YUARXGF4.js +0 -34
  29. package/cli/dist-bundle/cold-preflight-5TVSNLIV.js +0 -2
  30. package/cli/dist-bundle/one-command-TKXMWXCK.js +0 -4
  31. package/cli/dist-bundle/open-5SUD6LKB.js +0 -2
  32. package/cli/dist-bundle/project-5GTJYFAE.js +0 -2
  33. package/cli/dist-bundle/project-templates-BHURA3LT.js +0 -2
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- var t={demo:{repo:"https://github.com/flisk-sh/tdk-restaurant-example.git",description:"The demo stack: restaurant ops with reservations, kitchen and floor control"},restaurant:{repo:"https://github.com/flisk-sh/tdk-restaurant-example.git",description:"Restaurant ops: reservations, kitchen, floor control (Hono + Vite + Bun)"},saas:{repo:"https://github.com/flisk-sh/tdk-saas-starter.git",description:"SaaS starter: account dashboard and a working checkout button (Hono + Vite + Bun)"},erp:{repo:"https://github.com/flisk-sh/tdk-erp-system.git",description:"Enterprise ERP: 100 microservices across 7 business domains"},"user-management":{repo:"https://github.com/flisk-sh/tdk-user-management.git",description:"User/auth management services"},ecommerce:{repo:"https://github.com/flisk-sh/tdk-ecommerce-example.git",description:"Vue 3 storefront and Hono catalog API (needs Flisk 1.3.75+ for --framework vue)"},example:{repo:"https://github.com/flisk-sh/tdk-example.git",bundledPath:"examples/tdk-example",description:"Hono + Postgres + NATS worker + Vite example with a routed write path"},"agent-stack":{repo:"https://github.com/flisk-sh/tdk-agent-stack.git",description:"AI agent stack: Bun agent + MCP tool server + Postgres + NATS"}};export{t as a};
@@ -1,5 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{Ta as w,cb as A,d as P,k as T}from"./chunk-US4D5GJJ.js";import{execFileSync as x}from"node:child_process";import{existsSync as G,mkdirSync as W,readFileSync as D,realpathSync as Y,writeFileSync as q}from"node:fs";import{join as S,resolve as V,sep as X}from"node:path";import{createServer as U}from"node:net";import{connect as K}from"node:net";function N(e,s=500){return new Promise(t=>{let r=K({port:e,host:"127.0.0.1"}),o=n=>{r.destroy(),t(n)};r.setTimeout(s,()=>o(!1)),r.once("connect",()=>o(!0)),r.once("error",()=>o(!1))})}var J={ingressHttp:{start:8080,end:8180},ingressHttps:{start:8443,end:8543},postgres:{start:15432,end:15532}},E={ingressHttp:"TDK_HTTP_PORT",ingressHttps:"TDK_HTTPS_PORT",postgres:"TDK_POSTGRES_PORT"},H={ingressHttp:80,ingressHttps:443,postgres:5432},k={ingressHttp:H.ingressHttp,ingressHttps:H.ingressHttps};function j(e,s){return e==="EACCES"&&s==="darwin"}async function b(e){return await N(e)?!1:new Promise(s=>{let t=U();t.once("error",r=>{s(j(r.code,process.platform))}),t.listen(e,"127.0.0.1",()=>t.close(()=>s(!0)))})}function B(e,s){let t=Number(s);if(!Number.isInteger(t)||t<1||t>65535)throw new Error(`${e} must be an integer between 1 and 65535 (received ${JSON.stringify(s)})`);return t}async function O(e={}){let s=e.env??process.env,t=e.isAvailable??b,r={ingressHttp:!1,ingressHttps:!1,postgres:!1},o={ingressHttp:"",ingressHttps:"",postgres:""},n={explicit:r},c=new Set;for(let a of["ingressHttp","ingressHttps","postgres"]){let f=s[E[a]],i=f!==void 0&&f.trim()!=="",u=e.ranges?.[a]??J[a],p=k[a],h=i?[B(E[a],f)]:[...p===void 0?[]:[p],...Array.from({length:u.end-u.start+1},(g,_)=>u.start+_)],d;for(let g of h)if(!c.has(g)){if(await t(g)){d=g;break}if(i)throw new Error(`${E[a]}=${g} is already in use. Choose a free host port and retry.`)}if(d===void 0)throw new Error(`No available host port in ${u.start}-${u.end} for ${a}. Set ${E[a]} to a free port and retry.`);c.add(d),n[a]=d,r[a]=i,o[a]=i?"explicit override":d===p?"requested port is free":`selected from fallback range ${u.start}-${u.end}`}return{...n,requested:{...H},reason:o}}function ue(e){return`Host ports: HTTP ${e.ingressHttp}, HTTPS ${e.ingressHttps}, Postgres ${e.postgres}`}var R=S(".tdk",".tdk-out","host-ports.json");function Q(e,s,t){return e.split(`
3
- `).some(r=>{let[o="",n=""]=r.split("|"),c=o.toLowerCase(),a=s.toLowerCase();return(c.startsWith(`${a}_`)||c.startsWith(`${a}-`))&&n.includes(`:${t}->`)})}function F(e){let s=S(e,R);if(!G(s))return null;try{let t=JSON.parse(D(s,"utf-8"));if(!t||typeof t!="object")return null;let r=t;return!Number.isInteger(r.ingressHttp)||!Number.isInteger(r.ingressHttps)||!Number.isInteger(r.postgres)||!r.requested||!r.explicit||!r.reason?null:r}catch{return null}}function Se(e,s){let t=S(e,R);W(S(e,".tdk",".tdk-out"),{recursive:!0}),q(t,`${JSON.stringify(s,null,2)}
4
- `,{encoding:"utf-8",mode:384})}function _e(e){process.env.TDK_HTTP_PORT=String(e.ingressHttp),process.env.TDK_HTTPS_PORT=String(e.ingressHttps),process.env.TDK_POSTGRES_PORT=String(e.postgres)}var z="com.docker.compose.project.working_dir";function Z(e,s,t){let r=new Set([V(s)]);try{r.add(Y(s))}catch{}return e.split(`
5
- `).some(o=>{let[,n="",c=""]=o.split("|");return!c||!n.includes(`:${t}->`)?!1:[...r].some(a=>c===a||c.startsWith(`${a}${X}`))})}function Te(e,s,t=()=>x("docker",["ps","--format",`{{.Names}}|{{.Ports}}|{{.Label "${z}"}}`],{encoding:"utf-8",timeout:5e3})){let r=F(e);if(!r||r.ingressHttp===s)return s;try{if(Z(t(),e,r.ingressHttp))return r.ingressHttp}catch{}return s}async function Ee(e,s={}){let t=F(e),r=["TDK_HTTP_PORT","TDK_HTTPS_PORT","TDK_POSTGRES_PORT"].some(i=>process.env[i]);if(s.inspectDocker===!1&&t&&!r)return t;let o="";try{let i=JSON.parse(D(S(e,".tdk",T),"utf-8"));o=String(i?.project?.name??"tdk-project").replace(/-/g,"_").toLowerCase()}catch{o="tdk_project"}let n="";if(s.inspectDocker!==!1)try{n=x("docker",["ps","--format","{{.Names}}|{{.Ports}}"],{encoding:"utf-8",timeout:5e3})}catch{}let c=i=>Q(n,o,i),a=s.isPortFree??b,f=async i=>await a(i)||c(i);if(t&&!r){for(let i of[t.ingressHttp,t.ingressHttps,t.postgres])if(!await f(i))return O({isAvailable:f});for(let[i,u]of Object.entries(k)){let p=t[i];if(u!==void 0&&p!==u&&await f(u))return O({isAvailable:f})}return t}return O({isAvailable:f})}import{existsSync as ee,readFileSync as v}from"node:fs";import{join as l}from"node:path";var $=["postgres",P],L=["pre_alpha","alpha","beta","out_of_scope"];function te(e){return $.includes(e)}function C(e){try{return JSON.parse(v(l(e,".tdk",T),"utf-8"))}catch{return}}function m(e){try{return ee(e)?v(e,"utf-8"):void 0}catch{return}}function I(e,s){let t=o=>{let n=o;for(;n<e.length&&/\s/.test(e[n]);)n+=1;return n},r=0;for(;;){let o=e.indexOf(s,r);if(o===-1)return;let n=t(o+s.length);if(e[n]==="="&&(n=t(n+1),e[n]==="[")){let c=e.indexOf("]",n+1);return c===-1?void 0:[...e.slice(n+1,c).matchAll(/"([^"]+)"|'([^']+)'/g)].map(a=>a[1]??a[2]??"")}r=o+s.length}}function M(e){let s=l(e,".tdk",".tdk-out","Tiltfile"),t=m(s);if(t)return I(t,"ALWAYS_ENABLED_INFRA")}function se(e){let s=l(e,".tdk",".tdk-out","spec.master"),t=m(s);if(t!==void 0)return/"database-management"\s*:\s*True/.test(t)}function re(e){let s=l(e,".tdk",".tdk-out"),t=m(l(s,"Tiltfile")),r=m(l(s,"spec.master")),o=m(l(s,"tdk-cli-ext","discovery","config.star")),n=m(l(s,"tdk-cli-ext","engine","topologies","tilt","config","profiles.star"));if(!t||!r||!o||!n)return!1;let c=r.match(/PRE_ALPHA_RESOURCES\s*=\s*\{([^}]*)\}/)?.[1],a=I(o,"CORE_INFRA");return/FOCUS_MODE\s*,\s*FOCUS_ENABLED_ALL\s*,\s*FOCUS_ENABLED_RESOURCES\s*=\s*Config\.apply_focus\(cfg\)/.test(t)&&/if FOCUS_MODE and FOCUS_ENABLED_ALL\s*:/.test(t)&&/"[^"]+"\s*:\s*True|'[^']+'\s*:\s*True/.test(c??"")&&(a?.includes("postgres")??!1)&&/["']postgres["']\s*:\s*["']database-management["']/.test(o)&&/for infra in CORE_INFRA_EXPORT\s*:/.test(n)&&/needed\[INFRA_STACK_MAP_EXPORT\[infra\]\]\s*=\s*True/.test(n)}function ne(e){let s=C(e);if(!s)return!1;let t=s.phases??{};for(let o of L){let n=t[o]?.enabledStacks;if(Array.isArray(n)&&n.includes(P))return!0}let r=s.always_enabled_infra??A;return Array.isArray(r)&&r.includes(P)}function oe(e,s){let t=new Set;for(let n of $)t.add(n);for(let n of s)t.add(n.name),n.stack&&t.add(n.stack);let r=C(e);if(r){let n=r.phases??{};for(let a of L){let f=n[a]?.enabledStacks;if(Array.isArray(f))for(let i of f)t.add(i)}let c=r.always_enabled_infra??A;if(Array.isArray(c))for(let a of c)t.add(a)}let o=M(e);if(Array.isArray(o))for(let n of o)t.add(n);return t}function be(e,s=w(e)){let t=ne(e),r=M(e),o=Array.isArray(r)&&r.includes(P),n=se(e)===!0,c=t||o||n,a=!t&&re(e),f=oe(e,s),i=[],u=[];for(let d of s){let g=d.config?.dependsOn??[],_=!1;for(let y of g){if(te(y)){_=!0;continue}f.has(y)||u.push({resource:d.name,name:y})}_&&i.push(d.name)}let p=c||i.length>0,h=c?"feature":i.length>0?"dependsOn":"none";return{featureOn:c,featureOnFromProjectJson:t,featureOnFromTiltfile:o,featureOnFromSpecMaster:n,focusWouldEnableDatabaseManagement:a,dependsOnUsers:i,willStart:p,reason:h,unknownDependsOnNames:u}}export{O as a,ue as b,F as c,Se as d,_e as e,Te as f,Ee as g,$ as h,be as i};
@@ -1,4 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{a as k}from"./chunk-DTIHDMED.js";import{g as w,h as y}from"./chunk-SB5WAMSU.js";import{Ra as h,ba as d,ca as u,d as l,k as f,ra as m,s as p,ta as g}from"./chunk-US4D5GJJ.js";import{b as a}from"./chunk-CF46CD6R.js";import{Command as A}from"commander";import{readFileSync as E}from"node:fs";import{join as T}from"node:path";function $(n){let e=n.config;return e?Array.isArray(e.featuresEnabled)&&e.featuresEnabled.includes(l)?!0:(Array.isArray(e.dependsOn)?e.dependsOn:[]).some(o=>y.includes(o)):!1}function H(n,e){let i=n.replace(/-/g,"_"),o=[];for(let t of[...e].sort((r,s)=>r.name.localeCompare(s.name))){let r=t.resources.filter($).map(s=>s.name);r.length!==0&&o.push({name:`${i}_${t.name.replace(/-/g,"_")}`,stack:t.name,services:r.sort()})}return o.length===0?null:{name:"postgres",databases:o}}function x(n){try{let e=JSON.parse(E(T(n,".tdk",f),"utf-8"));return typeof e?.project?.name=="string"?e.project.name:null}catch{return null}}import{spawn as P}from"node:child_process";function j(n){try{let e=new URL(n);return e.protocol==="http:"||e.protocol==="https:"}catch{return!1}}function S(n,e=process.platform,i=P){if(!j(n))return Promise.resolve(!1);let o,t;return e==="darwin"?(o="open",t=[n]):e==="win32"?(o="rundll32.exe",t=["url.dll,FileProtocolHandler",n]):(o="xdg-open",t=[n]),new Promise(r=>{try{let s=i(o,t,{stdio:"ignore",detached:!0,windowsHide:!0});s.once("error",()=>r(!1)),s.once("spawn",()=>{typeof s.unref=="function"&&s.unref(),r(!0)})}catch{r(!1)}})}function B(n,e=process.platform,i=P){return new Promise(o=>{let t,r;e==="darwin"?(t="pbcopy",r=[]):e==="win32"?(t="clip",r=[]):(t="xclip",r=["-selection","clipboard"]);try{let s=i(t,r,{stdio:["pipe","ignore","ignore"],windowsHide:!0});s.on("error",()=>{o(!1)}),s.on("close",c=>{o(c===0)}),s.stdin?(s.stdin.on("error",()=>{o(!1)}),s.stdin.write(n,"utf-8"),s.stdin.end()):o(!1)}catch{o(!1)}})}async function N(n){let{resources:e}=h(n),i=await w(n,{inspectDocker:!1}),{appBase:o}=m(i?.ingressHttp,n);return e.filter(t=>t.config?.appType==="frontend").map(t=>({name:t.name,url:`${o}${g(t)}`}))}async function O(n,e=2e3){try{return(await fetch(n,{signal:AbortSignal.timeout(e)})).status<500}catch{return!1}}async function b(n,e=3e4,i){if(n.length===0)return;let o=Date.now(),t=o+e;for(;;){for(let s of n)if(await O(s.url))return s;let r=Date.now()-o;if(r>=e)return;i?.(r),await new Promise(s=>setTimeout(s,2e3))}}async function F(n){let e=n??p();if(!e)return console.log(a.yellow("Not in a Flisk project, so there is no frontend to open.")),console.log(a.gray("Run `flisk project --yes` first, or `flisk open` inside a project.")),null;let i=await N(e);if(i.length===0)return console.log(a.yellow("This project has no frontend service to open.")),console.log(a.gray("Start the stack with `flisk up` and add a frontend with `flisk resource`.")),null;let o=x(e);d(`Opening the first frontend of ${o??"this project"}`);for(let c of i)console.log(a.gray(` - ${c.name}: ${c.url}`));let t=k("Waiting for the frontend to answer..."),r=await b(i,12e4,c=>{t.text=`Waiting for the frontend to answer... ${Math.round(c/1e3)}s`});if(!r){t.fail("No frontend answered yet."),console.log(a.yellow("The stack is not serving the frontend yet.")),console.log(a.gray(" - Start the stack in another terminal: flisk up")),console.log(a.gray(" - Then run this again: flisk open"));for(let c of i)console.log(a.gray(` - ${c.name}: ${c.url}`));return null}t.succeed(`The frontend is up: ${r.name}`);let s=await S(r.url);return console.log(s?a.green(`
3
- Opened ${r.url}`):a.yellow(`
4
- Could not open a browser. Open ${r.url} yourself.`)),u("Run `flisk open` again to open the next frontend."),r.url}var Q=new A("open").description("Open the first frontend of the project in your browser").action(async()=>{await F()});export{H as a,x as b,S as c,B as d,N as e,O as f,b as g,F as h,Q as i};
@@ -1,34 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{a as O}from"./chunk-KGKKDD4K.js";import{b as N,c as pe,d as q,i as D,j as Y,n as J,o as I,q as C}from"./chunk-KBGQ4NJE.js";import{H as z,J as G,L as E,Na as re,Ra as ae,Sa as se,Ua as ie,V as T,W as B,Wa as ce,Xa as le,Ya as de,aa as f,ba as y,ca as t,d as x,ja as ne,k as U,ka as W,la as V,m as P,s as F}from"./chunk-US4D5GJJ.js";import{b as p}from"./chunk-CF46CD6R.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
- \u274C Unknown template: "${e}"`)),console.log(p.yellow(`
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
- `,0),t(`Source: ${a.bundledPath?"bundled Flisk example":a.repo}`,0),t(`Destination: ${d}
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
- \u2705 Cloned "${e}" into ${l}/`)),t(`
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 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-5TVSNLIV.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
- `),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=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
- \u{1F4CB} Regenerating master configuration files...
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
- \u2705 Project configuration regenerated!`)),t(`
16
- Generated in .tdk/.tdk-out/:`,0);for(let v of P)t(`- ${v}`);t(`
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 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
- \u{1F4CB} Creating project configuration...
23
- `),N(m,r),f("Created: .tdk/project.json"),t(`\u2192 Project: ${r.project.name}`),y(`
24
- \u{1F4CB} Generating master configuration files...
25
- `),await Y(n),y(`
26
- \u{1F527} Setting up environment variables...
27
- `),V(n))f("Created: .env (the defaults work as-is)");else{let i=W(n);i.length>0?f(`Updated: .env (added ${i.join(", ")}; existing values unchanged)`):f("Found: .env (environment already configured)")}let Z=ne(n);if(Z.missing.length>0){console.log(p.yellow(`
28
- \u26A0\uFE0F Missing required environment variables:`));for(let i of Z.missing)t(`- ${i}`,1);t("\u2192 Edit .env and fill in these values before running `flisk up`",1)}let ee=q(n);ee.length>0&&f(`Added to .gitignore: ${ee.join(", ")}`),console.log(p.green(`
29
- \u2705 Project configuration complete!`)),t(`
30
- Generated files in .tdk/.tdk-out/:`,0);for(let i of P)t(`- ${i}`);t(`
31
- Environment configuration:`,0),t("- .env (contains all required variables)"),t(`
32
- Source file:`,0),t("- .tdk/project.json (edit this to change project structure)"),t(`
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,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,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{J as a,K as b,L as c,M as d,N as e,O as f,P as g,Q as h,R as i,S as j}from"./chunk-DWHA5YKT.js";import"./chunk-SB5WAMSU.js";import"./chunk-KBGQ4NJE.js";import"./chunk-42IVF3YT.js";import"./chunk-US4D5GJJ.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{c as MACHINE_CHECK_IDS,a as RUNTIME_CHECK_IDS,b as SCAFFOLD_CHECK_IDS,h as assertMachineReadyOrExit,i as detectRuntimePrerequisites,g as formatColdPreflight,j as formatRuntimeNextSteps,d as nodeTooOld,e as requireVerifiedDockerVersions,f as runColdPreflight};
@@ -1,4 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import"./chunk-6EA4DGCY.js";import{spawn as u}from"node:child_process";var p="Frontend URLs";function h(t){let n=t.split(`
3
- `),r=n.findIndex(e=>e.includes(p));if(r!==-1)for(let e of n.slice(r+1)){let i=e.match(/^\s*-\s+\S+:\s+(https?:\/\/\S+)/);if(i)return i[1];if(e.trim()===""||e.includes("URLs:"))break}}function l(t){for(let n of t.split(`
4
- `)){let r=n.trim();if(r.startsWith("{"))try{let e=JSON.parse(r),s=(e.data??{}).ok===!0;return{ok:s,error:s?void 0:e.errors?.[0]?.message??"the stack did not come up",raw:t}}catch{}}}function k(t,n,r=process.env,e=u){return new Promise(i=>{let s=e(process.execPath,[t,"up","--json"],{cwd:n,env:r,stdio:["inherit","pipe","pipe"]}),c="",d=!1,a=o=>{d||(d=!0,s.unref?.(),i(o))};s.stdout?.on("data",o=>{c+=String(o);let f=l(c);f&&a(f)}),s.stderr?.on("data",o=>{c+=String(o)}),s.on("error",o=>a({ok:!1,error:o.message,raw:c})),s.on("close",o=>a({ok:!1,error:`the stack stopped before it was ready (code ${o})`,raw:c}))})}function x(t,n){if(!n(t))return t;for(let r=2;r<1e3;r+=1){let e=`${t}-${r}`;if(!n(e))return e}return t}export{h as findFrontendUrl,x as nextAvailableProjectDir,l as parseStackEnvelope,k as runStackQuiet};
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{e as a,f as b,g as c,h as d,i as e}from"./chunk-WPQOTHB5.js";import"./chunk-DTIHDMED.js";import"./chunk-SB5WAMSU.js";import"./chunk-US4D5GJJ.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{b as isFrontendReady,a as listFrontendTargets,e as openCommand,d as openFirstFrontend,c as pickReadyFrontend};
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{g as a,h as b,i as c,j as d}from"./chunk-YUARXGF4.js";import"./chunk-KGKKDD4K.js";import"./chunk-KBGQ4NJE.js";import"./chunk-42IVF3YT.js";import"./chunk-US4D5GJJ.js";import"./chunk-CF46CD6R.js";import"./chunk-6EA4DGCY.js";export{c as cloneProjectTemplate,a as enableDiscoveredStacks,d as projectCommand,b as templateTargetDir};
@@ -1,2 +0,0 @@
1
- import{createRequire as __tdkRequire}from'node:module';const require=__tdkRequire(import.meta.url);
2
- import{a}from"./chunk-KGKKDD4K.js";import"./chunk-6EA4DGCY.js";export{a as PROJECT_TEMPLATES};