@slats/claude-assets-sync 0.1.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +89 -581
  2. package/bin/inject-claude-settings.mjs +4 -0
  3. package/dist/claude-hashes.json +20 -0
  4. package/dist/commands/index.d.ts +1 -112
  5. package/dist/commands/runCli/index.d.ts +2 -0
  6. package/dist/commands/runCli/runCli.cjs +53 -0
  7. package/dist/commands/runCli/runCli.d.ts +14 -0
  8. package/dist/commands/runCli/runCli.mjs +51 -0
  9. package/dist/commands/runCli/type.d.ts +19 -0
  10. package/dist/commands/runCli/utils/classifyTarget.cjs +48 -0
  11. package/dist/commands/runCli/utils/classifyTarget.d.ts +19 -0
  12. package/dist/commands/runCli/utils/classifyTarget.mjs +46 -0
  13. package/dist/commands/runCli/utils/injectOne.cjs +47 -0
  14. package/dist/commands/runCli/utils/injectOne.d.ts +3 -0
  15. package/dist/commands/runCli/utils/injectOne.mjs +45 -0
  16. package/dist/commands/runCli/utils/resolvePackage.cjs +77 -0
  17. package/dist/commands/runCli/utils/resolvePackage.d.ts +16 -0
  18. package/dist/commands/runCli/utils/resolvePackage.mjs +74 -0
  19. package/dist/commands/runCli/utils/resolveScopeAlias.cjs +69 -0
  20. package/dist/commands/runCli/utils/resolveScopeAlias.d.ts +2 -0
  21. package/dist/commands/runCli/utils/resolveScopeAlias.mjs +67 -0
  22. package/dist/commands/runCli/utils/resolveScopeFlag.cjs +28 -0
  23. package/dist/commands/runCli/utils/resolveScopeFlag.d.ts +2 -0
  24. package/dist/commands/runCli/utils/resolveScopeFlag.mjs +26 -0
  25. package/dist/commands/runCli/utils/resolveTargets.cjs +40 -0
  26. package/dist/commands/runCli/utils/resolveTargets.d.ts +15 -0
  27. package/dist/commands/runCli/utils/resolveTargets.mjs +38 -0
  28. package/dist/commands/runCli/utils/runInject.cjs +52 -0
  29. package/dist/commands/runCli/utils/runInject.d.ts +3 -0
  30. package/dist/commands/runCli/utils/runInject.mjs +50 -0
  31. package/dist/core/buildPlan/buildPlan.cjs +42 -0
  32. package/dist/core/buildPlan/buildPlan.d.ts +2 -0
  33. package/dist/core/buildPlan/buildPlan.mjs +40 -0
  34. package/dist/core/buildPlan/index.d.ts +2 -0
  35. package/dist/core/buildPlan/type.d.ts +32 -0
  36. package/dist/core/buildPlan/utils/toPosix.cjs +9 -0
  37. package/dist/core/buildPlan/utils/toPosix.d.ts +1 -0
  38. package/dist/core/buildPlan/utils/toPosix.mjs +7 -0
  39. package/dist/core/buildPlan/utils/walkFiles.cjs +25 -0
  40. package/dist/core/buildPlan/utils/walkFiles.d.ts +1 -0
  41. package/dist/core/buildPlan/utils/walkFiles.mjs +23 -0
  42. package/dist/core/hash/hash.cjs +30 -0
  43. package/dist/core/hash/hash.d.ts +4 -0
  44. package/dist/core/hash/hash.mjs +26 -0
  45. package/dist/core/hash/index.d.ts +1 -0
  46. package/dist/core/hashManifest/hashManifest.cjs +27 -0
  47. package/dist/core/hashManifest/hashManifest.d.ts +17 -0
  48. package/dist/core/hashManifest/hashManifest.mjs +23 -0
  49. package/dist/core/hashManifest/index.d.ts +1 -0
  50. package/dist/core/index.d.ts +5 -0
  51. package/dist/core/injectDocs/index.d.ts +2 -0
  52. package/dist/core/injectDocs/injectDocs.cjs +43 -0
  53. package/dist/core/injectDocs/injectDocs.d.ts +2 -0
  54. package/dist/core/injectDocs/injectDocs.mjs +41 -0
  55. package/dist/core/injectDocs/type.d.ts +30 -0
  56. package/dist/core/injectDocs/utils/applyAction.cjs +21 -0
  57. package/dist/core/injectDocs/utils/applyAction.d.ts +2 -0
  58. package/dist/core/injectDocs/utils/applyAction.mjs +19 -0
  59. package/dist/core/injectDocs/utils/emitCiForceList.cjs +10 -0
  60. package/dist/core/injectDocs/utils/emitCiForceList.d.ts +2 -0
  61. package/dist/core/injectDocs/utils/emitCiForceList.mjs +8 -0
  62. package/dist/core/injectDocs/utils/printPlan.cjs +20 -0
  63. package/dist/core/injectDocs/utils/printPlan.d.ts +2 -0
  64. package/dist/core/injectDocs/utils/printPlan.mjs +18 -0
  65. package/dist/core/injectDocs/utils/summarize.cjs +27 -0
  66. package/dist/core/injectDocs/utils/summarize.d.ts +3 -0
  67. package/dist/core/injectDocs/utils/summarize.mjs +25 -0
  68. package/dist/core/scope/index.d.ts +1 -0
  69. package/dist/core/scope/scope.cjs +46 -0
  70. package/dist/core/scope/scope.d.ts +16 -0
  71. package/dist/core/scope/scope.mjs +41 -0
  72. package/dist/core/scope/utils/isDirectory.cjs +14 -0
  73. package/dist/core/scope/utils/isDirectory.d.ts +1 -0
  74. package/dist/core/scope/utils/isDirectory.mjs +12 -0
  75. package/dist/index.cjs +15 -9
  76. package/dist/index.d.ts +3 -5
  77. package/dist/index.mjs +7 -3
  78. package/dist/prompts/confirmForce.cjs +27 -0
  79. package/dist/prompts/confirmForce.d.ts +1 -0
  80. package/dist/prompts/confirmForce.mjs +25 -0
  81. package/dist/prompts/index.d.ts +2 -0
  82. package/dist/prompts/selectScope.cjs +30 -0
  83. package/dist/prompts/selectScope.d.ts +2 -0
  84. package/dist/prompts/selectScope.mjs +28 -0
  85. package/dist/utils/heartbeat.cjs +25 -0
  86. package/dist/utils/heartbeat.d.ts +16 -0
  87. package/dist/utils/heartbeat.mjs +23 -0
  88. package/dist/utils/logger.cjs +7 -0
  89. package/dist/utils/logger.d.ts +8 -0
  90. package/dist/utils/logger.mjs +7 -0
  91. package/dist/utils/types.d.ts +1 -252
  92. package/dist/utils/version.cjs +2 -14
  93. package/dist/utils/version.d.ts +3 -53
  94. package/dist/utils/version.mjs +2 -13
  95. package/docs/bundle-size-decision.md +36 -0
  96. package/docs/claude/skills/claude-docs-asset-wiring/SKILL.md +159 -0
  97. package/docs/claude/skills/claude-docs-asset-wiring/knowledge/claude-md-template.md +86 -0
  98. package/docs/claude/skills/claude-docs-asset-wiring/knowledge/dependency-cruiser.md +54 -0
  99. package/docs/claude/skills/claude-docs-asset-wiring/knowledge/gotchas.md +122 -0
  100. package/docs/claude/skills/claude-docs-asset-wiring/knowledge/package-json-patches.md +145 -0
  101. package/docs/claude/skills/claude-docs-asset-wiring/knowledge/reference-files.md +37 -0
  102. package/docs/claude/skills/claude-docs-asset-wiring/knowledge/smoke-tests.md +111 -0
  103. package/docs/consumer-integration.md +94 -0
  104. package/package.json +24 -16
  105. package/scripts/build-hashes.mjs +30 -0
  106. package/scripts/buildHashes.d.mts +15 -0
  107. package/scripts/buildHashes.mjs +82 -0
  108. package/scripts/claude-build-hashes.mjs +42 -0
  109. package/scripts/inject-version.js +112 -0
  110. package/dist/cli.cjs +0 -8
  111. package/dist/cli.d.ts +0 -1
  112. package/dist/cli.mjs +0 -7
  113. package/dist/commands/add.cjs +0 -80
  114. package/dist/commands/add.d.ts +0 -8
  115. package/dist/commands/add.mjs +0 -78
  116. package/dist/commands/list.cjs +0 -94
  117. package/dist/commands/list.d.ts +0 -15
  118. package/dist/commands/list.mjs +0 -91
  119. package/dist/commands/migrate.cjs +0 -9
  120. package/dist/commands/migrate.d.ts +0 -6
  121. package/dist/commands/migrate.mjs +0 -7
  122. package/dist/commands/remove.cjs +0 -127
  123. package/dist/commands/remove.d.ts +0 -6
  124. package/dist/commands/remove.mjs +0 -105
  125. package/dist/commands/status.cjs +0 -193
  126. package/dist/commands/status.d.ts +0 -6
  127. package/dist/commands/status.mjs +0 -171
  128. package/dist/commands/sync.cjs +0 -28
  129. package/dist/commands/sync.d.ts +0 -6
  130. package/dist/commands/sync.mjs +0 -26
  131. package/dist/commands/types.d.ts +0 -89
  132. package/dist/commands/update.cjs +0 -209
  133. package/dist/commands/update.d.ts +0 -29
  134. package/dist/commands/update.mjs +0 -206
  135. package/dist/components/add/AddCommand.cjs +0 -103
  136. package/dist/components/add/AddCommand.d.ts +0 -14
  137. package/dist/components/add/AddCommand.mjs +0 -101
  138. package/dist/components/add/BulkAddView.cjs +0 -165
  139. package/dist/components/add/BulkAddView.d.ts +0 -11
  140. package/dist/components/add/BulkAddView.mjs +0 -163
  141. package/dist/components/add/index.d.ts +0 -2
  142. package/dist/components/index.d.ts +0 -2
  143. package/dist/components/list/EditableTreeItem.d.ts +0 -13
  144. package/dist/components/list/ListCommand.cjs +0 -651
  145. package/dist/components/list/ListCommand.d.ts +0 -5
  146. package/dist/components/list/ListCommand.mjs +0 -649
  147. package/dist/components/list/SyncedPackageTree.d.ts +0 -14
  148. package/dist/components/list/index.d.ts +0 -10
  149. package/dist/components/list/types.d.ts +0 -14
  150. package/dist/components/primitives/Box.d.ts +0 -4
  151. package/dist/components/primitives/Spinner.d.ts +0 -6
  152. package/dist/components/primitives/Text.d.ts +0 -4
  153. package/dist/components/primitives/index.d.ts +0 -3
  154. package/dist/components/remove/RemoveConfirm.cjs +0 -18
  155. package/dist/components/remove/RemoveConfirm.d.ts +0 -11
  156. package/dist/components/remove/RemoveConfirm.mjs +0 -16
  157. package/dist/components/shared/Confirm.cjs +0 -30
  158. package/dist/components/shared/Confirm.d.ts +0 -8
  159. package/dist/components/shared/Confirm.mjs +0 -28
  160. package/dist/components/shared/MenuItem.cjs +0 -18
  161. package/dist/components/shared/MenuItem.d.ts +0 -7
  162. package/dist/components/shared/MenuItem.mjs +0 -16
  163. package/dist/components/shared/ProgressBar.d.ts +0 -7
  164. package/dist/components/shared/StepRunner.cjs +0 -58
  165. package/dist/components/shared/StepRunner.d.ts +0 -15
  166. package/dist/components/shared/StepRunner.mjs +0 -56
  167. package/dist/components/shared/Table.cjs +0 -19
  168. package/dist/components/shared/Table.d.ts +0 -8
  169. package/dist/components/shared/Table.mjs +0 -17
  170. package/dist/components/shared/index.d.ts +0 -6
  171. package/dist/components/status/PackageStatusCard.d.ts +0 -10
  172. package/dist/components/status/StatusDisplay.cjs +0 -26
  173. package/dist/components/status/StatusDisplay.d.ts +0 -23
  174. package/dist/components/status/StatusDisplay.mjs +0 -24
  175. package/dist/components/status/StatusTreeNode.cjs +0 -40
  176. package/dist/components/status/StatusTreeNode.d.ts +0 -15
  177. package/dist/components/status/StatusTreeNode.mjs +0 -38
  178. package/dist/components/status/index.d.ts +0 -6
  179. package/dist/components/tree/AssetTreeNode.cjs +0 -54
  180. package/dist/components/tree/AssetTreeNode.d.ts +0 -12
  181. package/dist/components/tree/AssetTreeNode.mjs +0 -52
  182. package/dist/components/tree/TreeSelect.cjs +0 -129
  183. package/dist/components/tree/TreeSelect.d.ts +0 -12
  184. package/dist/components/tree/TreeSelect.mjs +0 -127
  185. package/dist/components/tree/index.d.ts +0 -4
  186. package/dist/core/assetStructure.cjs +0 -30
  187. package/dist/core/assetStructure.d.ts +0 -36
  188. package/dist/core/assetStructure.mjs +0 -27
  189. package/dist/core/cli.cjs +0 -106
  190. package/dist/core/cli.d.ts +0 -9
  191. package/dist/core/cli.mjs +0 -103
  192. package/dist/core/constants.cjs +0 -28
  193. package/dist/core/constants.d.ts +0 -94
  194. package/dist/core/constants.mjs +0 -21
  195. package/dist/core/filesystem.cjs +0 -98
  196. package/dist/core/filesystem.d.ts +0 -94
  197. package/dist/core/filesystem.mjs +0 -88
  198. package/dist/core/github.cjs +0 -115
  199. package/dist/core/github.d.ts +0 -61
  200. package/dist/core/github.mjs +0 -107
  201. package/dist/core/io.cjs +0 -46
  202. package/dist/core/io.d.ts +0 -40
  203. package/dist/core/io.mjs +0 -39
  204. package/dist/core/listOperations.cjs +0 -228
  205. package/dist/core/listOperations.d.ts +0 -43
  206. package/dist/core/listOperations.mjs +0 -205
  207. package/dist/core/localSource.cjs +0 -126
  208. package/dist/core/localSource.d.ts +0 -33
  209. package/dist/core/localSource.mjs +0 -120
  210. package/dist/core/migration.cjs +0 -201
  211. package/dist/core/migration.d.ts +0 -57
  212. package/dist/core/migration.mjs +0 -198
  213. package/dist/core/packageScanner.cjs +0 -360
  214. package/dist/core/packageScanner.d.ts +0 -22
  215. package/dist/core/packageScanner.mjs +0 -356
  216. package/dist/core/sync.cjs +0 -400
  217. package/dist/core/sync.d.ts +0 -21
  218. package/dist/core/sync.mjs +0 -397
  219. package/dist/core/syncMeta.cjs +0 -242
  220. package/dist/core/syncMeta.d.ts +0 -75
  221. package/dist/core/syncMeta.mjs +0 -229
  222. package/dist/utils/dependencies.cjs +0 -57
  223. package/dist/utils/dependencies.d.ts +0 -10
  224. package/dist/utils/dependencies.mjs +0 -34
  225. package/dist/utils/nameTransform.cjs +0 -13
  226. package/dist/utils/nameTransform.d.ts +0 -65
  227. package/dist/utils/nameTransform.mjs +0 -11
  228. package/dist/utils/package.cjs +0 -170
  229. package/dist/utils/package.d.ts +0 -105
  230. package/dist/utils/package.mjs +0 -157
  231. package/dist/utils/packageName.cjs +0 -24
  232. package/dist/utils/packageName.d.ts +0 -32
  233. package/dist/utils/packageName.mjs +0 -21
  234. package/dist/utils/paths.cjs +0 -18
  235. package/dist/utils/paths.d.ts +0 -55
  236. package/dist/utils/paths.mjs +0 -15
  237. package/dist/version.cjs +0 -5
  238. package/dist/version.d.ts +0 -5
  239. package/dist/version.mjs +0 -3
