@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,165 +0,0 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var ink = require('ink');
5
- var Spinner = require('ink-spinner');
6
- var React = require('react');
7
- var packageScanner = require('../../core/packageScanner.cjs');
8
- var sync = require('../../core/sync.cjs');
9
- var asyncPool = require('../../utils/asyncPool.cjs');
10
- var dependencies = require('../../utils/dependencies.cjs');
11
- var StepRunner = require('../shared/StepRunner.cjs');
12
- var Table = require('../shared/Table.cjs');
13
-
14
- const BulkAddView = ({ pattern, cwd, local = false, ref, }) => {
15
- const [phase, setPhase] = React.useState('scanning-deps');
16
- const [matches, setMatches] = React.useState([]);
17
- const [scanSteps, setScanSteps] = React.useState([]);
18
- const [syncSteps, setSyncSteps] = React.useState([]);
19
- const [results, setResults] = React.useState([]);
20
- const [errorMessage, setErrorMessage] = React.useState('');
21
- React.useEffect(() => {
22
- const run = async () => {
23
- setPhase('scanning-deps');
24
- let matched;
25
- try {
26
- const deps = dependencies.readProjectDependencies(cwd);
27
- matched = dependencies.filterByPattern(deps, pattern);
28
- }
29
- catch (err) {
30
- setErrorMessage(err instanceof Error ? err.message : String(err));
31
- setPhase('error');
32
- return;
33
- }
34
- setMatches(matched);
35
- if (matched.length === 0) {
36
- setResults([]);
37
- setPhase('done');
38
- return;
39
- }
40
- setPhase('scanning-assets');
41
- const initialScanSteps = matched.map((name) => ({
42
- name,
43
- status: 'pending',
44
- }));
45
- setScanSteps(initialScanSteps);
46
- const packagesWithAssets = [];
47
- const scanResults = [];
48
- await asyncPool.asyncPool(3, matched, async (pkgName) => {
49
- setScanSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'running' } : s));
50
- try {
51
- const trees = await packageScanner.scanPackageAssets(pkgName, { local, ref, cwd });
52
- const hasAssets = trees.length > 0;
53
- if (hasAssets) {
54
- packagesWithAssets.push(pkgName);
55
- setScanSteps((prev) => prev.map((s) => s.name === pkgName
56
- ? { ...s, status: 'success', output: `${trees.length} asset type(s)` }
57
- : s));
58
- }
59
- else {
60
- scanResults.push({ name: pkgName, status: 'skipped', assetCount: 0 });
61
- setScanSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'skipped' } : s));
62
- }
63
- }
64
- catch (err) {
65
- const msg = err instanceof Error ? err.message : String(err);
66
- const isNoAssets = /no repository|asset path.*does not exist|not found in/i.test(msg);
67
- if (isNoAssets) {
68
- scanResults.push({ name: pkgName, status: 'skipped', assetCount: 0 });
69
- setScanSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'skipped' } : s));
70
- }
71
- else {
72
- scanResults.push({ name: pkgName, status: 'error', assetCount: 0, error: msg });
73
- setScanSteps((prev) => prev.map((s) => s.name === pkgName
74
- ? { ...s, status: 'failed', error: msg }
75
- : s));
76
- }
77
- }
78
- });
79
- if (packagesWithAssets.length === 0) {
80
- setResults(scanResults);
81
- setPhase('done');
82
- return;
83
- }
84
- setPhase('syncing');
85
- const initialSyncSteps = packagesWithAssets.map((name) => ({
86
- name,
87
- status: 'pending',
88
- }));
89
- setSyncSteps(initialSyncSteps);
90
- await asyncPool.asyncPool(3, packagesWithAssets, async (pkgName) => {
91
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'running' } : s));
92
- try {
93
- const result = await sync.syncPackage(pkgName, {
94
- force: true,
95
- dryRun: false,
96
- local,
97
- ref,
98
- flat: true,
99
- }, cwd, undefined, undefined);
100
- if (result.success && !result.skipped) {
101
- const assetCount = Object.values(result.syncedFiles ?? {}).reduce((sum, files) => sum + files.length, 0);
102
- scanResults.push({ name: pkgName, status: 'synced', assetCount });
103
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName
104
- ? { ...s, status: 'success', output: `${assetCount} file(s)` }
105
- : s));
106
- }
107
- else if (result.skipped) {
108
- scanResults.push({ name: pkgName, status: 'skipped', assetCount: 0 });
109
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'skipped' } : s));
110
- }
111
- else {
112
- const msg = result.reason ?? 'Sync failed';
113
- scanResults.push({ name: pkgName, status: 'error', assetCount: 0, error: msg });
114
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName
115
- ? { ...s, status: 'failed', error: msg }
116
- : s));
117
- }
118
- }
119
- catch (err) {
120
- const msg = err instanceof Error ? err.message : String(err);
121
- scanResults.push({ name: pkgName, status: 'error', assetCount: 0, error: msg });
122
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName
123
- ? { ...s, status: 'failed', error: msg }
124
- : s));
125
- }
126
- });
127
- setResults(scanResults);
128
- setPhase('done');
129
- };
130
- run();
131
- }, []);
132
- if (phase === 'scanning-deps') {
133
- return (jsxRuntime.jsx(ink.Box, { children: jsxRuntime.jsxs(ink.Text, { color: "cyan", children: [jsxRuntime.jsx(Spinner, { type: "dots" }), " Scanning dependencies matching /", pattern, "/..."] }) }));
134
- }
135
- if (phase === 'error') {
136
- return (jsxRuntime.jsx(ink.Box, { flexDirection: "column", children: jsxRuntime.jsxs(ink.Text, { color: "red", children: ["Error: ", errorMessage] }) }));
137
- }
138
- if (phase === 'scanning-assets') {
139
- return (jsxRuntime.jsxs(ink.Box, { flexDirection: "column", children: [jsxRuntime.jsx(ink.Box, { marginBottom: 1, children: jsxRuntime.jsxs(ink.Text, { children: ["Found ", jsxRuntime.jsx(ink.Text, { bold: true, children: matches.length }), " matching package(s). Scanning assets..."] }) }), jsxRuntime.jsx(StepRunner.StepRunner, { steps: scanSteps, currentStep: scanSteps.findIndex((s) => s.status === 'running'), total: scanSteps.length })] }));
140
- }
141
- if (phase === 'syncing') {
142
- return (jsxRuntime.jsxs(ink.Box, { flexDirection: "column", children: [jsxRuntime.jsx(ink.Box, { marginBottom: 1, children: jsxRuntime.jsx(ink.Text, { children: "Syncing packages..." }) }), jsxRuntime.jsx(StepRunner.StepRunner, { steps: syncSteps, currentStep: syncSteps.findIndex((s) => s.status === 'running'), total: syncSteps.length })] }));
143
- }
144
- if (phase === 'done') {
145
- const synced = results.filter((r) => r.status === 'synced').length;
146
- const skipped = results.filter((r) => r.status === 'skipped').length;
147
- const errors = results.filter((r) => r.status === 'error').length;
148
- if (results.length === 0) {
149
- return (jsxRuntime.jsx(ink.Box, { flexDirection: "column", children: jsxRuntime.jsxs(ink.Text, { color: "yellow", children: ["No packages matched pattern /", pattern, "/"] }) }));
150
- }
151
- const rows = results.map((r) => {
152
- const statusCell = r.status === 'synced'
153
- ? '✓ synced'
154
- : r.status === 'skipped'
155
- ? '⏭ skipped'
156
- : `✗ error`;
157
- const assetsCell = r.status === 'synced' ? String(r.assetCount) : r.error ?? '-';
158
- return [r.name, statusCell, assetsCell];
159
- });
160
- return (jsxRuntime.jsxs(ink.Box, { flexDirection: "column", children: [jsxRuntime.jsx(Table.Table, { headers: ['Package', 'Status', 'Assets'], rows: rows }), jsxRuntime.jsx(ink.Box, { marginTop: 1, children: jsxRuntime.jsxs(ink.Text, { children: [jsxRuntime.jsxs(ink.Text, { color: "green", children: [synced, " synced"] }), jsxRuntime.jsx(ink.Text, { children: ", " }), jsxRuntime.jsxs(ink.Text, { color: "blue", children: [skipped, " skipped"] }), jsxRuntime.jsx(ink.Text, { children: ", " }), jsxRuntime.jsxs(ink.Text, { color: errors > 0 ? 'red' : 'gray', children: [errors, " errors"] })] }) })] }));
161
- }
162
- return null;
163
- };
164
-
165
- exports.BulkAddView = BulkAddView;
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- export interface BulkAddViewProps {
3
- pattern: string;
4
- cwd: string;
5
- local?: boolean;
6
- ref?: string;
7
- }
8
- /**
9
- * Bulk add view — scans dependencies by regex, scans assets, and syncs all found assets.
10
- */
11
- export declare const BulkAddView: React.FC<BulkAddViewProps>;
@@ -1,163 +0,0 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { Box, Text } from 'ink';
3
- import Spinner from 'ink-spinner';
4
- import { useState, useEffect } from 'react';
5
- import { scanPackageAssets } from '../../core/packageScanner.mjs';
6
- import { syncPackage } from '../../core/sync.mjs';
7
- import { asyncPool } from '../../utils/asyncPool.mjs';
8
- import { readProjectDependencies, filterByPattern } from '../../utils/dependencies.mjs';
9
- import { StepRunner } from '../shared/StepRunner.mjs';
10
- import { Table } from '../shared/Table.mjs';
11
-
12
- const BulkAddView = ({ pattern, cwd, local = false, ref, }) => {
13
- const [phase, setPhase] = useState('scanning-deps');
14
- const [matches, setMatches] = useState([]);
15
- const [scanSteps, setScanSteps] = useState([]);
16
- const [syncSteps, setSyncSteps] = useState([]);
17
- const [results, setResults] = useState([]);
18
- const [errorMessage, setErrorMessage] = useState('');
19
- useEffect(() => {
20
- const run = async () => {
21
- setPhase('scanning-deps');
22
- let matched;
23
- try {
24
- const deps = readProjectDependencies(cwd);
25
- matched = filterByPattern(deps, pattern);
26
- }
27
- catch (err) {
28
- setErrorMessage(err instanceof Error ? err.message : String(err));
29
- setPhase('error');
30
- return;
31
- }
32
- setMatches(matched);
33
- if (matched.length === 0) {
34
- setResults([]);
35
- setPhase('done');
36
- return;
37
- }
38
- setPhase('scanning-assets');
39
- const initialScanSteps = matched.map((name) => ({
40
- name,
41
- status: 'pending',
42
- }));
43
- setScanSteps(initialScanSteps);
44
- const packagesWithAssets = [];
45
- const scanResults = [];
46
- await asyncPool(3, matched, async (pkgName) => {
47
- setScanSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'running' } : s));
48
- try {
49
- const trees = await scanPackageAssets(pkgName, { local, ref, cwd });
50
- const hasAssets = trees.length > 0;
51
- if (hasAssets) {
52
- packagesWithAssets.push(pkgName);
53
- setScanSteps((prev) => prev.map((s) => s.name === pkgName
54
- ? { ...s, status: 'success', output: `${trees.length} asset type(s)` }
55
- : s));
56
- }
57
- else {
58
- scanResults.push({ name: pkgName, status: 'skipped', assetCount: 0 });
59
- setScanSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'skipped' } : s));
60
- }
61
- }
62
- catch (err) {
63
- const msg = err instanceof Error ? err.message : String(err);
64
- const isNoAssets = /no repository|asset path.*does not exist|not found in/i.test(msg);
65
- if (isNoAssets) {
66
- scanResults.push({ name: pkgName, status: 'skipped', assetCount: 0 });
67
- setScanSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'skipped' } : s));
68
- }
69
- else {
70
- scanResults.push({ name: pkgName, status: 'error', assetCount: 0, error: msg });
71
- setScanSteps((prev) => prev.map((s) => s.name === pkgName
72
- ? { ...s, status: 'failed', error: msg }
73
- : s));
74
- }
75
- }
76
- });
77
- if (packagesWithAssets.length === 0) {
78
- setResults(scanResults);
79
- setPhase('done');
80
- return;
81
- }
82
- setPhase('syncing');
83
- const initialSyncSteps = packagesWithAssets.map((name) => ({
84
- name,
85
- status: 'pending',
86
- }));
87
- setSyncSteps(initialSyncSteps);
88
- await asyncPool(3, packagesWithAssets, async (pkgName) => {
89
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'running' } : s));
90
- try {
91
- const result = await syncPackage(pkgName, {
92
- force: true,
93
- dryRun: false,
94
- local,
95
- ref,
96
- flat: true,
97
- }, cwd, undefined, undefined);
98
- if (result.success && !result.skipped) {
99
- const assetCount = Object.values(result.syncedFiles ?? {}).reduce((sum, files) => sum + files.length, 0);
100
- scanResults.push({ name: pkgName, status: 'synced', assetCount });
101
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName
102
- ? { ...s, status: 'success', output: `${assetCount} file(s)` }
103
- : s));
104
- }
105
- else if (result.skipped) {
106
- scanResults.push({ name: pkgName, status: 'skipped', assetCount: 0 });
107
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName ? { ...s, status: 'skipped' } : s));
108
- }
109
- else {
110
- const msg = result.reason ?? 'Sync failed';
111
- scanResults.push({ name: pkgName, status: 'error', assetCount: 0, error: msg });
112
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName
113
- ? { ...s, status: 'failed', error: msg }
114
- : s));
115
- }
116
- }
117
- catch (err) {
118
- const msg = err instanceof Error ? err.message : String(err);
119
- scanResults.push({ name: pkgName, status: 'error', assetCount: 0, error: msg });
120
- setSyncSteps((prev) => prev.map((s) => s.name === pkgName
121
- ? { ...s, status: 'failed', error: msg }
122
- : s));
123
- }
124
- });
125
- setResults(scanResults);
126
- setPhase('done');
127
- };
128
- run();
129
- }, []);
130
- if (phase === 'scanning-deps') {
131
- return (jsx(Box, { children: jsxs(Text, { color: "cyan", children: [jsx(Spinner, { type: "dots" }), " Scanning dependencies matching /", pattern, "/..."] }) }));
132
- }
133
- if (phase === 'error') {
134
- return (jsx(Box, { flexDirection: "column", children: jsxs(Text, { color: "red", children: ["Error: ", errorMessage] }) }));
135
- }
136
- if (phase === 'scanning-assets') {
137
- return (jsxs(Box, { flexDirection: "column", children: [jsx(Box, { marginBottom: 1, children: jsxs(Text, { children: ["Found ", jsx(Text, { bold: true, children: matches.length }), " matching package(s). Scanning assets..."] }) }), jsx(StepRunner, { steps: scanSteps, currentStep: scanSteps.findIndex((s) => s.status === 'running'), total: scanSteps.length })] }));
138
- }
139
- if (phase === 'syncing') {
140
- return (jsxs(Box, { flexDirection: "column", children: [jsx(Box, { marginBottom: 1, children: jsx(Text, { children: "Syncing packages..." }) }), jsx(StepRunner, { steps: syncSteps, currentStep: syncSteps.findIndex((s) => s.status === 'running'), total: syncSteps.length })] }));
141
- }
142
- if (phase === 'done') {
143
- const synced = results.filter((r) => r.status === 'synced').length;
144
- const skipped = results.filter((r) => r.status === 'skipped').length;
145
- const errors = results.filter((r) => r.status === 'error').length;
146
- if (results.length === 0) {
147
- return (jsx(Box, { flexDirection: "column", children: jsxs(Text, { color: "yellow", children: ["No packages matched pattern /", pattern, "/"] }) }));
148
- }
149
- const rows = results.map((r) => {
150
- const statusCell = r.status === 'synced'
151
- ? '✓ synced'
152
- : r.status === 'skipped'
153
- ? '⏭ skipped'
154
- : `✗ error`;
155
- const assetsCell = r.status === 'synced' ? String(r.assetCount) : r.error ?? '-';
156
- return [r.name, statusCell, assetsCell];
157
- });
158
- return (jsxs(Box, { flexDirection: "column", children: [jsx(Table, { headers: ['Package', 'Status', 'Assets'], rows: rows }), jsx(Box, { marginTop: 1, children: jsxs(Text, { children: [jsxs(Text, { color: "green", children: [synced, " synced"] }), jsx(Text, { children: ", " }), jsxs(Text, { color: "blue", children: [skipped, " skipped"] }), jsx(Text, { children: ", " }), jsxs(Text, { color: errors > 0 ? 'red' : 'gray', children: [errors, " errors"] })] }) })] }));
159
- }
160
- return null;
161
- };
162
-
163
- export { BulkAddView };
@@ -1,2 +0,0 @@
1
- export { AddCommand } from './AddCommand.js';
2
- export type { AddCommandProps } from './AddCommand.js';
@@ -1,2 +0,0 @@
1
- export * from './primitives/index.js';
2
- export * from './status/index.js';
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- export interface EditableTreeItemProps {
3
- label: string;
4
- depth: number;
5
- selected: boolean;
6
- markedForDeletion?: boolean;
7
- markedForAddition?: boolean;
8
- onToggleDelete?: () => void;
9
- }
10
- /**
11
- * Editable tree item component for list view
12
- */
13
- export declare const EditableTreeItem: React.FC<EditableTreeItemProps>;