@claudetools/cli 0.13.12 → 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 +31 -5
- 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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-First Data Access Layer
|
|
3
|
+
*
|
|
4
|
+
* Routes all data access through the ClaudeTools sync engine via Unix socket JSON-RPC.
|
|
5
|
+
* All reads go through the sync engine's local store. All writes go through the sync engine's
|
|
6
|
+
* transaction queue for optimistic updates with background sync.
|
|
7
|
+
*
|
|
8
|
+
* Offline Mode:
|
|
9
|
+
* - Reads: Return cached data from sync engine's local store
|
|
10
|
+
* - Writes: Queue mutations via sync engine, sync when online
|
|
11
|
+
* - Graceful degradation with clear offline indicators
|
|
12
|
+
*/
|
|
13
|
+
export interface LocalStack {
|
|
14
|
+
id: string;
|
|
15
|
+
user_id: string;
|
|
16
|
+
team_id?: string;
|
|
17
|
+
owner_type: 'user' | 'team';
|
|
18
|
+
visibility: 'private' | 'team' | 'public';
|
|
19
|
+
extends: string[];
|
|
20
|
+
name: string;
|
|
21
|
+
slug: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
status: string;
|
|
24
|
+
is_official: boolean;
|
|
25
|
+
is_synced: boolean;
|
|
26
|
+
version: number;
|
|
27
|
+
extensions: Array<{
|
|
28
|
+
extension_type: 'skill' | 'agent' | 'hook' | 'mcp-server';
|
|
29
|
+
slug: string;
|
|
30
|
+
version?: string;
|
|
31
|
+
}>;
|
|
32
|
+
created_at: string;
|
|
33
|
+
updated_at: string;
|
|
34
|
+
}
|
|
35
|
+
export interface LocalProject {
|
|
36
|
+
id: string;
|
|
37
|
+
user_id: string;
|
|
38
|
+
team_id?: string;
|
|
39
|
+
name: string;
|
|
40
|
+
slug: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
path?: string;
|
|
43
|
+
repository_url?: string;
|
|
44
|
+
default_branch: string;
|
|
45
|
+
icon?: string;
|
|
46
|
+
color?: string;
|
|
47
|
+
archived_at?: string;
|
|
48
|
+
version: number;
|
|
49
|
+
created_at: string;
|
|
50
|
+
updated_at: string;
|
|
51
|
+
}
|
|
52
|
+
export interface SyncStatus {
|
|
53
|
+
pending: number;
|
|
54
|
+
created: number;
|
|
55
|
+
queued: number;
|
|
56
|
+
executing: number;
|
|
57
|
+
completed: number;
|
|
58
|
+
failed: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if we're running offline (no network connectivity)
|
|
62
|
+
* Re-exported from network.ts for convenience
|
|
63
|
+
*/
|
|
64
|
+
export declare function isOffline(): Promise<boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* Get all stacks from local store
|
|
67
|
+
*/
|
|
68
|
+
export declare function getLocalStacks(): Promise<LocalStack[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Get a single stack by ID from local store
|
|
71
|
+
*/
|
|
72
|
+
export declare function getLocalStack(id: string): Promise<LocalStack | null>;
|
|
73
|
+
/**
|
|
74
|
+
* Create a new stack (optimistic update + background sync)
|
|
75
|
+
*/
|
|
76
|
+
export declare function createLocalStack(stack: LocalStack): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Update an existing stack (optimistic update + background sync)
|
|
79
|
+
*/
|
|
80
|
+
export declare function updateLocalStack(stack: LocalStack): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Delete a stack (optimistic update + background sync)
|
|
83
|
+
*/
|
|
84
|
+
export declare function deleteLocalStack(id: string): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Get all projects from local store
|
|
87
|
+
*/
|
|
88
|
+
export declare function getLocalProjects(): Promise<LocalProject[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Get a single project by ID from local store
|
|
91
|
+
*/
|
|
92
|
+
export declare function getLocalProject(id: string): Promise<LocalProject | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Create a new project (optimistic update + background sync)
|
|
95
|
+
*/
|
|
96
|
+
export declare function createLocalProject(project: LocalProject): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Update an existing project (optimistic update + background sync)
|
|
99
|
+
*/
|
|
100
|
+
export declare function updateLocalProject(project: LocalProject): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Delete a project (optimistic update + background sync)
|
|
103
|
+
*/
|
|
104
|
+
export declare function deleteLocalProject(id: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Get sync queue status (pending, executing, completed, failed)
|
|
107
|
+
*/
|
|
108
|
+
export declare function getSyncStatus(): Promise<SyncStatus>;
|
|
109
|
+
/**
|
|
110
|
+
* Get failed transactions (for conflict resolution UI)
|
|
111
|
+
*/
|
|
112
|
+
export declare function getFailedTransactions(): Promise<string[]>;
|
|
113
|
+
//# sourceMappingURL=local-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../src/lib/local-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-First Data Access Layer
|
|
3
|
+
*
|
|
4
|
+
* Routes all data access through the ClaudeTools sync engine via Unix socket JSON-RPC.
|
|
5
|
+
* All reads go through the sync engine's local store. All writes go through the sync engine's
|
|
6
|
+
* transaction queue for optimistic updates with background sync.
|
|
7
|
+
*
|
|
8
|
+
* Offline Mode:
|
|
9
|
+
* - Reads: Return cached data from sync engine's local store
|
|
10
|
+
* - Writes: Queue mutations via sync engine, sync when online
|
|
11
|
+
* - Graceful degradation with clear offline indicators
|
|
12
|
+
*/
|
|
13
|
+
import { getSyncEngineClient } from '../sync-engine/client.js';
|
|
14
|
+
// ============================================
|
|
15
|
+
// Mapping: Sync Engine wire format <-> LocalStack
|
|
16
|
+
// ============================================
|
|
17
|
+
/**
|
|
18
|
+
* Sync Engine JSON uses `type` (Rust serde rename), local interface uses `extension_type`
|
|
19
|
+
*/
|
|
20
|
+
function syncEngineStackToLocal(ds) {
|
|
21
|
+
return {
|
|
22
|
+
id: ds.id,
|
|
23
|
+
user_id: ds.user_id,
|
|
24
|
+
team_id: ds.team_id ?? undefined,
|
|
25
|
+
owner_type: ds.owner_type,
|
|
26
|
+
visibility: ds.visibility,
|
|
27
|
+
extends: ds.extends,
|
|
28
|
+
name: ds.name,
|
|
29
|
+
slug: ds.slug,
|
|
30
|
+
description: ds.description ?? undefined,
|
|
31
|
+
status: ds.status,
|
|
32
|
+
is_official: ds.is_official,
|
|
33
|
+
is_synced: ds.is_synced,
|
|
34
|
+
version: ds.version,
|
|
35
|
+
extensions: ds.extensions.map((ext) => ({
|
|
36
|
+
extension_type: ext.type,
|
|
37
|
+
slug: ext.slug,
|
|
38
|
+
version: ext.version ?? undefined,
|
|
39
|
+
})),
|
|
40
|
+
created_at: ds.created_at,
|
|
41
|
+
updated_at: ds.updated_at,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function localStackToSyncEngine(ls) {
|
|
45
|
+
return {
|
|
46
|
+
id: ls.id,
|
|
47
|
+
user_id: ls.user_id,
|
|
48
|
+
team_id: ls.team_id ?? null,
|
|
49
|
+
owner_type: ls.owner_type,
|
|
50
|
+
visibility: ls.visibility,
|
|
51
|
+
extends: ls.extends,
|
|
52
|
+
name: ls.name,
|
|
53
|
+
slug: ls.slug,
|
|
54
|
+
description: ls.description ?? null,
|
|
55
|
+
status: ls.status,
|
|
56
|
+
is_official: ls.is_official,
|
|
57
|
+
is_synced: ls.is_synced,
|
|
58
|
+
version: ls.version,
|
|
59
|
+
extensions: ls.extensions.map((ext) => ({
|
|
60
|
+
type: ext.extension_type,
|
|
61
|
+
slug: ext.slug,
|
|
62
|
+
version: ext.version ?? null,
|
|
63
|
+
})),
|
|
64
|
+
created_at: ls.created_at,
|
|
65
|
+
updated_at: ls.updated_at,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function syncEngineProjectToLocal(dp) {
|
|
69
|
+
return {
|
|
70
|
+
id: dp.id,
|
|
71
|
+
user_id: dp.user_id,
|
|
72
|
+
team_id: dp.team_id ?? undefined,
|
|
73
|
+
name: dp.name,
|
|
74
|
+
slug: dp.slug,
|
|
75
|
+
description: dp.description ?? undefined,
|
|
76
|
+
path: dp.path ?? undefined,
|
|
77
|
+
repository_url: dp.repository_url ?? undefined,
|
|
78
|
+
default_branch: dp.default_branch,
|
|
79
|
+
icon: dp.icon ?? undefined,
|
|
80
|
+
color: dp.color ?? undefined,
|
|
81
|
+
archived_at: dp.archived_at ?? undefined,
|
|
82
|
+
version: dp.version,
|
|
83
|
+
created_at: dp.created_at,
|
|
84
|
+
updated_at: dp.updated_at,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function localProjectToSyncEngine(lp) {
|
|
88
|
+
return {
|
|
89
|
+
id: lp.id,
|
|
90
|
+
user_id: lp.user_id,
|
|
91
|
+
team_id: lp.team_id ?? null,
|
|
92
|
+
name: lp.name,
|
|
93
|
+
slug: lp.slug,
|
|
94
|
+
description: lp.description ?? null,
|
|
95
|
+
path: lp.path ?? null,
|
|
96
|
+
repository_url: lp.repository_url ?? null,
|
|
97
|
+
default_branch: lp.default_branch,
|
|
98
|
+
icon: lp.icon ?? null,
|
|
99
|
+
color: lp.color ?? null,
|
|
100
|
+
archived_at: lp.archived_at ?? null,
|
|
101
|
+
version: lp.version,
|
|
102
|
+
created_at: lp.created_at,
|
|
103
|
+
updated_at: lp.updated_at,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if we're running offline (no network connectivity)
|
|
108
|
+
* Re-exported from network.ts for convenience
|
|
109
|
+
*/
|
|
110
|
+
export async function isOffline() {
|
|
111
|
+
const { isOnlineCached } = await import('./network.js');
|
|
112
|
+
const online = await isOnlineCached();
|
|
113
|
+
return !online;
|
|
114
|
+
}
|
|
115
|
+
// ============================================
|
|
116
|
+
// Stack Operations (Local-First)
|
|
117
|
+
// ============================================
|
|
118
|
+
/**
|
|
119
|
+
* Get all stacks from local store
|
|
120
|
+
*/
|
|
121
|
+
export async function getLocalStacks() {
|
|
122
|
+
const client = getSyncEngineClient();
|
|
123
|
+
const stacks = await client.syncPullStacks();
|
|
124
|
+
return stacks.map(syncEngineStackToLocal);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get a single stack by ID from local store
|
|
128
|
+
*/
|
|
129
|
+
export async function getLocalStack(id) {
|
|
130
|
+
const client = getSyncEngineClient();
|
|
131
|
+
const stack = await client.syncGetStack(id);
|
|
132
|
+
return stack ? syncEngineStackToLocal(stack) : null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a new stack (optimistic update + background sync)
|
|
136
|
+
*/
|
|
137
|
+
export async function createLocalStack(stack) {
|
|
138
|
+
const client = getSyncEngineClient();
|
|
139
|
+
await client.syncPushStack(localStackToSyncEngine(stack), 'insert');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Update an existing stack (optimistic update + background sync)
|
|
143
|
+
*/
|
|
144
|
+
export async function updateLocalStack(stack) {
|
|
145
|
+
const client = getSyncEngineClient();
|
|
146
|
+
await client.syncPushStack(localStackToSyncEngine(stack), 'update');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Delete a stack (optimistic update + background sync)
|
|
150
|
+
*/
|
|
151
|
+
export async function deleteLocalStack(id) {
|
|
152
|
+
const client = getSyncEngineClient();
|
|
153
|
+
await client.syncDeleteStack(id);
|
|
154
|
+
}
|
|
155
|
+
// ============================================
|
|
156
|
+
// Project Operations (Local-First)
|
|
157
|
+
// ============================================
|
|
158
|
+
/**
|
|
159
|
+
* Get all projects from local store
|
|
160
|
+
*/
|
|
161
|
+
export async function getLocalProjects() {
|
|
162
|
+
const client = getSyncEngineClient();
|
|
163
|
+
const projects = await client.syncPullProjects();
|
|
164
|
+
return projects.map(syncEngineProjectToLocal);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get a single project by ID from local store
|
|
168
|
+
*/
|
|
169
|
+
export async function getLocalProject(id) {
|
|
170
|
+
const client = getSyncEngineClient();
|
|
171
|
+
const project = await client.syncGetProject(id);
|
|
172
|
+
return project ? syncEngineProjectToLocal(project) : null;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create a new project (optimistic update + background sync)
|
|
176
|
+
*/
|
|
177
|
+
export async function createLocalProject(project) {
|
|
178
|
+
const client = getSyncEngineClient();
|
|
179
|
+
await client.syncPushProject(localProjectToSyncEngine(project), 'insert');
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Update an existing project (optimistic update + background sync)
|
|
183
|
+
*/
|
|
184
|
+
export async function updateLocalProject(project) {
|
|
185
|
+
const client = getSyncEngineClient();
|
|
186
|
+
await client.syncPushProject(localProjectToSyncEngine(project), 'update');
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Delete a project (optimistic update + background sync)
|
|
190
|
+
*/
|
|
191
|
+
export async function deleteLocalProject(id) {
|
|
192
|
+
const client = getSyncEngineClient();
|
|
193
|
+
await client.syncDeleteProject(id);
|
|
194
|
+
}
|
|
195
|
+
// ============================================
|
|
196
|
+
// Sync Queue Status
|
|
197
|
+
// ============================================
|
|
198
|
+
/**
|
|
199
|
+
* Get sync queue status (pending, executing, completed, failed)
|
|
200
|
+
*/
|
|
201
|
+
export async function getSyncStatus() {
|
|
202
|
+
const client = getSyncEngineClient();
|
|
203
|
+
const counts = await client.syncState();
|
|
204
|
+
return {
|
|
205
|
+
pending: counts.created + counts.queued + counts.executing,
|
|
206
|
+
created: counts.created,
|
|
207
|
+
queued: counts.queued,
|
|
208
|
+
executing: counts.executing,
|
|
209
|
+
completed: counts.completed,
|
|
210
|
+
failed: counts.failed,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get failed transactions (for conflict resolution UI)
|
|
215
|
+
*/
|
|
216
|
+
export async function getFailedTransactions() {
|
|
217
|
+
const client = getSyncEngineClient();
|
|
218
|
+
return client.syncFailed();
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=local-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../src/lib/local-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-specific machine ID retrieval.
|
|
3
|
+
*
|
|
4
|
+
* Returns the OS-level machine identifier (IOPlatformUUID on macOS,
|
|
5
|
+
* /etc/machine-id on Linux, MachineGuid on Windows) or null if unavailable.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getMachineId(): string | null;
|
|
8
|
+
//# sourceMappingURL=machine-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-id.d.ts","sourceRoot":"","sources":["../../src/lib/machine-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAuC5C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-specific machine ID retrieval.
|
|
3
|
+
*
|
|
4
|
+
* Returns the OS-level machine identifier (IOPlatformUUID on macOS,
|
|
5
|
+
* /etc/machine-id on Linux, MachineGuid on Windows) or null if unavailable.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync } from 'fs';
|
|
8
|
+
import { execFileSync } from 'child_process';
|
|
9
|
+
export function getMachineId() {
|
|
10
|
+
try {
|
|
11
|
+
switch (process.platform) {
|
|
12
|
+
case 'darwin': {
|
|
13
|
+
const output = execFileSync('ioreg', ['-rd1', '-c', 'IOPlatformExpertDevice'], { encoding: 'utf-8', timeout: 5000 });
|
|
14
|
+
const match = output.match(/"IOPlatformUUID"\s*=\s*"([a-fA-F0-9-]+)"/);
|
|
15
|
+
return match?.[1] || null;
|
|
16
|
+
}
|
|
17
|
+
case 'linux': {
|
|
18
|
+
if (existsSync('/etc/machine-id')) {
|
|
19
|
+
return readFileSync('/etc/machine-id', 'utf-8').trim();
|
|
20
|
+
}
|
|
21
|
+
if (existsSync('/var/lib/dbus/machine-id')) {
|
|
22
|
+
return readFileSync('/var/lib/dbus/machine-id', 'utf-8').trim();
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
case 'win32': {
|
|
27
|
+
const output = execFileSync('reg', ['query', 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography', '/v', 'MachineGuid'], { encoding: 'utf-8', timeout: 5000 });
|
|
28
|
+
const match = output.match(/MachineGuid\s+REG_SZ\s+(\S+)/);
|
|
29
|
+
return match?.[1] || null;
|
|
30
|
+
}
|
|
31
|
+
default:
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=machine-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine-id.js","sourceRoot":"","sources":["../../src/lib/machine-id.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,MAAM,GAAG,YAAY,CACzB,OAAO,EACP,CAAC,MAAM,EAAE,IAAI,EAAE,wBAAwB,CAAC,EACxC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CACrC,CAAC;gBACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBACvE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAC5B,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAClC,OAAO,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzD,CAAC;gBACD,IAAI,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;oBAC3C,OAAO,YAAY,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBAClE,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,MAAM,GAAG,YAAY,CACzB,KAAK,EACL,CAAC,OAAO,EAAE,uDAAuD,EAAE,IAAI,EAAE,aAAa,CAAC,EACvF,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CACrC,CAAC;gBACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBAC3D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAC5B,CAAC;YAED;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network connectivity detection
|
|
3
|
+
*
|
|
4
|
+
* Detects whether the CLI is online or offline to enable graceful degradation.
|
|
5
|
+
* Used by hybrid-data layer to determine when to fallback to cached data.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if we have network connectivity
|
|
9
|
+
*
|
|
10
|
+
* Uses a quick health check endpoint to verify connectivity.
|
|
11
|
+
* Falls back gracefully on any network error.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isOnline(): Promise<boolean>;
|
|
14
|
+
export declare function isOnlineCached(): Promise<boolean>;
|
|
15
|
+
//# sourceMappingURL=network.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/lib/network.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;GAKG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBjD;AASD,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAWvD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network connectivity detection
|
|
3
|
+
*
|
|
4
|
+
* Detects whether the CLI is online or offline to enable graceful degradation.
|
|
5
|
+
* Used by hybrid-data layer to determine when to fallback to cached data.
|
|
6
|
+
*/
|
|
7
|
+
const HEALTH_CHECK_URL = 'https://claudetools.com/api/health';
|
|
8
|
+
const TIMEOUT_MS = 3000;
|
|
9
|
+
/**
|
|
10
|
+
* Check if we have network connectivity
|
|
11
|
+
*
|
|
12
|
+
* Uses a quick health check endpoint to verify connectivity.
|
|
13
|
+
* Falls back gracefully on any network error.
|
|
14
|
+
*/
|
|
15
|
+
export async function isOnline() {
|
|
16
|
+
try {
|
|
17
|
+
const controller = new AbortController();
|
|
18
|
+
const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
19
|
+
const response = await fetch(HEALTH_CHECK_URL, {
|
|
20
|
+
signal: controller.signal,
|
|
21
|
+
method: 'HEAD', // HEAD is faster than GET
|
|
22
|
+
});
|
|
23
|
+
clearTimeout(timeoutId);
|
|
24
|
+
return response.ok;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Any network error = offline
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Cached online status (expires after 30 seconds)
|
|
33
|
+
* Prevents excessive health checks
|
|
34
|
+
*/
|
|
35
|
+
let cachedStatus = null;
|
|
36
|
+
const CACHE_TTL_MS = 30_000; // 30 seconds
|
|
37
|
+
export async function isOnlineCached() {
|
|
38
|
+
const now = Date.now();
|
|
39
|
+
if (cachedStatus && (now - cachedStatus.timestamp) < CACHE_TTL_MS) {
|
|
40
|
+
return cachedStatus.online;
|
|
41
|
+
}
|
|
42
|
+
const online = await isOnline();
|
|
43
|
+
cachedStatus = { online, timestamp: now };
|
|
44
|
+
return online;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/lib/network.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAC9D,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;YAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,MAAM,EAAE,0BAA0B;SAC3C,CAAC,CAAC;QAEH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,IAAI,YAAY,GAAkD,IAAI,CAAC;AACvE,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,aAAa;AAE1C,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,IAAI,YAAY,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,YAAY,EAAE,CAAC;QAClE,OAAO,YAAY,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAC;IAChC,YAAY,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IAE1C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export declare const theme: {
|
|
2
|
+
success: import("chalk").ChalkInstance;
|
|
3
|
+
error: import("chalk").ChalkInstance;
|
|
4
|
+
warning: import("chalk").ChalkInstance;
|
|
5
|
+
info: import("chalk").ChalkInstance;
|
|
6
|
+
muted: import("chalk").ChalkInstance;
|
|
7
|
+
highlight: import("chalk").ChalkInstance;
|
|
8
|
+
brand: import("chalk").ChalkInstance;
|
|
9
|
+
bold: import("chalk").ChalkInstance;
|
|
10
|
+
dim: import("chalk").ChalkInstance;
|
|
11
|
+
header: import("chalk").ChalkInstance;
|
|
12
|
+
subheader: import("chalk").ChalkInstance;
|
|
13
|
+
command: import("chalk").ChalkInstance;
|
|
14
|
+
placeholder: import("chalk").ChalkInstance;
|
|
15
|
+
code: import("chalk").ChalkInstance;
|
|
16
|
+
symbols: {
|
|
17
|
+
success: string;
|
|
18
|
+
error: string;
|
|
19
|
+
warning: string;
|
|
20
|
+
info: string;
|
|
21
|
+
pending: string;
|
|
22
|
+
arrow: string;
|
|
23
|
+
dot: string;
|
|
24
|
+
bullet: string;
|
|
25
|
+
};
|
|
26
|
+
ok: (msg: string) => string;
|
|
27
|
+
fail: (msg: string) => string;
|
|
28
|
+
warn: (msg: string) => string;
|
|
29
|
+
step: (msg: string) => string;
|
|
30
|
+
colorSupport: boolean;
|
|
31
|
+
termWidth: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Format a header with consistent styling
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatHeader(text: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Format a subheader with consistent styling
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatSubheader(text: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Format a command example
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatCommand(cmd: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Format a placeholder (e.g., <name>, [options])
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatPlaceholder(text: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Format an error message with symbol
|
|
51
|
+
*/
|
|
52
|
+
export declare function formatError(msg: string, code?: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Format a success message with symbol
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatSuccess(msg: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Format a warning message with symbol
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatWarning(msg: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Format an info message with symbol
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatInfo(msg: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Format a step/progress message with arrow
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatStep(msg: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Get terminal width for responsive output
|
|
71
|
+
*/
|
|
72
|
+
export declare function getTermWidth(): number;
|
|
73
|
+
/**
|
|
74
|
+
* Truncate text to fit terminal width
|
|
75
|
+
*/
|
|
76
|
+
export declare function truncate(text: string, maxWidth?: number): string;
|
|
77
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/lib/theme.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;cAkCN,MAAM,KAAG,MAAM;gBACb,MAAM,KAAG,MAAM;gBACf,MAAM,KAAG,MAAM;gBACf,MAAM,KAAG,MAAM;;;CAK5B,CAAC;AAMF;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhE"}
|