@flisk-sh/flisk 1.4.5 → 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.
- package/README.md +37 -14
- package/cli/dist/commands/doctor.js +50 -12
- package/cli/dist/commands/down.js +33 -1
- package/cli/dist/commands/logs.js +38 -1
- package/cli/dist/commands/project.js +11 -0
- package/cli/dist/commands/status.js +39 -10
- package/cli/dist/commands/up.js +119 -1
- package/cli/dist/commands/upgrade.js +2 -2
- package/cli/dist/utils/bun-requirement.js +7 -4
- package/cli/dist/utils/cold-preflight.js +52 -32
- package/cli/dist/utils/doctor-native.js +96 -0
- package/cli/dist/utils/native-project.js +41 -0
- package/cli/dist/utils/native-runtime.js +513 -0
- package/cli/dist/utils/native-service.js +95 -0
- package/cli/dist/utils/native-up.js +156 -0
- package/cli/dist/utils/platform.js +1 -1
- package/cli/dist/utils/project-templates.js +1 -1
- package/cli/dist/utils/service-manifest.js +19 -3
- package/cli/dist/utils/services.js +15 -2
- package/cli/dist/utils/tilt-logs.js +8 -0
- package/cli/dist-bundle/{chunk-V36PT2HF.js → chunk-BIVAAWBX.js} +1 -1
- package/cli/dist-bundle/{chunk-U42XZWXB.js → chunk-C4UFBXRD.js} +1 -1
- package/cli/dist-bundle/{chunk-CGTWXWBU.js → chunk-CAEMWNPF.js} +1 -1
- package/cli/dist-bundle/chunk-CDKEHFW6.js +35 -0
- package/cli/dist-bundle/{chunk-LUUJ4JB7.js → chunk-DPQK5TIS.js} +1 -1
- package/cli/dist-bundle/chunk-ETXZ5LUG.js +18 -0
- package/cli/dist-bundle/chunk-GT76VMUL.js +130 -0
- package/cli/dist-bundle/{chunk-4J2FLFUA.js → chunk-IDNES5PE.js} +1 -1
- package/cli/dist-bundle/{chunk-SFOFTVYM.js → chunk-MUDE4DZD.js} +1 -1
- package/cli/dist-bundle/{chunk-BP2M4OJ4.js → chunk-QEBN6ZVQ.js} +1 -1
- package/cli/dist-bundle/{chunk-VMVTECCK.js → chunk-R7DWXISM.js} +1 -1
- package/cli/dist-bundle/{chunk-Z5QEE4SW.js → chunk-U5FCQF42.js} +1 -1
- package/cli/dist-bundle/{chunk-TIYTGN5R.js → chunk-WCGBVETR.js} +1 -1
- package/cli/dist-bundle/cli.js +357 -352
- package/cli/dist-bundle/cold-preflight-KUWOL2Q2.js +2 -0
- package/cli/dist-bundle/{demo-stage-G4W23BXW.js → demo-stage-QCC4IWXR.js} +1 -1
- package/cli/dist-bundle/{open-HQFT6WDC.js → open-AZNX4AC5.js} +1 -1
- package/cli/dist-bundle/project-5SWIGCNP.js +2 -0
- package/cli/dist-bundle/{project-templates-IMJ3OX5I.js → project-templates-2VQPUBSQ.js} +1 -1
- package/cli/dist-bundle/{services-GLFKZBBZ.js → services-EY5WKPHQ.js} +1 -1
- package/cli/dist-bundle/{tilt-port-owner-PJN4MPYE.js → tilt-port-owner-UBU6JWOA.js} +1 -1
- package/cli/package.json +1 -1
- package/examples/{tdk-example → flisk-example}/README.md +2 -2
- package/package.json +2 -2
- package/runtime/discovery/AGENTS.md +1 -1
- package/runtime/discovery/TILT_DISCOVERY.star +1 -1
- package/runtime/discovery/deterministic.star +1 -1
- package/runtime/engine/AGENTS.md +3 -3
- package/runtime/engine/README.md +1 -1
- package/runtime/engine/REFACTORING_MANIFEST_SYSTEM.md +1 -1
- package/runtime/engine/assets/docker/wake-gateway/decide.ts +1 -1
- package/runtime/engine/assets/docker/wake-gateway/server.ts +2 -2
- package/runtime/engine/assets/scripts/mac-m1-resource-monitor.sh +6 -6
- package/runtime/engine/schemas/service-schema.json +99 -21
- package/runtime/engine/scripts/debug-container.sh +1 -1
- package/runtime/engine/scripts/generate-manifest.sh +2 -2
- package/runtime/engine/topologies/platform/docker/compose/traefik_standalone.star +19 -4
- package/runtime/engine/topologies/platform/docker/constants.star +2 -2
- package/runtime/engine/topologies/platform/docker/networking/traefik_static_routes.star +2 -2
- package/runtime/engine/topologies/tilt/manifest/mapper.star +1 -1
- package/runtime/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +1 -1
- package/runtime/ext/ide-components/README.md +1 -1
- package/runtime/ext/ui-enhancements/extension.yaml +2 -2
- package/runtime/specs/specs/TILT_SERVICE_DEFAULTS.star +1 -1
- package/runtime/specs/specs/TILT_TECH_STACK.star +1 -1
- package/cli/dist-bundle/chunk-BMHPPX2Q.js +0 -35
- package/cli/dist-bundle/chunk-PEZQEZVV.js +0 -17
- package/cli/dist-bundle/chunk-ULMQVD7J.js +0 -122
- package/cli/dist-bundle/cold-preflight-3BNDOLGS.js +0 -2
- package/cli/dist-bundle/project-JZO2CPZZ.js +0 -2
- /package/examples/{tdk-example → flisk-example}/LICENSE +0 -0
- /package/examples/{tdk-example → flisk-example}/TILT_SERVICE_DEFAULTS.star +0 -0
- /package/examples/{tdk-example → flisk-example}/TILT_TECH_STACK.star +0 -0
- /package/examples/{tdk-example → flisk-example}/Tiltfile +0 -0
- /package/examples/{tdk-example → flisk-example}/services/platform/messaging/docker-compose.yml +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/package.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/service.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/src/index.ts +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/index.html +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/package.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/public/.gitkeep +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/service.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/main.tsx +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/orders.tsx +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/style.css +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/package.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/service.json +0 -0
- /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-
|
|
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{d as a,e as b,f as c,g as d,h as e,i as f}from"./chunk-
|
|
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-
|
|
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{
|
|
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-
|
|
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
|
@@ -10,10 +10,10 @@ flisk project --yes
|
|
|
10
10
|
flisk up
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Open `http://app.
|
|
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.
|
|
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.
|
|
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/
|
|
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
|
|
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
|
|
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
|
|
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
|
|
package/runtime/engine/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
disable: false
|
|
3
|
-
description: Topology specialist for Flisk
|
|
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
|
|
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
|
|
542
|
+
# Load from topologies (Flisk pattern)
|
|
543
543
|
load('../../../platform/docker/index.star', 'Docker')
|
|
544
544
|
```
|
|
545
545
|
|
package/runtime/engine/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Tilt Platform Framework Code**
|
|
6
6
|
|
|
7
|
-
This directory contains the Flisk
|
|
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
|
|
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
|
-
*
|
|
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
|
-
* "
|
|
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. "
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
45
|
+
echo -e "${GREEN}📊 Running Flisk Containers:${NC}"
|
|
46
46
|
echo "=================================================="
|
|
47
47
|
|
|
48
|
-
# Get detailed stats for Flisk
|
|
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": "^
|
|
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
|
|
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
|
|
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
|
|
40
|
+
║ 🎯 Flisk RESOURCE MANIFEST GENERATOR ║
|
|
41
41
|
╚═══════════════════════════════════════════════════════════════════╝${NC}
|
|
42
42
|
|
|
43
43
|
${YELLOW}Usage:${NC}
|
|
@@ -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
|
-
- "--
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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):
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# Config for a request travels to the gateway via headers (X-Wake-*), not
|
|
18
18
|
# the path/query. The route still strips the same `apiPath` prefix the real
|
|
19
19
|
# Docker-label `-project` router strips (get_backend_traefik_labels) before
|
|
20
|
-
# forwarding -- confirmed live against
|
|
20
|
+
# forwarding -- confirmed live against flisk-erp-system (task 7.2) that a
|
|
21
21
|
# backend's app only serves its bare health path (e.g. `/health`), not the
|
|
22
22
|
# full `/api/{name}/health` the public route is matched on; without this, the
|
|
23
23
|
# gateway's own proxy-through would forward the unstripped path once healthy
|
|
@@ -61,7 +61,7 @@ def _container_name(compose_project_name, res_name):
|
|
|
61
61
|
Confirmed empirically against a live Flisk container (analytics-autogenerated
|
|
62
62
|
-data-governance-api-1) -- see design.md D2 Context. Compose projects are now
|
|
63
63
|
<project>-<stack>-autogenerated, so the name starts with the Flisk project too
|
|
64
|
-
(
|
|
64
|
+
(flisk-erp-system-analytics-autogenerated-data-governance-api-1). Always replica 1: a
|
|
65
65
|
deferred resource's replica count is unrelated to which single instance
|
|
66
66
|
the wake gateway needs to address."""
|
|
67
67
|
return compose_project_name + "-" + res_name + "-1"
|
|
@@ -190,7 +190,7 @@ def map_manifest(manifest, target_format='internal'):
|
|
|
190
190
|
def _to_yaml_format(internal_manifest):
|
|
191
191
|
"""Convert internal format to YAML hierarchical format."""
|
|
192
192
|
return {
|
|
193
|
-
'apiVersion': 'tilt.
|
|
193
|
+
'apiVersion': 'tilt.flisk.io/v1',
|
|
194
194
|
'kind': 'ResourceManifest',
|
|
195
195
|
'metadata': {
|
|
196
196
|
'name': internal_manifest.get('appName', ''),
|
|
@@ -429,7 +429,7 @@ def _register_deferred_image_prebuild(config, auto_init_apps):
|
|
|
429
429
|
"""Build a deferStart resource's image during `flisk up` without creating its container.
|
|
430
430
|
|
|
431
431
|
`auto_init=False` on the dc_resource skips its docker_build too (confirmed
|
|
432
|
-
live on
|
|
432
|
+
live on flisk-erp-system, task 7.2), so a fresh project's first request would
|
|
433
433
|
find no image and the wake gateway would fall back to `tilt trigger`, which
|
|
434
434
|
queues behind every other build. This local_resource builds the same image
|
|
435
435
|
(same Dockerfile and target as docker_build: `production`, or `development` for Go with `dev.liveReload`; host network, and an allowlist
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# UI Enhancements Extension for Flisk
|
|
1
|
+
# UI Enhancements Extension for Flisk Tilt IDE
|
|
2
2
|
# Provides tooltips, icons, help panels, and cron jobs monitoring
|
|
3
3
|
|
|
4
4
|
name: ui-enhancements
|
|
5
5
|
version: 1.0.0
|
|
6
|
-
author: Flisk
|
|
6
|
+
author: Flisk Platform Team
|
|
7
7
|
description: |
|
|
8
8
|
Enhances the Tilt web UI with:
|
|
9
9
|
- Contextual tooltips for all resources
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# 🔧 TILT SERVICE DEFAULTS MASTER CONFIG
|
|
7
7
|
# =============================================================================
|
|
8
8
|
#
|
|
9
|
-
# Defines standard configurations for all services in the Flisk
|
|
9
|
+
# Defines standard configurations for all services in the Flisk platform.
|
|
10
10
|
# This provides consistent port allocation, health checks, and build settings.
|
|
11
11
|
#
|
|
12
12
|
# See: docs/TILT_MASTER_CONFIGS.md
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# 🏗️ TILT TECH STACK MASTER CONFIG
|
|
7
7
|
# =============================================================================
|
|
8
8
|
#
|
|
9
|
-
# Defines the approved technology choices for the Flisk
|
|
9
|
+
# Defines the approved technology choices for the Flisk platform.
|
|
10
10
|
# This is the single source of truth for tech stack validation.
|
|
11
11
|
#
|
|
12
12
|
# See: docs/TILT_MASTER_CONFIGS.md
|