@rubytech/create-maxy-code 0.1.108 → 0.1.110

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 (124) hide show
  1. package/dist/index.js +11 -125
  2. package/dist/snap-chromium.js +1 -2
  3. package/dist/uninstall.js +10 -9
  4. package/package.json +1 -1
  5. package/payload/platform/plugins/admin/PLUGIN.md +1 -0
  6. package/payload/platform/plugins/admin/mcp/dist/index.js +1 -1
  7. package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
  8. package/payload/platform/plugins/admin/skills/upgrade/SKILL.md +34 -0
  9. package/payload/platform/plugins/cloudflare/.claude-plugin/plugin.json +1 -1
  10. package/payload/platform/plugins/cloudflare/PLUGIN.md +9 -16
  11. package/payload/platform/plugins/cloudflare/mcp/dist/index.js +7 -12
  12. package/payload/platform/plugins/cloudflare/mcp/dist/index.js.map +1 -1
  13. package/payload/platform/plugins/cloudflare/references/dashboard-guide.md +3 -3
  14. package/payload/platform/plugins/cloudflare/references/manual-setup.md +16 -51
  15. package/payload/platform/plugins/cloudflare/references/reset-guide.md +24 -25
  16. package/payload/platform/plugins/cloudflare/skills/setup-tunnel/SKILL.md +29 -144
  17. package/payload/platform/plugins/docs/references/admin-session.md +1 -1
  18. package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
  19. package/payload/platform/plugins/docs/references/cloudflare.md +20 -29
  20. package/payload/platform/plugins/docs/references/platform.md +4 -22
  21. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
  22. package/payload/platform/plugins/docs/references/troubleshooting.md +4 -316
  23. package/payload/platform/plugins/venture-studio/PLUGIN.md +35 -4
  24. package/payload/platform/plugins/venture-studio/bin/scaffold.sh +104 -0
  25. package/payload/platform/plugins/venture-studio/skills/investor-data-room/SKILL.md +3 -1
  26. package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.d.ts +2 -0
  27. package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.d.ts.map +1 -0
  28. package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.js +78 -0
  29. package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.js.map +1 -0
  30. package/payload/platform/scripts/check-no-task-id-leaks.mjs +1 -1
  31. package/payload/platform/scripts/vnc.sh +4 -3
  32. package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
  33. package/payload/premium-plugins/venture-studio/PLUGIN.md +35 -4
  34. package/payload/premium-plugins/venture-studio/bin/scaffold.sh +104 -0
  35. package/payload/premium-plugins/venture-studio/skills/investor-data-room/SKILL.md +3 -1
  36. package/payload/server/{chunk-AGFS3TVN.js → chunk-FSPPVVWM.js} +1303 -496
  37. package/payload/server/maxy-edge.js +21 -259
  38. package/payload/server/public/assets/{ChatInput-DJsqm_Gf.js → ChatInput-CsnIedhS.js} +1 -5
  39. package/payload/server/public/assets/{Checkbox-DGZG9BKc.js → Checkbox-CWugFyFT.js} +1 -1
  40. package/payload/server/public/assets/admin-D3gZuyUn.js +217 -0
  41. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Dw16BhiX.js → architectureDiagram-Q4EWVU46-CeTRKWDb.js} +1 -1
  42. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DIOpmf5Y.js → blockDiagram-DXYQGD6D-DeeIX5U3.js} +1 -1
  43. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-Tdb_HZeX.js → c4Diagram-AHTNJAMY-CFsqZuil.js} +1 -1
  44. package/payload/server/public/assets/channel-CrSx5mnG.js +1 -0
  45. package/payload/server/public/assets/{chunk-336JU56O-CebpwDDe.js → chunk-336JU56O-DpIXuFM0.js} +2 -2
  46. package/payload/server/public/assets/{chunk-426QAEUC-BtRCmfDU.js → chunk-426QAEUC-Qk8qqrvA.js} +1 -1
  47. package/payload/server/public/assets/{chunk-4TB4RGXK-BZ3GEWs3.js → chunk-4TB4RGXK-DtM8-CUn.js} +1 -1
  48. package/payload/server/public/assets/{chunk-5FUZZQ4R-iDI6Xu0U.js → chunk-5FUZZQ4R-CrSQ4ySU.js} +1 -1
  49. package/payload/server/public/assets/{chunk-5PVQY5BW-SQD_EpYa.js → chunk-5PVQY5BW-Bn2nQwdj.js} +1 -1
  50. package/payload/server/public/assets/{chunk-EDXVE4YY-CtCcA7_e.js → chunk-EDXVE4YY-CzCPnR0P.js} +1 -1
  51. package/payload/server/public/assets/{chunk-ENJZ2VHE-pXVGVCbb.js → chunk-ENJZ2VHE-CgZj9RoG.js} +1 -1
  52. package/payload/server/public/assets/{chunk-ICPOFSXX-Dkzg9o2N.js → chunk-ICPOFSXX-wy-eNjwW.js} +1 -1
  53. package/payload/server/public/assets/{chunk-OYMX7WX6-1ZZWzf9F.js → chunk-OYMX7WX6-CMmJtL8S.js} +1 -1
  54. package/payload/server/public/assets/{chunk-U2HBQHQK-CpQ3kzO0.js → chunk-U2HBQHQK-CFCW7OaT.js} +1 -1
  55. package/payload/server/public/assets/{chunk-X2U36JSP-C2LkxroC.js → chunk-X2U36JSP-Bgh-CJSN.js} +1 -1
  56. package/payload/server/public/assets/{chunk-YZCP3GAM-Bl5jBOt5.js → chunk-YZCP3GAM-BXKwZ4vN.js} +1 -1
  57. package/payload/server/public/assets/{chunk-ZZ45TVLE-CHtnptPS.js → chunk-ZZ45TVLE-BiOuK5NP.js} +1 -1
  58. package/payload/server/public/assets/classDiagram-6PBFFD2Q-C3IDJsqN.js +1 -0
  59. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BOIrJ5Zb.js +1 -0
  60. package/payload/server/public/assets/clone-P8Fkz7JD.js +1 -0
  61. package/payload/server/public/assets/{dagre-BziN0Nkh.js → dagre-DyCxa9Q2.js} +1 -1
  62. package/payload/server/public/assets/{dagre-KV5264BT-B7OG1g1Y.js → dagre-KV5264BT-Cffo_hmf.js} +1 -1
  63. package/payload/server/public/assets/data-DRfwJPja.js +1 -0
  64. package/payload/server/public/assets/{diagram-5BDNPKRD-Bf31nIDs.js → diagram-5BDNPKRD-Bt93Du3V.js} +1 -1
  65. package/payload/server/public/assets/{diagram-G4DWMVQ6-DQu85hhH.js → diagram-G4DWMVQ6-v4r-tBsC.js} +1 -1
  66. package/payload/server/public/assets/{diagram-MMDJMWI5-5tstbs4y.js → diagram-MMDJMWI5-DKrVPOP-.js} +1 -1
  67. package/payload/server/public/assets/{diagram-TYMM5635--MOV1U4o.js → diagram-TYMM5635-B1PzWQb9.js} +1 -1
  68. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BtAnOJmd.js → erDiagram-SMLLAGMA-ClQzsQAs.js} +1 -1
  69. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CybiCIih.js → flowDiagram-DWJPFMVM-h3IbpN_7.js} +1 -1
  70. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B44jN7Cy.js → ganttDiagram-T4ZO3ILL-ClaxOJi8.js} +1 -1
  71. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CT7iYcwg.js → gitGraphDiagram-UUTBAWPF-pM-U4ClD.js} +1 -1
  72. package/payload/server/public/assets/graph-B4FFYwus.js +1 -0
  73. package/payload/server/public/assets/graph-labels-Cpk9Ktt0.js +1 -0
  74. package/payload/server/public/assets/{graphlib-DP4o0pYL.js → graphlib-CwimOv_M.js} +1 -1
  75. package/payload/server/public/assets/{infoDiagram-42DDH7IO-CvxFpFHN.js → infoDiagram-42DDH7IO-DcO3Giwe.js} +1 -1
  76. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CUwWLPeR.js → ishikawaDiagram-UXIWVN3A-BcdSL5VS.js} +1 -1
  77. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-y-OnGgLi.js → journeyDiagram-VCZTEJTY-CYahHYzf.js} +1 -1
  78. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BhrSe8R4.js → kanban-definition-6JOO6SKY-Cl5KhoS4.js} +1 -1
  79. package/payload/server/public/assets/lib--yuBd0Xi.js +33 -0
  80. package/payload/server/public/assets/{line-C9uS7z4J.js → line-d_2oTxLp.js} +1 -1
  81. package/payload/server/public/assets/{mermaid-parser.core-Cg4ZdKp-.js → mermaid-parser.core-CMMDGv3x.js} +1 -1
  82. package/payload/server/public/assets/{mermaid.core-BHdKOsex.js → mermaid.core-DK9ENGbr.js} +3 -3
  83. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-NBYiXHo7.js → mindmap-definition-QFDTVHPH-mA3x3MFG.js} +1 -1
  84. package/payload/server/public/assets/page-CgDmg_fX.js +1 -0
  85. package/payload/server/public/assets/{page-D9YpwhIu.js → page-D9lluVl7.js} +2 -2
  86. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CbojC64C.js → pieDiagram-DEJITSTG-CW1nGFlY.js} +1 -1
  87. package/payload/server/public/assets/public-DdLMkNdS.js +7 -0
  88. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CnnoZXcL.js → quadrantDiagram-34T5L4WZ-DI5igJhR.js} +1 -1
  89. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DFRFRtyJ.js → requirementDiagram-MS252O5E-DyVeI4e_.js} +1 -1
  90. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DU5gcpzO.js → sankeyDiagram-XADWPNL6-CCTTBYKY.js} +1 -1
  91. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BN7HZ6Hq.js → sequenceDiagram-FGHM5R23-hVVf35ly.js} +1 -1
  92. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DG6cCjvg.js → stateDiagram-FHFEXIEX-CSLuQDUX.js} +1 -1
  93. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C5JejhQU.js +1 -0
  94. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-qmV-8SEV.js → timeline-definition-GMOUNBTQ-sxC3W8Q4.js} +1 -1
  95. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BMXQ1s3n.js → vennDiagram-DHZGUBPP-Ro-ton6Z.js} +1 -1
  96. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CoAdP1Gw.js → wardleyDiagram-NUSXRM2D-T-dKD0Zx.js} +1 -1
  97. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CZlfGTEn.js → xychartDiagram-5P7HB3ND-CfProPts.js} +1 -1
  98. package/payload/server/public/data.html +4 -4
  99. package/payload/server/public/graph.html +5 -5
  100. package/payload/server/public/index.html +7 -7
  101. package/payload/server/public/public.html +4 -4
  102. package/payload/server/server.js +299 -1392
  103. package/payload/platform/plugins/cloudflare/scripts/__tests__/tunnel-ingress.test.ts +0 -241
  104. package/payload/platform/plugins/cloudflare/scripts/_stream-log.sh +0 -154
  105. package/payload/platform/plugins/cloudflare/scripts/list-cf-domains.sh +0 -98
  106. package/payload/platform/plugins/cloudflare/scripts/list-cf-domains.ts +0 -749
  107. package/payload/platform/plugins/cloudflare/scripts/reset-tunnel.sh +0 -107
  108. package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +0 -854
  109. package/payload/platform/plugins/cloudflare/scripts/tunnel-ingress.ts +0 -291
  110. package/payload/server/chunk-BDFOTLPW.js +0 -759
  111. package/payload/server/chunk-JRBCOVA4.js +0 -1305
  112. package/payload/server/cloudflare-task-tracker-M5ONAGUT.js +0 -22
  113. package/payload/server/public/assets/admin-BvzMvMGo.js +0 -217
  114. package/payload/server/public/assets/channel-DThrH4QF.js +0 -1
  115. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BC6oGTNX.js +0 -1
  116. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-COwC5Umh.js +0 -1
  117. package/payload/server/public/assets/clone-Chp7hvnA.js +0 -1
  118. package/payload/server/public/assets/data-BAgaPs4j.js +0 -1
  119. package/payload/server/public/assets/graph-Cma7EArf.js +0 -1
  120. package/payload/server/public/assets/graph-labels-DyKk6Sxf.js +0 -1
  121. package/payload/server/public/assets/lib-CpkYtEDz.js +0 -29
  122. package/payload/server/public/assets/page-B4IWl3aZ.js +0 -1
  123. package/payload/server/public/assets/public-BtOXjy3A.js +0 -8
  124. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-CvVd1Q_q.js +0 -1
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { execFileSync, spawn, spawnSync } from "node:child_process";
3
- import { existsSync, mkdirSync, writeFileSync, cpSync, readFileSync, rmSync, readdirSync, appendFileSync, openSync, closeSync, chmodSync, symlinkSync, unlinkSync, lstatSync, statSync, readlinkSync, realpathSync, accessSync, constants as fsConstants } from "node:fs";
3
+ import { existsSync, mkdirSync, writeFileSync, cpSync, readFileSync, rmSync, readdirSync, appendFileSync, openSync, closeSync, chmodSync, statSync, realpathSync } from "node:fs";
4
4
  import { registerSpecialistAgentsAt, SpecialistSymlinkCollision } from "./specialist-registration.js";