@@ -1,193 +0,0 @@
1
- 'use strict';
2
-
3
- var fs = require('node:fs');
4
- var path = require('node:path');
5
- var ink = require('ink');
6
- var pc = require('picocolors');
7
- var React = require('react');
8
- var StatusDisplay = require('../components/status/StatusDisplay.cjs');
9
- require('react/jsx-runtime');
10
- var syncMeta = require('../core/syncMeta.cjs');
11
- var logger = require('../utils/logger.cjs');
12
- var _package = require('../utils/package.cjs');
13
-
14
- function _interopNamespaceDefault(e) {
15
- var n = Object.create(null);
16
- if (e) {
17
- Object.keys(e).forEach(function (k) {
18
- if (k !== 'default') {
19
- var d = Object.getOwnPropertyDescriptor(e, k);
20
- Object.defineProperty(n, k, d.get ? d : {
21
- enumerable: true,
22
- get: function () { return e[k]; }
23
- });
24
- }
25
- });
26
- }
27
- n.default = e;
28
- return Object.freeze(n);
29
- }
30
-
31
- var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
32
- var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
33
-
34
- const CACHE_DURATION = 5 * 60 * 1000;
35
- const CACHE_FILE = '.sync-version-cache.json';
36
- const fetchRemoteVersion = async (packageName) => {
37
- try {
38
- const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
39
- signal: AbortSignal.timeout(5000),
40
- });
41
- if (!response.ok) {
42
- if (response.status === 404) {
43
- return undefined;
44
- }
45
- throw new Error(`HTTP ${response.status}`);
46
- }
47
- const data = await response.json();
48
- return data.version;
49
- }
50
- catch {
51
- return undefined;
52
- }
53
- };
54
- const readVersionCache = (cwd) => {
55
- try {
56
- const cachePath = path__namespace.join(cwd, '.claude', CACHE_FILE);
57
- const content = fs__namespace.readFileSync(cachePath, 'utf-8');
58
- return JSON.parse(content);
59
- }
60
- catch {
61
- return {};
62
- }
63
- };
64
- const writeVersionCache = (cwd, cache) => {
65
- try {
66
- const cachePath = path__namespace.join(cwd, '.claude', CACHE_FILE);
67
- fs__namespace.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
68
- }
69
- catch {
70
- }
71
- };
72
- const getCachedRemoteVersion = async (packageName, cwd) => {
73
- const cache = readVersionCache(cwd);
74
- const now = Date.now();
75
- const cached = cache[packageName];
76
- if (cached && now - cached.timestamp < CACHE_DURATION) {
77
- return cached.version;
78
- }
79
- const version = await fetchRemoteVersion(packageName);
80
- if (version) {
81
- cache[packageName] = {
82
- version,
83
- timestamp: now,
84
- };
85
- writeVersionCache(cwd, cache);
86
- }
87
- return version;
88
- };
89
- const runStatusCommand = async (options, cwd = process.cwd()) => {
90
- const destDir = _package.findGitRoot(cwd) ?? cwd;
91
- const meta = syncMeta.readUnifiedSyncMeta(destDir);
92
- if (!meta || Object.keys(meta.packages).length === 0) {
93
- logger.logger.info('No packages synced yet.');
94
- return;
95
- }
96
- const statuses = [];
97
- for (const [, packageInfo] of Object.entries(meta.packages)) {
98
- let remoteVersion;
99
- let error;
100
- if (!options.noRemote) {
101
- try {
102
- remoteVersion = await getCachedRemoteVersion(packageInfo.originalName, destDir);
103
- }
104
- catch (err) {
105
- error = err instanceof Error ? err.message : 'Unknown error';
106
- }
107
- }
108
- const upToDate = remoteVersion !== undefined && remoteVersion === packageInfo.version;
109
- let totalFiles = 0;
110
- for (const files of Object.values(packageInfo.files)) {
111
- totalFiles += Array.isArray(files) ? files.length : 0;
112
- }
113
- statuses.push({
114
- name: packageInfo.originalName,
115
- localVersion: packageInfo.version,
116
- remoteVersion,
117
- upToDate,
118
- syncedAt: meta.syncedAt,
119
- error,
120
- files: packageInfo.files,
121
- fileCount: totalFiles,
122
- });
123
- }
124
- statuses.sort((a, b) => a.name.localeCompare(b.name));
125
- if (process.stdout.isTTY) {
126
- const packages = statuses.map((s) => ({
127
- name: s.name,
128
- localVersion: s.localVersion,
129
- remoteVersion: s.remoteVersion,
130
- status: s.error
131
- ? 'error'
132
- : s.upToDate
133
- ? 'up-to-date'
134
- : s.remoteVersion
135
- ? 'outdated'
136
- : 'unknown',
137
- syncedAt: s.syncedAt,
138
- error: s.error,
139
- files: s.files,
140
- fileCount: s.fileCount,
141
- }));
142
- const summary = {
143
- upToDate: statuses.filter((s) => s.upToDate).length,
144
- outdated: statuses.filter((s) => s.remoteVersion && !s.upToDate).length,
145
- error: statuses.filter((s) => s.error).length,
146
- unknown: statuses.filter((s) => !s.remoteVersion && !s.error && !options.noRemote).length,
147
- };
148
- ink.render(React.createElement(StatusDisplay.StatusDisplay, {
149
- packages,
150
- loading: false,
151
- summary,
152
- }));
153
- }
154
- else {
155
- console.log(pc.bold('\nPackage Status:\n'));
156
- for (const status of statuses) {
157
- const icon = status.upToDate
158
- ? pc.green('✓')
159
- : status.remoteVersion
160
- ? pc.yellow('⚠')
161
- : pc.gray('?');
162
- console.log(` ${icon} ${pc.cyan(status.name)}`);
163
- console.log(` Local: ${status.localVersion}`);
164
- if (status.remoteVersion) {
165
- console.log(` Remote: ${status.remoteVersion}`);
166
- }
167
- else if (status.error) {
168
- console.log(` Remote: ${pc.red('Error:')} ${status.error}`);
169
- }
170
- else if (options.noRemote) {
171
- console.log(` Remote: ${pc.gray('(check skipped)')}`);
172
- }
173
- else {
174
- console.log(` Remote: ${pc.gray('(not available)')}`);
175
- }
176
- if (status.remoteVersion && !status.upToDate) {
177
- console.log(` Status: ${pc.yellow('Update available')}`);
178
- }
179
- else if (status.upToDate) {
180
- console.log(` Status: ${pc.green('Up to date')}`);
181
- }
182
- console.log(` Synced: ${new Date(status.syncedAt).toLocaleString()}`);
183
- console.log('');
184
- }
185
- const upToDateCount = statuses.filter((s) => s.upToDate).length;
186
- const updateAvailable = statuses.filter((s) => s.remoteVersion && !s.upToDate).length;
187
- if (!options.noRemote) {
188
- console.log(pc.gray(`Summary: ${upToDateCount} up to date, ${updateAvailable} updates available\n`));
189
- }
190
- }
191
- };
192
-
193
- exports.runStatusCommand = runStatusCommand;
@@ -1,6 +0,0 @@
1
- import type { StatusCommandOptions } from './types.js';
2
- /**
3
- * Run the status command
4
- * @param options - Status command options
5
- */
6
- export declare const runStatusCommand: (options: StatusCommandOptions, cwd?: string) => Promise<void>;
@@ -1,171 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { render } from 'ink';
4
- import pc from 'picocolors';
5
- import React from 'react';
6
- import { StatusDisplay } from '../components/status/StatusDisplay.mjs';
7
- import 'react/jsx-runtime';
8
- import { readUnifiedSyncMeta } from '../core/syncMeta.mjs';
9
- import { logger } from '../utils/logger.mjs';
10
- import { findGitRoot } from '../utils/package.mjs';
11
-
12
- const CACHE_DURATION = 5 * 60 * 1000;
13
- const CACHE_FILE = '.sync-version-cache.json';
14
- const fetchRemoteVersion = async (packageName) => {
15
- try {
16
- const response = await fetch(`https://registry.npmjs.org/${packageName}/latest`, {
17
- signal: AbortSignal.timeout(5000),
18
- });
19
- if (!response.ok) {
20
- if (response.status === 404) {
21
- return undefined;
22
- }
23
- throw new Error(`HTTP ${response.status}`);
24
- }
25
- const data = await response.json();
26
- return data.version;
27
- }
28
- catch {
29
- return undefined;
30
- }
31
- };
32
- const readVersionCache = (cwd) => {
33
- try {
34
- const cachePath = path.join(cwd, '.claude', CACHE_FILE);
35
- const content = fs.readFileSync(cachePath, 'utf-8');
36
- return JSON.parse(content);
37
- }
38
- catch {
39
- return {};
40
- }
41
- };
42
- const writeVersionCache = (cwd, cache) => {
43
- try {
44
- const cachePath = path.join(cwd, '.claude', CACHE_FILE);
45
- fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
46
- }
47
- catch {
48
- }
49
- };
50
- const getCachedRemoteVersion = async (packageName, cwd) => {
51
- const cache = readVersionCache(cwd);
52
- const now = Date.now();
53
- const cached = cache[packageName];
54
- if (cached && now - cached.timestamp < CACHE_DURATION) {
55
- return cached.version;
56
- }
57
- const version = await fetchRemoteVersion(packageName);
58
- if (version) {
59
- cache[packageName] = {
60
- version,
61
- timestamp: now,
62
- };
63
- writeVersionCache(cwd, cache);
64
- }
65
- return version;
66
- };
67
- const runStatusCommand = async (options, cwd = process.cwd()) => {
68
- const destDir = findGitRoot(cwd) ?? cwd;
69
- const meta = readUnifiedSyncMeta(destDir);
70
- if (!meta || Object.keys(meta.packages).length === 0) {
71
- logger.info('No packages synced yet.');
72
- return;
73
- }
74
- const statuses = [];
75
- for (const [, packageInfo] of Object.entries(meta.packages)) {
76
- let remoteVersion;
77
- let error;
78
- if (!options.noRemote) {
79
- try {
80
- remoteVersion = await getCachedRemoteVersion(packageInfo.originalName, destDir);
81
- }
82
- catch (err) {
83
- error = err instanceof Error ? err.message : 'Unknown error';
84
- }
85
- }
86
- const upToDate = remoteVersion !== undefined && remoteVersion === packageInfo.version;
87
- let totalFiles = 0;
88
- for (const files of Object.values(packageInfo.files)) {
89
- totalFiles += Array.isArray(files) ? files.length : 0;
90
- }
91
- statuses.push({
92
- name: packageInfo.originalName,
93
- localVersion: packageInfo.version,
94
- remoteVersion,
95
- upToDate,
96
- syncedAt: meta.syncedAt,
97
- error,
98
- files: packageInfo.files,
99
- fileCount: totalFiles,
100
- });
101
- }
102
- statuses.sort((a, b) => a.name.localeCompare(b.name));
103
- if (process.stdout.isTTY) {
104
- const packages = statuses.map((s) => ({
105
- name: s.name,
106
- localVersion: s.localVersion,
107
- remoteVersion: s.remoteVersion,
108
- status: s.error
109
- ? 'error'
110
- : s.upToDate
111
- ? 'up-to-date'
112
- : s.remoteVersion
113
- ? 'outdated'
114
- : 'unknown',
115
- syncedAt: s.syncedAt,
116
- error: s.error,
117
- files: s.files,
118
- fileCount: s.fileCount,
119
- }));
120
- const summary = {
121
- upToDate: statuses.filter((s) => s.upToDate).length,
122
- outdated: statuses.filter((s) => s.remoteVersion && !s.upToDate).length,
123
- error: statuses.filter((s) => s.error).length,
124
- unknown: statuses.filter((s) => !s.remoteVersion && !s.error && !options.noRemote).length,
125
- };
126
- render(React.createElement(StatusDisplay, {
127
- packages,
128
- loading: false,
129
- summary,
130
- }));
131
- }
132
- else {
133
- console.log(pc.bold('\nPackage Status:\n'));
134
- for (const status of statuses) {
135
- const icon = status.upToDate
136
- ? pc.green('✓')
137
- : status.remoteVersion
138
- ? pc.yellow('⚠')
139
- : pc.gray('?');
140
- console.log(` ${icon} ${pc.cyan(status.name)}`);
141
- console.log(` Local: ${status.localVersion}`);
142
- if (status.remoteVersion) {
143
- console.log(` Remote: ${status.remoteVersion}`);
144
- }
145
- else if (status.error) {
146
- console.log(` Remote: ${pc.red('Error:')} ${status.error}`);
147
- }
148
- else if (options.noRemote) {
149
- console.log(` Remote: ${pc.gray('(check skipped)')}`);
150
- }
151
- else {
152
- console.log(` Remote: ${pc.gray('(not available)')}`);
153
- }
154
- if (status.remoteVersion && !status.upToDate) {
155
- console.log(` Status: ${pc.yellow('Update available')}`);
156
- }
157
- else if (status.upToDate) {
158
- console.log(` Status: ${pc.green('Up to date')}`);
159
- }
160
- console.log(` Synced: ${new Date(status.syncedAt).toLocaleString()}`);
161
- console.log('');
162
- }
163
- const upToDateCount = statuses.filter((s) => s.upToDate).length;
164
- const updateAvailable = statuses.filter((s) => s.remoteVersion && !s.upToDate).length;
165
- if (!options.noRemote) {
166
- console.log(pc.gray(`Summary: ${upToDateCount} up to date, ${updateAvailable} updates available\n`));
167
- }
168
- }
169
- };
170
-
171
- export { runStatusCommand };
@@ -1,28 +0,0 @@
1
- 'use strict';
2
-
3
- var sync = require('../core/sync.cjs');
4
- var logger = require('../utils/logger.cjs');
5
-
6
- const runSyncCommand = async (options) => {
7
- if (options.package.length === 0) {
8
- logger.logger.error('No packages specified. Use -p <package> to specify packages.');
9
- logger.logger.info('Example: claude-assets-sync -p @canard/schema-form');
10
- process.exit(1);
11
- }
12
- if (options.dryRun)
13
- logger.logger.dryRunNotice();
14
- if (options.local)
15
- logger.logger.info('[LOCAL MODE] Reading packages from workspace instead of node_modules\n');
16
- const results = await sync.syncPackages(options.package, {
17
- force: options.force,
18
- dryRun: options.dryRun,
19
- local: options.local,
20
- ref: options.ref,
21
- flat: options.flat,
22
- });
23
- const hasFailures = results.some((r) => !r.success && !r.skipped);
24
- if (hasFailures)
25
- process.exit(1);
26
- };
27
-
28
- exports.runSyncCommand = runSyncCommand;
@@ -1,6 +0,0 @@
1
- import type { SyncCommandOptions } from './types.js';
2
- /**
3
- * Run the sync command
4
- * @param options - Sync command options
5
- */
6
- export declare const runSyncCommand: (options: SyncCommandOptions) => Promise<void>;
@@ -1,26 +0,0 @@
1
- import { syncPackages } from '../core/sync.mjs';
2
- import { logger } from '../utils/logger.mjs';
3
-
4
- const runSyncCommand = async (options) => {
5
- if (options.package.length === 0) {
6
- logger.error('No packages specified. Use -p <package> to specify packages.');
7
- logger.info('Example: claude-assets-sync -p @canard/schema-form');
8
- process.exit(1);
9
- }
10
- if (options.dryRun)
11
- logger.dryRunNotice();
12
- if (options.local)
13
- logger.info('[LOCAL MODE] Reading packages from workspace instead of node_modules\n');
14
- const results = await syncPackages(options.package, {
15
- force: options.force,
16
- dryRun: options.dryRun,
17
- local: options.local,
18
- ref: options.ref,
19
- flat: options.flat,
20
- });
21
- const hasFailures = results.some((r) => !r.success && !r.skipped);
22
- if (hasFailures)
23
- process.exit(1);
24
- };
25
-
26
- export { runSyncCommand };
@@ -1,89 +0,0 @@
1
- /**
2
- * Common types for command modules
3
- */
4
- import type { SkillUnit } from '../utils/types.js';
5
- /**
6
- * Base command result
7
- */
8
- export interface CommandResult {
9
- success: boolean;
10
- message?: string;
11
- }
12
- /**
13
- * Options for add command
14
- */
15
- export interface AddCommandOptions {
16
- package?: string;
17
- pattern?: string;
18
- local?: boolean;
19
- ref?: string;
20
- }
21
- /**
22
- * Options for sync command
23
- */
24
- export interface SyncCommandOptions {
25
- package: string[];
26
- force: boolean;
27
- dryRun: boolean;
28
- local: boolean;
29
- ref?: string;
30
- flat?: boolean;
31
- }
32
- /**
33
- * Options for list command
34
- */
35
- export interface ListCommandOptions {
36
- json?: boolean;
37
- }
38
- /**
39
- * Options for remove command
40
- */
41
- export interface RemoveCommandOptions {
42
- package: string;
43
- yes?: boolean;
44
- dryRun?: boolean;
45
- }
46
- /**
47
- * Options for status command
48
- */
49
- export interface StatusCommandOptions {
50
- noRemote?: boolean;
51
- }
52
- /**
53
- * Options for migrate command
54
- */
55
- export interface MigrateCommandOptions {
56
- dryRun?: boolean;
57
- }
58
- /**
59
- * Package list item
60
- */
61
- export interface PackageListItem {
62
- name: string;
63
- version: string;
64
- syncedAt: string;
65
- assetCount: number;
66
- assets: Record<string, number>;
67
- }
68
- /**
69
- * Package status item
70
- */
71
- export interface PackageStatusItem {
72
- name: string;
73
- localVersion: string;
74
- remoteVersion?: string;
75
- upToDate: boolean;
76
- syncedAt: string;
77
- error?: string;
78
- files: Record<string, SkillUnit[]>;
79
- fileCount: number;
80
- }
81
- /**
82
- * Remote version cache entry
83
- */
84
- export interface RemoteVersionCache {
85
- [packageName: string]: {
86
- version: string;
87
- timestamp: number;
88
- };
89
- }