@claudetools/cli 0.13.13 → 0.13.15
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/__tests__/factories.d.ts +173 -0
- package/dist/__tests__/factories.d.ts.map +1 -0
- package/dist/__tests__/factories.js +150 -0
- package/dist/__tests__/factories.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +36 -0
- package/dist/__tests__/helpers.d.ts.map +1 -0
- package/dist/__tests__/helpers.js +52 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/analytics/index.d.ts +14 -0
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/index.js +259 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/session.d.ts +17 -0
- package/dist/analytics/session.d.ts.map +1 -0
- package/dist/analytics/session.js +130 -0
- package/dist/analytics/session.js.map +1 -0
- package/dist/analytics/token-tracker.d.ts +48 -0
- package/dist/analytics/token-tracker.d.ts.map +1 -0
- package/dist/analytics/token-tracker.js +269 -0
- package/dist/analytics/token-tracker.js.map +1 -0
- package/dist/analytics/tracker.d.ts +33 -0
- package/dist/analytics/tracker.d.ts.map +1 -0
- package/dist/analytics/tracker.js +210 -0
- package/dist/analytics/tracker.js.map +1 -0
- package/dist/api-keys/index.d.ts +15 -0
- package/dist/api-keys/index.d.ts.map +1 -0
- package/dist/api-keys/index.js +228 -0
- package/dist/api-keys/index.js.map +1 -0
- package/dist/auth/config.d.ts +15 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +67 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +299 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +21 -0
- package/dist/auth/keychain.d.ts.map +1 -0
- package/dist/auth/keychain.js +256 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/billing/index.d.ts +7 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +233 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/cli.js +291 -43
- package/dist/cli.js.map +1 -1
- package/dist/commands/hook.d.ts +12 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +190 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/keys.d.ts +4 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +43 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +43 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/project.d.ts +4 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +68 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +37 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/stacks.d.ts +4 -0
- package/dist/commands/stacks.d.ts.map +1 -0
- package/dist/commands/stacks.js +103 -0
- package/dist/commands/stacks.js.map +1 -0
- package/dist/commands/stats.d.ts +4 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +6 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync.d.ts +4 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +60 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +63 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/daemon/client.d.ts +107 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +250 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/health.d.ts +38 -0
- package/dist/daemon/health.d.ts.map +1 -0
- package/dist/daemon/health.js +212 -0
- package/dist/daemon/health.js.map +1 -0
- package/dist/daemon/index.d.ts +34 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +197 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/protocol.d.ts +144 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +5 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/gamification/index.d.ts +13 -0
- package/dist/gamification/index.d.ts.map +1 -0
- package/dist/gamification/index.js +120 -0
- package/dist/gamification/index.js.map +1 -0
- package/dist/gamification/types.d.ts +34 -0
- package/dist/gamification/types.d.ts.map +1 -0
- package/dist/gamification/types.js +5 -0
- package/dist/gamification/types.js.map +1 -0
- package/dist/hooks/index.d.ts +65 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +403 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/lib/api.d.ts +29 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +213 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/browser.d.ts +6 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +14 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/channel-config.d.ts +10 -0
- package/dist/lib/channel-config.d.ts.map +1 -0
- package/dist/lib/channel-config.js +48 -0
- package/dist/lib/channel-config.js.map +1 -0
- package/dist/lib/command-runner.d.ts +16 -0
- package/dist/lib/command-runner.d.ts.map +1 -0
- package/dist/lib/command-runner.js +59 -0
- package/dist/lib/command-runner.js.map +1 -0
- package/dist/lib/command-utils.d.ts +22 -0
- package/dist/lib/command-utils.d.ts.map +1 -0
- package/dist/lib/command-utils.js +88 -0
- package/dist/lib/command-utils.js.map +1 -0
- package/dist/lib/error-handler.d.ts +13 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +70 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/errors.d.ts +35 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +70 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/exit.d.ts +10 -0
- package/dist/lib/exit.d.ts.map +1 -0
- package/dist/lib/exit.js +21 -0
- package/dist/lib/exit.js.map +1 -0
- package/dist/lib/formatters.d.ts +65 -0
- package/dist/lib/formatters.d.ts.map +1 -0
- package/dist/lib/formatters.js +180 -0
- package/dist/lib/formatters.js.map +1 -0
- package/dist/lib/hybrid-data.d.ts +47 -0
- package/dist/lib/hybrid-data.d.ts.map +1 -0
- package/dist/lib/hybrid-data.js +326 -0
- package/dist/lib/hybrid-data.js.map +1 -0
- package/dist/lib/local-store.d.ts +113 -0
- package/dist/lib/local-store.d.ts.map +1 -0
- package/dist/lib/local-store.js +220 -0
- package/dist/lib/local-store.js.map +1 -0
- package/dist/lib/machine-id.d.ts +8 -0
- package/dist/lib/machine-id.d.ts.map +1 -0
- package/dist/lib/machine-id.js +39 -0
- package/dist/lib/machine-id.js.map +1 -0
- package/dist/lib/network.d.ts +15 -0
- package/dist/lib/network.d.ts.map +1 -0
- package/dist/lib/network.js +46 -0
- package/dist/lib/network.js.map +1 -0
- package/dist/lib/theme.d.ts +77 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +137 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/tool-availability.d.ts +13 -0
- package/dist/lib/tool-availability.d.ts.map +1 -0
- package/dist/lib/tool-availability.js +48 -0
- package/dist/lib/tool-availability.js.map +1 -0
- package/dist/lib/update-checker.d.ts +21 -0
- package/dist/lib/update-checker.d.ts.map +1 -0
- package/dist/lib/update-checker.js +110 -0
- package/dist/lib/update-checker.js.map +1 -0
- package/dist/lib/validation.d.ts +30 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +82 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/validators.d.ts +18 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +30 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/marketplace/api.d.ts +24 -0
- package/dist/marketplace/api.d.ts.map +1 -0
- package/dist/marketplace/api.js +92 -0
- package/dist/marketplace/api.js.map +1 -0
- package/dist/marketplace/index.d.ts +13 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +155 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/installer.d.ts +18 -0
- package/dist/marketplace/installer.d.ts.map +1 -0
- package/dist/marketplace/installer.js +184 -0
- package/dist/marketplace/installer.js.map +1 -0
- package/dist/mcp/api.d.ts +93 -0
- package/dist/mcp/api.d.ts.map +1 -0
- package/dist/mcp/api.js +106 -0
- package/dist/mcp/api.js.map +1 -0
- package/dist/mcp/config.d.ts +72 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +156 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/index.d.ts +54 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +381 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/prompt.clean.d.ts +25 -0
- package/dist/mcp/prompt.clean.d.ts.map +1 -0
- package/dist/mcp/prompt.clean.js +206 -0
- package/dist/mcp/prompt.clean.js.map +1 -0
- package/dist/mcp/prompt.d.ts +52 -0
- package/dist/mcp/prompt.d.ts.map +1 -0
- package/dist/mcp/prompt.js +210 -0
- package/dist/mcp/prompt.js.map +1 -0
- package/dist/mcp/secrets.clean.d.ts +18 -0
- package/dist/mcp/secrets.clean.d.ts.map +1 -0
- package/dist/mcp/secrets.clean.js +357 -0
- package/dist/mcp/secrets.clean.js.map +1 -0
- package/dist/mcp/secrets.d.ts +46 -0
- package/dist/mcp/secrets.d.ts.map +1 -0
- package/dist/mcp/secrets.js +339 -0
- package/dist/mcp/secrets.js.map +1 -0
- package/dist/memory/index.d.ts +14 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +98 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/onboard/agents-md-builder.d.ts.map +1 -1
- package/dist/onboard/agents-md-builder.js +45 -0
- package/dist/onboard/agents-md-builder.js.map +1 -1
- package/dist/onboard/claude-inference.d.ts.map +1 -1
- package/dist/onboard/claude-inference.js +15 -4
- package/dist/onboard/claude-inference.js.map +1 -1
- package/dist/onboard/context7-fetcher.d.ts +1 -1
- package/dist/onboard/context7-fetcher.d.ts.map +1 -1
- package/dist/onboard/context7-fetcher.js +50 -16
- package/dist/onboard/context7-fetcher.js.map +1 -1
- package/dist/onboard/docs-builder.d.ts.map +1 -1
- package/dist/onboard/docs-builder.js +523 -50
- package/dist/onboard/docs-builder.js.map +1 -1
- package/dist/onboard/index.d.ts.map +1 -1
- package/dist/onboard/index.js +74 -25
- package/dist/onboard/index.js.map +1 -1
- package/dist/onboard/stack-detector.d.ts.map +1 -1
- package/dist/onboard/stack-detector.js +5 -55
- package/dist/onboard/stack-detector.js.map +1 -1
- package/dist/project/constants.d.ts +21 -0
- package/dist/project/constants.d.ts.map +1 -0
- package/dist/project/constants.js +21 -0
- package/dist/project/constants.js.map +1 -0
- package/dist/project/format.d.ts +16 -0
- package/dist/project/format.d.ts.map +1 -0
- package/dist/project/format.js +40 -0
- package/dist/project/format.js.map +1 -0
- package/dist/project/git.d.ts +28 -0
- package/dist/project/git.d.ts.map +1 -0
- package/dist/project/git.js +93 -0
- package/dist/project/git.js.map +1 -0
- package/dist/project/index.d.ts +36 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +272 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/mapper.d.ts +27 -0
- package/dist/project/mapper.d.ts.map +1 -0
- package/dist/project/mapper.js +64 -0
- package/dist/project/mapper.js.map +1 -0
- package/dist/project/storage.d.ts +71 -0
- package/dist/project/storage.d.ts.map +1 -0
- package/dist/project/storage.js +274 -0
- package/dist/project/storage.js.map +1 -0
- package/dist/project/sync-bridge.d.ts +33 -0
- package/dist/project/sync-bridge.d.ts.map +1 -0
- package/dist/project/sync-bridge.js +155 -0
- package/dist/project/sync-bridge.js.map +1 -0
- package/dist/project/types.d.ts +107 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +77 -0
- package/dist/project/types.js.map +1 -0
- package/dist/publish/index.d.ts +4 -0
- package/dist/publish/index.d.ts.map +1 -0
- package/dist/publish/index.js +92 -0
- package/dist/publish/index.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +29 -10
- package/dist/setup.js.map +1 -1
- package/dist/skills/index.d.ts +51 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +509 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/stacks/check.d.ts +2 -0
- package/dist/stacks/check.d.ts.map +1 -0
- package/dist/stacks/check.js +144 -0
- package/dist/stacks/check.js.map +1 -0
- package/dist/stacks/diff.d.ts +11 -0
- package/dist/stacks/diff.d.ts.map +1 -0
- package/dist/stacks/diff.js +123 -0
- package/dist/stacks/diff.js.map +1 -0
- package/dist/stacks/index.d.ts +17 -0
- package/dist/stacks/index.d.ts.map +1 -0
- package/dist/stacks/index.js +525 -0
- package/dist/stacks/index.js.map +1 -0
- package/dist/stacks/index.refactored.d.ts.map +1 -0
- package/dist/stacks/index.refactored.js.map +1 -0
- package/dist/stacks/io.d.ts +11 -0
- package/dist/stacks/io.d.ts.map +1 -0
- package/dist/stacks/io.js +179 -0
- package/dist/stacks/io.js.map +1 -0
- package/dist/stacks/rollback.d.ts +5 -0
- package/dist/stacks/rollback.d.ts.map +1 -0
- package/dist/stacks/rollback.js +162 -0
- package/dist/stacks/rollback.js.map +1 -0
- package/dist/stacks/types.d.ts +70 -0
- package/dist/stacks/types.d.ts.map +1 -0
- package/dist/stacks/types.js +6 -0
- package/dist/stacks/types.js.map +1 -0
- package/dist/stacks/utils.d.ts +9 -0
- package/dist/stacks/utils.d.ts.map +1 -0
- package/dist/stacks/utils.js +11 -0
- package/dist/stacks/utils.js.map +1 -0
- package/dist/start/index.d.ts +23 -0
- package/dist/start/index.d.ts.map +1 -0
- package/dist/start/index.js +386 -0
- package/dist/start/index.js.map +1 -0
- package/dist/sync/index.d.ts +49 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +207 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync-engine/__tests__/test-helpers.d.ts +14 -0
- package/dist/sync-engine/__tests__/test-helpers.d.ts.map +1 -0
- package/dist/sync-engine/__tests__/test-helpers.js +73 -0
- package/dist/sync-engine/__tests__/test-helpers.js.map +1 -0
- package/dist/sync-engine/client.d.ts +128 -0
- package/dist/sync-engine/client.d.ts.map +1 -0
- package/dist/sync-engine/client.js +289 -0
- package/dist/sync-engine/client.js.map +1 -0
- package/dist/sync-engine/health.d.ts +38 -0
- package/dist/sync-engine/health.d.ts.map +1 -0
- package/dist/sync-engine/health.js +259 -0
- package/dist/sync-engine/health.js.map +1 -0
- package/dist/sync-engine/index.d.ts +34 -0
- package/dist/sync-engine/index.d.ts.map +1 -0
- package/dist/sync-engine/index.js +197 -0
- package/dist/sync-engine/index.js.map +1 -0
- package/dist/sync-engine/protocol.d.ts +153 -0
- package/dist/sync-engine/protocol.d.ts.map +1 -0
- package/dist/sync-engine/protocol.js +5 -0
- package/dist/sync-engine/protocol.js.map +1 -0
- package/dist/tasks/index.d.ts +14 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +109 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/team/index.d.ts +12 -0
- package/dist/team/index.d.ts.map +1 -0
- package/dist/team/index.js +151 -0
- package/dist/team/index.js.map +1 -0
- package/dist/updater.d.ts +5 -5
- package/dist/updater.d.ts.map +1 -1
- package/dist/updater.js +24 -88
- package/dist/updater.js.map +1 -1
- package/dist/usage/index.d.ts +10 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +104 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/webhooks/index.d.ts +7 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +81 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +26 -15
- package/scripts/postinstall.js +282 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,CAAC,EAAE,EACV,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAC3B,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAaN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,IAAI,CAuEN;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAO/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAAC,EAClF,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAYN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAU5E;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,IAAI,CAaN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;CAAE,CAAC,GAChG,IAAI,CAcN"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import Table from 'cli-table3';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import { theme, formatHeader, getTermWidth } from './theme.js';
|
|
4
|
+
/**
|
|
5
|
+
* Prints a formatted list of items
|
|
6
|
+
* @param title List title
|
|
7
|
+
* @param items Array of items to render
|
|
8
|
+
* @param renderFn Function to render each item
|
|
9
|
+
* @param emptyMessage Message to show when list is empty
|
|
10
|
+
* @param emptyHint Optional hint to show when list is empty
|
|
11
|
+
*/
|
|
12
|
+
export function formatList(title, items, renderFn, emptyMessage, emptyHint) {
|
|
13
|
+
if (items.length === 0) {
|
|
14
|
+
emptyState(emptyMessage, emptyHint);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
console.log();
|
|
18
|
+
console.log(` ${formatHeader(title)}`);
|
|
19
|
+
console.log();
|
|
20
|
+
for (const item of items) {
|
|
21
|
+
renderFn(item);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Prints a professional table with borders and colors
|
|
26
|
+
* @param headers Column headers
|
|
27
|
+
* @param rows Array of row data (each row is an array of cell values)
|
|
28
|
+
* @param options Optional table configuration
|
|
29
|
+
*/
|
|
30
|
+
export function formatTable(headers, rows, options) {
|
|
31
|
+
if (rows.length === 0) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const style = options?.style || 'default';
|
|
35
|
+
const useColors = options?.colors !== false && theme.colorSupport;
|
|
36
|
+
const table = new Table({
|
|
37
|
+
head: headers.map((h) => (useColors ? theme.info(h) : h)),
|
|
38
|
+
style: {
|
|
39
|
+
head: [],
|
|
40
|
+
border: useColors ? [theme.muted.name] : [],
|
|
41
|
+
'padding-left': 1,
|
|
42
|
+
'padding-right': 1,
|
|
43
|
+
compact: style === 'compact',
|
|
44
|
+
},
|
|
45
|
+
chars: style === 'markdown'
|
|
46
|
+
? {
|
|
47
|
+
top: '',
|
|
48
|
+
'top-mid': '',
|
|
49
|
+
'top-left': '',
|
|
50
|
+
'top-right': '',
|
|
51
|
+
bottom: '',
|
|
52
|
+
'bottom-mid': '',
|
|
53
|
+
'bottom-left': '',
|
|
54
|
+
'bottom-right': '',
|
|
55
|
+
left: '|',
|
|
56
|
+
'left-mid': '',
|
|
57
|
+
mid: '',
|
|
58
|
+
'mid-mid': '',
|
|
59
|
+
right: '|',
|
|
60
|
+
'right-mid': '',
|
|
61
|
+
middle: '|',
|
|
62
|
+
}
|
|
63
|
+
: style === 'compact'
|
|
64
|
+
? {
|
|
65
|
+
top: '',
|
|
66
|
+
'top-mid': '',
|
|
67
|
+
'top-left': '',
|
|
68
|
+
'top-right': '',
|
|
69
|
+
bottom: '',
|
|
70
|
+
'bottom-mid': '',
|
|
71
|
+
'bottom-left': '',
|
|
72
|
+
'bottom-right': '',
|
|
73
|
+
left: '',
|
|
74
|
+
'left-mid': '',
|
|
75
|
+
mid: '',
|
|
76
|
+
'mid-mid': '',
|
|
77
|
+
right: '',
|
|
78
|
+
'right-mid': '',
|
|
79
|
+
middle: ' ',
|
|
80
|
+
}
|
|
81
|
+
: undefined,
|
|
82
|
+
});
|
|
83
|
+
// Add rows
|
|
84
|
+
for (const row of rows) {
|
|
85
|
+
table.push(row);
|
|
86
|
+
}
|
|
87
|
+
console.log();
|
|
88
|
+
console.log(table
|
|
89
|
+
.toString()
|
|
90
|
+
.split('\n')
|
|
91
|
+
.map((line) => ` ${line}`)
|
|
92
|
+
.join('\n'));
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Prints an empty state message with optional hint
|
|
97
|
+
* @param message Main message
|
|
98
|
+
* @param hint Optional hint or suggestion
|
|
99
|
+
*/
|
|
100
|
+
export function emptyState(message, hint) {
|
|
101
|
+
console.log();
|
|
102
|
+
console.log(` ${theme.muted(message)}`);
|
|
103
|
+
if (hint) {
|
|
104
|
+
console.log(` ${theme.muted(hint)}`);
|
|
105
|
+
}
|
|
106
|
+
console.log();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Prints a bar chart for percentages
|
|
110
|
+
* @param items Array of {label, percentage, color} objects
|
|
111
|
+
* @param width Maximum bar width in characters (adapts to terminal width)
|
|
112
|
+
*/
|
|
113
|
+
export function formatBarChart(items, width) {
|
|
114
|
+
const termWidth = getTermWidth();
|
|
115
|
+
const maxBarWidth = width || Math.min(40, Math.floor((termWidth - 30) * 0.6));
|
|
116
|
+
const maxPercentage = Math.max(...items.map((item) => item.percentage));
|
|
117
|
+
for (const item of items) {
|
|
118
|
+
const filled = Math.round((item.percentage / maxPercentage) * maxBarWidth);
|
|
119
|
+
const colorFn = item.color || theme.highlight;
|
|
120
|
+
const bar = colorFn('█'.repeat(filled)) + ' '.repeat(maxBarWidth - filled);
|
|
121
|
+
const pct = item.percentage.toFixed(1).padStart(5) + '%';
|
|
122
|
+
console.log(` ${item.label.padEnd(12)} ${bar} ${theme.muted(pct)}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Prints a quota display (used/limit)
|
|
127
|
+
* @param title Quota title
|
|
128
|
+
* @param used Used count
|
|
129
|
+
* @param limit Limit count
|
|
130
|
+
*/
|
|
131
|
+
export function formatQuota(title, used, limit) {
|
|
132
|
+
const percentage = (used / limit) * 100;
|
|
133
|
+
const colorFn = percentage >= 90 ? theme.error : percentage >= 70 ? theme.warning : theme.success;
|
|
134
|
+
console.log(` ${title} ${colorFn(`${used}/${limit}`)} ${theme.muted(`(${percentage.toFixed(0)}%)`)}`);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Displays a boxed message for important announcements
|
|
138
|
+
* @param message Main message text
|
|
139
|
+
* @param options Boxen options
|
|
140
|
+
*/
|
|
141
|
+
export function formatBox(message, options) {
|
|
142
|
+
console.log();
|
|
143
|
+
console.log(boxen(message, {
|
|
144
|
+
padding: options?.padding || 1,
|
|
145
|
+
margin: { left: 2 },
|
|
146
|
+
borderStyle: 'round',
|
|
147
|
+
borderColor: options?.borderColor || 'cyan',
|
|
148
|
+
title: options?.title,
|
|
149
|
+
titleAlignment: 'center',
|
|
150
|
+
}));
|
|
151
|
+
console.log();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Format a section header with divider
|
|
155
|
+
*/
|
|
156
|
+
export function formatSection(title) {
|
|
157
|
+
console.log();
|
|
158
|
+
console.log(` ${formatHeader(title)}`);
|
|
159
|
+
console.log(` ${theme.muted('─'.repeat(Math.min(title.length, 60)))}`);
|
|
160
|
+
console.log();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Format a command summary footer
|
|
164
|
+
*/
|
|
165
|
+
export function formatSummary(items) {
|
|
166
|
+
console.log();
|
|
167
|
+
console.log(` ${theme.muted('─'.repeat(60))}`);
|
|
168
|
+
for (const item of items) {
|
|
169
|
+
const symbol = item.status === 'success'
|
|
170
|
+
? theme.symbols.success
|
|
171
|
+
: item.status === 'error'
|
|
172
|
+
? theme.symbols.error
|
|
173
|
+
: item.status === 'warning'
|
|
174
|
+
? theme.symbols.warning
|
|
175
|
+
: theme.symbols.dot;
|
|
176
|
+
console.log(` ${symbol} ${item.label}: ${theme.bold(String(item.value))}`);
|
|
177
|
+
}
|
|
178
|
+
console.log();
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid Data Access Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides local-first data access with automatic API sync:
|
|
5
|
+
* - Reads: Try local store first, fall back to API if empty/stale
|
|
6
|
+
* - Writes: Optimistic local update + queue for background sync
|
|
7
|
+
* - Bootstrap: First-time fetch from API to populate local store
|
|
8
|
+
* - Offline: Graceful degradation with cached data
|
|
9
|
+
*
|
|
10
|
+
* This layer bridges the gap between the old API-first CLI and the new
|
|
11
|
+
* local-first sync engine until it is fully integrated.
|
|
12
|
+
*/
|
|
13
|
+
import { type LocalStack } from './local-store.js';
|
|
14
|
+
import type { Stack } from '../stacks/types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Get all stacks (local-first with API fallback)
|
|
17
|
+
*/
|
|
18
|
+
export declare function getStacks(options?: {
|
|
19
|
+
forceRefresh?: boolean;
|
|
20
|
+
}): Promise<Stack[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get a single stack by ID (local-first with API fallback)
|
|
23
|
+
*/
|
|
24
|
+
export declare function getStack(id: string, options?: {
|
|
25
|
+
forceRefresh?: boolean;
|
|
26
|
+
}): Promise<Stack | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Create a new stack (optimistic update + API sync)
|
|
29
|
+
*/
|
|
30
|
+
export declare function createStack(stack: Partial<Stack>): Promise<Stack>;
|
|
31
|
+
/**
|
|
32
|
+
* Update an existing stack (optimistic update + API sync)
|
|
33
|
+
*/
|
|
34
|
+
export declare function updateStack(id: string, updates: Partial<LocalStack>): Promise<Stack>;
|
|
35
|
+
/**
|
|
36
|
+
* Delete a stack (optimistic update + API sync)
|
|
37
|
+
*/
|
|
38
|
+
export declare function deleteStack(id: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Get sync queue status for UI indicators
|
|
41
|
+
*/
|
|
42
|
+
export declare function getQueueStatus(): Promise<import("./local-store.js").SyncStatus>;
|
|
43
|
+
/**
|
|
44
|
+
* Check if there are pending changes waiting to sync
|
|
45
|
+
*/
|
|
46
|
+
export declare function hasPendingChanges(): Promise<boolean>;
|
|
47
|
+
//# sourceMappingURL=hybrid-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-data.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-data.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAaL,KAAK,UAAU,EAEhB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,oBAAoB,CAAC;AAmF5B;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CA2BxB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAsCvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA8DvE;AAyBD;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CA4C1F;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB3D;AAMD;;GAEG;AACH,wBAAsB,cAAc,mDAEnC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG1D"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid Data Access Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides local-first data access with automatic API sync:
|
|
5
|
+
* - Reads: Try local store first, fall back to API if empty/stale
|
|
6
|
+
* - Writes: Optimistic local update + queue for background sync
|
|
7
|
+
* - Bootstrap: First-time fetch from API to populate local store
|
|
8
|
+
* - Offline: Graceful degradation with cached data
|
|
9
|
+
*
|
|
10
|
+
* This layer bridges the gap between the old API-first CLI and the new
|
|
11
|
+
* local-first sync engine until it is fully integrated.
|
|
12
|
+
*/
|
|
13
|
+
import { getLocalStacks, getLocalStack, createLocalStack, updateLocalStack, deleteLocalStack, getSyncStatus, isOffline, } from './local-store.js';
|
|
14
|
+
import { getApiClient, ApiError } from './api.js';
|
|
15
|
+
/**
|
|
16
|
+
* Convert API Stack to LocalStack
|
|
17
|
+
*/
|
|
18
|
+
function apiStackToLocal(apiStack) {
|
|
19
|
+
return {
|
|
20
|
+
id: apiStack.id,
|
|
21
|
+
user_id: 'local-user', // Consistent sentinel for API-sourced stacks
|
|
22
|
+
team_id: apiStack.teamSlug,
|
|
23
|
+
owner_type: 'user', // Default to user
|
|
24
|
+
visibility: (apiStack.visibility || 'private'),
|
|
25
|
+
extends: apiStack.extends || [],
|
|
26
|
+
name: apiStack.name,
|
|
27
|
+
slug: apiStack.slug,
|
|
28
|
+
description: apiStack.description,
|
|
29
|
+
status: 'approved', // Default status
|
|
30
|
+
is_official: false, // API doesn't indicate this
|
|
31
|
+
is_synced: true, // Coming from API means it's synced
|
|
32
|
+
version: 0, // API stacks don't have version
|
|
33
|
+
extensions: apiStack.extensions.map((ext) => ({
|
|
34
|
+
extension_type: ext.type,
|
|
35
|
+
slug: ext.slug,
|
|
36
|
+
version: ext.version,
|
|
37
|
+
})),
|
|
38
|
+
created_at: apiStack.createdAt,
|
|
39
|
+
updated_at: apiStack.updatedAt,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Convert LocalStack to API Stack
|
|
44
|
+
*/
|
|
45
|
+
function localStackToApi(localStack) {
|
|
46
|
+
return {
|
|
47
|
+
id: localStack.id,
|
|
48
|
+
name: localStack.name,
|
|
49
|
+
slug: localStack.slug,
|
|
50
|
+
description: localStack.description,
|
|
51
|
+
visibility: localStack.visibility,
|
|
52
|
+
teamSlug: localStack.team_id,
|
|
53
|
+
extends: localStack.extends,
|
|
54
|
+
extensions: localStack.extensions.map((ext) => ({
|
|
55
|
+
type: ext.extension_type,
|
|
56
|
+
slug: ext.slug,
|
|
57
|
+
version: ext.version,
|
|
58
|
+
})),
|
|
59
|
+
createdAt: localStack.created_at,
|
|
60
|
+
updatedAt: localStack.updated_at,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Sync stacks from API to local store (bootstrap)
|
|
65
|
+
*/
|
|
66
|
+
async function syncStacksFromApi() {
|
|
67
|
+
const client = getApiClient({ authenticated: true });
|
|
68
|
+
const response = await client.get('/stacks');
|
|
69
|
+
if (response.success && response.data) {
|
|
70
|
+
const { stacks } = response.data;
|
|
71
|
+
// Insert all stacks into local store
|
|
72
|
+
for (const apiStack of stacks) {
|
|
73
|
+
const localStack = apiStackToLocal(apiStack);
|
|
74
|
+
try {
|
|
75
|
+
await createLocalStack(localStack);
|
|
76
|
+
}
|
|
77
|
+
catch (createError) {
|
|
78
|
+
// Stack might already exist, try update
|
|
79
|
+
try {
|
|
80
|
+
await updateLocalStack(localStack);
|
|
81
|
+
}
|
|
82
|
+
catch (updateError) {
|
|
83
|
+
console.warn(`[hybrid-data] Failed to sync stack "${apiStack.slug}" to local store:`, updateError instanceof Error ? updateError.message : updateError);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ============================================
|
|
90
|
+
// Hybrid Stack Operations
|
|
91
|
+
// ============================================
|
|
92
|
+
/**
|
|
93
|
+
* Get all stacks (local-first with API fallback)
|
|
94
|
+
*/
|
|
95
|
+
export async function getStacks(options = {}) {
|
|
96
|
+
// Try local store first unless force refresh
|
|
97
|
+
if (!options.forceRefresh) {
|
|
98
|
+
try {
|
|
99
|
+
const localStacks = await getLocalStacks();
|
|
100
|
+
// If we have data, return it immediately
|
|
101
|
+
if (localStacks.length > 0) {
|
|
102
|
+
return localStacks.map(localStackToApi);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
// Local store error, fall through to API
|
|
107
|
+
console.warn('Local store unavailable, using API:', error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// No local data or force refresh - fetch from API and sync
|
|
111
|
+
if (!(await isOffline())) {
|
|
112
|
+
await syncStacksFromApi();
|
|
113
|
+
// Now return from local store
|
|
114
|
+
const localStacks = await getLocalStacks();
|
|
115
|
+
return localStacks.map(localStackToApi);
|
|
116
|
+
}
|
|
117
|
+
// Offline with no cache - return empty
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get a single stack by ID (local-first with API fallback)
|
|
122
|
+
*/
|
|
123
|
+
export async function getStack(id, options = {}) {
|
|
124
|
+
// Try local store first
|
|
125
|
+
if (!options.forceRefresh) {
|
|
126
|
+
try {
|
|
127
|
+
const localStack = await getLocalStack(id);
|
|
128
|
+
if (localStack) {
|
|
129
|
+
return localStackToApi(localStack);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.warn('Local store unavailable, using API:', error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Not in local store or force refresh - fetch from API
|
|
137
|
+
if (!(await isOffline())) {
|
|
138
|
+
const client = getApiClient({ authenticated: true });
|
|
139
|
+
const response = await client.get(`/stacks/${id}`);
|
|
140
|
+
if (response.success && response.data) {
|
|
141
|
+
const apiStack = response.data;
|
|
142
|
+
const localStack = apiStackToLocal(apiStack);
|
|
143
|
+
// Store in local cache
|
|
144
|
+
try {
|
|
145
|
+
await createLocalStack(localStack);
|
|
146
|
+
}
|
|
147
|
+
catch (cacheCreateError) {
|
|
148
|
+
try {
|
|
149
|
+
await updateLocalStack(localStack);
|
|
150
|
+
}
|
|
151
|
+
catch (cacheUpdateError) {
|
|
152
|
+
console.warn(`[hybrid-data] Failed to cache stack "${id}" locally:`, cacheUpdateError instanceof Error ? cacheUpdateError.message : cacheUpdateError);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return apiStack;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Create a new stack (optimistic update + API sync)
|
|
162
|
+
*/
|
|
163
|
+
export async function createStack(stack) {
|
|
164
|
+
// Generate local ID if not provided
|
|
165
|
+
const now = new Date().toISOString();
|
|
166
|
+
const localStack = {
|
|
167
|
+
id: stack.id || `stack-${Date.now()}`,
|
|
168
|
+
user_id: 'local-user', // Consistent sentinel until API assigns real user_id
|
|
169
|
+
team_id: stack.teamSlug,
|
|
170
|
+
owner_type: 'user',
|
|
171
|
+
visibility: stack.visibility || 'private',
|
|
172
|
+
extends: stack.extends || [],
|
|
173
|
+
name: stack.name || '',
|
|
174
|
+
slug: stack.slug || stack.name?.toLowerCase().replace(/\s+/g, '-') || '',
|
|
175
|
+
description: stack.description,
|
|
176
|
+
status: 'approved',
|
|
177
|
+
is_official: false,
|
|
178
|
+
is_synced: false, // Not yet synced to API
|
|
179
|
+
version: 0,
|
|
180
|
+
extensions: (stack.extensions || []).map((ext) => ({
|
|
181
|
+
extension_type: ext.type,
|
|
182
|
+
slug: ext.slug,
|
|
183
|
+
version: ext.version,
|
|
184
|
+
})),
|
|
185
|
+
created_at: now,
|
|
186
|
+
updated_at: now,
|
|
187
|
+
};
|
|
188
|
+
// Apply locally first (optimistic update)
|
|
189
|
+
await createLocalStack(localStack);
|
|
190
|
+
// If online, sync to API immediately
|
|
191
|
+
if (!(await isOffline())) {
|
|
192
|
+
try {
|
|
193
|
+
const client = getApiClient({ authenticated: true });
|
|
194
|
+
const response = await client.post('/stacks', {
|
|
195
|
+
name: localStack.name,
|
|
196
|
+
description: localStack.description,
|
|
197
|
+
visibility: localStack.visibility,
|
|
198
|
+
extensions: localStack.extensions.map((ext) => ({
|
|
199
|
+
type: ext.extension_type,
|
|
200
|
+
slug: ext.slug,
|
|
201
|
+
version: ext.version,
|
|
202
|
+
})),
|
|
203
|
+
});
|
|
204
|
+
if (response.success && response.data) {
|
|
205
|
+
const apiStack = response.data;
|
|
206
|
+
const syncedStack = apiStackToLocal(apiStack);
|
|
207
|
+
// Update local store with server-assigned ID and data
|
|
208
|
+
await updateLocalStack(syncedStack);
|
|
209
|
+
return apiStack;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (error instanceof ApiError) {
|
|
214
|
+
throw error;
|
|
215
|
+
}
|
|
216
|
+
// Network error - keep local version, will sync later
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return localStackToApi(localStack);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Convert LocalStack fields to API-compatible camelCase payload.
|
|
223
|
+
* Only includes fields that are present in the updates.
|
|
224
|
+
*/
|
|
225
|
+
function localUpdatesToApiPayload(updates) {
|
|
226
|
+
const apiPayload = {};
|
|
227
|
+
if (updates.name !== undefined)
|
|
228
|
+
apiPayload.name = updates.name;
|
|
229
|
+
if (updates.description !== undefined)
|
|
230
|
+
apiPayload.description = updates.description;
|
|
231
|
+
if (updates.visibility !== undefined)
|
|
232
|
+
apiPayload.visibility = updates.visibility;
|
|
233
|
+
if (updates.team_id !== undefined)
|
|
234
|
+
apiPayload.teamSlug = updates.team_id;
|
|
235
|
+
if (updates.extends !== undefined)
|
|
236
|
+
apiPayload.extends = updates.extends;
|
|
237
|
+
if (updates.extensions !== undefined) {
|
|
238
|
+
apiPayload.extensions = updates.extensions.map((ext) => ({
|
|
239
|
+
type: ext.extension_type,
|
|
240
|
+
slug: ext.slug,
|
|
241
|
+
version: ext.version,
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
return apiPayload;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Update an existing stack (optimistic update + API sync)
|
|
248
|
+
*/
|
|
249
|
+
export async function updateStack(id, updates) {
|
|
250
|
+
// Get current stack
|
|
251
|
+
const existingStack = await getLocalStack(id);
|
|
252
|
+
if (!existingStack) {
|
|
253
|
+
throw new Error(`Stack not found: ${id}`);
|
|
254
|
+
}
|
|
255
|
+
// Merge updates
|
|
256
|
+
const updatedStack = {
|
|
257
|
+
...existingStack,
|
|
258
|
+
...updates,
|
|
259
|
+
updated_at: new Date().toISOString(),
|
|
260
|
+
is_synced: false,
|
|
261
|
+
};
|
|
262
|
+
// Apply locally first (optimistic update)
|
|
263
|
+
await updateLocalStack(updatedStack);
|
|
264
|
+
// If online, sync to API immediately
|
|
265
|
+
if (!(await isOffline())) {
|
|
266
|
+
try {
|
|
267
|
+
const client = getApiClient({ authenticated: true });
|
|
268
|
+
// Convert snake_case LocalStack fields to camelCase API payload
|
|
269
|
+
const apiPayload = localUpdatesToApiPayload(updates);
|
|
270
|
+
const response = await client.put(`/stacks/${id}`, apiPayload);
|
|
271
|
+
if (response.success && response.data) {
|
|
272
|
+
const apiStack = response.data;
|
|
273
|
+
const syncedStack = apiStackToLocal(apiStack);
|
|
274
|
+
// Update local store with server confirmation
|
|
275
|
+
await updateLocalStack(syncedStack);
|
|
276
|
+
return apiStack;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
if (error instanceof ApiError) {
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
// Network error - keep local version, will sync later
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return localStackToApi(updatedStack);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Delete a stack (optimistic update + API sync)
|
|
290
|
+
*/
|
|
291
|
+
export async function deleteStack(id) {
|
|
292
|
+
// Delete locally first (optimistic)
|
|
293
|
+
await deleteLocalStack(id);
|
|
294
|
+
// If online, sync to API immediately
|
|
295
|
+
if (!(await isOffline())) {
|
|
296
|
+
try {
|
|
297
|
+
const client = getApiClient({ authenticated: true });
|
|
298
|
+
await client.delete(`/stacks/${id}`);
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
if (error instanceof ApiError) {
|
|
302
|
+
// If API delete fails, restore local copy?
|
|
303
|
+
// For now, just propagate the error
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
// Network error - deletion will sync later
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// ============================================
|
|
311
|
+
// Sync Status Helpers
|
|
312
|
+
// ============================================
|
|
313
|
+
/**
|
|
314
|
+
* Get sync queue status for UI indicators
|
|
315
|
+
*/
|
|
316
|
+
export async function getQueueStatus() {
|
|
317
|
+
return getSyncStatus();
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Check if there are pending changes waiting to sync
|
|
321
|
+
*/
|
|
322
|
+
export async function hasPendingChanges() {
|
|
323
|
+
const status = await getSyncStatus();
|
|
324
|
+
return status.pending > 0;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=hybrid-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-data.js","sourceRoot":"","sources":["../../src/lib/hybrid-data.ts"],"names":[],"mappings":"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"}
|