5
5
  import { resolve, join, dirname } from "node:path";
6
6
  import { randomBytes } from "node:crypto";
@@ -588,8 +588,8 @@ function runChromiumPostInstallGate(chromiumBin) {
588
588
  }
589
589
  /**
590
590
  * write the resolved Chromium absolute path to
591
- * `<INSTALL_DIR>/platform/config/chromium-binary.path` so vnc.sh,
592
- * writeChromiumWrapper, and setup-tunnel.sh all read the same value. Called
591
+ * `<INSTALL_DIR>/platform/config/chromium-binary.path` so vnc.sh and
592
+ * writeChromiumWrapper read the same value. Called
593
593
  * after deployPayload so the platform/config/ directory exists. Idempotent:
594
594
  * re-running the installer with the same RESOLVED_CHROMIUM_BIN is a no-op
595
595
  * write (writeFileSync overwrites in place).
@@ -2174,11 +2174,10 @@ function setupVncViewer() {
2174
2174
 
2175
2175
  // Layer-6 beacon: emit event=rfb-connected and
2176
2176
  // event=rfb-error to the operator-grep lifecycle endpoint so
2177
- // server.log shows the noVNC outcome alongside [setup-tunnel] /
2178
- // [cloudflare-setup] / [device-url:click] / [http] / [websockify].
2179
- // Same-origin POST works whether the iframe is parented by the
2180
- // React BrowserViewer or by vnc-popout.html.
2181
- function reportBrowserViewerEvent(event, fields) {
2177
+ // server.log shows the noVNC outcome alongside [device-url:click]
2178
+ // / [http] / [websockify]. Same-origin POST works whether the
2179
+ // iframe is parented by the React VNC viewer or by vnc-popout.html.
2180
+ function reportVncIframeEvent(event, fields) {
2182
2181
  try {
2183
2182
  var body = JSON.stringify(Object.assign(
2184
2183
  { event: event, surface: 'iframe' },
@@ -2212,7 +2211,7 @@ function setupVncViewer() {
2212
2211
  rfb.addEventListener('connect', () => {
2213
2212
  status.classList.add('hidden');
2214
2213
  retryCount = 0;
2215
- reportBrowserViewerEvent('rfb-connected', {
2214
+ reportVncIframeEvent('rfb-connected', {
2216
2215
  durationMs: Date.now() - connectStartedAt,
2217
2216
  });
2218
2217
  });
@@ -2222,7 +2221,7 @@ function setupVncViewer() {
2222
2221
  const detail = e.detail || {};
2223
2222
  const reason = detail.reason || (detail.clean === false ? 'Connection refused' : '');
2224
2223
  reportClientEvent('disconnect', reason || (detail.clean === false ? 'unclean-close' : 'normal'));
2225
- reportBrowserViewerEvent('rfb-error', {
2224
+ reportVncIframeEvent('rfb-error', {
2226
2225
  durationMs: Date.now() - connectStartedAt,
2227
2226
  errorCode: detail.clean === false ? 'unclean-close' : 'normal',
2228
2227
  message: reason || '',
@@ -2422,27 +2421,6 @@ function writeEntitlementFromFlag(payload) {
2422
2421
  console.log(line);
2423
2422
  logFile(line);
2424
2423
  }
2425
- // ---------------------------------------------------------------------------
2426
- // Tunnel script shortcuts
2427
- //
2428
- // The cloudflare plugin's SKILL.md, PLUGIN.md, and reference docs encode the
2429
- // invocation `~/setup-tunnel.sh` (and `~/reset-tunnel.sh`). The filesystem
2430
- // reality is <INSTALL_DIR>/platform/plugins/cloudflare/scripts/*.sh. Without
2431
- // the symlink the agent's first SKILL-compliant invocation fails with exit
2432
- // 127 — the discipline-violation loop the symlink exists to close.
2433
- //
2434
- // Collision discipline (last-writer-wins across brands):
2435
- // - absent path → create
2436
- // - regular file → exit 1 (operator-owned file, do not clobber)
2437
- // - symlink → same target → no-op
2438
- // - symlink → any other target → overwrite (unlink + symlink)
2439
- // covers stale-same-brand, dangling,
2440
- // unreadable, and peer-brand cases.
2441
- // setup-tunnel.sh takes <brand> as argv
2442
- // so the script still operates on the
2443
- // correct brand regardless of who owns
2444
- // the shortcut symlink.
2445
- // ---------------------------------------------------------------------------
2446
2424
  function registerSpecialistAgents() {
2447
2425
  try {
2448
2426
  registerSpecialistAgentsAt(join(INSTALL_DIR, "platform/templates/specialists/agents"), join(CLAUDE_CONFIG_DIR, "agents"), (line) => { console.log(line); logFile(line); });
@@ -2456,76 +2434,6 @@ function registerSpecialistAgents() {
2456
2434
  throw err;
2457
2435
  }
2458
2436
  }
2459
- function createTunnelSymlink(linkPath, target) {
2460
- const targetAbs = resolve(target);
2461
- let lstat = null;
2462
- try {
2463
- lstat = lstatSync(linkPath);
2464
- }
2465
- catch (err) {
2466
- const code = err.code;
2467
- if (code !== "ENOENT") {
2468
- console.error(`Setup failed: ${linkPath} lstat failed: ${err.message}`);
2469
- console.error(`[create-maxy:error] ${linkPath} lstat failed: ${err.message}`);
2470
- process.exit(1);
2471
- }
2472
- }
2473
- if (lstat === null) {
2474
- symlinkSync(targetAbs, linkPath);
2475
- console.log(` [create-maxy] symlink ${linkPath} → ${targetAbs}`);
2476
- logFile(` symlink created: ${linkPath} → ${targetAbs}`);
2477
- return;
2478
- }
2479
- if (!lstat.isSymbolicLink()) {
2480
- console.error(`Setup failed: ${linkPath} collision (regular file)`);
2481
- console.error(`[create-maxy:collision] ${linkPath} already exists target=<regular-file>`);
2482
- console.error(` Remove the file and re-run: npx -y @rubytech/create-maxy`);
2483
- process.exit(1);
2484
- }
2485
- // Brand isolation: a symlink at this path is either stale-same-brand,
2486
- // dangling, unreadable, or pointing at another brand. All four cases are resolved
2487
- // by last-writer-wins overwrite — setup-tunnel.sh takes <brand> as argv, so
2488
- // whichever brand's installer ran last owns the shortcut.
2489
- const resolvedTarget = (() => {
2490
- try {
2491
- return resolve(dirname(linkPath), readlinkSync(linkPath));
2492
- }
2493
- catch {
2494
- return "<unreadable>";
2495
- }
2496
- })();
2497
- if (resolvedTarget === targetAbs) {
2498
- console.log(` [create-maxy] symlink ${linkPath} already points to ${targetAbs}`);
2499
- logFile(` symlink unchanged: ${linkPath} → ${targetAbs}`);
2500
- return;
2501
- }
2502
- unlinkSync(linkPath);
2503
- symlinkSync(targetAbs, linkPath);
2504
- console.log(` [create-maxy] symlink replaced: ${linkPath} → ${targetAbs}`);
2505
- logFile(` symlink replaced: ${linkPath} was ${resolvedTarget}, now ${targetAbs}`);
2506
- }
2507
- function installTunnelScripts() {
2508
- const setupSrc = join(INSTALL_DIR, "platform/plugins/cloudflare/scripts/setup-tunnel.sh");
2509
- const resetSrc = join(INSTALL_DIR, "platform/plugins/cloudflare/scripts/reset-tunnel.sh");
2510
- const listSrc = join(INSTALL_DIR, "platform/plugins/cloudflare/scripts/list-cf-domains.sh");
2511
- const setupLink = resolve(process.env.HOME ?? "/root", "setup-tunnel.sh");
2512
- const resetLink = resolve(process.env.HOME ?? "/root", "reset-tunnel.sh");
2513
- const listLink = resolve(process.env.HOME ?? "/root", "list-cf-domains.sh");
2514
- for (const src of [setupSrc, resetSrc, listSrc]) {
2515
- try {
2516
- chmodSync(src, 0o755);
2517
- }
2518
- catch (err) {
2519
- console.error(`Setup failed: tunnel script missing or chmod failed: ${src}`);
2520
- console.error(`[create-maxy:error] tunnel script missing or chmod failed: ${src}`);
2521
- console.error(` ${err.message}`);
2522
- process.exit(1);
2523
- }
2524
- }
2525
- createTunnelSymlink(setupLink, setupSrc);
2526
- createTunnelSymlink(resetLink, resetSrc);
2527
- createTunnelSymlink(listLink, listSrc);
2528
- }
2529
2437
  // ---------------------------------------------------------------------------
2530
2438
  // Account discovery (shared by installService + the post-install summary)
2531
2439
  //
@@ -3238,27 +3146,6 @@ WantedBy=multi-user.target
3238
3146
  process.exit(1);
3239
3147
  }
3240
3148
  }
3241
- // Tunnel script smoke check — the cloudflare SKILL contract invokes
3242
- // ~/setup-tunnel.sh directly. If the install-time symlink creation in
3243
- // installTunnelScripts() didn't land, fail the install loudly here rather
3244
- // than shipping a missing-symlink gap that would loop the agent on exit 127.
3245
- for (const linkPath of [
3246
- resolve(process.env.HOME ?? "/root", "setup-tunnel.sh"),
3247
- resolve(process.env.HOME ?? "/root", "reset-tunnel.sh"),
3248
- resolve(process.env.HOME ?? "/root", "list-cf-domains.sh"),
3249
- ]) {
3250
- try {
3251
- accessSync(linkPath, fsConstants.X_OK);
3252
- console.log(` [create-maxy] verify: ${linkPath} executable ✓`);
3253
- }
3254
- catch (err) {
3255
- console.error("");
3256
- console.error(`Setup failed: tunnel script symlink missing or not executable: ${linkPath}`);
3257
- console.error(` [create-maxy:error] tunnel script symlink missing or not executable: ${linkPath}`);
3258
- console.error(` ${err.message}`);
3259
- process.exit(1);
3260
- }
3261
- }
3262
3149
  }
3263
3150
  // ---------------------------------------------------------------------------
3264
3151
  // Samba provisioning. Runs after installService() so SMB never
@@ -3729,8 +3616,8 @@ try {
3729
3616
  installWhisperCpp();
3730
3617
  deployPayload(); // Must happen before ensureNeo4jPassword — restores config backup
3731
3618
  // write the resolved Chromium absolute path into the deployed
3732
- // platform/config/ so vnc.sh, writeChromiumWrapper, and setup-tunnel.sh
3733
- // all read the same value. Must run after deployPayload (config dir is
3619
+ // platform/config/ so vnc.sh and writeChromiumWrapper read the same
3620
+ // value. Must run after deployPayload (config dir is
3734
3621
  // a payload subdirectory). Linux-only; no-op on darwin/non-linux.
3735
3622
  writeChromiumBinaryPathFile();
3736
3623
  // scrub plaintext neo4j passwords from any pre-fix install-*.log.
@@ -3746,7 +3633,6 @@ try {
3746
3633
  if (ENTITLEMENT_PAYLOAD) {
3747
3634
  writeEntitlementFromFlag(ENTITLEMENT_PAYLOAD);
3748
3635
  }
3749
- installTunnelScripts(); // ~/setup-tunnel.sh, ~/reset-tunnel.sh — the SKILL contract
3750
3636
  installService();
3751
3637
  // Samba on the LAN. Runs after the brand systemd unit is up so
3752
3638
  // SMB provisioning never blocks the admin server starting; loud-fail per
@@ -1,7 +1,6 @@
1
1
  // pure decision: should the laptop installer replace snap-confined
2
2
  // Chromium with Google Chrome stable, and which absolute binary path should
3
- // vnc.sh / writeChromiumWrapper / setup-tunnel.sh / the Playwright env var
4
- // resolve to?
3
+ // vnc.sh / writeChromiumWrapper / the Playwright env var resolve to?
5
4
  //
6
5
  // Mirrors apt-resolve.ts and port-resolution.ts: inputs
7
6
  // in, decision out, no I/O. The installer wraps this with the actual
package/dist/uninstall.js CHANGED
@@ -330,22 +330,23 @@ export function exportData(exportPath) {
330
330
  console.log(` Export complete: ${exportPath}`);
331
331
  }
332
332
  // ---------------------------------------------------------------------------
333
- // Step 3b: Remove tunnel script symlinks
333
+ // Step 3b: Remove legacy tunnel shortcut symlinks
334
334
  //
335
- // installTunnelScripts() creates ~/setup-tunnel.sh and ~/reset-tunnel.sh as
336
- // symlinks into INSTALL_DIR. Must run BEFORE removeAppDirs removes INSTALL_DIR
337
- // so readlink-then-compare still works.
335
+ // Older installer versions created ~/setup-tunnel and ~/reset-tunnel (with
336
+ // the ".sh" suffix) as symlinks into INSTALL_DIR's cloudflare scripts
337
+ // directory. The wrapper scripts and their installer hook were retired in
338
+ // Task 288 (PTY-native cloudflared via Bash). This step removes any leftover
339
+ // symlinks from previous installs. Must run BEFORE removeAppDirs removes
340
+ // INSTALL_DIR so readlink-then-compare still works.
338
341
  //
339
342
  // Only unlink if the symlink's resolved target is inside this brand's
340
343
  // INSTALL_DIR. A symlink pointing elsewhere came from a different brand install
341
344
  // on the same home (unsupported but not destructive) — leave it alone.
342
345
  // ---------------------------------------------------------------------------
346
+ const LEGACY_TUNNEL_SHORTCUTS = ["setup-tunnel", "reset-tunnel"].map((n) => `${n}.sh`);
343
347
  function removeTunnelSymlinks() {
344
- log("3b", "Removing tunnel script symlinks...");
345
- for (const linkPath of [
346
- resolve(HOME, "setup-tunnel.sh"),
347
- resolve(HOME, "reset-tunnel.sh"),
348
- ]) {
348
+ log("3b", "Removing legacy tunnel shortcut symlinks...");
349
+ for (const linkPath of LEGACY_TUNNEL_SHORTCUTS.map((name) => resolve(HOME, name))) {
349
350
  let lstat;
350
351
  try {
351
352
  lstat = lstatSync(linkPath);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-maxy-code",
3
- "version": "0.1.108",
3
+ "version": "0.1.110",
4
4
  "description": "Install Maxy — AI for Productive People",
5
5
  "bin": {
6
6
  "create-maxy-code": "./dist/index.js"
@@ -127,6 +127,7 @@ Tools are available via the `admin` MCP server.
127
127
  | Session reset / continue / resume | User asks to clear the session, start fresh, continue the last session, or pick up where they left off | `skills/session-management/SKILL.md` |
128
128
  | Commitment follow-through | A `<commitment-detected>` block appears in the prompt; the owner has just made a commitment that needs a backing mechanism | `skills/commitment-followthrough/SKILL.md` |
129
129
  | Show or download a file | User asks to view, attach, or download a file or document, or the current turn produces a document the owner needs to review | `skills/file-presentation/SKILL.md` |
130
+ | Upgrade Maxy | User asks to upgrade, update, install the latest version, or accepts an upgrade offer | `skills/upgrade/SKILL.md` |
130
131
 
131
132
  ## Hooks
132
133
 
@@ -1803,7 +1803,7 @@ eagerTool(server, "session-resume", "Resume a previous session. Loads the select
1803
1803
  server.tool("remote-auth-set-password", "Set the remote access password. Hashes with scrypt and writes to the platform's brand-specific config directory with mode 0600. " +
1804
1804
  "Validates strength (8+ chars, digit, special character, no spaces anywhere). " +
1805
1805
  "Protects the admin interface when exposed over the tunnel — has no effect on the public endpoint or the tunnel itself. " +
1806
- "Set before `setup-tunnel.sh` — the script's post-restart verification curls the admin hostname and fails if remote-auth is not configured.", { password: z.string() }, async ({ password }) => {
1806
+ "Set before configuring the Cloudflare tunnel — the post-restart `curl -I https://<admin-hostname>` verification fails if remote-auth is not configured.", { password: z.string() }, async ({ password }) => {
1807
1807
  if (!ACCOUNT_ID)
1808
1808
  return refuseNoAccount("remote-auth-set-password");
1809
1809
  // Validate strength — same rules as the web server's validatePasswordStrength