@smartmemory/compose 0.2.46-beta → 0.2.48-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/bin/compose.js +35 -1
- package/dist/assets/{App-CZNprfTP.js → App-D7E7S49Q.js} +163 -153
- package/dist/assets/{arc-D7Ql7gBh.js → arc-LOW60tiI.js} +1 -1
- package/dist/assets/{architectureDiagram-3BPJPVTR-CMzqpLWw.js → architectureDiagram-3BPJPVTR-BDY00hRy.js} +1 -1
- package/dist/assets/{blockDiagram-GPEHLZMM-CbW2AYzk.js → blockDiagram-GPEHLZMM-DiC_6ktq.js} +1 -1
- package/dist/assets/browser-DW2JlJCC.js +8 -0
- package/dist/assets/{c4Diagram-AAUBKEIU-C89TIEqM.js → c4Diagram-AAUBKEIU-CXZC8woU.js} +1 -1
- package/dist/assets/channel-Dh96pu1k.js +1 -0
- package/dist/assets/{chunk-2J33WTMH-jLQK9et3.js → chunk-2J33WTMH-b8Rdk4S-.js} +1 -1
- package/dist/assets/{chunk-4BX2VUAB-bH25OCUA.js → chunk-4BX2VUAB-BSxn03f-.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-Dhb0bOrW.js → chunk-55IACEB6-uUk1WzZ1.js} +1 -1
- package/dist/assets/{chunk-727SXJPM-CBfeQuSd.js → chunk-727SXJPM-zvXhT6iZ.js} +1 -1
- package/dist/assets/{chunk-AQP2D5EJ-CIxa5qRv.js → chunk-AQP2D5EJ-B6GCyrIp.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-CmXvjRAO.js → chunk-FMBD7UC4-DlhrqkBp.js} +1 -1
- package/dist/assets/{chunk-ND2GUHAM-DRs6NTTH.js → chunk-ND2GUHAM-lo_8kNzw.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-BmkcOtBV.js → chunk-QZHKN3VN-on-yD-C0.js} +1 -1
- package/dist/assets/classDiagram-4FO5ZUOK-BCqpDcaS.js +1 -0
- package/dist/assets/classDiagram-v2-Q7XG4LA2-BCqpDcaS.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-BZwhzUqa.js → cose-bilkent-S5V4N54A-DxV7Y2bU.js} +1 -1
- package/dist/assets/{dagre-BM42HDAG-CEHe9vzv.js → dagre-BM42HDAG-BHf9sURy.js} +1 -1
- package/dist/assets/{diagram-2AECGRRQ-Cq8RCIdY.js → diagram-2AECGRRQ-R9Puxzlh.js} +1 -1
- package/dist/assets/{diagram-5GNKFQAL-DCaYgQ-u.js → diagram-5GNKFQAL-BbjlClKx.js} +1 -1
- package/dist/assets/{diagram-KO2AKTUF-DehQMQAE.js → diagram-KO2AKTUF-r89Mx4m1.js} +1 -1
- package/dist/assets/{diagram-LMA3HP47-BUJ8pJCq.js → diagram-LMA3HP47-CstVDJZ3.js} +1 -1
- package/dist/assets/{diagram-OG6HWLK6-BrqALaH3.js → diagram-OG6HWLK6-xmX57FKh.js} +1 -1
- package/dist/assets/{erDiagram-TEJ5UH35-Cz2hnPqN.js → erDiagram-TEJ5UH35-DhLPxvrl.js} +1 -1
- package/dist/assets/{flowDiagram-I6XJVG4X-BpPrbE4K.js → flowDiagram-I6XJVG4X-BExoUaNm.js} +1 -1
- package/dist/assets/{ganttDiagram-6RSMTGT7-Dne2jtVu.js → ganttDiagram-6RSMTGT7-BEXa5a22.js} +1 -1
- package/dist/assets/{gitGraphDiagram-PVQCEYII-W8OpyxIG.js → gitGraphDiagram-PVQCEYII-Cbes9api.js} +1 -1
- package/dist/assets/{graph-viND0NdB.js → graph-BBXaecIU.js} +1 -1
- package/dist/assets/index-BwLfbbOu.css +1 -0
- package/dist/assets/{index-BVnbNZXC.js → index-DNuHtZwR.js} +22 -22
- package/dist/assets/{infoDiagram-5YYISTIA-4OeddgjS.js → infoDiagram-5YYISTIA-UBm4ssfm.js} +1 -1
- package/dist/assets/{ishikawaDiagram-YF4QCWOH-D0XwMcCq.js → ishikawaDiagram-YF4QCWOH-CksBYHCF.js} +1 -1
- package/dist/assets/{journeyDiagram-JHISSGLW-CO0wIeDT.js → journeyDiagram-JHISSGLW-CKHkIHky.js} +1 -1
- package/dist/assets/{kanban-definition-UN3LZRKU-CLU0ciYv.js → kanban-definition-UN3LZRKU-CEahMFzE.js} +1 -1
- package/dist/assets/{linear-BOFLe2h1.js → linear-CqLVtYRk.js} +1 -1
- package/dist/assets/{mindmap-definition-RKZ34NQL-ByuwlkdD.js → mindmap-definition-RKZ34NQL-C61zWt4M.js} +1 -1
- package/dist/assets/mobile-DwmxS_O4.js +17 -0
- package/dist/assets/{pieDiagram-4H26LBE5-CPm2BXke.js → pieDiagram-4H26LBE5-BIpZHyJW.js} +1 -1
- package/dist/assets/{quadrantDiagram-W4KKPZXB-CR3NLvwU.js → quadrantDiagram-W4KKPZXB-Db7nRbZm.js} +1 -1
- package/dist/assets/{requirementDiagram-4Y6WPE33-D4vpyryW.js → requirementDiagram-4Y6WPE33-BQqFCAr0.js} +1 -1
- package/dist/assets/{sankeyDiagram-5OEKKPKP--Clp0eo-.js → sankeyDiagram-5OEKKPKP-D-oAAMci.js} +1 -1
- package/dist/assets/{sequenceDiagram-3UESZ5HK-B1xrJkMo.js → sequenceDiagram-3UESZ5HK-Dc4Cp0Om.js} +1 -1
- package/dist/assets/{stateDiagram-AJRCARHV-D5w5yQql.js → stateDiagram-AJRCARHV-B5DkQ8Pr.js} +1 -1
- package/dist/assets/stateDiagram-v2-BHNVJYJU-BM1Uf6a_.js +1 -0
- package/dist/assets/{timeline-definition-PNZ67QCA-DxOINQqf.js → timeline-definition-PNZ67QCA-DU9Fl-FW.js} +1 -1
- package/dist/assets/{vennDiagram-CIIHVFJN-B3Wss4do.js → vennDiagram-CIIHVFJN-Bthz7siw.js} +1 -1
- package/dist/assets/{wardley-L42UT6IY-nYDkwvlu.js → wardley-L42UT6IY-nqdlFSIA.js} +1 -1
- package/dist/assets/{wardleyDiagram-YWT4CUSO-BMM3myEL.js → wardleyDiagram-YWT4CUSO-BJ1BC5zc.js} +1 -1
- package/dist/assets/{xychartDiagram-2RQKCTM6-B5ElCNMx.js → xychartDiagram-2RQKCTM6-Bib5JrbR.js} +1 -1
- package/dist/index.html +3 -3
- package/lib/cli-remote.js +533 -0
- package/package.json +3 -1
- package/server/auth-middleware.js +309 -0
- package/server/auth-routes.js +195 -0
- package/server/auth-store.js +539 -0
- package/server/build-routes.js +1 -1
- package/server/index.js +134 -7
- package/server/remote-utils.js +134 -0
- package/server/security.js +46 -1
- package/server/supervisor.js +7 -1
- package/server/vision-routes.js +1 -1
- package/server/vision-server.js +1 -1
- package/dist/assets/channel-sjm4Ncyv.js +0 -1
- package/dist/assets/classDiagram-4FO5ZUOK-LkIQdBsc.js +0 -1
- package/dist/assets/classDiagram-v2-Q7XG4LA2-LkIQdBsc.js +0 -1
- package/dist/assets/index-D9M5IzwO.css +0 -1
- package/dist/assets/mobile-B-d4crm_.js +0 -17
- package/dist/assets/stateDiagram-v2-BHNVJYJU-TPU-mOqi.js +0 -1
package/README.md
CHANGED
|
@@ -133,6 +133,23 @@ compose tracker sync # reconcile op-log against remote provider
|
|
|
133
133
|
|
|
134
134
|
See [docs/configuration.md](docs/configuration.md) for the full `tracker` config reference.
|
|
135
135
|
|
|
136
|
+
## Remote access (mobile PWA from anywhere)
|
|
137
|
+
|
|
138
|
+
The mobile cockpit at `/m` can be reached from outside localhost — bring your own tunnel, compose handles auth and pairing:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npm run build # remote serves the built PWA from the API server
|
|
142
|
+
COMPOSE_REMOTE_AUTH=enabled compose start --host=0.0.0.0
|
|
143
|
+
compose remote pair --public-host=https://your-tunnel-host # prints a QR — scan it with your phone
|
|
144
|
+
compose remote status # bind, devices, tunnel reachability
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
How it works: binding beyond `127.0.0.1` refuses to start unless `COMPOSE_REMOTE_AUTH=enabled` is set. In remote mode every request needs a credential — there is deliberately **no IP-based trust** (tunnel daemons connect from loopback). Phones pair once via QR (5-minute single-use code) and stay authenticated for 30 days through rotating refresh tokens + 15-minute access JWTs; reuse of a rotated refresh token revokes the device. Devices are listable and revocable (`compose remote list|revoke`, or the cockpit's "Pair mobile" modal). Only port 4001 needs to be exposed — agent-server traffic is proxied through it.
|
|
148
|
+
|
|
149
|
+
Tunnel layer is yours: Tailscale (serve/funnel), Cloudflare Tunnel, or a reverse proxy on your own VPS+domain all work — the last is the most reliable from restrictive networks (e.g. mainland China, where `trycloudflare.com`/ngrok domains are commonly blocked; plain TLS on 443 to an unremarkable domain travels best). Pair the device *before* traveling: pairing needs a live round-trip, while an already-paired phone only needs refresh.
|
|
150
|
+
|
|
151
|
+
`compose remote rotate-secret --yes` invalidates every paired device (post-leak hammer).
|
|
152
|
+
|
|
136
153
|
## Documentation
|
|
137
154
|
|
|
138
155
|
Topic-scoped reference:
|
package/bin/compose.js
CHANGED
|
@@ -109,6 +109,7 @@ if (!cmd || cmd === '--help' || cmd === '-h') {
|
|
|
109
109
|
console.log('')
|
|
110
110
|
console.log('Commands:')
|
|
111
111
|
console.log(' start Start the compose app (UI + API) for this project')
|
|
112
|
+
console.log(' remote Manage remote access: pair, list, revoke, status')
|
|
112
113
|
console.log(' new Kickoff a product (research, brainstorm, roadmap, scaffold)')
|
|
113
114
|
console.log(' import Scan existing project and generate structured analysis')
|
|
114
115
|
console.log(' feature Add a single feature (folder, design seed, ROADMAP entry)')
|
|
@@ -2345,16 +2346,49 @@ if (cmd === 'build') {
|
|
|
2345
2346
|
process.exit(1)
|
|
2346
2347
|
}
|
|
2347
2348
|
|
|
2349
|
+
// --host=<addr> forwards COMPOSE_HOST to the supervisor → api-server child.
|
|
2350
|
+
// supervisor.js already threads COMPOSE_HOST to api-server only; agent-server
|
|
2351
|
+
// stays 127.0.0.1 always (see supervisor.js ~line 146).
|
|
2352
|
+
const hostFlagIdx = args.findIndex((a) => a.startsWith('--host='))
|
|
2353
|
+
const startEnv = { ...process.env, COMPOSE_TARGET: targetRoot }
|
|
2354
|
+
if (hostFlagIdx !== -1) {
|
|
2355
|
+
startEnv.COMPOSE_HOST = args[hostFlagIdx].slice('--host='.length)
|
|
2356
|
+
}
|
|
2357
|
+
|
|
2348
2358
|
const child = spawn('node', [join(PACKAGE_ROOT, 'server', 'supervisor.js')], {
|
|
2349
2359
|
stdio: 'inherit',
|
|
2350
2360
|
cwd: PACKAGE_ROOT,
|
|
2351
|
-
env:
|
|
2361
|
+
env: startEnv,
|
|
2352
2362
|
})
|
|
2353
2363
|
child.on('error', (err) => {
|
|
2354
2364
|
console.error(`Failed to start compose: ${err.message}`)
|
|
2355
2365
|
process.exit(1)
|
|
2356
2366
|
})
|
|
2357
2367
|
child.on('exit', (code) => process.exit(code ?? 0))
|
|
2368
|
+
} else if (cmd === 'remote') {
|
|
2369
|
+
// ---------------------------------------------------------------------------
|
|
2370
|
+
// compose remote — remote access management (COMP-MOBILE-REMOTE S03)
|
|
2371
|
+
// ---------------------------------------------------------------------------
|
|
2372
|
+
const { runRemoteCommand } = await import('../lib/cli-remote.js')
|
|
2373
|
+
const { root: remoteCwd } = resolveCwdWithWorkspace(args)
|
|
2374
|
+
|
|
2375
|
+
await runRemoteCommand(args, {
|
|
2376
|
+
port: resolvePort(),
|
|
2377
|
+
token: process.env.COMPOSE_API_TOKEN,
|
|
2378
|
+
cwd: remoteCwd,
|
|
2379
|
+
lines: { push: (l) => console.log(l) },
|
|
2380
|
+
// qr and poll use defaults (qrcode-terminal + setTimeout)
|
|
2381
|
+
}).catch((err) => {
|
|
2382
|
+
// Errors already printed to output; only exit non-zero
|
|
2383
|
+
if (
|
|
2384
|
+
err.message !== 'COMPOSE_API_TOKEN not set' &&
|
|
2385
|
+
err.message !== '--yes required' &&
|
|
2386
|
+
err.message !== 'Missing device-id'
|
|
2387
|
+
) {
|
|
2388
|
+
console.error(`remote: ${err.message}`)
|
|
2389
|
+
}
|
|
2390
|
+
process.exit(1)
|
|
2391
|
+
})
|
|
2358
2392
|
} else if (cmd === 'ideabox') {
|
|
2359
2393
|
// ---------------------------------------------------------------------------
|
|
2360
2394
|
// compose ideabox — idea management CLI
|