@unlimitechcloud/devlink 1.0.2

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 (186) hide show
  1. package/AGENTS.md +880 -0
  2. package/LICENSE +21 -0
  3. package/README.md +335 -0
  4. package/dist/__tests__/e2e.spec.d.ts +8 -0
  5. package/dist/__tests__/e2e.spec.d.ts.map +1 -0
  6. package/dist/__tests__/e2e.spec.js +253 -0
  7. package/dist/__tests__/e2e.spec.js.map +1 -0
  8. package/dist/__tests__/integration.spec.d.ts +8 -0
  9. package/dist/__tests__/integration.spec.d.ts.map +1 -0
  10. package/dist/__tests__/integration.spec.js +274 -0
  11. package/dist/__tests__/integration.spec.js.map +1 -0
  12. package/dist/cli.d.ts +6 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +610 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands/consumers.d.ts +37 -0
  17. package/dist/commands/consumers.d.ts.map +1 -0
  18. package/dist/commands/consumers.js +107 -0
  19. package/dist/commands/consumers.js.map +1 -0
  20. package/dist/commands/docs.d.ts +59 -0
  21. package/dist/commands/docs.d.ts.map +1 -0
  22. package/dist/commands/docs.js +262 -0
  23. package/dist/commands/docs.js.map +1 -0
  24. package/dist/commands/docs.spec.d.ts +5 -0
  25. package/dist/commands/docs.spec.d.ts.map +1 -0
  26. package/dist/commands/docs.spec.js +213 -0
  27. package/dist/commands/docs.spec.js.map +1 -0
  28. package/dist/commands/index.d.ts +13 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +13 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/install.d.ts +31 -0
  33. package/dist/commands/install.d.ts.map +1 -0
  34. package/dist/commands/install.js +234 -0
  35. package/dist/commands/install.js.map +1 -0
  36. package/dist/commands/list.d.ts +22 -0
  37. package/dist/commands/list.d.ts.map +1 -0
  38. package/dist/commands/list.js +45 -0
  39. package/dist/commands/list.js.map +1 -0
  40. package/dist/commands/list.spec.d.ts +5 -0
  41. package/dist/commands/list.spec.d.ts.map +1 -0
  42. package/dist/commands/list.spec.js +95 -0
  43. package/dist/commands/list.spec.js.map +1 -0
  44. package/dist/commands/prune.d.ts +27 -0
  45. package/dist/commands/prune.d.ts.map +1 -0
  46. package/dist/commands/prune.js +74 -0
  47. package/dist/commands/prune.js.map +1 -0
  48. package/dist/commands/publish.d.ts +16 -0
  49. package/dist/commands/publish.d.ts.map +1 -0
  50. package/dist/commands/publish.js +225 -0
  51. package/dist/commands/publish.js.map +1 -0
  52. package/dist/commands/publish.spec.d.ts +5 -0
  53. package/dist/commands/publish.spec.d.ts.map +1 -0
  54. package/dist/commands/publish.spec.js +98 -0
  55. package/dist/commands/publish.spec.js.map +1 -0
  56. package/dist/commands/push.d.ts +16 -0
  57. package/dist/commands/push.d.ts.map +1 -0
  58. package/dist/commands/push.js +164 -0
  59. package/dist/commands/push.js.map +1 -0
  60. package/dist/commands/remove.d.ts +24 -0
  61. package/dist/commands/remove.d.ts.map +1 -0
  62. package/dist/commands/remove.js +80 -0
  63. package/dist/commands/remove.js.map +1 -0
  64. package/dist/commands/remove.spec.d.ts +5 -0
  65. package/dist/commands/remove.spec.d.ts.map +1 -0
  66. package/dist/commands/remove.spec.js +87 -0
  67. package/dist/commands/remove.spec.js.map +1 -0
  68. package/dist/commands/resolve.d.ts +20 -0
  69. package/dist/commands/resolve.d.ts.map +1 -0
  70. package/dist/commands/resolve.js +52 -0
  71. package/dist/commands/resolve.js.map +1 -0
  72. package/dist/commands/resolve.spec.d.ts +5 -0
  73. package/dist/commands/resolve.spec.d.ts.map +1 -0
  74. package/dist/commands/resolve.spec.js +87 -0
  75. package/dist/commands/resolve.spec.js.map +1 -0
  76. package/dist/commands/verify.d.ts +32 -0
  77. package/dist/commands/verify.d.ts.map +1 -0
  78. package/dist/commands/verify.js +127 -0
  79. package/dist/commands/verify.js.map +1 -0
  80. package/dist/config.d.ts +22 -0
  81. package/dist/config.d.ts.map +1 -0
  82. package/dist/config.js +70 -0
  83. package/dist/config.js.map +1 -0
  84. package/dist/constants.d.ts +65 -0
  85. package/dist/constants.d.ts.map +1 -0
  86. package/dist/constants.js +116 -0
  87. package/dist/constants.js.map +1 -0
  88. package/dist/constants.spec.d.ts +5 -0
  89. package/dist/constants.spec.d.ts.map +1 -0
  90. package/dist/constants.spec.js +72 -0
  91. package/dist/constants.spec.js.map +1 -0
  92. package/dist/core/index.d.ts +9 -0
  93. package/dist/core/index.d.ts.map +1 -0
  94. package/dist/core/index.js +9 -0
  95. package/dist/core/index.js.map +1 -0
  96. package/dist/core/installations.d.ts +79 -0
  97. package/dist/core/installations.d.ts.map +1 -0
  98. package/dist/core/installations.js +207 -0
  99. package/dist/core/installations.js.map +1 -0
  100. package/dist/core/installations.spec.d.ts +5 -0
  101. package/dist/core/installations.spec.d.ts.map +1 -0
  102. package/dist/core/installations.spec.js +261 -0
  103. package/dist/core/installations.spec.js.map +1 -0
  104. package/dist/core/lock.d.ts +37 -0
  105. package/dist/core/lock.d.ts.map +1 -0
  106. package/dist/core/lock.js +198 -0
  107. package/dist/core/lock.js.map +1 -0
  108. package/dist/core/lock.spec.d.ts +5 -0
  109. package/dist/core/lock.spec.d.ts.map +1 -0
  110. package/dist/core/lock.spec.js +161 -0
  111. package/dist/core/lock.spec.js.map +1 -0
  112. package/dist/core/registry.d.ts +80 -0
  113. package/dist/core/registry.d.ts.map +1 -0
  114. package/dist/core/registry.js +231 -0
  115. package/dist/core/registry.js.map +1 -0
  116. package/dist/core/registry.spec.d.ts +5 -0
  117. package/dist/core/registry.spec.d.ts.map +1 -0
  118. package/dist/core/registry.spec.js +281 -0
  119. package/dist/core/registry.spec.js.map +1 -0
  120. package/dist/core/resolver.d.ts +55 -0
  121. package/dist/core/resolver.d.ts.map +1 -0
  122. package/dist/core/resolver.js +127 -0
  123. package/dist/core/resolver.js.map +1 -0
  124. package/dist/core/resolver.spec.d.ts +5 -0
  125. package/dist/core/resolver.spec.d.ts.map +1 -0
  126. package/dist/core/resolver.spec.js +202 -0
  127. package/dist/core/resolver.spec.js.map +1 -0
  128. package/dist/core/store.d.ts +65 -0
  129. package/dist/core/store.d.ts.map +1 -0
  130. package/dist/core/store.js +245 -0
  131. package/dist/core/store.js.map +1 -0
  132. package/dist/core/store.spec.d.ts +5 -0
  133. package/dist/core/store.spec.d.ts.map +1 -0
  134. package/dist/core/store.spec.js +195 -0
  135. package/dist/core/store.spec.js.map +1 -0
  136. package/dist/formatters/flat.d.ts +41 -0
  137. package/dist/formatters/flat.d.ts.map +1 -0
  138. package/dist/formatters/flat.js +131 -0
  139. package/dist/formatters/flat.js.map +1 -0
  140. package/dist/formatters/flat.spec.d.ts +5 -0
  141. package/dist/formatters/flat.spec.d.ts.map +1 -0
  142. package/dist/formatters/flat.spec.js +130 -0
  143. package/dist/formatters/flat.spec.js.map +1 -0
  144. package/dist/formatters/index.d.ts +6 -0
  145. package/dist/formatters/index.d.ts.map +1 -0
  146. package/dist/formatters/index.js +6 -0
  147. package/dist/formatters/index.js.map +1 -0
  148. package/dist/formatters/tree.d.ts +29 -0
  149. package/dist/formatters/tree.d.ts.map +1 -0
  150. package/dist/formatters/tree.js +256 -0
  151. package/dist/formatters/tree.js.map +1 -0
  152. package/dist/formatters/tree.spec.d.ts +5 -0
  153. package/dist/formatters/tree.spec.d.ts.map +1 -0
  154. package/dist/formatters/tree.spec.js +127 -0
  155. package/dist/formatters/tree.spec.js.map +1 -0
  156. package/dist/index.d.ts +11 -0
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +13 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/installer.d.ts +13 -0
  161. package/dist/installer.d.ts.map +1 -0
  162. package/dist/installer.js +171 -0
  163. package/dist/installer.js.map +1 -0
  164. package/dist/store.d.ts +78 -0
  165. package/dist/store.d.ts.map +1 -0
  166. package/dist/store.js +344 -0
  167. package/dist/store.js.map +1 -0
  168. package/dist/types.d.ts +235 -0
  169. package/dist/types.d.ts.map +1 -0
  170. package/dist/types.js +5 -0
  171. package/dist/types.js.map +1 -0
  172. package/docs/README.md +68 -0
  173. package/docs/inspection/consumers.md +178 -0
  174. package/docs/inspection/list.md +182 -0
  175. package/docs/inspection/resolve.md +172 -0
  176. package/docs/installation/configuration.md +238 -0
  177. package/docs/installation/install.md +184 -0
  178. package/docs/maintenance/prune.md +159 -0
  179. package/docs/maintenance/remove.md +174 -0
  180. package/docs/maintenance/verify.md +174 -0
  181. package/docs/publishing/publish.md +146 -0
  182. package/docs/publishing/push.md +146 -0
  183. package/docs/store/locking.md +118 -0
  184. package/docs/store/namespaces.md +141 -0
  185. package/docs/store/structure.md +163 -0
  186. package/package.json +58 -0
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Tree Formatter - Formateo en árbol para output
3
+ */
4
+ import { DEFAULT_NAMESPACE } from "../constants.js";
5
+ const DEFAULT_OPTIONS = {
6
+ showSignature: true,
7
+ showDate: false,
8
+ showFiles: false,
9
+ };
10
+ /**
11
+ * Group packages by scope
12
+ */
13
+ function groupByScope(packages) {
14
+ const groups = new Map();
15
+ for (const pkg of packages) {
16
+ if (pkg.startsWith("@")) {
17
+ const [scope, name] = pkg.split("/");
18
+ if (!groups.has(scope)) {
19
+ groups.set(scope, []);
20
+ }
21
+ groups.get(scope).push(name);
22
+ }
23
+ else {
24
+ if (!groups.has("")) {
25
+ groups.set("", []);
26
+ }
27
+ groups.get("").push(pkg);
28
+ }
29
+ }
30
+ return groups;
31
+ }
32
+ /**
33
+ * Sort namespaces with global first
34
+ */
35
+ function sortNamespaces(namespaces) {
36
+ return [...namespaces].sort((a, b) => {
37
+ if (a === DEFAULT_NAMESPACE)
38
+ return -1;
39
+ if (b === DEFAULT_NAMESPACE)
40
+ return 1;
41
+ return a.localeCompare(b);
42
+ });
43
+ }
44
+ /**
45
+ * Format registry by namespace (tree view)
46
+ */
47
+ export function formatByNamespaceTree(registry, filter, options = {}) {
48
+ const opts = { ...DEFAULT_OPTIONS, ...options };
49
+ const lines = ["📦 DevLink Store", ""];
50
+ const namespaces = sortNamespaces(Object.keys(registry.namespaces));
51
+ const filteredNs = filter ? namespaces.filter(ns => filter.includes(ns)) : namespaces;
52
+ for (let nsIdx = 0; nsIdx < filteredNs.length; nsIdx++) {
53
+ const ns = filteredNs[nsIdx];
54
+ const nsEntry = registry.namespaces[ns];
55
+ const isLastNs = nsIdx === filteredNs.length - 1;
56
+ const nsPrefix = isLastNs ? "└── " : "├── ";
57
+ const childPrefix = isLastNs ? " " : "│ ";
58
+ lines.push(`${nsPrefix}${ns}/`);
59
+ const packages = Object.keys(nsEntry.packages).sort();
60
+ const byScope = groupByScope(packages);
61
+ const scopes = Array.from(byScope.keys()).sort();
62
+ for (let scopeIdx = 0; scopeIdx < scopes.length; scopeIdx++) {
63
+ const scope = scopes[scopeIdx];
64
+ const pkgNames = byScope.get(scope).sort();
65
+ const isLastScope = scopeIdx === scopes.length - 1;
66
+ if (scope) {
67
+ // Scoped packages
68
+ const scopePrefix = isLastScope ? "└── " : "├── ";
69
+ const scopeChildPrefix = isLastScope ? " " : "│ ";
70
+ lines.push(`${childPrefix}${scopePrefix}${scope}/`);
71
+ for (let pkgIdx = 0; pkgIdx < pkgNames.length; pkgIdx++) {
72
+ const pkgName = pkgNames[pkgIdx];
73
+ const fullPkgName = `${scope}/${pkgName}`;
74
+ const pkgEntry = nsEntry.packages[fullPkgName];
75
+ const versions = Object.keys(pkgEntry.versions).sort();
76
+ const isLastPkg = pkgIdx === pkgNames.length - 1;
77
+ const pkgPrefix = isLastPkg ? "└── " : "├── ";
78
+ const versionPrefix = isLastPkg ? " " : "│ ";
79
+ lines.push(`${childPrefix}${scopeChildPrefix}${pkgPrefix}${pkgName}/`);
80
+ for (let verIdx = 0; verIdx < versions.length; verIdx++) {
81
+ const version = versions[verIdx];
82
+ const verEntry = pkgEntry.versions[version];
83
+ const isLastVer = verIdx === versions.length - 1;
84
+ const verPfx = isLastVer ? "└── " : "├── ";
85
+ let verLine = `${childPrefix}${scopeChildPrefix}${versionPrefix}${verPfx}${version}`;
86
+ if (opts.showSignature) {
87
+ verLine += ` (${verEntry.signature.slice(0, 8)})`;
88
+ }
89
+ lines.push(verLine);
90
+ }
91
+ }
92
+ }
93
+ else {
94
+ // Non-scoped packages
95
+ for (let pkgIdx = 0; pkgIdx < pkgNames.length; pkgIdx++) {
96
+ const pkgName = pkgNames[pkgIdx];
97
+ const pkgEntry = nsEntry.packages[pkgName];
98
+ const versions = Object.keys(pkgEntry.versions).sort();
99
+ const isLastPkg = pkgIdx === pkgNames.length - 1 && isLastScope;
100
+ const pkgPrefix = isLastPkg ? "└── " : "├── ";
101
+ const versionPrefix = isLastPkg ? " " : "│ ";
102
+ lines.push(`${childPrefix}${pkgPrefix}${pkgName}/`);
103
+ for (let verIdx = 0; verIdx < versions.length; verIdx++) {
104
+ const version = versions[verIdx];
105
+ const verEntry = pkgEntry.versions[version];
106
+ const isLastVer = verIdx === versions.length - 1;
107
+ const verPfx = isLastVer ? "└── " : "├── ";
108
+ let verLine = `${childPrefix}${versionPrefix}${verPfx}${version}`;
109
+ if (opts.showSignature) {
110
+ verLine += ` (${verEntry.signature.slice(0, 8)})`;
111
+ }
112
+ lines.push(verLine);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ return lines.join("\n");
119
+ }
120
+ /**
121
+ * Invert registry structure: package → namespace → versions
122
+ */
123
+ function invertRegistry(registry) {
124
+ const result = new Map();
125
+ for (const [ns, nsEntry] of Object.entries(registry.namespaces)) {
126
+ for (const [pkgName, pkgEntry] of Object.entries(nsEntry.packages)) {
127
+ if (!result.has(pkgName)) {
128
+ result.set(pkgName, new Map());
129
+ }
130
+ const versions = Object.keys(pkgEntry.versions).sort();
131
+ result.get(pkgName).set(ns, versions);
132
+ }
133
+ }
134
+ return result;
135
+ }
136
+ /**
137
+ * Format registry by package (tree view)
138
+ */
139
+ export function formatByPackageTree(registry, filter, options = {}) {
140
+ const opts = { ...DEFAULT_OPTIONS, ...options };
141
+ const lines = ["📦 DevLink Store (by package)", ""];
142
+ const byPackage = invertRegistry(registry);
143
+ let packages = Array.from(byPackage.keys()).sort();
144
+ // Apply filter
145
+ if (filter && filter.length > 0) {
146
+ packages = packages.filter(pkg => {
147
+ for (const f of filter) {
148
+ if (f.startsWith("@") && !f.includes("/")) {
149
+ // Scope filter
150
+ if (pkg.startsWith(f + "/") || pkg === f)
151
+ return true;
152
+ }
153
+ else {
154
+ // Exact match
155
+ if (pkg === f)
156
+ return true;
157
+ }
158
+ }
159
+ return false;
160
+ });
161
+ }
162
+ const byScope = groupByScope(packages);
163
+ const scopes = Array.from(byScope.keys()).sort();
164
+ for (let scopeIdx = 0; scopeIdx < scopes.length; scopeIdx++) {
165
+ const scope = scopes[scopeIdx];
166
+ const pkgNames = byScope.get(scope).sort();
167
+ const isLastScope = scopeIdx === scopes.length - 1;
168
+ if (scope) {
169
+ const scopePrefix = isLastScope ? "└── " : "├── ";
170
+ const scopeChildPrefix = isLastScope ? " " : "│ ";
171
+ lines.push(`${scopePrefix}${scope}/`);
172
+ for (let pkgIdx = 0; pkgIdx < pkgNames.length; pkgIdx++) {
173
+ const pkgName = pkgNames[pkgIdx];
174
+ const fullPkgName = `${scope}/${pkgName}`;
175
+ const namespaces = byPackage.get(fullPkgName);
176
+ const isLastPkg = pkgIdx === pkgNames.length - 1;
177
+ const pkgPrefix = isLastPkg ? "└── " : "├── ";
178
+ const nsChildPrefix = isLastPkg ? " " : "│ ";
179
+ lines.push(`${scopeChildPrefix}${pkgPrefix}${pkgName}/`);
180
+ const sortedNs = sortNamespaces(Array.from(namespaces.keys()));
181
+ for (let nsIdx = 0; nsIdx < sortedNs.length; nsIdx++) {
182
+ const ns = sortedNs[nsIdx];
183
+ const versions = namespaces.get(ns);
184
+ const isLastNs = nsIdx === sortedNs.length - 1;
185
+ const nsPrefix = isLastNs ? "└── " : "├── ";
186
+ const verChildPrefix = isLastNs ? " " : "│ ";
187
+ lines.push(`${scopeChildPrefix}${nsChildPrefix}${nsPrefix}${ns}/`);
188
+ for (let verIdx = 0; verIdx < versions.length; verIdx++) {
189
+ const version = versions[verIdx];
190
+ const isLastVer = verIdx === versions.length - 1;
191
+ const verPrefix = isLastVer ? "└── " : "├── ";
192
+ const verEntry = registry.namespaces[ns].packages[fullPkgName].versions[version];
193
+ let verLine = `${scopeChildPrefix}${nsChildPrefix}${verChildPrefix}${verPrefix}${version}`;
194
+ if (opts.showSignature) {
195
+ verLine += ` (${verEntry.signature.slice(0, 8)})`;
196
+ }
197
+ lines.push(verLine);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ else {
203
+ // Non-scoped packages
204
+ for (let pkgIdx = 0; pkgIdx < pkgNames.length; pkgIdx++) {
205
+ const pkgName = pkgNames[pkgIdx];
206
+ const namespaces = byPackage.get(pkgName);
207
+ const isLastPkg = pkgIdx === pkgNames.length - 1 && isLastScope;
208
+ const pkgPrefix = isLastPkg ? "└── " : "├── ";
209
+ const nsChildPrefix = isLastPkg ? " " : "│ ";
210
+ lines.push(`${pkgPrefix}${pkgName}/`);
211
+ const sortedNs = sortNamespaces(Array.from(namespaces.keys()));
212
+ for (let nsIdx = 0; nsIdx < sortedNs.length; nsIdx++) {
213
+ const ns = sortedNs[nsIdx];
214
+ const versions = namespaces.get(ns);
215
+ const isLastNs = nsIdx === sortedNs.length - 1;
216
+ const nsPrefix = isLastNs ? "└── " : "├── ";
217
+ const verChildPrefix = isLastNs ? " " : "│ ";
218
+ lines.push(`${nsChildPrefix}${nsPrefix}${ns}/`);
219
+ for (let verIdx = 0; verIdx < versions.length; verIdx++) {
220
+ const version = versions[verIdx];
221
+ const isLastVer = verIdx === versions.length - 1;
222
+ const verPrefix = isLastVer ? "└── " : "├── ";
223
+ const verEntry = registry.namespaces[ns].packages[pkgName].versions[version];
224
+ let verLine = `${nsChildPrefix}${verChildPrefix}${verPrefix}${version}`;
225
+ if (opts.showSignature) {
226
+ verLine += ` (${verEntry.signature.slice(0, 8)})`;
227
+ }
228
+ lines.push(verLine);
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }
234
+ return lines.join("\n");
235
+ }
236
+ /**
237
+ * Format consumers tree
238
+ */
239
+ export function formatConsumersTree(consumers) {
240
+ const lines = ["👥 Consumers", ""];
241
+ for (let i = 0; i < consumers.length; i++) {
242
+ const consumer = consumers[i];
243
+ const isLast = i === consumers.length - 1;
244
+ const prefix = isLast ? "└── " : "├── ";
245
+ const childPrefix = isLast ? " " : "│ ";
246
+ lines.push(`${prefix}${consumer.projectPath}`);
247
+ for (let j = 0; j < consumer.packages.length; j++) {
248
+ const pkg = consumer.packages[j];
249
+ const isLastPkg = j === consumer.packages.length - 1;
250
+ const pkgPrefix = isLastPkg ? "└── " : "├── ";
251
+ lines.push(`${childPrefix}${pkgPrefix}${pkg.name}@${pkg.version} (${pkg.namespace})`);
252
+ }
253
+ }
254
+ return lines.join("\n");
255
+ }
256
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/formatters/tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tree Formatter - Unit tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=tree.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.spec.d.ts","sourceRoot":"","sources":["../../src/formatters/tree.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Tree Formatter - Unit tests
3
+ */
4
+ import { describe, it, expect, vi } from "vitest";
5
+ import { formatByNamespaceTree, formatByPackageTree, formatConsumersTree } from "./tree.js";
6
+ vi.mock("../constants.js", () => ({
7
+ DEFAULT_NAMESPACE: "global",
8
+ }));
9
+ const createTestRegistry = () => ({
10
+ version: "1.0.0",
11
+ namespaces: {
12
+ global: {
13
+ created: "2026-02-12T10:00:00Z",
14
+ packages: {
15
+ "@webforgeai/core": {
16
+ versions: {
17
+ "1.0.0": { signature: "abc12345", published: "2026-02-12T10:00:00Z", files: 10 },
18
+ "2.0.0": { signature: "def67890", published: "2026-02-12T11:00:00Z", files: 12 },
19
+ },
20
+ },
21
+ "simple-pkg": {
22
+ versions: {
23
+ "1.0.0": { signature: "ghi11111", published: "2026-02-12T10:00:00Z", files: 5 },
24
+ },
25
+ },
26
+ },
27
+ },
28
+ feature: {
29
+ created: "2026-02-12T12:00:00Z",
30
+ packages: {
31
+ "@webforgeai/core": {
32
+ versions: {
33
+ "1.0.0-beta": { signature: "jkl22222", published: "2026-02-12T12:00:00Z", files: 11 },
34
+ },
35
+ },
36
+ },
37
+ },
38
+ },
39
+ });
40
+ describe("Tree Formatter", () => {
41
+ describe("formatByNamespaceTree", () => {
42
+ it("should format registry by namespace", () => {
43
+ const registry = createTestRegistry();
44
+ const output = formatByNamespaceTree(registry);
45
+ expect(output).toContain("📦 DevLink Store");
46
+ expect(output).toContain("global/");
47
+ expect(output).toContain("feature/");
48
+ expect(output).toContain("@webforgeai/");
49
+ expect(output).toContain("core/");
50
+ expect(output).toContain("1.0.0");
51
+ expect(output).toContain("2.0.0");
52
+ });
53
+ it("should show global first", () => {
54
+ const registry = createTestRegistry();
55
+ const output = formatByNamespaceTree(registry);
56
+ const globalIndex = output.indexOf("global/");
57
+ const featureIndex = output.indexOf("feature/");
58
+ expect(globalIndex).toBeLessThan(featureIndex);
59
+ });
60
+ it("should filter by namespace", () => {
61
+ const registry = createTestRegistry();
62
+ const output = formatByNamespaceTree(registry, ["feature"]);
63
+ expect(output).toContain("feature/");
64
+ expect(output).not.toContain("global/");
65
+ });
66
+ it("should show signature by default", () => {
67
+ const registry = createTestRegistry();
68
+ const output = formatByNamespaceTree(registry);
69
+ expect(output).toContain("(abc12345)");
70
+ });
71
+ it("should hide signature when disabled", () => {
72
+ const registry = createTestRegistry();
73
+ const output = formatByNamespaceTree(registry, undefined, { showSignature: false });
74
+ expect(output).not.toContain("(abc12345)");
75
+ });
76
+ });
77
+ describe("formatByPackageTree", () => {
78
+ it("should format registry by package", () => {
79
+ const registry = createTestRegistry();
80
+ const output = formatByPackageTree(registry);
81
+ expect(output).toContain("📦 DevLink Store (by package)");
82
+ expect(output).toContain("@webforgeai/");
83
+ expect(output).toContain("core/");
84
+ expect(output).toContain("global/");
85
+ expect(output).toContain("feature/");
86
+ });
87
+ it("should filter by package", () => {
88
+ const registry = createTestRegistry();
89
+ const output = formatByPackageTree(registry, ["simple-pkg"]);
90
+ expect(output).toContain("simple-pkg/");
91
+ expect(output).not.toContain("@webforgeai/");
92
+ });
93
+ it("should filter by scope", () => {
94
+ const registry = createTestRegistry();
95
+ const output = formatByPackageTree(registry, ["@webforgeai"]);
96
+ expect(output).toContain("@webforgeai/");
97
+ expect(output).not.toContain("simple-pkg");
98
+ });
99
+ });
100
+ describe("formatConsumersTree", () => {
101
+ it("should format consumers", () => {
102
+ const consumers = [
103
+ {
104
+ projectPath: "/project/a",
105
+ packages: [
106
+ { name: "@webforgeai/core", version: "1.0.0", namespace: "global" },
107
+ ],
108
+ },
109
+ {
110
+ projectPath: "/project/b",
111
+ packages: [
112
+ { name: "@webforgeai/core", version: "2.0.0", namespace: "feature" },
113
+ { name: "simple-pkg", version: "1.0.0", namespace: "global" },
114
+ ],
115
+ },
116
+ ];
117
+ const output = formatConsumersTree(consumers);
118
+ expect(output).toContain("👥 Consumers");
119
+ expect(output).toContain("/project/a");
120
+ expect(output).toContain("/project/b");
121
+ expect(output).toContain("@webforgeai/core@1.0.0");
122
+ expect(output).toContain("(global)");
123
+ expect(output).toContain("(feature)");
124
+ });
125
+ });
126
+ });
127
+ //# sourceMappingURL=tree.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.spec.js","sourceRoot":"","sources":["../../src/formatters/tree.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @unlimitechcloud/devlink
3
+ *
4
+ * Local package development and linking tool
5
+ * with declarative configuration and namespace support
6
+ */
7
+ export type { DevLinkConfig, ModeConfig, ModeFactory, FactoryContext, PackageVersions, ResolvedPackage, PackageManifest, StoredPackage, Lockfile, } from "./types.js";
8
+ export { loadConfig, createContext, detectMode } from "./config.js";
9
+ export { publishPackage, linkPackage, removePackages, getStoreMainDir, getStorePackagesDir, getPackageStoreDir, getPackageSignature, readPackageManifest, writePackageManifest, readLockfile, writeLockfile, } from "./store.js";
10
+ export { install, resolvePackages } from "./installer.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,aAAa,EACb,QAAQ,GACT,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @unlimitechcloud/devlink
3
+ *
4
+ * Local package development and linking tool
5
+ * with declarative configuration and namespace support
6
+ */
7
+ // Config
8
+ export { loadConfig, createContext, detectMode } from "./config.js";
9
+ // Store
10
+ export { publishPackage, linkPackage, removePackages, getStoreMainDir, getStorePackagesDir, getPackageStoreDir, getPackageSignature, readPackageManifest, writePackageManifest, readLockfile, writeLockfile, } from "./store.js";
11
+ // Installer
12
+ export { install, resolvePackages } from "./installer.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpE,QAAQ;AACR,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Installer - Orquesta la instalación de paquetes
3
+ */
4
+ import type { DevLinkConfig, ModeConfig, ResolvedPackage, FactoryContext } from "./types.js";
5
+ /**
6
+ * Resuelve los paquetes para el modo actual
7
+ */
8
+ export declare function resolvePackages(config: DevLinkConfig, mode: "dev" | "prod", modeConfig: ModeConfig): ResolvedPackage[];
9
+ /**
10
+ * Proceso principal de instalación
11
+ */
12
+ export declare function install(config: DevLinkConfig, ctx: FactoryContext, mode: "dev" | "prod", modeConfig: ModeConfig): Promise<boolean>;
13
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,eAAe,EACf,cAAc,EACf,MAAM,YAAY,CAAC;AAcpB;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,KAAK,GAAG,MAAM,EACpB,UAAU,EAAE,UAAU,GACrB,eAAe,EAAE,CAenB;AAyFD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,KAAK,GAAG,MAAM,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,OAAO,CAAC,CAgFlB"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Installer - Orquesta la instalación de paquetes
3
+ */
4
+ import { exec } from "child_process";
5
+ import { promisify } from "util";
6
+ import { linkPackage, readLockfile, writeLockfile, removePackages, getPackageSignature } from "./store.js";
7
+ const execAsync = promisify(exec);
8
+ // Colores simples sin dependencia externa
9
+ const colors = {
10
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
11
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
12
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
13
+ cyan: (s) => `\x1b[36m${s}\x1b[0m`,
14
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
15
+ };
16
+ /**
17
+ * Resuelve los paquetes para el modo actual
18
+ */
19
+ export function resolvePackages(config, mode, modeConfig) {
20
+ const packages = [];
21
+ for (const [name, versions] of Object.entries(config.packages)) {
22
+ const version = versions[mode];
23
+ if (!version)
24
+ continue;
25
+ packages.push({
26
+ name,
27
+ version,
28
+ qname: modeConfig.manager === "store" ? name : `${name}@${version}`,
29
+ });
30
+ }
31
+ return packages;
32
+ }
33
+ /**
34
+ * Ejecuta un comando bash
35
+ */
36
+ async function runCommand(command, cwd) {
37
+ try {
38
+ return await execAsync(command, { cwd });
39
+ }
40
+ catch (error) {
41
+ return { stdout: "", stderr: error.stderr || error.message };
42
+ }
43
+ }
44
+ /**
45
+ * Limpia paquetes existentes
46
+ */
47
+ async function cleanup(packages, workingDir) {
48
+ console.log(`\n🧹 ${colors.cyan("Cleaning up existing packages...")}`);
49
+ // Remover links existentes
50
+ await removePackages({ all: true, workingDir });
51
+ // Desinstalar paquetes de npm
52
+ if (packages.length > 0) {
53
+ const names = packages.map((p) => p.name).join(" ");
54
+ try {
55
+ await runCommand(`npm uninstall --force ${names}`, workingDir);
56
+ console.log(" ✓ NPM packages uninstalled");
57
+ }
58
+ catch {
59
+ console.log(" ⚠ No NPM packages to uninstall");
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Instala un paquete desde el store local
65
+ */
66
+ async function installFromStore(pkg, modeConfig, workingDir) {
67
+ const success = await linkPackage({
68
+ packageName: pkg.name,
69
+ version: pkg.version,
70
+ workingDir,
71
+ storeFolder: modeConfig.storeFolder,
72
+ replace: true,
73
+ });
74
+ let signature = "";
75
+ if (success) {
76
+ signature = await getPackageSignature(pkg.name, pkg.version, modeConfig.storeFolder);
77
+ console.log(` ✓ ${colors.green(pkg.name)}@${pkg.version}`);
78
+ }
79
+ else {
80
+ console.log(` ❌ ${colors.red(pkg.name)}: not found in store`);
81
+ }
82
+ return { success, signature };
83
+ }
84
+ /**
85
+ * Instala un paquete desde npm
86
+ */
87
+ async function installFromNpm(pkg, modeConfig, workingDir) {
88
+ const args = modeConfig.args?.join(" ") || "";
89
+ const command = `npm install ${pkg.qname} ${args}`;
90
+ const { stdout, stderr } = await runCommand(command, workingDir);
91
+ if (stderr && !stdout && stderr.includes("error")) {
92
+ console.log(` ❌ ${colors.red(pkg.name)}: ${stderr.split("\n")[0]}`);
93
+ return { success: false, signature: "" };
94
+ }
95
+ console.log(` ✓ ${colors.green(pkg.name)}@${pkg.version}`);
96
+ return { success: true, signature: `npm:${pkg.version}` };
97
+ }
98
+ /**
99
+ * Proceso principal de instalación
100
+ */
101
+ export async function install(config, ctx, mode, modeConfig) {
102
+ const packages = resolvePackages(config, mode, modeConfig);
103
+ const workingDir = ctx.cwd;
104
+ console.log(`\n📦 ${colors.bold(colors.green("DevLink"))} v1.0.0`);
105
+ console.log(` Mode: ${colors.cyan(mode)}`);
106
+ console.log(` Manager: ${colors.cyan(modeConfig.manager)}`);
107
+ console.log(` Packages: ${packages.length}`);
108
+ if (packages.length === 0) {
109
+ console.log(`\n⚠️ ${colors.yellow("No packages to install for this mode")}`);
110
+ return true;
111
+ }
112
+ // Listar paquetes
113
+ console.log(`\n📋 ${colors.cyan("Packages to install:")}`);
114
+ for (const pkg of packages) {
115
+ console.log(` - ${pkg.name}@${pkg.version}`);
116
+ }
117
+ // Cleanup
118
+ await cleanup(packages, workingDir);
119
+ // Hook: beforeAll
120
+ if (modeConfig.beforeAll) {
121
+ console.log(`\n🔧 ${colors.cyan("Running beforeAll hook...")}`);
122
+ await modeConfig.beforeAll();
123
+ }
124
+ // Instalar paquetes
125
+ console.log(`\n📥 ${colors.cyan("Installing packages...")}`);
126
+ let allSuccess = true;
127
+ const lockfile = await readLockfile(workingDir);
128
+ for (const pkg of packages) {
129
+ // Hook: beforeEach
130
+ if (modeConfig.beforeEach) {
131
+ await modeConfig.beforeEach(pkg);
132
+ }
133
+ let result;
134
+ if (modeConfig.manager === "store") {
135
+ result = await installFromStore(pkg, modeConfig, workingDir);
136
+ }
137
+ else {
138
+ result = await installFromNpm(pkg, modeConfig, workingDir);
139
+ }
140
+ if (result.success) {
141
+ lockfile.packages[pkg.name] = {
142
+ version: pkg.version,
143
+ signature: result.signature,
144
+ };
145
+ }
146
+ else {
147
+ allSuccess = false;
148
+ }
149
+ // Hook: afterEach
150
+ if (modeConfig.afterEach) {
151
+ await modeConfig.afterEach(pkg);
152
+ }
153
+ }
154
+ // Guardar lockfile
155
+ await writeLockfile(workingDir, lockfile);
156
+ // Hook: afterAll
157
+ if (modeConfig.afterAll) {
158
+ console.log(`\n🔧 ${colors.cyan("Running afterAll hook...")}`);
159
+ await modeConfig.afterAll();
160
+ }
161
+ // Resumen
162
+ console.log(`\n${"─".repeat(50)}`);
163
+ if (allSuccess) {
164
+ console.log(`✅ ${colors.green("All packages installed successfully!")}`);
165
+ }
166
+ else {
167
+ console.log(`❌ ${colors.red("Some packages failed to install")}`);
168
+ }
169
+ return allSuccess;
170
+ }
171
+ //# sourceMappingURL=installer.js.map