@boxes-dev/dvb 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/dvb.cjs +28232 -0
- package/dist/bin/dvb.d.ts +2 -0
- package/dist/bin/dvb.d.ts.map +1 -0
- package/dist/bin/dvb.js +71 -0
- package/dist/bin/dvb.js.map +1 -0
- package/dist/bin/dvbd.cjs +11816 -0
- package/dist/bin/dvbd.d.ts +2 -0
- package/dist/bin/dvbd.d.ts.map +1 -0
- package/dist/bin/dvbd.js +20 -0
- package/dist/bin/dvbd.js.map +1 -0
- package/dist/codex/services-schema.json +59 -0
- package/dist/codex/setup-schema.json +176 -0
- package/dist/devbox/auth.d.ts +17 -0
- package/dist/devbox/auth.d.ts.map +1 -0
- package/dist/devbox/auth.js +302 -0
- package/dist/devbox/auth.js.map +1 -0
- package/dist/devbox/cli.d.ts +2 -0
- package/dist/devbox/cli.d.ts.map +1 -0
- package/dist/devbox/cli.js +142 -0
- package/dist/devbox/cli.js.map +1 -0
- package/dist/devbox/commands/agent.d.ts +21 -0
- package/dist/devbox/commands/agent.d.ts.map +1 -0
- package/dist/devbox/commands/agent.js +257 -0
- package/dist/devbox/commands/agent.js.map +1 -0
- package/dist/devbox/commands/boxSelect.d.ts +14 -0
- package/dist/devbox/commands/boxSelect.d.ts.map +1 -0
- package/dist/devbox/commands/boxSelect.js +82 -0
- package/dist/devbox/commands/boxSelect.js.map +1 -0
- package/dist/devbox/commands/connect.d.ts +8 -0
- package/dist/devbox/commands/connect.d.ts.map +1 -0
- package/dist/devbox/commands/connect.js +1369 -0
- package/dist/devbox/commands/connect.js.map +1 -0
- package/dist/devbox/commands/daemon.d.ts +4 -0
- package/dist/devbox/commands/daemon.d.ts.map +1 -0
- package/dist/devbox/commands/daemon.js +36 -0
- package/dist/devbox/commands/daemon.js.map +1 -0
- package/dist/devbox/commands/destroy.d.ts +2 -0
- package/dist/devbox/commands/destroy.d.ts.map +1 -0
- package/dist/devbox/commands/destroy.js +131 -0
- package/dist/devbox/commands/destroy.js.map +1 -0
- package/dist/devbox/commands/init/args.d.ts +12 -0
- package/dist/devbox/commands/init/args.d.ts.map +1 -0
- package/dist/devbox/commands/init/args.js +42 -0
- package/dist/devbox/commands/init/args.js.map +1 -0
- package/dist/devbox/commands/init/codex/artifacts.d.ts +26 -0
- package/dist/devbox/commands/init/codex/artifacts.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/artifacts.js +108 -0
- package/dist/devbox/commands/init/codex/artifacts.js.map +1 -0
- package/dist/devbox/commands/init/codex/index.d.ts +35 -0
- package/dist/devbox/commands/init/codex/index.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/index.js +147 -0
- package/dist/devbox/commands/init/codex/index.js.map +1 -0
- package/dist/devbox/commands/init/codex/local.d.ts +19 -0
- package/dist/devbox/commands/init/codex/local.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/local.js +189 -0
- package/dist/devbox/commands/init/codex/local.js.map +1 -0
- package/dist/devbox/commands/init/codex/plan.d.ts +61 -0
- package/dist/devbox/commands/init/codex/plan.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/plan.js +39 -0
- package/dist/devbox/commands/init/codex/plan.js.map +1 -0
- package/dist/devbox/commands/init/codex/prompts.d.ts +6 -0
- package/dist/devbox/commands/init/codex/prompts.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/prompts.js +26 -0
- package/dist/devbox/commands/init/codex/prompts.js.map +1 -0
- package/dist/devbox/commands/init/codex/remote.d.ts +56 -0
- package/dist/devbox/commands/init/codex/remote.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/remote.js +395 -0
- package/dist/devbox/commands/init/codex/remote.js.map +1 -0
- package/dist/devbox/commands/init/codex/template.d.ts +3 -0
- package/dist/devbox/commands/init/codex/template.d.ts.map +1 -0
- package/dist/devbox/commands/init/codex/template.js +3 -0
- package/dist/devbox/commands/init/codex/template.js.map +1 -0
- package/dist/devbox/commands/init/index.d.ts +2 -0
- package/dist/devbox/commands/init/index.d.ts.map +1 -0
- package/dist/devbox/commands/init/index.js +1117 -0
- package/dist/devbox/commands/init/index.js.map +1 -0
- package/dist/devbox/commands/init/packaging.d.ts +5 -0
- package/dist/devbox/commands/init/packaging.d.ts.map +1 -0
- package/dist/devbox/commands/init/packaging.js +86 -0
- package/dist/devbox/commands/init/packaging.js.map +1 -0
- package/dist/devbox/commands/init/registry.d.ts +14 -0
- package/dist/devbox/commands/init/registry.d.ts.map +1 -0
- package/dist/devbox/commands/init/registry.js +61 -0
- package/dist/devbox/commands/init/registry.js.map +1 -0
- package/dist/devbox/commands/init/remote.d.ts +38 -0
- package/dist/devbox/commands/init/remote.d.ts.map +1 -0
- package/dist/devbox/commands/init/remote.js +554 -0
- package/dist/devbox/commands/init/remote.js.map +1 -0
- package/dist/devbox/commands/init/repo.d.ts +31 -0
- package/dist/devbox/commands/init/repo.d.ts.map +1 -0
- package/dist/devbox/commands/init/repo.js +164 -0
- package/dist/devbox/commands/init/repo.js.map +1 -0
- package/dist/devbox/commands/init/scripts.d.ts +3 -0
- package/dist/devbox/commands/init/scripts.d.ts.map +1 -0
- package/dist/devbox/commands/init/scripts.js +15 -0
- package/dist/devbox/commands/init/scripts.js.map +1 -0
- package/dist/devbox/commands/init/ssh.d.ts +19 -0
- package/dist/devbox/commands/init/ssh.d.ts.map +1 -0
- package/dist/devbox/commands/init/ssh.js +270 -0
- package/dist/devbox/commands/init/ssh.js.map +1 -0
- package/dist/devbox/commands/init/state.d.ts +31 -0
- package/dist/devbox/commands/init/state.d.ts.map +1 -0
- package/dist/devbox/commands/init/state.js +25 -0
- package/dist/devbox/commands/init/state.js.map +1 -0
- package/dist/devbox/commands/list.d.ts +2 -0
- package/dist/devbox/commands/list.d.ts.map +1 -0
- package/dist/devbox/commands/list.js +213 -0
- package/dist/devbox/commands/list.js.map +1 -0
- package/dist/devbox/commands/listFormatting.d.ts +27 -0
- package/dist/devbox/commands/listFormatting.d.ts.map +1 -0
- package/dist/devbox/commands/listFormatting.js +155 -0
- package/dist/devbox/commands/listFormatting.js.map +1 -0
- package/dist/devbox/commands/logout.d.ts +2 -0
- package/dist/devbox/commands/logout.d.ts.map +1 -0
- package/dist/devbox/commands/logout.js +45 -0
- package/dist/devbox/commands/logout.js.map +1 -0
- package/dist/devbox/commands/mount.d.ts +3 -0
- package/dist/devbox/commands/mount.d.ts.map +1 -0
- package/dist/devbox/commands/mount.js +144 -0
- package/dist/devbox/commands/mount.js.map +1 -0
- package/dist/devbox/commands/mountSsh.d.ts +12 -0
- package/dist/devbox/commands/mountSsh.d.ts.map +1 -0
- package/dist/devbox/commands/mountSsh.js +137 -0
- package/dist/devbox/commands/mountSsh.js.map +1 -0
- package/dist/devbox/commands/ports.d.ts +2 -0
- package/dist/devbox/commands/ports.d.ts.map +1 -0
- package/dist/devbox/commands/ports.js +145 -0
- package/dist/devbox/commands/ports.js.map +1 -0
- package/dist/devbox/commands/services.d.ts +2 -0
- package/dist/devbox/commands/services.d.ts.map +1 -0
- package/dist/devbox/commands/services.js +552 -0
- package/dist/devbox/commands/services.js.map +1 -0
- package/dist/devbox/commands/servicesToml.d.ts +13 -0
- package/dist/devbox/commands/servicesToml.d.ts.map +1 -0
- package/dist/devbox/commands/servicesToml.js +198 -0
- package/dist/devbox/commands/servicesToml.js.map +1 -0
- package/dist/devbox/commands/sessionUtils.d.ts +10 -0
- package/dist/devbox/commands/sessionUtils.d.ts.map +1 -0
- package/dist/devbox/commands/sessionUtils.js +48 -0
- package/dist/devbox/commands/sessionUtils.js.map +1 -0
- package/dist/devbox/commands/sessions.d.ts +2 -0
- package/dist/devbox/commands/sessions.d.ts.map +1 -0
- package/dist/devbox/commands/sessions.js +425 -0
- package/dist/devbox/commands/sessions.js.map +1 -0
- package/dist/devbox/commands/setup.d.ts +2 -0
- package/dist/devbox/commands/setup.d.ts.map +1 -0
- package/dist/devbox/commands/setup.js +183 -0
- package/dist/devbox/commands/setup.js.map +1 -0
- package/dist/devbox/commands/wezterm.d.ts +3 -0
- package/dist/devbox/commands/wezterm.d.ts.map +1 -0
- package/dist/devbox/commands/wezterm.js +878 -0
- package/dist/devbox/commands/wezterm.js.map +1 -0
- package/dist/devbox/completions/cache.d.ts +59 -0
- package/dist/devbox/completions/cache.d.ts.map +1 -0
- package/dist/devbox/completions/cache.js +122 -0
- package/dist/devbox/completions/cache.js.map +1 -0
- package/dist/devbox/completions/index.d.ts +14 -0
- package/dist/devbox/completions/index.d.ts.map +1 -0
- package/dist/devbox/completions/index.js +796 -0
- package/dist/devbox/completions/index.js.map +1 -0
- package/dist/devbox/controlPlane.d.ts +44 -0
- package/dist/devbox/controlPlane.d.ts.map +1 -0
- package/dist/devbox/controlPlane.js +310 -0
- package/dist/devbox/controlPlane.js.map +1 -0
- package/dist/devbox/daemonClient.d.ts +28 -0
- package/dist/devbox/daemonClient.d.ts.map +1 -0
- package/dist/devbox/daemonClient.js +276 -0
- package/dist/devbox/daemonClient.js.map +1 -0
- package/dist/devbox/latency.d.ts +25 -0
- package/dist/devbox/latency.d.ts.map +1 -0
- package/dist/devbox/latency.js +186 -0
- package/dist/devbox/latency.js.map +1 -0
- package/dist/devbox/logger.d.ts +2 -0
- package/dist/devbox/logger.d.ts.map +1 -0
- package/dist/devbox/logger.js +3 -0
- package/dist/devbox/logger.js.map +1 -0
- package/dist/devbox/terminal/osc.d.ts +10 -0
- package/dist/devbox/terminal/osc.d.ts.map +1 -0
- package/dist/devbox/terminal/osc.js +88 -0
- package/dist/devbox/terminal/osc.js.map +1 -0
- package/dist/devbox/types.d.ts +4 -0
- package/dist/devbox/types.d.ts.map +1 -0
- package/dist/devbox/types.js +2 -0
- package/dist/devbox/types.js.map +1 -0
- package/dist/devbox/ui/colors.d.ts +19 -0
- package/dist/devbox/ui/colors.d.ts.map +1 -0
- package/dist/devbox/ui/colors.js +22 -0
- package/dist/devbox/ui/colors.js.map +1 -0
- package/dist/devbox/ui/statusLine.d.ts +14 -0
- package/dist/devbox/ui/statusLine.d.ts.map +1 -0
- package/dist/devbox/ui/statusLine.js +90 -0
- package/dist/devbox/ui/statusLine.js.map +1 -0
- package/dist/devbox/weztermMux.d.ts +11 -0
- package/dist/devbox/weztermMux.d.ts.map +1 -0
- package/dist/devbox/weztermMux.js +11 -0
- package/dist/devbox/weztermMux.js.map +1 -0
- package/dist/prompts/local-scan.md +32 -0
- package/dist/prompts/local-services-scan.md +17 -0
- package/dist/prompts/remote-apply.md +370 -0
- package/dist/scripts/fix-bashrc.sh +48 -0
- package/package.json +38 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
type StyleName = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white" | "gray" | "dim" | "bold" | "italic" | "underline";
|
|
2
|
+
export declare const colors: {
|
|
3
|
+
style: (text: string, styles: StyleName | StyleName[]) => string;
|
|
4
|
+
cyan: (text: string) => string;
|
|
5
|
+
green: (text: string) => string;
|
|
6
|
+
yellow: (text: string) => string;
|
|
7
|
+
red: (text: string) => string;
|
|
8
|
+
magenta: (text: string) => string;
|
|
9
|
+
blue: (text: string) => string;
|
|
10
|
+
dim: (text: string) => string;
|
|
11
|
+
gray: (text: string) => string;
|
|
12
|
+
white: (text: string) => string;
|
|
13
|
+
boldWhite: (text: string) => string;
|
|
14
|
+
bold: (text: string) => string;
|
|
15
|
+
italic: (text: string) => string;
|
|
16
|
+
muted: (text: string) => string;
|
|
17
|
+
};
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../../src/devbox/ui/colors.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GACV,OAAO,GACP,KAAK,GACL,OAAO,GACP,QAAQ,GACR,MAAM,GACN,SAAS,GACT,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,MAAM,GACN,QAAQ,GACR,WAAW,CAAC;AAOhB,eAAO,MAAM,MAAM;kBALQ,MAAM,UAAU,SAAS,GAAG,SAAS,EAAE;iBAOnD,MAAM;kBACL,MAAM;mBACL,MAAM;gBACT,MAAM;oBACF,MAAM;iBACT,MAAM;gBACP,MAAM;iBACL,MAAM;kBACL,MAAM;sBACF,MAAM;iBACX,MAAM;mBACJ,MAAM;kBACP,MAAM;CACrB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { styleText } from "node:util";
|
|
2
|
+
const applyStyles = (text, styles) => {
|
|
3
|
+
const list = Array.isArray(styles) ? styles : [styles];
|
|
4
|
+
return list.reduce((acc, style) => styleText(style, acc), text);
|
|
5
|
+
};
|
|
6
|
+
export const colors = {
|
|
7
|
+
style: applyStyles,
|
|
8
|
+
cyan: (text) => applyStyles(text, "cyan"),
|
|
9
|
+
green: (text) => applyStyles(text, "green"),
|
|
10
|
+
yellow: (text) => applyStyles(text, "yellow"),
|
|
11
|
+
red: (text) => applyStyles(text, "red"),
|
|
12
|
+
magenta: (text) => applyStyles(text, "magenta"),
|
|
13
|
+
blue: (text) => applyStyles(text, "blue"),
|
|
14
|
+
dim: (text) => applyStyles(text, "dim"),
|
|
15
|
+
gray: (text) => applyStyles(text, "gray"),
|
|
16
|
+
white: (text) => applyStyles(text, "white"),
|
|
17
|
+
boldWhite: (text) => applyStyles(text, ["bold", "white"]),
|
|
18
|
+
bold: (text) => applyStyles(text, "bold"),
|
|
19
|
+
italic: (text) => applyStyles(text, "italic"),
|
|
20
|
+
muted: (text) => applyStyles(text, ["gray", "italic"]),
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../../src/devbox/ui/colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAiBtC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,MAA+B,EAAE,EAAE;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAClE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,WAAW;IAClB,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC;IACnD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;IACrD,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;IAC/C,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC;IACvD,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;IACjD,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;IAC/C,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC;IACnD,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjE,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;IACjD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;IACrD,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC/D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type StatusTone = "info" | "success" | "warn" | "error";
|
|
2
|
+
type StatusLineOptions = {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
stream?: NodeJS.WriteStream;
|
|
5
|
+
};
|
|
6
|
+
type StatusLine = {
|
|
7
|
+
stage: (text: string, tone?: StatusTone) => void;
|
|
8
|
+
persist: (text: string, tone?: StatusTone) => void;
|
|
9
|
+
fail: (text: string) => void;
|
|
10
|
+
stop: () => void;
|
|
11
|
+
};
|
|
12
|
+
export declare const createStatusLine: ({ enabled, stream, }: StatusLineOptions) => StatusLine;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=statusLine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusLine.d.ts","sourceRoot":"","sources":["../../../src/devbox/ui/statusLine.ts"],"names":[],"mappings":"AAGA,KAAK,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAExD,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;CAC7B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACnD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AA0BF,eAAO,MAAM,gBAAgB,GAAI,sBAG9B,iBAAiB,KAAG,UA+DtB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import ora, {} from "ora";
|
|
2
|
+
import { colors } from "./colors.js";
|
|
3
|
+
const formatStage = (text, tone) => {
|
|
4
|
+
switch (tone) {
|
|
5
|
+
case "success":
|
|
6
|
+
return colors.green(text);
|
|
7
|
+
case "warn":
|
|
8
|
+
return colors.yellow(text);
|
|
9
|
+
case "error":
|
|
10
|
+
return colors.red(text);
|
|
11
|
+
case "info":
|
|
12
|
+
default:
|
|
13
|
+
return colors.cyan(text);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const formatPersist = (text, tone) => {
|
|
17
|
+
if (tone === "error")
|
|
18
|
+
return colors.red(text);
|
|
19
|
+
if (tone === "warn")
|
|
20
|
+
return colors.yellow(text);
|
|
21
|
+
if (tone === "success")
|
|
22
|
+
return colors.green(text);
|
|
23
|
+
return colors.muted(text);
|
|
24
|
+
};
|
|
25
|
+
export const createStatusLine = ({ enabled, stream = process.stderr, }) => {
|
|
26
|
+
if (!enabled) {
|
|
27
|
+
return {
|
|
28
|
+
stage: () => { },
|
|
29
|
+
persist: () => { },
|
|
30
|
+
fail: () => { },
|
|
31
|
+
stop: () => { },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
let spinner = null;
|
|
35
|
+
let done = false;
|
|
36
|
+
const ensureSpinner = (text, tone) => {
|
|
37
|
+
if (done)
|
|
38
|
+
return;
|
|
39
|
+
const formatted = formatStage(text, tone);
|
|
40
|
+
if (spinner) {
|
|
41
|
+
spinner.text = formatted;
|
|
42
|
+
if (!spinner.isSpinning)
|
|
43
|
+
spinner.start();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const options = {
|
|
47
|
+
text: formatted,
|
|
48
|
+
stream,
|
|
49
|
+
color: "white",
|
|
50
|
+
discardStdin: false,
|
|
51
|
+
};
|
|
52
|
+
spinner = ora(options).start();
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
stage: (text, tone = "info") => {
|
|
56
|
+
ensureSpinner(text, tone);
|
|
57
|
+
},
|
|
58
|
+
persist: (text, tone = "info") => {
|
|
59
|
+
if (done)
|
|
60
|
+
return;
|
|
61
|
+
done = true;
|
|
62
|
+
const formatted = formatPersist(text, tone);
|
|
63
|
+
if (spinner) {
|
|
64
|
+
spinner.stopAndPersist({ symbol: "", text: formatted });
|
|
65
|
+
spinner = null;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
stream.write(`${formatted}\n`);
|
|
69
|
+
},
|
|
70
|
+
fail: (text) => {
|
|
71
|
+
if (done)
|
|
72
|
+
return;
|
|
73
|
+
done = true;
|
|
74
|
+
const formatted = formatStage(text, "error");
|
|
75
|
+
if (spinner) {
|
|
76
|
+
spinner.fail(formatted);
|
|
77
|
+
spinner = null;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
stream.write(`${formatted}\n`);
|
|
81
|
+
},
|
|
82
|
+
stop: () => {
|
|
83
|
+
if (spinner) {
|
|
84
|
+
spinner.stop();
|
|
85
|
+
spinner = null;
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=statusLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusLine.js","sourceRoot":"","sources":["../../../src/devbox/ui/statusLine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const WEZTERM_MUX_DIR = "/home/sprite/.devbox/wezterm";
|
|
2
|
+
declare const WEZTERM_MUX_BIN_DIR = "/home/sprite/.devbox/wezterm/bin";
|
|
3
|
+
declare const WEZTERM_MUX_ENV_PATH = "/home/sprite/.devbox/wezterm/env";
|
|
4
|
+
declare const WEZTERM_MUX_INSTALL_DIR = "/home/sprite/.devbox/wezterm/opt";
|
|
5
|
+
declare const WEZTERM_MUX_SOCKET_PATH = "/home/sprite/.devbox/wezterm/sock";
|
|
6
|
+
declare const WEZTERM_MUX_CONFIG_PATH = "/home/sprite/.devbox/wezterm/wezterm.lua";
|
|
7
|
+
declare const WEZTERM_MUX_RUNNER_PATH = "/home/sprite/.devbox/wezterm/run-mux.sh";
|
|
8
|
+
declare const WEZTERM_MUX_SERVICE_NAME = "devbox-wezterm-mux";
|
|
9
|
+
declare const WEZTERM_MUX_TCP_PORT = 32123;
|
|
10
|
+
export { WEZTERM_MUX_BIN_DIR, WEZTERM_MUX_CONFIG_PATH, WEZTERM_MUX_DIR, WEZTERM_MUX_ENV_PATH, WEZTERM_MUX_INSTALL_DIR, WEZTERM_MUX_RUNNER_PATH, WEZTERM_MUX_SERVICE_NAME, WEZTERM_MUX_SOCKET_PATH, WEZTERM_MUX_TCP_PORT, };
|
|
11
|
+
//# sourceMappingURL=weztermMux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weztermMux.d.ts","sourceRoot":"","sources":["../../src/devbox/weztermMux.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,eAAe,iCAAiC,CAAC;AACvD,QAAA,MAAM,mBAAmB,qCAA2B,CAAC;AACrD,QAAA,MAAM,oBAAoB,qCAA2B,CAAC;AACtD,QAAA,MAAM,uBAAuB,qCAA2B,CAAC;AACzD,QAAA,MAAM,uBAAuB,sCAA4B,CAAC;AAC1D,QAAA,MAAM,uBAAuB,6CAAmC,CAAC;AACjE,QAAA,MAAM,uBAAuB,4CAAkC,CAAC;AAChE,QAAA,MAAM,wBAAwB,uBAAuB,CAAC;AACtD,QAAA,MAAM,oBAAoB,QAAQ,CAAC;AAEnC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const WEZTERM_MUX_DIR = "/home/sprite/.devbox/wezterm";
|
|
2
|
+
const WEZTERM_MUX_BIN_DIR = `${WEZTERM_MUX_DIR}/bin`;
|
|
3
|
+
const WEZTERM_MUX_ENV_PATH = `${WEZTERM_MUX_DIR}/env`;
|
|
4
|
+
const WEZTERM_MUX_INSTALL_DIR = `${WEZTERM_MUX_DIR}/opt`;
|
|
5
|
+
const WEZTERM_MUX_SOCKET_PATH = `${WEZTERM_MUX_DIR}/sock`;
|
|
6
|
+
const WEZTERM_MUX_CONFIG_PATH = `${WEZTERM_MUX_DIR}/wezterm.lua`;
|
|
7
|
+
const WEZTERM_MUX_RUNNER_PATH = `${WEZTERM_MUX_DIR}/run-mux.sh`;
|
|
8
|
+
const WEZTERM_MUX_SERVICE_NAME = "devbox-wezterm-mux";
|
|
9
|
+
const WEZTERM_MUX_TCP_PORT = 32123;
|
|
10
|
+
export { WEZTERM_MUX_BIN_DIR, WEZTERM_MUX_CONFIG_PATH, WEZTERM_MUX_DIR, WEZTERM_MUX_ENV_PATH, WEZTERM_MUX_INSTALL_DIR, WEZTERM_MUX_RUNNER_PATH, WEZTERM_MUX_SERVICE_NAME, WEZTERM_MUX_SOCKET_PATH, WEZTERM_MUX_TCP_PORT, };
|
|
11
|
+
//# sourceMappingURL=weztermMux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weztermMux.js","sourceRoot":"","sources":["../../src/devbox/weztermMux.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,8BAA8B,CAAC;AACvD,MAAM,mBAAmB,GAAG,GAAG,eAAe,MAAM,CAAC;AACrD,MAAM,oBAAoB,GAAG,GAAG,eAAe,MAAM,CAAC;AACtD,MAAM,uBAAuB,GAAG,GAAG,eAAe,MAAM,CAAC;AACzD,MAAM,uBAAuB,GAAG,GAAG,eAAe,OAAO,CAAC;AAC1D,MAAM,uBAAuB,GAAG,GAAG,eAAe,cAAc,CAAC;AACjE,MAAM,uBAAuB,GAAG,GAAG,eAAe,aAAa,CAAC;AAChE,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;AACtD,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAEnC,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,GACrB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
We're migrating this dev environment from the current macOS to a Linux-based devbox. It will solely be used for local development of this repo.
|
|
2
|
+
Your task is to create a detailed inventory of everything needed to recreate the local dev environment.
|
|
3
|
+
We'll already have the repo checked out, so focus on any other dependencies, configs, and files needed for local operation.
|
|
4
|
+
Exhaustively scan this repo and the local environment for anything needed to recreate this dev environment from scratch.
|
|
5
|
+
Only include items that are required for local operation.
|
|
6
|
+
Do not include secret values.
|
|
7
|
+
|
|
8
|
+
Return JSON with this shape:
|
|
9
|
+
- schemaVersion: number (use 2)
|
|
10
|
+
- envFiles: [{ name, path, vars, usage }]
|
|
11
|
+
- envFiles are untracked .env-style files in the repo
|
|
12
|
+
- vars is a list of { name, value, isSecret, commented, hasValue }
|
|
13
|
+
- hasValue is true if the variable has a non-empty value (even if commented)
|
|
14
|
+
- value should be present for non-secret vars; use null for secrets
|
|
15
|
+
- usage should mention where the file / env vars consumed (briefly)
|
|
16
|
+
- secretFiles: [{ name, path, description }]
|
|
17
|
+
- untracked non-.env files that include secrets or configs needed locally
|
|
18
|
+
- "description" should name the secrets/configs by name (no values)
|
|
19
|
+
- extraArtifacts: [{ name, path, description }]
|
|
20
|
+
- other untracked files or directories that seem required for local operation
|
|
21
|
+
- keep this list tight; prefer listing a directory if all contents are needed rather than many individual files
|
|
22
|
+
- "description" should explain very briefly what the artifact(s) appear to be used for
|
|
23
|
+
- externalDependencies: [{ name, version, evidence }]
|
|
24
|
+
- dependencies not installed by repo scripts but needed locally
|
|
25
|
+
- these can be CLIs, runtimes, global tools, etc.
|
|
26
|
+
- "version" refers to either the required or, if not clear, the installed version on local
|
|
27
|
+
- evidence can mention where you inferred it, should be very short
|
|
28
|
+
- externalConfigs: [{ name, path, description }]
|
|
29
|
+
- config/secret files outside the repo that are required for local operation
|
|
30
|
+
- "description" should explain why they appear to be needed
|
|
31
|
+
|
|
32
|
+
Return only JSON that matches the provided schema.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
We're capturing how to run this repo locally and any background services expected during local development.
|
|
2
|
+
Scan the repo to find the primary command(s) a developer should run from the repo root to start the app locally.
|
|
3
|
+
Also identify any background services the app expects to be running for local development.
|
|
4
|
+
Only include commands that are required or explicitly documented in this repo.
|
|
5
|
+
Do not include secret values.
|
|
6
|
+
|
|
7
|
+
Return JSON with this shape:
|
|
8
|
+
- schemaVersion: number (use 1)
|
|
9
|
+
- appEntrypoints: [{ command, description }]
|
|
10
|
+
- command should be the exact command to run from the repo root
|
|
11
|
+
- description should be a short, human-readable explanation of what the command does
|
|
12
|
+
- backgroundServices: [{ name, command, httpPort }]
|
|
13
|
+
- name should be a short identifier (e.g. "postgres")
|
|
14
|
+
- command should be the full command string to start the service
|
|
15
|
+
- httpPort is the HTTP port for proxy routing, or null if not applicable/unknown
|
|
16
|
+
|
|
17
|
+
Return only JSON that matches the provided schema.
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
You're on headless dev machine, running on a Fly.io "sprite" with Ubuntu 25.04.
|
|
2
|
+
It's a full linux environment with root access, and local ports are forwarded, so
|
|
3
|
+
we can just run things here as if it were our local machine (i.e. use localhost).
|
|
4
|
+
|
|
5
|
+
We're setting it up to be the persistent development environment for this project,
|
|
6
|
+
migrating from macOS. Your task is to apply the setup plan at `{{setup_path}}`
|
|
7
|
+
to make this repo usable, with a focus on correctness, repeatability, and minimal
|
|
8
|
+
risk. We want to be able to run all the services locally for development.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
Here is some information on the local environment. When setting things up for
|
|
13
|
+
development, be aware of what's already installed on the system; leverage existing
|
|
14
|
+
tools where possible. You are free to modify the system as needed, but avoid
|
|
15
|
+
unnecessary changes.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
# Sprite Environment
|
|
19
|
+
|
|
20
|
+
Sprites run on pre-configured base images that include common development tools, language runtimes, and AI coding agents. The base image is upgraded automatically without affecting your overlay filesystem.
|
|
21
|
+
|
|
22
|
+
## Ubuntu DevTools (Default)
|
|
23
|
+
|
|
24
|
+
The default Sprite image is based on Ubuntu 25.04 and comes with a comprehensive development environment.
|
|
25
|
+
|
|
26
|
+
### Operating System
|
|
27
|
+
|
|
28
|
+
- **Base**: Ubuntu 25.04
|
|
29
|
+
- **User**: `sprite` with passwordless sudo
|
|
30
|
+
- **Shell**: bash (default), with zsh, fish, tcsh, and ksh available
|
|
31
|
+
|
|
32
|
+
### Pre-installed Languages
|
|
33
|
+
|
|
34
|
+
| Language | Default Version | Version Manager | Manager Shimmed? |
|
|
35
|
+
|----------|-----------------|-----------------|------------------|
|
|
36
|
+
| Node.js | 22.20.0 | nvm | No (requires sourcing) |
|
|
37
|
+
| Python | 3.13.7 | pyenv | Yes |
|
|
38
|
+
| Go | 1.25.1 | Direct install | N/A |
|
|
39
|
+
| Rust | 1.90.0 | rustup | Yes |
|
|
40
|
+
| Ruby | 3.4.6 | rbenv | Yes |
|
|
41
|
+
| Elixir | 1.18.4 | Direct install | N/A |
|
|
42
|
+
| Erlang | 28.1 | kerl | Yes |
|
|
43
|
+
| Java | 25 (Temurin) | SDKMAN | No (requires sourcing) |
|
|
44
|
+
| Bun | latest | Direct install | N/A |
|
|
45
|
+
| Deno | latest | Direct install | N/A |
|
|
46
|
+
|
|
47
|
+
### AI Coding Agents
|
|
48
|
+
|
|
49
|
+
Pre-installed coding agents ready to use:
|
|
50
|
+
|
|
51
|
+
| Agent | Command | Package |
|
|
52
|
+
|-------|---------|---------|
|
|
53
|
+
| Claude Code | `claude` | @anthropic-ai/claude-code |
|
|
54
|
+
| Gemini CLI | `gemini` | @google/gemini-cli |
|
|
55
|
+
| OpenAI Codex | `codex` | @openai/codex |
|
|
56
|
+
| Cursor | `cursor` | cursor |
|
|
57
|
+
|
|
58
|
+
### System Tools
|
|
59
|
+
|
|
60
|
+
Common development tools pre-installed:
|
|
61
|
+
|
|
62
|
+
- **Build tools**: build-essential, clang, autoconf, automake, libtool, pkg-config
|
|
63
|
+
- **Version control**: git
|
|
64
|
+
- **Editors**: vim, nano
|
|
65
|
+
- **Shells**: bash, zsh, fish, tcsh, ksh
|
|
66
|
+
- **Terminal**: tmux, kitty
|
|
67
|
+
- **Utilities**: curl, wget, rsync, tree, htop
|
|
68
|
+
- **Network**: dnsutils, iputils-ping, net-tools, openssh-client
|
|
69
|
+
|
|
70
|
+
## Language Details
|
|
71
|
+
|
|
72
|
+
### Node.js
|
|
73
|
+
|
|
74
|
+
Default commands work immediately via shims: `node`, `npm`, `npx`, `corepack`.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# These work directly
|
|
78
|
+
node --version
|
|
79
|
+
npm --version
|
|
80
|
+
npm install express
|
|
81
|
+
npx create-next-app
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
To install or switch Node.js versions, you must source nvm first:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Source nvm
|
|
88
|
+
export NVM_DIR="/.sprite/languages/node/nvm"
|
|
89
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
90
|
+
|
|
91
|
+
# Now nvm commands work
|
|
92
|
+
nvm install 20
|
|
93
|
+
nvm install 18
|
|
94
|
+
nvm use 20
|
|
95
|
+
nvm alias default 20
|
|
96
|
+
nvm list
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Python
|
|
100
|
+
|
|
101
|
+
Default commands work immediately via shims: `python`, `pip`, `pipenv`, `poetry`, `virtualenv`.
|
|
102
|
+
|
|
103
|
+
The `pyenv` command is also shimmed and works directly:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# These work directly
|
|
107
|
+
python --version
|
|
108
|
+
pip --version
|
|
109
|
+
pip install requests
|
|
110
|
+
|
|
111
|
+
# pyenv is shimmed - works without sourcing
|
|
112
|
+
pyenv install 3.12.0
|
|
113
|
+
pyenv install 3.11.0
|
|
114
|
+
pyenv global 3.12.0
|
|
115
|
+
pyenv local 3.11.0 # Per-directory
|
|
116
|
+
pyenv versions
|
|
117
|
+
|
|
118
|
+
# Virtual environments
|
|
119
|
+
python -m venv myenv
|
|
120
|
+
source myenv/bin/activate
|
|
121
|
+
|
|
122
|
+
# Or use poetry/pipenv (pre-installed)
|
|
123
|
+
poetry new myproject
|
|
124
|
+
pipenv install
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Go
|
|
128
|
+
|
|
129
|
+
Default commands work immediately via shims: `go`, `gofmt`.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# These work directly
|
|
133
|
+
go version
|
|
134
|
+
go build
|
|
135
|
+
go run main.go
|
|
136
|
+
go install github.com/example/tool@latest
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Go is installed directly without a version manager. Only one version is available at a time.
|
|
140
|
+
|
|
141
|
+
### Rust
|
|
142
|
+
|
|
143
|
+
Default commands work immediately via shims: `rustc`, `cargo`, `rustfmt`, `rustdoc`.
|
|
144
|
+
|
|
145
|
+
The `rustup` command is also shimmed and works directly:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# These work directly
|
|
149
|
+
rustc --version
|
|
150
|
+
cargo --version
|
|
151
|
+
cargo build
|
|
152
|
+
cargo run
|
|
153
|
+
|
|
154
|
+
# rustup is shimmed - works without sourcing
|
|
155
|
+
rustup toolchain install nightly
|
|
156
|
+
rustup toolchain install 1.75.0
|
|
157
|
+
rustup default nightly
|
|
158
|
+
rustup default stable
|
|
159
|
+
rustup component add clippy
|
|
160
|
+
rustup toolchain list
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Ruby
|
|
164
|
+
|
|
165
|
+
Default commands work immediately via shims: `ruby`, `gem`, `bundle`, `bundler`, `irb`, `rake`.
|
|
166
|
+
|
|
167
|
+
The `rbenv` command is also shimmed and works directly:
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# These work directly
|
|
171
|
+
ruby --version
|
|
172
|
+
gem --version
|
|
173
|
+
gem install rails
|
|
174
|
+
bundle install
|
|
175
|
+
|
|
176
|
+
# rbenv is shimmed - works without sourcing
|
|
177
|
+
rbenv install 3.3.0
|
|
178
|
+
rbenv install 3.2.0
|
|
179
|
+
rbenv global 3.3.0
|
|
180
|
+
rbenv local 3.2.0 # Per-directory
|
|
181
|
+
rbenv versions
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Elixir & Erlang
|
|
185
|
+
|
|
186
|
+
Default Elixir commands work via shims: `elixir`, `elixirc`, `iex`, `mix`.
|
|
187
|
+
|
|
188
|
+
Default Erlang commands work via shims: `erl`, `erlc`, `escript`, `dialyzer`, `rebar3`.
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
# These work directly
|
|
192
|
+
elixir --version
|
|
193
|
+
iex
|
|
194
|
+
mix new myapp
|
|
195
|
+
|
|
196
|
+
erl -version
|
|
197
|
+
rebar3 new app myapp
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
The `kerl` command is shimmed for managing Erlang versions:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# kerl is shimmed - works without sourcing
|
|
204
|
+
kerl list releases
|
|
205
|
+
kerl build 27.0 27.0
|
|
206
|
+
kerl install 27.0 /.sprite/languages/erlang/kerl/installs/27.0
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Elixir is installed directly for the default Erlang version. To use different Elixir versions, download precompiled releases manually.
|
|
210
|
+
|
|
211
|
+
### Java
|
|
212
|
+
|
|
213
|
+
Default Java commands work via shims: `java`, `javac`, `jar`, `jshell`, etc.
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# These work directly
|
|
217
|
+
java --version
|
|
218
|
+
javac --version
|
|
219
|
+
java -jar myapp.jar
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
To install or switch Java versions, you must source SDKMAN first:
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Source SDKMAN
|
|
226
|
+
export SDKMAN_DIR="/.sprite/languages/java/sdkman"
|
|
227
|
+
[ -s "$SDKMAN_DIR/bin/sdkman-init.sh" ] && \. "$SDKMAN_DIR/bin/sdkman-init.sh"
|
|
228
|
+
|
|
229
|
+
# Now sdk commands work
|
|
230
|
+
sdk list java
|
|
231
|
+
sdk install java 21-tem
|
|
232
|
+
sdk install java 17-tem
|
|
233
|
+
sdk use java 21-tem
|
|
234
|
+
sdk default java 21-tem
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Bun
|
|
238
|
+
|
|
239
|
+
Default commands work via shims: `bun`, `bunx`.
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# These work directly
|
|
243
|
+
bun --version
|
|
244
|
+
bun run start
|
|
245
|
+
bun install
|
|
246
|
+
bun test
|
|
247
|
+
bunx create-next-app
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Deno
|
|
251
|
+
|
|
252
|
+
Default command works via shim: `deno`.
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# These work directly
|
|
256
|
+
deno --version
|
|
257
|
+
deno run script.ts
|
|
258
|
+
deno task start
|
|
259
|
+
deno compile app.ts
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## Filesystem Layout
|
|
263
|
+
|
|
264
|
+
Languages are installed in `/.sprite/languages/` with shims in `/.sprite/bin/`:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
/.sprite/
|
|
268
|
+
├── bin/ # Command shims (in PATH)
|
|
269
|
+
│ ├── node
|
|
270
|
+
│ ├── npm
|
|
271
|
+
│ ├── python
|
|
272
|
+
│ ├── pyenv # Shimmed - works directly
|
|
273
|
+
│ ├── go
|
|
274
|
+
│ ├── rustc
|
|
275
|
+
│ ├── rustup # Shimmed - works directly
|
|
276
|
+
│ ├── ruby
|
|
277
|
+
│ ├── rbenv # Shimmed - works directly
|
|
278
|
+
│ └── ...
|
|
279
|
+
├── languages/
|
|
280
|
+
│ ├── node/
|
|
281
|
+
│ │ └── nvm/ # Must source to use nvm
|
|
282
|
+
│ ├── python/
|
|
283
|
+
│ │ └── pyenv/ # Shimmed via /.sprite/bin/pyenv
|
|
284
|
+
│ ├── go/
|
|
285
|
+
│ │ ├── versions/ # Go versions
|
|
286
|
+
│ │ └── current/ # Symlink to active version
|
|
287
|
+
│ ├── rust/
|
|
288
|
+
│ │ ├── rustup/ # Shimmed via /.sprite/bin/rustup
|
|
289
|
+
│ │ └── cargo/
|
|
290
|
+
│ ├── ruby/
|
|
291
|
+
│ │ └── rbenv/ # Shimmed via /.sprite/bin/rbenv
|
|
292
|
+
│ ├── java/
|
|
293
|
+
│ │ └── sdkman/ # Must source to use sdk
|
|
294
|
+
│ ├── erlang/
|
|
295
|
+
│ │ └── kerl/ # Shimmed via /.sprite/bin/kerl
|
|
296
|
+
│ ├── elixir/
|
|
297
|
+
│ │ └── current/ # Symlink to active version
|
|
298
|
+
│ ├── bun/
|
|
299
|
+
│ └── deno/
|
|
300
|
+
├── etc/
|
|
301
|
+
│ └── profile.d/ # Shell initialization
|
|
302
|
+
└── llm.txt # LLM documentation
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Image Updates
|
|
306
|
+
|
|
307
|
+
Base images are updated automatically without affecting your files:
|
|
308
|
+
|
|
309
|
+
- **Your code and data**: Stored in the overlay filesystem, preserved across updates
|
|
310
|
+
- **System packages**: Updated in the base image, applied on next boot
|
|
311
|
+
- **Language runtimes**: Base versions updated, your installed versions preserved
|
|
312
|
+
|
|
313
|
+
To check the current base image version:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
cat /.sprite/version.txt
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## LLM Integration
|
|
320
|
+
|
|
321
|
+
Each Sprite includes documentation for LLMs at `/.sprite/llm.txt`. This file describes the environment and available tools, making it easy for AI assistants to understand and work with your Sprite.
|
|
322
|
+
|
|
323
|
+
Additional language-specific documentation is available in each language directory:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# General environment documentation
|
|
327
|
+
cat /.sprite/llm.txt
|
|
328
|
+
|
|
329
|
+
# Per-language documentation
|
|
330
|
+
cat /.sprite/languages/node/llm.txt
|
|
331
|
+
cat /.sprite/languages/python/llm.txt
|
|
332
|
+
cat /.sprite/languages/rust/llm.txt
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
339
|
+
Your task is to set up the development environment for this project by following these steps:
|
|
340
|
+
|
|
341
|
+
If `{{artifacts_bundle}}` and `{{artifacts_manifest}}` are present:
|
|
342
|
+
1) Unpack the bundle to a temp directory.
|
|
343
|
+
2) Use the manifest to copy files into their intended locations.
|
|
344
|
+
3) Preserve permissions and avoid overwriting newer files unless the manifest
|
|
345
|
+
explicitly says to replace them.
|
|
346
|
+
|
|
347
|
+
Then apply the setup plan in `{{setup_path}}`:
|
|
348
|
+
- Install required tools/runtimes that are listed.
|
|
349
|
+
- Prefer project-local installs (e.g., package manager installs in the repo)
|
|
350
|
+
over global installs.
|
|
351
|
+
- Run setup commands in the repo root unless the plan specifies another path.
|
|
352
|
+
- If there are multiple package managers, follow the plan’s choice; do not
|
|
353
|
+
guess.
|
|
354
|
+
|
|
355
|
+
Finally, make sure the dev environment is functional:
|
|
356
|
+
- Find the main entry point(s) for local dev in this repo, and make sure they work.{{entrypoints_block}}
|
|
357
|
+
- If you find any missing external dependencies, install them.
|
|
358
|
+
- If you find anything that needs to be run but has not been (i.e. `npm install`, `uv sync`, `bundle install`, etc), run it.
|
|
359
|
+
- If things need to be on the PATH, ensure that is set up correctly, including for new sessions.
|
|
360
|
+
- If you don't know how to install something, use web search (use reputable sources only) to find the correct approach
|
|
361
|
+
|
|
362
|
+
When doing these steps, lean careful / conservative:
|
|
363
|
+
- Do not delete user files or reset git history.
|
|
364
|
+
- Do not run arbitrary network calls unless it's required.
|
|
365
|
+
- If a step is unclear or unsafe, skip it and record a TODO.
|
|
366
|
+
|
|
367
|
+
Write a short, actionable summary to `.devbox/setup.todo` with:
|
|
368
|
+
- What you completed (and how).
|
|
369
|
+
- What you skipped (and why).
|
|
370
|
+
- Exact commands the user should run to finish setup (if needed).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
bashrc="/home/sprite/.bashrc"
|
|
5
|
+
old='trap '\''echo -ne "\033]0;${BASH_COMMAND}\007"'\'' DEBUG'
|
|
6
|
+
new='trap '\''printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"'\'' DEBUG'
|
|
7
|
+
# Note: the DEBUG trap replacement appears to be legacy. If the expected line
|
|
8
|
+
# isn't present (e.g., PROMPT_COMMAND-based titles), skip without failing.
|
|
9
|
+
old_bind_one='bind '"'"'"\e[A": history-search-backward'"'"''
|
|
10
|
+
old_bind_two='bind '"'"'"\e[B": history-search-forward'"'"''
|
|
11
|
+
new_bind_one='if [[ $- == *i* ]]; then bind "\e[A": history-search-backward; fi'
|
|
12
|
+
new_bind_two='if [[ $- == *i* ]]; then bind "\e[B": history-search-forward; fi'
|
|
13
|
+
|
|
14
|
+
if [[ ! -f "$bashrc" ]]; then
|
|
15
|
+
echo "missing $bashrc; skipping bashrc patch" >&2
|
|
16
|
+
exit 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
if grep -Fqx "$new" "$bashrc" && grep -Fqx "$new_bind_one" "$bashrc" && grep -Fqx "$new_bind_two" "$bashrc"; then
|
|
20
|
+
exit 0
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
python3 - <<'PY'
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
import re
|
|
26
|
+
|
|
27
|
+
path = Path("/home/sprite/.bashrc")
|
|
28
|
+
data = path.read_text()
|
|
29
|
+
old = 'trap \'echo -ne "\\033]0;${BASH_COMMAND}\\007"\' DEBUG'
|
|
30
|
+
new = 'trap \'printf "\\033]0;%s\\007" "${BASH_COMMAND//[^[:print:]]/}"\' DEBUG'
|
|
31
|
+
old_bind_one = 'bind '"'"'"\\e[A": history-search-backward"'"'"''
|
|
32
|
+
old_bind_two = 'bind '"'"'"\\e[B": history-search-forward"'"'"''
|
|
33
|
+
new_bind_one = 'if [[ $- == *i* ]]; then bind "\\e[A": history-search-backward; fi'
|
|
34
|
+
new_bind_two = 'if [[ $- == *i* ]]; then bind "\\e[B": history-search-forward; fi'
|
|
35
|
+
bind_back_pattern = r'^bind .*history-search-backward.*$'
|
|
36
|
+
bind_forward_pattern = r'^bind .*history-search-forward.*$'
|
|
37
|
+
|
|
38
|
+
if old in data:
|
|
39
|
+
data = data.replace(old, new, 1)
|
|
40
|
+
|
|
41
|
+
if new_bind_one not in data and re.search(bind_back_pattern, data, flags=re.M):
|
|
42
|
+
data = re.sub(bind_back_pattern, lambda _: new_bind_one, data, count=1, flags=re.M)
|
|
43
|
+
if new_bind_two not in data and re.search(bind_forward_pattern, data, flags=re.M):
|
|
44
|
+
data = re.sub(bind_forward_pattern, lambda _: new_bind_two, data, count=1, flags=re.M)
|
|
45
|
+
path.write_text(data)
|
|
46
|
+
PY
|
|
47
|
+
|
|
48
|
+
chmod 644 "$bashrc"
|