@flisk-sh/flisk 1.4.2 → 1.4.6

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 (134) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +148 -49
  3. package/cli/dist/backend-languages/bun.js +5 -0
  4. package/cli/dist/backend-languages/go.js +3 -1
  5. package/cli/dist/cli.js +9 -0
  6. package/cli/dist/commands/completion.js +8 -1
  7. package/cli/dist/commands/config.js +130 -55
  8. package/cli/dist/commands/doctor.js +66 -27
  9. package/cli/dist/commands/down.js +33 -1
  10. package/cli/dist/commands/logs.js +39 -1
  11. package/cli/dist/commands/project.js +12 -0
  12. package/cli/dist/commands/resource.js +39 -11
  13. package/cli/dist/commands/status.js +57 -19
  14. package/cli/dist/commands/up.js +221 -18
  15. package/cli/dist/commands/upgrade.js +2 -2
  16. package/cli/dist/frontend-frameworks/next.js +197 -0
  17. package/cli/dist/frontend-frameworks/react.js +81 -12
  18. package/cli/dist/frontend-frameworks/registry.js +5 -4
  19. package/cli/dist/frontend-frameworks/vue.js +82 -12
  20. package/cli/dist/generator/resource-templates.js +2 -4
  21. package/cli/dist/generator/template-engine.js +5 -3
  22. package/cli/dist/utils/bun-requirement.js +7 -4
  23. package/cli/dist/utils/cold-preflight.js +55 -34
  24. package/cli/dist/utils/config-explain.js +197 -0
  25. package/cli/dist/utils/demo-reset.js +22 -0
  26. package/cli/dist/utils/discovery-paths.js +7 -1
  27. package/cli/dist/utils/doctor-native.js +96 -0
  28. package/cli/dist/utils/host-port-plan.js +8 -3
  29. package/cli/dist/utils/native-project.js +41 -0
  30. package/cli/dist/utils/native-runtime.js +513 -0
  31. package/cli/dist/utils/native-service.js +95 -0
  32. package/cli/dist/utils/native-up.js +156 -0
  33. package/cli/dist/utils/platform.js +1 -1
  34. package/cli/dist/utils/port-conflict-fix.js +16 -14
  35. package/cli/dist/utils/port-occupant.js +35 -0
  36. package/cli/dist/utils/project-features.js +7 -16
  37. package/cli/dist/utils/project-templates.js +9 -9
  38. package/cli/dist/utils/resource-features.js +5 -5
  39. package/cli/dist/utils/service-manifest.js +20 -3
  40. package/cli/dist/utils/service-urls.js +11 -0
  41. package/cli/dist/utils/services.js +15 -2
  42. package/cli/dist/utils/startup-report.js +4 -3
  43. package/cli/dist/utils/tar.js +33 -28
  44. package/cli/dist/utils/tilt-logs.js +8 -0
  45. package/cli/dist/utils/tilt-process.js +4 -3
  46. package/cli/dist/utils/windows-doctor.js +18 -15
  47. package/cli/dist-bundle/chunk-BIVAAWBX.js +24 -0
  48. package/cli/dist-bundle/{chunk-YNCBBJ4V.js → chunk-C4UFBXRD.js} +1 -1
  49. package/cli/dist-bundle/{chunk-53L2JN7G.js → chunk-CAEMWNPF.js} +1 -1
  50. package/cli/dist-bundle/chunk-CDKEHFW6.js +35 -0
  51. package/cli/dist-bundle/{chunk-5QBYM33Q.js → chunk-DPQK5TIS.js} +1 -1
  52. package/cli/dist-bundle/chunk-ETXZ5LUG.js +18 -0
  53. package/cli/dist-bundle/chunk-GPUJ55MI.js +3 -0
  54. package/cli/dist-bundle/chunk-GT76VMUL.js +130 -0
  55. package/cli/dist-bundle/{chunk-IGN5UC3P.js → chunk-IDNES5PE.js} +14 -7
  56. package/cli/dist-bundle/{chunk-MWOVYIBB.js → chunk-MUDE4DZD.js} +5 -5
  57. package/cli/dist-bundle/chunk-QEBN6ZVQ.js +2 -0
  58. package/cli/dist-bundle/{chunk-I7TGIK5N.js → chunk-R7DWXISM.js} +1 -1
  59. package/cli/dist-bundle/{chunk-DU2BN46C.js → chunk-U5FCQF42.js} +1 -1
  60. package/cli/dist-bundle/{chunk-3XODDLRJ.js → chunk-WCGBVETR.js} +1 -1
  61. package/cli/dist-bundle/cli.js +626 -389
  62. package/cli/dist-bundle/cold-preflight-KUWOL2Q2.js +2 -0
  63. package/cli/dist-bundle/{demo-stage-OHNTP2UJ.js → demo-stage-QCC4IWXR.js} +1 -1
  64. package/cli/dist-bundle/{extension-fetch-VEFSCG4B.js → extension-fetch-KIPYDIRM.js} +1 -1
  65. package/cli/dist-bundle/{open-XROJ6YEY.js → open-AZNX4AC5.js} +1 -1
  66. package/cli/dist-bundle/project-5SWIGCNP.js +2 -0
  67. package/cli/dist-bundle/{project-templates-EYSQG2EO.js → project-templates-2VQPUBSQ.js} +1 -1
  68. package/cli/dist-bundle/{services-BIMF6MVU.js → services-EY5WKPHQ.js} +1 -1
  69. package/cli/dist-bundle/{tilt-port-owner-ZY5M2JC4.js → tilt-port-owner-UBU6JWOA.js} +1 -1
  70. package/cli/package.json +1 -1
  71. package/examples/{tdk-example → flisk-example}/README.md +2 -2
  72. package/package.json +2 -2
  73. package/runtime/discovery/AGENTS.md +1 -1
  74. package/runtime/discovery/TILT_DISCOVERY.star +1 -1
  75. package/runtime/discovery/deterministic.star +1 -1
  76. package/runtime/engine/AGENTS.md +3 -3
  77. package/runtime/engine/README.md +1 -1
  78. package/runtime/engine/REFACTORING_MANIFEST_SYSTEM.md +1 -1
  79. package/runtime/engine/assets/docker/wake-gateway/decide.ts +1 -1
  80. package/runtime/engine/assets/docker/wake-gateway/server.ts +2 -2
  81. package/runtime/engine/assets/scripts/mac-m1-resource-monitor.sh +6 -6
  82. package/runtime/engine/schemas/service-schema.json +99 -21
  83. package/runtime/engine/scripts/debug-container.sh +1 -1
  84. package/runtime/engine/scripts/generate-manifest.sh +2 -2
  85. package/runtime/engine/topologies/platform/docker/compose/compose.star +40 -4
  86. package/runtime/engine/topologies/platform/docker/compose/traefik_standalone.star +19 -4
  87. package/runtime/engine/topologies/platform/docker/constants.star +2 -2
  88. package/runtime/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +6 -0
  89. package/runtime/engine/topologies/platform/docker/dockerfile/next_dockerfile.star +83 -0
  90. package/runtime/engine/topologies/platform/docker/index.star +4 -0
  91. package/runtime/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +7 -0
  92. package/runtime/engine/topologies/platform/docker/networking/traefik.star +85 -46
  93. package/runtime/engine/topologies/platform/docker/networking/traefik_static_routes.star +2 -2
  94. package/runtime/engine/topologies/tilt/common/utils_output.star +1 -0
  95. package/runtime/engine/topologies/tilt/generators/validators.star +1 -1
  96. package/runtime/engine/topologies/tilt/generators/vite/frontend.star +2 -2
  97. package/runtime/engine/topologies/tilt/generators/vite/generators.star +3 -0
  98. package/runtime/engine/topologies/tilt/manifest/constants.star +3 -0
  99. package/runtime/engine/topologies/tilt/manifest/mapper.star +1 -1
  100. package/runtime/engine/topologies/tilt/manifest/parser.star +9 -3
  101. package/runtime/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +9 -4
  102. package/runtime/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +50 -24
  103. package/runtime/engine/topologies/tilt/resources/orchestrator/generators/env.star +11 -2
  104. package/runtime/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +23 -9
  105. package/runtime/ext/ide-components/README.md +1 -1
  106. package/runtime/ext/ui-enhancements/extension.yaml +2 -2
  107. package/runtime/specs/specs/TILT_SERVICE_DEFAULTS.star +1 -1
  108. package/runtime/specs/specs/TILT_TECH_STACK.star +1 -1
  109. package/cli/dist-bundle/chunk-43XWL2PB.js +0 -61
  110. package/cli/dist-bundle/chunk-5F7YP5IR.js +0 -17
  111. package/cli/dist-bundle/chunk-ETKUVKJ2.js +0 -35
  112. package/cli/dist-bundle/chunk-K6SOCO6V.js +0 -3
  113. package/cli/dist-bundle/chunk-YHYRGWUH.js +0 -24
  114. package/cli/dist-bundle/chunk-YL56J2WX.js +0 -2
  115. package/cli/dist-bundle/cold-preflight-ZOPR7PWJ.js +0 -2
  116. package/cli/dist-bundle/project-7PTIOHGF.js +0 -2
  117. /package/examples/{tdk-example → flisk-example}/LICENSE +0 -0
  118. /package/examples/{tdk-example → flisk-example}/TILT_SERVICE_DEFAULTS.star +0 -0
  119. /package/examples/{tdk-example → flisk-example}/TILT_TECH_STACK.star +0 -0
  120. /package/examples/{tdk-example → flisk-example}/Tiltfile +0 -0
  121. /package/examples/{tdk-example → flisk-example}/services/platform/messaging/docker-compose.yml +0 -0
  122. /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/package.json +0 -0
  123. /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/service.json +0 -0
  124. /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/src/index.ts +0 -0
  125. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/index.html +0 -0
  126. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/package.json +0 -0
  127. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/public/.gitkeep +0 -0
  128. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/service.json +0 -0
  129. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/main.tsx +0 -0
  130. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/orders.tsx +0 -0
  131. /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/style.css +0 -0
  132. /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/package.json +0 -0
  133. /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/service.json +0 -0
  134. /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/src/index.ts +0 -0
