@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.
- package/dist/index.js +11 -125
- package/dist/snap-chromium.js +1 -2
- package/dist/uninstall.js +10 -9
- package/package.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -0
- package/payload/platform/plugins/admin/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/upgrade/SKILL.md +34 -0
- package/payload/platform/plugins/cloudflare/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/cloudflare/PLUGIN.md +9 -16
- package/payload/platform/plugins/cloudflare/mcp/dist/index.js +7 -12
- package/payload/platform/plugins/cloudflare/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/cloudflare/references/dashboard-guide.md +3 -3
- package/payload/platform/plugins/cloudflare/references/manual-setup.md +16 -51
- package/payload/platform/plugins/cloudflare/references/reset-guide.md +24 -25
- package/payload/platform/plugins/cloudflare/skills/setup-tunnel/SKILL.md +29 -144
- package/payload/platform/plugins/docs/references/admin-session.md +1 -1
- package/payload/platform/plugins/docs/references/admin-ui.md +1 -1
- package/payload/platform/plugins/docs/references/cloudflare.md +20 -29
- package/payload/platform/plugins/docs/references/platform.md +4 -22
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -1
- package/payload/platform/plugins/docs/references/troubleshooting.md +4 -316
- package/payload/platform/plugins/venture-studio/PLUGIN.md +35 -4
- package/payload/platform/plugins/venture-studio/bin/scaffold.sh +104 -0
- package/payload/platform/plugins/venture-studio/skills/investor-data-room/SKILL.md +3 -1
- package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.d.ts +2 -0
- package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.d.ts.map +1 -0
- package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.js +78 -0
- package/payload/platform/plugins/work/mcp/dist/cli/project-create-cli.js.map +1 -0
- package/payload/platform/scripts/check-no-task-id-leaks.mjs +1 -1
- package/payload/platform/scripts/vnc.sh +4 -3
- package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
- package/payload/premium-plugins/venture-studio/PLUGIN.md +35 -4
- package/payload/premium-plugins/venture-studio/bin/scaffold.sh +104 -0
- package/payload/premium-plugins/venture-studio/skills/investor-data-room/SKILL.md +3 -1
- package/payload/server/{chunk-AGFS3TVN.js → chunk-FSPPVVWM.js} +1303 -496
- package/payload/server/maxy-edge.js +21 -259
- package/payload/server/public/assets/{ChatInput-DJsqm_Gf.js → ChatInput-CsnIedhS.js} +1 -5
- package/payload/server/public/assets/{Checkbox-DGZG9BKc.js → Checkbox-CWugFyFT.js} +1 -1
- package/payload/server/public/assets/admin-D3gZuyUn.js +217 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-Dw16BhiX.js → architectureDiagram-Q4EWVU46-CeTRKWDb.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-DIOpmf5Y.js → blockDiagram-DXYQGD6D-DeeIX5U3.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-Tdb_HZeX.js → c4Diagram-AHTNJAMY-CFsqZuil.js} +1 -1
- package/payload/server/public/assets/channel-CrSx5mnG.js +1 -0
- package/payload/server/public/assets/{chunk-336JU56O-CebpwDDe.js → chunk-336JU56O-DpIXuFM0.js} +2 -2
- package/payload/server/public/assets/{chunk-426QAEUC-BtRCmfDU.js → chunk-426QAEUC-Qk8qqrvA.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-BZ3GEWs3.js → chunk-4TB4RGXK-DtM8-CUn.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-iDI6Xu0U.js → chunk-5FUZZQ4R-CrSQ4ySU.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-SQD_EpYa.js → chunk-5PVQY5BW-Bn2nQwdj.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-CtCcA7_e.js → chunk-EDXVE4YY-CzCPnR0P.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-pXVGVCbb.js → chunk-ENJZ2VHE-CgZj9RoG.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-Dkzg9o2N.js → chunk-ICPOFSXX-wy-eNjwW.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-1ZZWzf9F.js → chunk-OYMX7WX6-CMmJtL8S.js} +1 -1
- package/payload/server/public/assets/{chunk-U2HBQHQK-CpQ3kzO0.js → chunk-U2HBQHQK-CFCW7OaT.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-C2LkxroC.js → chunk-X2U36JSP-Bgh-CJSN.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-Bl5jBOt5.js → chunk-YZCP3GAM-BXKwZ4vN.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-CHtnptPS.js → chunk-ZZ45TVLE-BiOuK5NP.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-C3IDJsqN.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BOIrJ5Zb.js +1 -0
- package/payload/server/public/assets/clone-P8Fkz7JD.js +1 -0
- package/payload/server/public/assets/{dagre-BziN0Nkh.js → dagre-DyCxa9Q2.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-B7OG1g1Y.js → dagre-KV5264BT-Cffo_hmf.js} +1 -1
- package/payload/server/public/assets/data-DRfwJPja.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-Bf31nIDs.js → diagram-5BDNPKRD-Bt93Du3V.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-DQu85hhH.js → diagram-G4DWMVQ6-v4r-tBsC.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-5tstbs4y.js → diagram-MMDJMWI5-DKrVPOP-.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635--MOV1U4o.js → diagram-TYMM5635-B1PzWQb9.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-BtAnOJmd.js → erDiagram-SMLLAGMA-ClQzsQAs.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-CybiCIih.js → flowDiagram-DWJPFMVM-h3IbpN_7.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-B44jN7Cy.js → ganttDiagram-T4ZO3ILL-ClaxOJi8.js} +1 -1
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-CT7iYcwg.js → gitGraphDiagram-UUTBAWPF-pM-U4ClD.js} +1 -1
- package/payload/server/public/assets/graph-B4FFYwus.js +1 -0
- package/payload/server/public/assets/graph-labels-Cpk9Ktt0.js +1 -0
- package/payload/server/public/assets/{graphlib-DP4o0pYL.js → graphlib-CwimOv_M.js} +1 -1
- package/payload/server/public/assets/{infoDiagram-42DDH7IO-CvxFpFHN.js → infoDiagram-42DDH7IO-DcO3Giwe.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-CUwWLPeR.js → ishikawaDiagram-UXIWVN3A-BcdSL5VS.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-y-OnGgLi.js → journeyDiagram-VCZTEJTY-CYahHYzf.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-BhrSe8R4.js → kanban-definition-6JOO6SKY-Cl5KhoS4.js} +1 -1
- package/payload/server/public/assets/lib--yuBd0Xi.js +33 -0
- package/payload/server/public/assets/{line-C9uS7z4J.js → line-d_2oTxLp.js} +1 -1
- package/payload/server/public/assets/{mermaid-parser.core-Cg4ZdKp-.js → mermaid-parser.core-CMMDGv3x.js} +1 -1
- package/payload/server/public/assets/{mermaid.core-BHdKOsex.js → mermaid.core-DK9ENGbr.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-NBYiXHo7.js → mindmap-definition-QFDTVHPH-mA3x3MFG.js} +1 -1
- package/payload/server/public/assets/page-CgDmg_fX.js +1 -0
- package/payload/server/public/assets/{page-D9YpwhIu.js → page-D9lluVl7.js} +2 -2
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-CbojC64C.js → pieDiagram-DEJITSTG-CW1nGFlY.js} +1 -1
- package/payload/server/public/assets/public-DdLMkNdS.js +7 -0
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CnnoZXcL.js → quadrantDiagram-34T5L4WZ-DI5igJhR.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-DFRFRtyJ.js → requirementDiagram-MS252O5E-DyVeI4e_.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-DU5gcpzO.js → sankeyDiagram-XADWPNL6-CCTTBYKY.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BN7HZ6Hq.js → sequenceDiagram-FGHM5R23-hVVf35ly.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-DG6cCjvg.js → stateDiagram-FHFEXIEX-CSLuQDUX.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-C5JejhQU.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-qmV-8SEV.js → timeline-definition-GMOUNBTQ-sxC3W8Q4.js} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BMXQ1s3n.js → vennDiagram-DHZGUBPP-Ro-ton6Z.js} +1 -1
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-CoAdP1Gw.js → wardleyDiagram-NUSXRM2D-T-dKD0Zx.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CZlfGTEn.js → xychartDiagram-5P7HB3ND-CfProPts.js} +1 -1
- package/payload/server/public/data.html +4 -4
- package/payload/server/public/graph.html +5 -5
- package/payload/server/public/index.html +7 -7
- package/payload/server/public/public.html +4 -4
- package/payload/server/server.js +299 -1392
- package/payload/platform/plugins/cloudflare/scripts/__tests__/tunnel-ingress.test.ts +0 -241
- package/payload/platform/plugins/cloudflare/scripts/_stream-log.sh +0 -154
- package/payload/platform/plugins/cloudflare/scripts/list-cf-domains.sh +0 -98
- package/payload/platform/plugins/cloudflare/scripts/list-cf-domains.ts +0 -749
- package/payload/platform/plugins/cloudflare/scripts/reset-tunnel.sh +0 -107
- package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +0 -854
- package/payload/platform/plugins/cloudflare/scripts/tunnel-ingress.ts +0 -291
- package/payload/server/chunk-BDFOTLPW.js +0 -759
- package/payload/server/chunk-JRBCOVA4.js +0 -1305
- package/payload/server/cloudflare-task-tracker-M5ONAGUT.js +0 -22
- package/payload/server/public/assets/admin-BvzMvMGo.js +0 -217
- package/payload/server/public/assets/channel-DThrH4QF.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BC6oGTNX.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-COwC5Umh.js +0 -1
- package/payload/server/public/assets/clone-Chp7hvnA.js +0 -1
- package/payload/server/public/assets/data-BAgaPs4j.js +0 -1
- package/payload/server/public/assets/graph-Cma7EArf.js +0 -1
- package/payload/server/public/assets/graph-labels-DyKk6Sxf.js +0 -1
- package/payload/server/public/assets/lib-CpkYtEDz.js +0 -29
- package/payload/server/public/assets/page-B4IWl3aZ.js +0 -1
- package/payload/server/public/assets/public-BtOXjy3A.js +0 -8
- 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,
|
|
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
|
|
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 [
|
|
2178
|
-
//
|
|
2179
|
-
//
|
|
2180
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
3733
|
-
//
|
|
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
|
package/dist/snap-chromium.js
CHANGED
|
@@ -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 /
|
|
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
|
|
333
|
+
// Step 3b: Remove legacy tunnel shortcut symlinks
|
|
334
334
|
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
337
|
-
//
|
|
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
|
|
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
|
@@ -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
|
|
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
|