@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.
Files changed (201) hide show
  1. package/dist/bin/dvb.cjs +28232 -0
  2. package/dist/bin/dvb.d.ts +2 -0
  3. package/dist/bin/dvb.d.ts.map +1 -0
  4. package/dist/bin/dvb.js +71 -0
  5. package/dist/bin/dvb.js.map +1 -0
  6. package/dist/bin/dvbd.cjs +11816 -0
  7. package/dist/bin/dvbd.d.ts +2 -0
  8. package/dist/bin/dvbd.d.ts.map +1 -0
  9. package/dist/bin/dvbd.js +20 -0
  10. package/dist/bin/dvbd.js.map +1 -0
  11. package/dist/codex/services-schema.json +59 -0
  12. package/dist/codex/setup-schema.json +176 -0
  13. package/dist/devbox/auth.d.ts +17 -0
  14. package/dist/devbox/auth.d.ts.map +1 -0
  15. package/dist/devbox/auth.js +302 -0
  16. package/dist/devbox/auth.js.map +1 -0
  17. package/dist/devbox/cli.d.ts +2 -0
  18. package/dist/devbox/cli.d.ts.map +1 -0
  19. package/dist/devbox/cli.js +142 -0
  20. package/dist/devbox/cli.js.map +1 -0
  21. package/dist/devbox/commands/agent.d.ts +21 -0
  22. package/dist/devbox/commands/agent.d.ts.map +1 -0
  23. package/dist/devbox/commands/agent.js +257 -0
  24. package/dist/devbox/commands/agent.js.map +1 -0
  25. package/dist/devbox/commands/boxSelect.d.ts +14 -0
  26. package/dist/devbox/commands/boxSelect.d.ts.map +1 -0
  27. package/dist/devbox/commands/boxSelect.js +82 -0
  28. package/dist/devbox/commands/boxSelect.js.map +1 -0
  29. package/dist/devbox/commands/connect.d.ts +8 -0
  30. package/dist/devbox/commands/connect.d.ts.map +1 -0
  31. package/dist/devbox/commands/connect.js +1369 -0
  32. package/dist/devbox/commands/connect.js.map +1 -0
  33. package/dist/devbox/commands/daemon.d.ts +4 -0
  34. package/dist/devbox/commands/daemon.d.ts.map +1 -0
  35. package/dist/devbox/commands/daemon.js +36 -0
  36. package/dist/devbox/commands/daemon.js.map +1 -0
  37. package/dist/devbox/commands/destroy.d.ts +2 -0
  38. package/dist/devbox/commands/destroy.d.ts.map +1 -0
  39. package/dist/devbox/commands/destroy.js +131 -0
  40. package/dist/devbox/commands/destroy.js.map +1 -0
  41. package/dist/devbox/commands/init/args.d.ts +12 -0
  42. package/dist/devbox/commands/init/args.d.ts.map +1 -0
  43. package/dist/devbox/commands/init/args.js +42 -0
  44. package/dist/devbox/commands/init/args.js.map +1 -0
  45. package/dist/devbox/commands/init/codex/artifacts.d.ts +26 -0
  46. package/dist/devbox/commands/init/codex/artifacts.d.ts.map +1 -0
  47. package/dist/devbox/commands/init/codex/artifacts.js +108 -0
  48. package/dist/devbox/commands/init/codex/artifacts.js.map +1 -0
  49. package/dist/devbox/commands/init/codex/index.d.ts +35 -0
  50. package/dist/devbox/commands/init/codex/index.d.ts.map +1 -0
  51. package/dist/devbox/commands/init/codex/index.js +147 -0
  52. package/dist/devbox/commands/init/codex/index.js.map +1 -0
  53. package/dist/devbox/commands/init/codex/local.d.ts +19 -0
  54. package/dist/devbox/commands/init/codex/local.d.ts.map +1 -0
  55. package/dist/devbox/commands/init/codex/local.js +189 -0
  56. package/dist/devbox/commands/init/codex/local.js.map +1 -0
  57. package/dist/devbox/commands/init/codex/plan.d.ts +61 -0
  58. package/dist/devbox/commands/init/codex/plan.d.ts.map +1 -0
  59. package/dist/devbox/commands/init/codex/plan.js +39 -0
  60. package/dist/devbox/commands/init/codex/plan.js.map +1 -0
  61. package/dist/devbox/commands/init/codex/prompts.d.ts +6 -0
  62. package/dist/devbox/commands/init/codex/prompts.d.ts.map +1 -0
  63. package/dist/devbox/commands/init/codex/prompts.js +26 -0
  64. package/dist/devbox/commands/init/codex/prompts.js.map +1 -0
  65. package/dist/devbox/commands/init/codex/remote.d.ts +56 -0
  66. package/dist/devbox/commands/init/codex/remote.d.ts.map +1 -0
  67. package/dist/devbox/commands/init/codex/remote.js +395 -0
  68. package/dist/devbox/commands/init/codex/remote.js.map +1 -0
  69. package/dist/devbox/commands/init/codex/template.d.ts +3 -0
  70. package/dist/devbox/commands/init/codex/template.d.ts.map +1 -0
  71. package/dist/devbox/commands/init/codex/template.js +3 -0
  72. package/dist/devbox/commands/init/codex/template.js.map +1 -0
  73. package/dist/devbox/commands/init/index.d.ts +2 -0
  74. package/dist/devbox/commands/init/index.d.ts.map +1 -0
  75. package/dist/devbox/commands/init/index.js +1117 -0
  76. package/dist/devbox/commands/init/index.js.map +1 -0
  77. package/dist/devbox/commands/init/packaging.d.ts +5 -0
  78. package/dist/devbox/commands/init/packaging.d.ts.map +1 -0
  79. package/dist/devbox/commands/init/packaging.js +86 -0
  80. package/dist/devbox/commands/init/packaging.js.map +1 -0
  81. package/dist/devbox/commands/init/registry.d.ts +14 -0
  82. package/dist/devbox/commands/init/registry.d.ts.map +1 -0
  83. package/dist/devbox/commands/init/registry.js +61 -0
  84. package/dist/devbox/commands/init/registry.js.map +1 -0
  85. package/dist/devbox/commands/init/remote.d.ts +38 -0
  86. package/dist/devbox/commands/init/remote.d.ts.map +1 -0
  87. package/dist/devbox/commands/init/remote.js +554 -0
  88. package/dist/devbox/commands/init/remote.js.map +1 -0
  89. package/dist/devbox/commands/init/repo.d.ts +31 -0
  90. package/dist/devbox/commands/init/repo.d.ts.map +1 -0
  91. package/dist/devbox/commands/init/repo.js +164 -0
  92. package/dist/devbox/commands/init/repo.js.map +1 -0
  93. package/dist/devbox/commands/init/scripts.d.ts +3 -0
  94. package/dist/devbox/commands/init/scripts.d.ts.map +1 -0
  95. package/dist/devbox/commands/init/scripts.js +15 -0
  96. package/dist/devbox/commands/init/scripts.js.map +1 -0
  97. package/dist/devbox/commands/init/ssh.d.ts +19 -0
  98. package/dist/devbox/commands/init/ssh.d.ts.map +1 -0
  99. package/dist/devbox/commands/init/ssh.js +270 -0
  100. package/dist/devbox/commands/init/ssh.js.map +1 -0
  101. package/dist/devbox/commands/init/state.d.ts +31 -0
  102. package/dist/devbox/commands/init/state.d.ts.map +1 -0
  103. package/dist/devbox/commands/init/state.js +25 -0
  104. package/dist/devbox/commands/init/state.js.map +1 -0
  105. package/dist/devbox/commands/list.d.ts +2 -0
  106. package/dist/devbox/commands/list.d.ts.map +1 -0
  107. package/dist/devbox/commands/list.js +213 -0
  108. package/dist/devbox/commands/list.js.map +1 -0
  109. package/dist/devbox/commands/listFormatting.d.ts +27 -0
  110. package/dist/devbox/commands/listFormatting.d.ts.map +1 -0
  111. package/dist/devbox/commands/listFormatting.js +155 -0
  112. package/dist/devbox/commands/listFormatting.js.map +1 -0
  113. package/dist/devbox/commands/logout.d.ts +2 -0
  114. package/dist/devbox/commands/logout.d.ts.map +1 -0
  115. package/dist/devbox/commands/logout.js +45 -0
  116. package/dist/devbox/commands/logout.js.map +1 -0
  117. package/dist/devbox/commands/mount.d.ts +3 -0
  118. package/dist/devbox/commands/mount.d.ts.map +1 -0
  119. package/dist/devbox/commands/mount.js +144 -0
  120. package/dist/devbox/commands/mount.js.map +1 -0
  121. package/dist/devbox/commands/mountSsh.d.ts +12 -0
  122. package/dist/devbox/commands/mountSsh.d.ts.map +1 -0
  123. package/dist/devbox/commands/mountSsh.js +137 -0
  124. package/dist/devbox/commands/mountSsh.js.map +1 -0
  125. package/dist/devbox/commands/ports.d.ts +2 -0
  126. package/dist/devbox/commands/ports.d.ts.map +1 -0
  127. package/dist/devbox/commands/ports.js +145 -0
  128. package/dist/devbox/commands/ports.js.map +1 -0
  129. package/dist/devbox/commands/services.d.ts +2 -0
  130. package/dist/devbox/commands/services.d.ts.map +1 -0
  131. package/dist/devbox/commands/services.js +552 -0
  132. package/dist/devbox/commands/services.js.map +1 -0
  133. package/dist/devbox/commands/servicesToml.d.ts +13 -0
  134. package/dist/devbox/commands/servicesToml.d.ts.map +1 -0
  135. package/dist/devbox/commands/servicesToml.js +198 -0
  136. package/dist/devbox/commands/servicesToml.js.map +1 -0
  137. package/dist/devbox/commands/sessionUtils.d.ts +10 -0
  138. package/dist/devbox/commands/sessionUtils.d.ts.map +1 -0
  139. package/dist/devbox/commands/sessionUtils.js +48 -0
  140. package/dist/devbox/commands/sessionUtils.js.map +1 -0
  141. package/dist/devbox/commands/sessions.d.ts +2 -0
  142. package/dist/devbox/commands/sessions.d.ts.map +1 -0
  143. package/dist/devbox/commands/sessions.js +425 -0
  144. package/dist/devbox/commands/sessions.js.map +1 -0
  145. package/dist/devbox/commands/setup.d.ts +2 -0
  146. package/dist/devbox/commands/setup.d.ts.map +1 -0
  147. package/dist/devbox/commands/setup.js +183 -0
  148. package/dist/devbox/commands/setup.js.map +1 -0
  149. package/dist/devbox/commands/wezterm.d.ts +3 -0
  150. package/dist/devbox/commands/wezterm.d.ts.map +1 -0
  151. package/dist/devbox/commands/wezterm.js +878 -0
  152. package/dist/devbox/commands/wezterm.js.map +1 -0
  153. package/dist/devbox/completions/cache.d.ts +59 -0
  154. package/dist/devbox/completions/cache.d.ts.map +1 -0
  155. package/dist/devbox/completions/cache.js +122 -0
  156. package/dist/devbox/completions/cache.js.map +1 -0
  157. package/dist/devbox/completions/index.d.ts +14 -0
  158. package/dist/devbox/completions/index.d.ts.map +1 -0
  159. package/dist/devbox/completions/index.js +796 -0
  160. package/dist/devbox/completions/index.js.map +1 -0
  161. package/dist/devbox/controlPlane.d.ts +44 -0
  162. package/dist/devbox/controlPlane.d.ts.map +1 -0
  163. package/dist/devbox/controlPlane.js +310 -0
  164. package/dist/devbox/controlPlane.js.map +1 -0
  165. package/dist/devbox/daemonClient.d.ts +28 -0
  166. package/dist/devbox/daemonClient.d.ts.map +1 -0
  167. package/dist/devbox/daemonClient.js +276 -0
  168. package/dist/devbox/daemonClient.js.map +1 -0
  169. package/dist/devbox/latency.d.ts +25 -0
  170. package/dist/devbox/latency.d.ts.map +1 -0
  171. package/dist/devbox/latency.js +186 -0
  172. package/dist/devbox/latency.js.map +1 -0
  173. package/dist/devbox/logger.d.ts +2 -0
  174. package/dist/devbox/logger.d.ts.map +1 -0
  175. package/dist/devbox/logger.js +3 -0
  176. package/dist/devbox/logger.js.map +1 -0
  177. package/dist/devbox/terminal/osc.d.ts +10 -0
  178. package/dist/devbox/terminal/osc.d.ts.map +1 -0
  179. package/dist/devbox/terminal/osc.js +88 -0
  180. package/dist/devbox/terminal/osc.js.map +1 -0
  181. package/dist/devbox/types.d.ts +4 -0
  182. package/dist/devbox/types.d.ts.map +1 -0
  183. package/dist/devbox/types.js +2 -0
  184. package/dist/devbox/types.js.map +1 -0
  185. package/dist/devbox/ui/colors.d.ts +19 -0
  186. package/dist/devbox/ui/colors.d.ts.map +1 -0
  187. package/dist/devbox/ui/colors.js +22 -0
  188. package/dist/devbox/ui/colors.js.map +1 -0
  189. package/dist/devbox/ui/statusLine.d.ts +14 -0
  190. package/dist/devbox/ui/statusLine.d.ts.map +1 -0
  191. package/dist/devbox/ui/statusLine.js +90 -0
  192. package/dist/devbox/ui/statusLine.js.map +1 -0
  193. package/dist/devbox/weztermMux.d.ts +11 -0
  194. package/dist/devbox/weztermMux.d.ts.map +1 -0
  195. package/dist/devbox/weztermMux.js +11 -0
  196. package/dist/devbox/weztermMux.js.map +1 -0
  197. package/dist/prompts/local-scan.md +32 -0
  198. package/dist/prompts/local-services-scan.md +17 -0
  199. package/dist/prompts/remote-apply.md +370 -0
  200. package/dist/scripts/fix-bashrc.sh +48 -0
  201. 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"