@@ -0,0 +1,2 @@
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ import{L as a,M as b,N as c,O as d,P as e,Q as f,R as g,S as h,T as i,U as j,V as k,W as l}from"./chunk-GT76VMUL.js";import"./chunk-MUDE4DZD.js";import"./chunk-IDNES5PE.js";import"./chunk-GPUJ55MI.js";import"./chunk-3J6XI3NX.js";import"./chunk-BIVAAWBX.js";import"./chunk-WCGBVETR.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{d as MACHINE_CHECK_IDS,a as NATIVE_CHECK_IDS,b as RUNTIME_CHECK_IDS,c as SCAFFOLD_CHECK_IDS,j as assertMachineReadyOrExit,k as detectRuntimePrerequisites,i as formatColdPreflight,l as formatRuntimeNextSteps,e as nodeTooOld,f as requireVerifiedDockerVersions,h as runColdPreflight,g as usesPrisma};
@@ -1,5 +1,5 @@
1
1
  import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
- import{b as R}from"./chunk-5QBYM33Q.js";import{b as c}from"./chunk-YNCBBJ4V.js";import"./chunk-KJZUBHLO.js";var v=12,_=24,F={plain:e=>e,bold:c.bold,dim:c.gray,ok:c.green,warn:c.yellow,err:c.red},S={pending:"\u25CB",active:"\u25D0",done:"\u2714",failed:"\u2716"},j={pending:"dim",active:"warn",done:"ok",failed:"err"};function o(e){return R(String(e)).replace(/[\n\r\t]/g," ")}function g(e){if(!Number.isFinite(e)||e<0)return"0.0s";if(e<1e4)return`${(e/1e3).toFixed(1)}s`;if(e<6e4)return`${Math.round(e/1e3)}s`;let n=Math.floor(e/6e4),i=Math.round(e%6e4/1e3);return`${n}m ${i}s`}function $(e){return e.reduce((n,i)=>n+i.text.length,0)}function k(e,n){if(n<=0)return[];let i=[],l=0;for(let s of e){if(l>=n)break;let t=n-l;if(s.text.length<=t){i.push(s),l+=s.text.length;continue}i.push({...s,text:`${s.text.slice(0,Math.max(0,t-1))}\u2026`}),l=n}return i}function w(e,n){let i=k(e,n),l=n-$(i);return l<=0?i:[...i,{text:" ".repeat(l),style:"plain"}]}function M(e,n,i){let l=$(n),s=i-l-1;if(s<4)return w(k([...e,...n],i),i);let t=k(e,s),r=i-$(t)-l;return[...t,{text:" ".repeat(Math.max(1,r)),style:"plain"},...n]}function b(e){return[{text:` ${"\u2500".repeat(Math.max(0,e-2))}`,style:"dim"}]}function P(e,n){return M([{text:" ",style:"plain"},{text:S[e.status],style:j[e.status]},{text:" ",style:"plain"},{text:o(e.label),style:e.status==="pending"?"dim":"plain"}],e.elapsedMs===void 0?[]:[{text:g(e.elapsedMs),style:"dim"}],n)}function Y(e){let n=Math.max(0,e.servicesTotal);if(n===0)return"no services found";let l=[`${Math.min(Math.max(0,e.servicesReady),n)} of ${n} services ready`];return e.servicesBuilding>0&&l.push(`${e.servicesBuilding} building`),l.join(" \xB7 ")}function E(e,n=80){let i=Number.isFinite(n)&&n>0?n:80,l=Math.max(_,Math.min(i-1,78)),s=[],t=a=>s.push(w(a,l)),r=()=>t([]);if(e.done){t(M([{text:" ",style:"plain"},{text:"\u2714",style:"ok"},{text:" Your stack is running",style:"ok"}],[{text:g(e.elapsedMs),style:"dim"}],l)),t([{text:" ",style:"plain"},{text:o(e.subtitle),style:"dim"}]),r();for(let a of e.done.urls.slice(0,2))t([{text:" ",style:"plain"},{text:o(a),style:"plain"}]);r(),t(b(l)),t([{text:" ",style:"plain"},{text:o(e.done.summary),style:"plain"}]),t([{text:" ",style:"plain"},{text:o(e.done.hint),style:"dim"}]),r(),t([{text:" ",style:"plain"},{text:`flisk ${o(e.done.version)}`,style:"dim"}])}else if(e.failure){let a=e.phases.find(p=>p.status==="failed");t(M([{text:" ",style:"plain"},{text:"\u2716",style:"err"},{text:" ",style:"plain"},{text:o(a?.label??"The demo stopped"),style:"err"}],[{text:g(e.elapsedMs),style:"dim"}],l)),r(),t([{text:" ",style:"plain"},{text:o(e.failure.message),style:"plain"}]),e.failure.fix&&t([{text:" ",style:"plain"},{text:o(e.failure.fix),style:"dim"}]),r(),t(b(l)),e.detail&&t([{text:" ",style:"plain"},{text:o(e.detail),style:"dim"}]),e.failure.logPath&&t([{text:" ",style:"plain"},{text:`log: ${o(e.failure.logPath)}`,style:"dim"}])}else{t([{text:" ",style:"plain"},{text:o(e.title),style:"bold"}]),t([{text:" ",style:"plain"},{text:o(e.subtitle),style:"dim"}]),r();let a=e.phases.slice(0,4);for(let p of a)t(P(p,l));for(let p=a.length;p<4;p+=1)r();r(),t(b(l)),t([{text:" ",style:"plain"},{text:o(e.detail??""),style:"dim"}]),t(M([{text:" ",style:"plain"},{text:Y(e),style:"plain"}],[{text:g(e.elapsedMs),style:"dim"}],l))}for(;s.length<v;)s.push(w([],l));return s.slice(0,v)}function A(e){return e.map(n=>n.map(i=>i.text).join(""))}function D(e){return e.map(n=>F[n.style](n.text)).join("")}function H(e,n=process.stderr,i=Date.now){let l=n.isTTY===!0,s=i(),t={...e},r=!1,a="",p="",f,T=()=>{let u=!!(t.done||t.failure);return{...t,elapsedMs:u?t.elapsedMs:i()-s}},x=()=>{let u=T(),m=E(u,n.columns??80),y=A(m);if(!l){let h=y.join(`
2
+ import{b as R}from"./chunk-DPQK5TIS.js";import{b as c}from"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";var v=12,_=24,F={plain:e=>e,bold:c.bold,dim:c.gray,ok:c.green,warn:c.yellow,err:c.red},S={pending:"\u25CB",active:"\u25D0",done:"\u2714",failed:"\u2716"},j={pending:"dim",active:"warn",done:"ok",failed:"err"};function o(e){return R(String(e)).replace(/[\n\r\t]/g," ")}function g(e){if(!Number.isFinite(e)||e<0)return"0.0s";if(e<1e4)return`${(e/1e3).toFixed(1)}s`;if(e<6e4)return`${Math.round(e/1e3)}s`;let n=Math.floor(e/6e4),i=Math.round(e%6e4/1e3);return`${n}m ${i}s`}function $(e){return e.reduce((n,i)=>n+i.text.length,0)}function k(e,n){if(n<=0)return[];let i=[],l=0;for(let s of e){if(l>=n)break;let t=n-l;if(s.text.length<=t){i.push(s),l+=s.text.length;continue}i.push({...s,text:`${s.text.slice(0,Math.max(0,t-1))}\u2026`}),l=n}return i}function w(e,n){let i=k(e,n),l=n-$(i);return l<=0?i:[...i,{text:" ".repeat(l),style:"plain"}]}function M(e,n,i){let l=$(n),s=i-l-1;if(s<4)return w(k([...e,...n],i),i);let t=k(e,s),r=i-$(t)-l;return[...t,{text:" ".repeat(Math.max(1,r)),style:"plain"},...n]}function b(e){return[{text:` ${"\u2500".repeat(Math.max(0,e-2))}`,style:"dim"}]}function P(e,n){return M([{text:" ",style:"plain"},{text:S[e.status],style:j[e.status]},{text:" ",style:"plain"},{text:o(e.label),style:e.status==="pending"?"dim":"plain"}],e.elapsedMs===void 0?[]:[{text:g(e.elapsedMs),style:"dim"}],n)}function Y(e){let n=Math.max(0,e.servicesTotal);if(n===0)return"no services found";let l=[`${Math.min(Math.max(0,e.servicesReady),n)} of ${n} services ready`];return e.servicesBuilding>0&&l.push(`${e.servicesBuilding} building`),l.join(" \xB7 ")}function E(e,n=80){let i=Number.isFinite(n)&&n>0?n:80,l=Math.max(_,Math.min(i-1,78)),s=[],t=a=>s.push(w(a,l)),r=()=>t([]);if(e.done){t(M([{text:" ",style:"plain"},{text:"\u2714",style:"ok"},{text:" Your stack is running",style:"ok"}],[{text:g(e.elapsedMs),style:"dim"}],l)),t([{text:" ",style:"plain"},{text:o(e.subtitle),style:"dim"}]),r();for(let a of e.done.urls.slice(0,2))t([{text:" ",style:"plain"},{text:o(a),style:"plain"}]);r(),t(b(l)),t([{text:" ",style:"plain"},{text:o(e.done.summary),style:"plain"}]),t([{text:" ",style:"plain"},{text:o(e.done.hint),style:"dim"}]),r(),t([{text:" ",style:"plain"},{text:`flisk ${o(e.done.version)}`,style:"dim"}])}else if(e.failure){let a=e.phases.find(p=>p.status==="failed");t(M([{text:" ",style:"plain"},{text:"\u2716",style:"err"},{text:" ",style:"plain"},{text:o(a?.label??"The demo stopped"),style:"err"}],[{text:g(e.elapsedMs),style:"dim"}],l)),r(),t([{text:" ",style:"plain"},{text:o(e.failure.message),style:"plain"}]),e.failure.fix&&t([{text:" ",style:"plain"},{text:o(e.failure.fix),style:"dim"}]),r(),t(b(l)),e.detail&&t([{text:" ",style:"plain"},{text:o(e.detail),style:"dim"}]),e.failure.logPath&&t([{text:" ",style:"plain"},{text:`log: ${o(e.failure.logPath)}`,style:"dim"}])}else{t([{text:" ",style:"plain"},{text:o(e.title),style:"bold"}]),t([{text:" ",style:"plain"},{text:o(e.subtitle),style:"dim"}]),r();let a=e.phases.slice(0,4);for(let p of a)t(P(p,l));for(let p=a.length;p<4;p+=1)r();r(),t(b(l)),t([{text:" ",style:"plain"},{text:o(e.detail??""),style:"dim"}]),t(M([{text:" ",style:"plain"},{text:Y(e),style:"plain"}],[{text:g(e.elapsedMs),style:"dim"}],l))}for(;s.length<v;)s.push(w([],l));return s.slice(0,v)}function A(e){return e.map(n=>n.map(i=>i.text).join(""))}function D(e){return e.map(n=>F[n.style](n.text)).join("")}function H(e,n=process.stderr,i=Date.now){let l=n.isTTY===!0,s=i(),t={...e},r=!1,a="",p="",f,T=()=>{let u=!!(t.done||t.failure);return{...t,elapsedMs:u?t.elapsedMs:i()-s}},x=()=>{let u=T(),m=E(u,n.columns??80),y=A(m);if(!l){let h=y.join(`
3
3
  `);if(h===p)return;p=h,n.write(`${y.filter(L=>L.trim()!=="").join(`
4
4
  `)}
5
5
  `);return}let d=y.join(`
@@ -1,2 +1,2 @@
1
1
  import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
- import{b as a,c as b,d as c,e as d}from"./chunk-K6SOCO6V.js";import"./chunk-KJZUBHLO.js";export{a as applyPremiumOverlay,c as hasDddLicense,d as hasSablierLicense,b as hasVerdaccioLicense};
2
+ import{b as a,c as b,d as c,e as d}from"./chunk-GPUJ55MI.js";import"./chunk-KJZUBHLO.js";export{a as applyPremiumOverlay,c as hasDddLicense,d as hasSablierLicense,b as hasVerdaccioLicense};
@@ -1,2 +1,2 @@
1
1
  import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
- import{d as a,e as b,f as c,g as d,h as e,i as f}from"./chunk-DU2BN46C.js";import"./chunk-MINZ25AC.js";import"./chunk-YHYRGWUH.js";import"./chunk-3XODDLRJ.js";import"./chunk-53L2JN7G.js";import"./chunk-5F7YP5IR.js";import"./chunk-YNCBBJ4V.js";import"./chunk-KJZUBHLO.js";export{d as findReadyFrontend,b as isFrontendReady,a as listFrontendTargets,f as openCommand,e as openFirstFrontend,c as pickReadyFrontend};
2
+ import{d as a,e as b,f as c,g as d,h as e,i as f}from"./chunk-U5FCQF42.js";import"./chunk-MINZ25AC.js";import"./chunk-BIVAAWBX.js";import"./chunk-WCGBVETR.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{d as findReadyFrontend,b as isFrontendReady,a as listFrontendTargets,f as openCommand,e as openFirstFrontend,c as pickReadyFrontend};
@@ -0,0 +1,2 @@
1
+ import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
+ import{g as a,h as b,i as c,j as d,k as e}from"./chunk-CDKEHFW6.js";import"./chunk-QEBN6ZVQ.js";import"./chunk-MUDE4DZD.js";import"./chunk-GPUJ55MI.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{c as cloneProjectTemplate,a as enableDiscoveredStacks,e as projectCommand,b as templateTargetDir,d as writeDefaultProjectConfig};
@@ -1,2 +1,2 @@
1
1
  import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
- import{a,b}from"./chunk-YL56J2WX.js";import"./chunk-KJZUBHLO.js";export{a as PROJECT_TEMPLATES,b as bareTemplateArg};
2
+ import{a,b}from"./chunk-QEBN6ZVQ.js";import"./chunk-KJZUBHLO.js";export{a as PROJECT_TEMPLATES,b as bareTemplateArg};
@@ -1,2 +1,2 @@
1
1
  import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
- import{ca as a,da as b,ea as c,fa as d,ga as e,ha as f,ia as g,ja as h,ka as i,la as j,ma as k,na as l,oa as m,pa as n,qa as o}from"./chunk-5F7YP5IR.js";import"./chunk-YNCBBJ4V.js";import"./chunk-KJZUBHLO.js";export{m as clearMetadataCache,f as discoverResources,e as discoverResourcesFromRoot,g as discoverResourcesStrict,c as discoverResourcesWithProblems,a as discoverServiceManifestPaths,h as discoverStackNames,j as discoverStacks,i as getAllStacks,n as getResourceMetadata,k as getResourcesForStack,o as getStackMetadata,b as resetPrintedServiceWarnings,l as stackExists,d as warnAboutSkippedFiles};
2
+ import{ia as a,ja as b,ka as c,la as d,ma as e,na as f,oa as g,pa as h,qa as i,ra as j,sa as k,ta as l,ua as m,va as n,wa as o}from"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{m as clearMetadataCache,f as discoverResources,e as discoverResourcesFromRoot,g as discoverResourcesStrict,c as discoverResourcesWithProblems,a as discoverServiceManifestPaths,h as discoverStackNames,j as discoverStacks,i as getAllStacks,n as getResourceMetadata,k as getResourcesForStack,o as getStackMetadata,b as resetPrintedServiceWarnings,l as stackExists,d as warnAboutSkippedFiles};
@@ -1,2 +1,2 @@
1
1
  import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
2
- import{a,b,c}from"./chunk-I7TGIK5N.js";import"./chunk-IGN5UC3P.js";import"./chunk-3XODDLRJ.js";import"./chunk-53L2JN7G.js";import"./chunk-5F7YP5IR.js";import"./chunk-YNCBBJ4V.js";import"./chunk-KJZUBHLO.js";export{c as classifyTiltPorts,a as findTiltPortOwner,b as isForeignTilt};
2
+ import{a,b,c}from"./chunk-R7DWXISM.js";import"./chunk-IDNES5PE.js";import"./chunk-WCGBVETR.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{c as classifyTiltPorts,a as findTiltPortOwner,b as isForeignTilt};
package/cli/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "flisk-cli-internal",
3
3
  "private": true,
4
- "version": "1.4.2",
4
+ "version": "1.4.6",
5
5
  "description": "Flisk CLI — start services on your machine.",
6
6
  "keywords": [
7
7
  "flisk",
@@ -10,10 +10,10 @@ flisk project --yes
10
10
  flisk up
11
11
  ```
12
12
 
13
- Open `http://app.tdk-example.localhost/orders-app/` and create an order, or use the routed API:
13
+ Open `http://app.flisk-example.localhost/orders-app/` and create an order, or use the routed API:
14
14
 
15
15
  ```sh
16
- curl -fsS -X POST http://api.tdk-example.localhost/api/orders \
16
+ curl -fsS -X POST http://api.flisk-example.localhost/api/orders \
17
17
  -H 'content-type: application/json' -d '{"item":"coffee"}'
18
18
  ```
19
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flisk-sh/flisk",
3
- "version": "1.4.2",
3
+ "version": "1.4.6",
4
4
  "description": "Flisk CLI — start services on your machine.",
5
5
  "homepage": "https://flisk.sh",
6
6
  "repository": {
@@ -29,7 +29,7 @@
29
29
  "!runtime/**/*.spec.*",
30
30
  "!runtime/**/test_*.py",
31
31
  "!runtime/**/*_test.py",
32
- "examples/tdk-example",
32
+ "examples/flisk-example",
33
33
  "cli/bin",
34
34
  "cli/dist/**/*.js",
35
35
  "cli/dist-bundle/**/*.js",
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Purpose
4
4
 
5
- This folder contains the **service discovery system** for Flisk Landscape's Tilt infrastructure. It scans the repository for service manifests and creates Tilt resources.
5
+ This folder contains the **service discovery system** for Flisk's Tilt infrastructure. It scans the repository for service manifests and creates Tilt resources.
6
6
 
7
7
  ## Architecture: Two-Layer Scanning with Validation
8
8
 
@@ -8,7 +8,7 @@
8
8
  # ⚠️ DEVELOPER NOTICE: This is a SYSTEM CONFIG file.
9
9
  # For human-friendly docs, see: TILT_CONFIG.md
10
10
  #
11
- # This file defines service discovery settings for the Flisk Landscape platform.
11
+ # This file defines service discovery settings for the Flisk platform.
12
12
  # Discovery automatically finds and registers services from the filesystem.
13
13
  #
14
14
  # 📖 TO EDIT DISCOVERY SETTINGS:
@@ -1,6 +1,6 @@
1
1
  # Copyright (c) 2026 Flisk Landscape contributors
2
2
  # SPDX-License-Identifier: MIT
3
- # Deterministic Tilt Configuration for Flisk Landscape
3
+ # Deterministic Tilt Configuration for Flisk
4
4
  # Inspired by Mira Murati's "Defeating Nondeterminism" philosophy
5
5
  # Goal: Same filesystem state + same environment = identical Tilt output
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  disable: false
3
- description: Topology specialist for Flisk Landscape - expert in Tilt/Starlark, manifest-driven architecture, service discovery, and the complete local development orchestration system. Masters the infrastructure topology that enables 120+ services.
3
+ description: Topology specialist for Flisk - expert in Tilt/Starlark, manifest-driven architecture, service discovery, and the complete local development orchestration system. Masters the infrastructure topology that enables 120+ services.
4
4
  mode: subagent
5
5
  tools:
6
6
  - write
@@ -13,7 +13,7 @@ created: 2026-03-31
13
13
  updated: 2026-04-04
14
14
  ---
15
15
 
16
- You are a senior topology engineer specialized in the Flisk Landscape Tilt infrastructure. You are the definitive expert on the manifest-driven architecture, Starlark topology modules, service discovery, and the complete local development orchestration system.
16
+ You are a senior topology engineer specialized in the Flisk Tilt infrastructure. You are the definitive expert on the manifest-driven architecture, Starlark topology modules, service discovery, and the complete local development orchestration system.
17
17
 
18
18
  ## Core Identity: The Infrastructure Cartographer
19
19
 
@@ -539,7 +539,7 @@ load('./my_custom_extension.star', 'my_function')
539
539
  # Load from parent directory
540
540
  load('../common/utils.star', 'helper')
541
541
 
542
- # Load from topologies (Flisk Landscape pattern)
542
+ # Load from topologies (Flisk pattern)
543
543
  load('../../../platform/docker/index.star', 'Docker')
544
544
  ```
545
545
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Tilt Platform Framework Code**
6
6
 
7
- This directory contains the Flisk Landscape Tilt infrastructure framework - the code that powers our local development orchestration.
7
+ This directory contains the Flisk Tilt infrastructure framework - the code that powers our local development orchestration.
8
8
 
9
9
  ## What's Here
10
10
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Executive Summary
4
4
 
5
- This document outlines a comprehensive refactoring of the manifest parsing and validation system in the Flisk Landscape Tilt infrastructure. The goal is to move from scattered inline logic to a clean, modular, well-tested architecture.
5
+ This document outlines a comprehensive refactoring of the manifest parsing and validation system in the Flisk Tilt infrastructure. The goal is to move from scattered inline logic to a clean, modular, well-tested architecture.
6
6
 
7
7
  **Current State:**
8
8
  - Manifest parsing scattered across `discovery.star`, `registry.star`, and multiple generator files
@@ -38,7 +38,7 @@ export interface WakeAction {
38
38
  * only queues the resource: with Tilt's build slots busy (e.g. 100+
39
39
  * resources rebuilding after a re-vendor), a triggered resource waited
40
40
  * behind them and the request timed out (observed live against
41
- * tdk-erp-system, see tasks.md 7.2). server.ts falls back to `tilt trigger`
41
+ * flisk-erp-system, see tasks.md 7.2). server.ts falls back to `tilt trigger`
42
42
  * when no image exists yet to start from.
43
43
  */
44
44
  useComposeStart: boolean;
@@ -19,12 +19,12 @@
19
19
  * the resource name; Compose derives it as
20
20
  * <project>-<service>-<replica>, confirmed empirically
21
21
  * against a live Flisk container, e.g.
22
- * "tdk-erp-system-analytics-autogenerated-data-governance-api-1"
22
+ * "flisk-erp-system-analytics-autogenerated-data-governance-api-1"
23
23
  * for the "data-governance-api" resource).
24
24
  * X-Wake-Deps Comma-separated "resourceName=containerName" pairs
25
25
  * for required dependencies (task 1.5: Tilt never
26
26
  * cascades a trigger to these on its own).
27
- * X-Wake-Compose-Project The resource's Compose project (e.g. "tdk-erp-system-analytics-autogenerated").
27
+ * X-Wake-Compose-Project The resource's Compose project (e.g. "flisk-erp-system-analytics-autogenerated").
28
28
  * X-Wake-Compose-Files Comma-separated absolute compose file paths, the
29
29
  * same ones Tilt's `<resource>-run-only` resource
30
30
  * passes. The project root is mounted into this
@@ -2,7 +2,7 @@
2
2
  # Copyright (c) 2026 Flisk Landscape contributors
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
- # Flisk Landscape Mac M1 Resource Monitor
5
+ # Flisk Mac M1 Resource Monitor
6
6
  # Monitors Docker container resource usage and provides optimization recommendations
7
7
 
8
8
  set -e
@@ -14,7 +14,7 @@ YELLOW='\033[1;33m'
14
14
  BLUE='\033[0;34m'
15
15
  NC='\033[0m' # No Color
16
16
 
17
- echo -e "${BLUE}🍎 Flisk Landscape Mac M1 Resource Monitor${NC}"
17
+ echo -e "${BLUE}🍎 Flisk Mac M1 Resource Monitor${NC}"
18
18
  echo "=================================================="
19
19
 
20
20
  # Check if Docker is running
@@ -33,19 +33,19 @@ echo -e "${BLUE}💻 System Memory:${NC} $SYSTEM_MEMORY"
33
33
 
34
34
  echo ""
35
35
 
36
- # Check running Flisk Landscape containers
36
+ # Check running Flisk containers
37
37
  PROJECT_CONTAINERS=$(docker ps --format "{{.Names}}" | grep -E "(postgres|redis|nats|kafka|traefik|clickhouse|elasticsearch|verdaccio|infisical)" | sort)
38
38
 
39
39
  if [ -z "$PROJECT_CONTAINERS" ]; then
40
- echo -e "${YELLOW}⚠️ No Flisk Landscape containers are currently running${NC}"
40
+ echo -e "${YELLOW}⚠️ No Flisk containers are currently running${NC}"
41
41
  echo "Run 'tilt up' to start services"
42
42
  exit 0
43
43
  fi
44
44
 
45
- echo -e "${GREEN}📊 Running Flisk Landscape Containers:${NC}"
45
+ echo -e "${GREEN}📊 Running Flisk Containers:${NC}"
46
46
  echo "=================================================="
47
47
 
48
- # Get detailed stats for Flisk Landscape containers
48
+ # Get detailed stats for Flisk containers
49
49
  TOTAL_MEMORY_MB=0
50
50
  HIGH_CPU_COUNT=0
51
51
  HIGH_MEMORY_COUNT=0
@@ -12,7 +12,12 @@
12
12
  },
13
13
  "required": [
14
14
  "appType"
15
- ]
15
+ ],
16
+ "not": {
17
+ "required": [
18
+ "command"
19
+ ]
20
+ }
16
21
  },
17
22
  "then": {
18
23
  "properties": {
@@ -35,7 +40,12 @@
35
40
  },
36
41
  "required": [
37
42
  "appType"
38
- ]
43
+ ],
44
+ "not": {
45
+ "required": [
46
+ "command"
47
+ ]
48
+ }
39
49
  },
40
50
  "then": {
41
51
  "properties": {
@@ -55,7 +65,12 @@
55
65
  },
56
66
  "required": [
57
67
  "appType"
58
- ]
68
+ ],
69
+ "not": {
70
+ "required": [
71
+ "command"
72
+ ]
73
+ }
59
74
  },
60
75
  "then": {
61
76
  "properties": {
@@ -79,7 +94,12 @@
79
94
  },
80
95
  "required": [
81
96
  "appType"
82
- ]
97
+ ],
98
+ "not": {
99
+ "required": [
100
+ "command"
101
+ ]
102
+ }
83
103
  },
84
104
  "then": {
85
105
  "properties": {
@@ -92,9 +112,62 @@
92
112
  "port"
93
113
  ]
94
114
  }
115
+ },
116
+ {
117
+ "if": {
118
+ "required": [
119
+ "command"
120
+ ]
121
+ },
122
+ "then": {
123
+ "anyOf": [
124
+ {
125
+ "required": [
126
+ "appName"
127
+ ]
128
+ },
129
+ {
130
+ "required": [
131
+ "name"
132
+ ]
133
+ }
134
+ ],
135
+ "not": {
136
+ "anyOf": [
137
+ {
138
+ "required": [
139
+ "image"
140
+ ]
141
+ },
142
+ {
143
+ "required": [
144
+ "dockerfile"
145
+ ]
146
+ }
147
+ ]
148
+ }
149
+ },
150
+ "else": {
151
+ "required": [
152
+ "appName",
153
+ "stack"
154
+ ],
155
+ "anyOf": [
156
+ {
157
+ "required": [
158
+ "appType"
159
+ ]
160
+ },
161
+ {
162
+ "required": [
163
+ "type"
164
+ ]
165
+ }
166
+ ]
167
+ }
95
168
  }
96
169
  ],
97
- "description": "Configuration for Flisk resources. Drives Tilt orchestration, Docker Compose generation, and dependency resolution. Supports both explicit service.json files and synthesis from directory structure.",
170
+ "description": "Configuration for Flisk resources. Drives Tilt orchestration, Docker Compose generation, and dependency resolution. Supports both explicit service.json files and synthesis from directory structure. A service runs from exactly one source: a container (image, dockerfile, or a generated Dockerfile) or a local command.",
98
171
  "properties": {
99
172
  "$schema": {
100
173
  "description": "JSON Schema reference for IDE validation",
@@ -144,7 +217,7 @@
144
217
  },
145
218
  "databaseName": {
146
219
  "description": "Override auto-generated DB name.\nDefault: FLISK_{stack}",
147
- "pattern": "^Flisk_[a-z_]+$",
220
+ "pattern": "^FLISK_[a-z_]+$",
148
221
  "type": "string"
149
222
  },
150
223
  "dependencies": {
@@ -513,25 +586,30 @@
513
586
  "default": "files"
514
587
  }
515
588
  }
589
+ },
590
+ "command": {
591
+ "description": "Run the service as a local process with this shell command instead of a container, for example \"node server.js\" or \"uvicorn main:app --port $PORT\". It runs from the service directory with PORT set to port. No image, Dockerfile or generated files: flisk up starts, supervises and restarts it without Docker or Tilt. Cannot be combined with image or dockerfile.",
592
+ "minLength": 1,
593
+ "type": "string"
594
+ },
595
+ "env": {
596
+ "additionalProperties": {
597
+ "type": "string"
598
+ },
599
+ "description": "Environment variables for a command service. Values may reference ${VAR} (or ${VAR:-default}) from the project .env or the shell.",
600
+ "propertyNames": {
601
+ "pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
602
+ },
603
+ "type": "object"
604
+ },
605
+ "name": {
606
+ "description": "Service name. Same as appName; a command service may use either.",
607
+ "type": "string"
516
608
  }
517
609
  },
518
610
  "required": [
519
- "appName",
520
- "stack",
521
611
  "schemaVersion"
522
612
  ],
523
613
  "title": "Flisk Resource Configuration",
524
- "type": "object",
525
- "anyOf": [
526
- {
527
- "required": [
528
- "appType"
529
- ]
530
- },
531
- {
532
- "required": [
533
- "type"
534
- ]
535
- }
536
- ]
614
+ "type": "object"
537
615
  }
@@ -157,7 +157,7 @@ diagnostics_menu() {
157
157
  case $choice in
158
158
  1)
159
159
  echo -e "${BLUE}Testing network connectivity...${NC}"
160
- run_command "$resource_name" "nc -zv registry.npmjs.org 443 && nc -zv Flisk Landscape-verdaccio 4873"
160
+ run_command "$resource_name" "nc -zv registry.npmjs.org 443 && nc -zv flisk-verdaccio 4873"
161
161
  ;;
162
162
  2)
163
163
  echo -e "${BLUE}Viewing configuration files...${NC}"
@@ -2,7 +2,7 @@
2
2
  # Copyright (c) 2026 Flisk Landscape contributors
3
3
  # SPDX-License-Identifier: MIT
4
4
  # =============================================================================
5
- # 🎯 Flisk Landscape - RESOURCE MANIFEST GENERATOR
5
+ # 🎯 Flisk - RESOURCE MANIFEST GENERATOR
6
6
  # =============================================================================
7
7
  # Usage: ./generate-manifest.sh <stack> <resource-name> <type> [port]
8
8
  #
@@ -37,7 +37,7 @@ PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
37
37
  print_usage() {
38
38
  cat << EOF
39
39
  ${BLUE}╔═══════════════════════════════════════════════════════════════════╗
40
- ║ 🎯 Flisk Landscape RESOURCE MANIFEST GENERATOR ║
40
+ ║ 🎯 Flisk RESOURCE MANIFEST GENERATOR ║
41
41
  ╚═══════════════════════════════════════════════════════════════════╝${NC}
42
42
 
43
43
  ${YELLOW}Usage:${NC}
@@ -77,6 +77,19 @@ def _compute_env_file_rel_path(resource_path, full_resource_path, env_filename):
77
77
  # 🚦 FRONTEND / BACKEND ENTRIES
78
78
  # =============================================================================
79
79
 
80
+ # The memory anchors a frontend service merges. Next.js gets its own (next dev needs far more than the 64M an nginx SPA fits in,
81
+ # and the OOM kill exits 0, so the container looks like a clean exit). The engine finds frontend entries by these strings.
82
+ _FRONTEND_MEMORY_ANCHORS = ["<<: *frontend-memory-limit", "<<: *next-memory-limit"]
83
+
84
+
85
+ def _has_frontend_memory_anchor(entry):
86
+ """True when a compose entry merges one of the frontend memory anchors."""
87
+ for anchor in _FRONTEND_MEMORY_ANCHORS:
88
+ if anchor in entry:
89
+ return True
90
+ return False
91
+
92
+
80
93
  def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
81
94
  """Generate frontend docker-compose entry with Traefik routing."""
82
95
  res_name = res['name']
@@ -91,6 +104,10 @@ def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
91
104
  # healthcheck probe a port nothing listens on, which left the container marked
92
105
  # unhealthy -- and Traefik's Docker provider skips unhealthy containers, so the
93
106
  # router was never registered and every request 404'd.
107
+ # Next.js is served by its own Node server (no nginx), on the manifest port, under its basePath.
108
+ is_next = bool(manifest) and manifest.get('framework') == 'next'
109
+ if is_next:
110
+ use_nginx = False
94
111
  port = NGINX_CONTAINER_PORT if use_nginx else reject_unsafe_value(manifest.get('port', BASE_PORT_FRONTEND), 'port')
95
112
 
96
113
  # Base path for routing on {project}.localhost. Shared with the Vite config and
@@ -129,11 +146,19 @@ def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
129
146
  manifest=manifest,
130
147
  )
131
148
 
149
+ memory_anchor = "<<: *next-memory-limit" if is_next else "<<: *frontend-memory-limit"
150
+ # An nginx frontend answers at /. Next.js answers at its basePath (with a trailing slash, see next.config.mjs), and the image
151
+ # has curl, not wget.
152
+ if is_next:
153
+ health_test = '["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1:{}{}/"]'.format(port, base_path)
154
+ else:
155
+ health_test = '["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:{}"]'.format(port)
156
+
132
157
  return """ {res_name}:
133
158
  image: {image_name}
134
159
  init: true
135
160
  {build_config}
136
- <<: *frontend-memory-limit
161
+ {memory_anchor}
137
162
  env_file:
138
163
  - {env_file_rel_path}
139
164
  environment:
@@ -144,9 +169,11 @@ def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
144
169
  - {network_traefik_public}
145
170
  - {network_backend}
146
171
  healthcheck:
147
- test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:{port}"]
172
+ test: {health_test}
148
173
  {healthcheck_timing}""".format(
174
+ health_test=health_test,
149
175
  res_name=res_name,
176
+ memory_anchor=memory_anchor,
150
177
  image_name=image_name,
151
178
  build_config=build_config,
152
179
  env_file_rel_path=env_file_rel_path,
@@ -439,7 +466,7 @@ def _generate_port_anchors(resource_entries):
439
466
  sdk_port = int(port_str)
440
467
  break
441
468
  # Check if this is a frontend (has frontend-memory-limit but not SDK)
442
- elif "<<: *frontend-memory-limit" in entry and not ("-sdk:" in entry or entry.strip().startswith("identity-sdk:")):
469
+ elif _has_frontend_memory_anchor(entry) and not ("-sdk:" in entry or entry.strip().startswith("identity-sdk:")):
443
470
  has_frontend = True
444
471
  # Extract frontend port from entry
445
472
  if "loadbalancer.server.port=" in entry:
@@ -452,7 +479,7 @@ def _generate_port_anchors(resource_entries):
452
479
  break
453
480
  # Check if this is a backend (has a port, not frontend, not SDK)
454
481
  # Backend entries have "healthcheck:" section with backend port
455
- elif "healthcheck:" in entry and "<<: *frontend-memory-limit" not in entry and not ("-sdk:" in entry or entry.strip().startswith("identity-sdk:")):
482
+ elif "healthcheck:" in entry and not _has_frontend_memory_anchor(entry) and not ("-sdk:" in entry or entry.strip().startswith("identity-sdk:")):
456
483
  has_backend = True
457
484
  # Extract backend port from entry
458
485
  if "loadbalancer.server.port=" in entry:
@@ -522,6 +549,15 @@ x-frontend-memory-limit: &frontend-memory-limit
522
549
  reservations:
523
550
  memory: 32M
524
551
 
552
+ x-next-memory-limit: &next-memory-limit
553
+ deploy:
554
+ resources:
555
+ limits:
556
+ memory: 1G
557
+ cpus: '1.0'
558
+ reservations:
559
+ memory: 256M
560
+
525
561
  services:
526
562
  """.format(port_anchors=port_anchors)
527
563
 
@@ -19,11 +19,26 @@ def generate_standalone_traefik_compose(sablier_enabled = False, http_host_port
19
19
  emitted when sablier_enabled is True (a license grants "sablier"). Without
20
20
  it they would run for nothing: a container holding a read-write Docker
21
21
  socket, an image build, and a plugin download from GitHub on every start.
22
+
23
+ Pass None for https_host_port to emit an HTTP-only Traefik configuration.
22
24
  """
23
25
  network = PlatformDockerConstants.NETWORK_TRAEFIK_PUBLIC
24
26
  name = PlatformDockerConstants.PROJECT_NAME
25
27
  log_level = "DEBUG" if sablier_enabled else "INFO"
26
28
  plugins_volume = " - plugins-storage:/plugins-storage\n" if sablier_enabled else ""
29
+ https_entrypoint = (
30
+ ' - "--entrypoints.websecure.address=:443"\n'
31
+ if https_host_port != None
32
+ else ""
33
+ )
34
+ https_port = (
35
+ ' - "{bind_address}:{https_host_port}:443"\n'.format(
36
+ bind_address=bind_address,
37
+ https_host_port=https_host_port,
38
+ )
39
+ if https_host_port != None
40
+ else ""
41
+ )
27
42
  return """###############################################################################
28
43
  # SYSTEM-GENERATED - DO NOT EDIT
29
44
  # Standalone Traefik for Flisk projects without platform/introvertic proxy files.
@@ -48,12 +63,10 @@ services:
48
63
  - "--providers.file.directory=/etc/traefik/dynamic"
49
64
  - "--providers.file.watch=true"
50
65
  - "--entrypoints.web.address=:80"
51
- - "--entrypoints.websecure.address=:443"
52
- - "--log.level={log_level}"
66
+ {https_entrypoint} - "--log.level={log_level}"
53
67
  {sablier_flags} ports:
54
68
  - "{bind_address}:{http_host_port}:80"
55
- - "{bind_address}:{https_host_port}:443"
56
- volumes:
69
+ {https_port} volumes:
57
70
  - /var/run/docker.sock:/var/run/docker.sock:ro
58
71
  - ./{dynamic_dir_name}:/etc/traefik/dynamic:ro
59
72
  {plugins_volume} networks:
@@ -75,6 +88,8 @@ volumes:
75
88
  bind_address=bind_address,
76
89
  healthcheck_timing=compose_healthcheck_timing(10),
77
90
  traefik_depends_on=_SABLIER_DEPENDS_ON if sablier_enabled else "",
91
+ https_entrypoint=https_entrypoint,
92
+ https_port=https_port,
78
93
  sablier_flags=_SABLIER_FLAGS if sablier_enabled else "",
79
94
  sablier_services=_SABLIER_SERVICES.format(
80
95
  name=name,
@@ -97,7 +97,7 @@ VERDACCIO_TRAEFIK_HOST = "verdaccio.localhost"
97
97
  # image. Without it, the second `flisk up` runs `--remove-orphans` against the
98
98
  # first project's containers and overwrites its images.
99
99
  def compose_project_name(stack):
100
- """Compose project for a stack: <project>-<stack>-autogenerated (e.g. tdk-erp-system-analytics-autogenerated)."""
100
+ """Compose project for a stack: <project>-<stack>-autogenerated (e.g. flisk-erp-system-analytics-autogenerated)."""
101
101
  return PROJECT_NAME_HYPHEN + "-" + stack + "-autogenerated"
102
102
 
103
103
  def app_image_name(stack, res_name):
@@ -105,7 +105,7 @@ def app_image_name(stack, res_name):
105
105
  return PROJECT_NAME + "_" + stack + "_" + res_name + ":dev"
106
106
 
107
107
  def infra_compose_project_name(infra):
108
- """Compose project for a shared platform stack: <project>-<infra> (e.g. tdk-erp-system-database-management)."""
108
+ """Compose project for a shared platform stack: <project>-<infra> (e.g. flisk-erp-system-database-management)."""
109
109
  return PROJECT_NAME_HYPHEN + "-" + infra
110
110
 
111
111
  def migrator_image_name(stack):
@@ -136,6 +136,7 @@ EXPOSE {port}
136
136
  CMD ["node", "src/index.js"]
137
137
  """
138
138
 
139
+
139
140
  # The watcher the Go development target runs. It compiles a change into a staging binary while the running app keeps serving, and stops
140
141
  # and swaps the app only when that build succeeds. Air was tried first and stops the app as soon as it sees a change (engine.go `start`
141
142
  # calls stopBin before buildRun), so the service stayed down for the whole compile; a Traefik health check landing in that gap kept the
@@ -247,6 +248,11 @@ def generate_language_dockerfile(res_path, language, port = BASE_PORT_BACKEND, d
247
248
  )
248
249
 
249
250
 
251
+ def is_next_frontend(manifest):
252
+ """True for a frontend whose `framework` is `next`: it runs on Node, not as a Vite build behind nginx."""
253
+ return bool(manifest) and manifest.get("appType") == "frontend" and manifest.get("framework") == "next"
254
+
255
+
250
256
  def is_provider_owned_language(manifest):
251
257
  """True when the manifest selects a provider-owned language (a missing language means Bun)."""
252
258
  if not manifest: