@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,80 @@
1
+ /**
2
+ * Remove Command - Eliminar paquetes del store
3
+ */
4
+ import { withStoreLock } from "../core/lock.js";
5
+ import { readRegistry, writeRegistry, removePackageFromRegistry, removeNamespaceFromRegistry, getPackageFromRegistry, namespaceExistsInRegistry, } from "../core/registry.js";
6
+ import { deletePackageVersion, deletePackage, deleteNamespace, } from "../core/store.js";
7
+ import { parsePackageSpec } from "../core/resolver.js";
8
+ import { DEFAULT_NAMESPACE } from "../constants.js";
9
+ /**
10
+ * Remove a package version, package, or namespace
11
+ */
12
+ export async function removeFromStore(target, options = {}) {
13
+ const namespace = options.namespace || DEFAULT_NAMESPACE;
14
+ return withStoreLock(async () => {
15
+ const registry = await readRegistry();
16
+ // Check if target is a namespace
17
+ if (!target.includes("@") && !target.includes("/")) {
18
+ // Could be a namespace or a simple package name
19
+ if (namespaceExistsInRegistry(registry, target) && !options.namespace) {
20
+ // It's a namespace - remove it
21
+ if (target === DEFAULT_NAMESPACE) {
22
+ throw new Error(`Cannot delete reserved namespace '${DEFAULT_NAMESPACE}'`);
23
+ }
24
+ removeNamespaceFromRegistry(registry, target);
25
+ await deleteNamespace(target);
26
+ await writeRegistry(registry);
27
+ return { type: "namespace", name: target };
28
+ }
29
+ }
30
+ // Parse as package spec
31
+ const parsed = parsePackageSpec(target);
32
+ if (parsed) {
33
+ // Remove specific version
34
+ const { name, version } = parsed;
35
+ const pkgEntry = getPackageFromRegistry(registry, namespace, name);
36
+ if (!pkgEntry || !pkgEntry.versions[version]) {
37
+ throw new Error(`Package ${name}@${version} not found in namespace '${namespace}'`);
38
+ }
39
+ removePackageFromRegistry(registry, namespace, name, version);
40
+ await deletePackageVersion(namespace, name, version);
41
+ await writeRegistry(registry);
42
+ return { type: "version", name, version, namespace };
43
+ }
44
+ // Remove entire package
45
+ const pkgEntry = getPackageFromRegistry(registry, namespace, target);
46
+ if (!pkgEntry) {
47
+ throw new Error(`Package ${target} not found in namespace '${namespace}'`);
48
+ }
49
+ removePackageFromRegistry(registry, namespace, target);
50
+ await deletePackage(namespace, target);
51
+ await writeRegistry(registry);
52
+ return { type: "package", name: target, namespace };
53
+ });
54
+ }
55
+ /**
56
+ * CLI handler for remove command
57
+ */
58
+ export async function handleRemove(args) {
59
+ try {
60
+ const result = await removeFromStore(args.target, {
61
+ namespace: args.namespace,
62
+ });
63
+ switch (result.type) {
64
+ case "namespace":
65
+ console.log(`✓ Removed namespace '${result.name}'`);
66
+ break;
67
+ case "package":
68
+ console.log(`✓ Removed package '${result.name}' from namespace '${result.namespace}'`);
69
+ break;
70
+ case "version":
71
+ console.log(`✓ Removed ${result.name}@${result.version} from namespace '${result.namespace}'`);
72
+ break;
73
+ }
74
+ }
75
+ catch (error) {
76
+ console.error(`✗ Remove failed: ${error.message}`);
77
+ process.exit(1);
78
+ }
79
+ }
80
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Remove Command - Unit tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=remove.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.spec.d.ts","sourceRoot":"","sources":["../../src/commands/remove.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Remove Command - Unit tests
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
5
+ import fs from "fs/promises";
6
+ import path from "path";
7
+ import os from "os";
8
+ import { removeFromStore } from "./remove.js";
9
+ import { writeRegistry, createEmptyRegistry, addPackageToRegistry, readRegistry, } from "../core/registry.js";
10
+ import { ensureNamespace } from "../core/store.js";
11
+ const TEST_STORE_PATH = path.join(os.tmpdir(), "devlink-remove-test-" + Date.now());
12
+ vi.mock("../constants.js", async () => {
13
+ const actual = await vi.importActual("../constants.js");
14
+ return {
15
+ ...actual,
16
+ getStorePath: () => TEST_STORE_PATH,
17
+ getNamespacesPath: () => path.join(TEST_STORE_PATH, "namespaces"),
18
+ getNamespacePath: (ns) => path.join(TEST_STORE_PATH, "namespaces", ns),
19
+ getPackagePath: (ns, pkg, ver) => path.join(TEST_STORE_PATH, "namespaces", ns, pkg, ver),
20
+ getRegistryPath: () => path.join(TEST_STORE_PATH, "registry.json"),
21
+ getLockPath: () => path.join(TEST_STORE_PATH, ".lock"),
22
+ };
23
+ });
24
+ describe("Remove Command", () => {
25
+ beforeEach(async () => {
26
+ await fs.mkdir(TEST_STORE_PATH, { recursive: true });
27
+ const registry = createEmptyRegistry();
28
+ addPackageToRegistry(registry, "global", "@test/pkg", "1.0.0", {
29
+ signature: "abc12345",
30
+ published: "2026-02-12T10:00:00Z",
31
+ files: 5,
32
+ });
33
+ addPackageToRegistry(registry, "global", "@test/pkg", "2.0.0", {
34
+ signature: "def67890",
35
+ published: "2026-02-12T11:00:00Z",
36
+ files: 5,
37
+ });
38
+ addPackageToRegistry(registry, "feature", "@test/pkg", "1.0.0-beta", {
39
+ signature: "ghi11111",
40
+ published: "2026-02-12T12:00:00Z",
41
+ files: 5,
42
+ });
43
+ await writeRegistry(registry);
44
+ await ensureNamespace("global");
45
+ await ensureNamespace("feature");
46
+ const v1Path = path.join(TEST_STORE_PATH, "namespaces/global/@test/pkg/1.0.0");
47
+ const v2Path = path.join(TEST_STORE_PATH, "namespaces/global/@test/pkg/2.0.0");
48
+ const betaPath = path.join(TEST_STORE_PATH, "namespaces/feature/@test/pkg/1.0.0-beta");
49
+ await fs.mkdir(v1Path, { recursive: true });
50
+ await fs.mkdir(v2Path, { recursive: true });
51
+ await fs.mkdir(betaPath, { recursive: true });
52
+ await fs.writeFile(path.join(v1Path, "package.json"), "{}");
53
+ await fs.writeFile(path.join(v2Path, "package.json"), "{}");
54
+ await fs.writeFile(path.join(betaPath, "package.json"), "{}");
55
+ });
56
+ afterEach(async () => {
57
+ await fs.rm(TEST_STORE_PATH, { recursive: true, force: true });
58
+ });
59
+ it("should remove specific version", async () => {
60
+ const result = await removeFromStore("@test/pkg@1.0.0", { namespace: "global" });
61
+ expect(result.type).toBe("version");
62
+ expect(result.name).toBe("@test/pkg");
63
+ expect(result.version).toBe("1.0.0");
64
+ const registry = await readRegistry();
65
+ expect(registry.namespaces.global.packages["@test/pkg"].versions["1.0.0"]).toBeUndefined();
66
+ expect(registry.namespaces.global.packages["@test/pkg"].versions["2.0.0"]).toBeDefined();
67
+ });
68
+ it("should remove entire package", async () => {
69
+ const result = await removeFromStore("@test/pkg", { namespace: "global" });
70
+ expect(result.type).toBe("package");
71
+ const registry = await readRegistry();
72
+ expect(registry.namespaces.global.packages["@test/pkg"]).toBeUndefined();
73
+ });
74
+ it("should remove namespace", async () => {
75
+ const result = await removeFromStore("feature");
76
+ expect(result.type).toBe("namespace");
77
+ const registry = await readRegistry();
78
+ expect(registry.namespaces.feature).toBeUndefined();
79
+ });
80
+ it("should throw when removing global namespace", async () => {
81
+ await expect(removeFromStore("global")).rejects.toThrow("Cannot delete reserved namespace 'global'");
82
+ });
83
+ it("should throw for non-existent package", async () => {
84
+ await expect(removeFromStore("nonexistent@1.0.0", { namespace: "global" })).rejects.toThrow("not found");
85
+ });
86
+ });
87
+ //# sourceMappingURL=remove.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.spec.js","sourceRoot":"","sources":["../../src/commands/remove.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Resolve Command - Resolver paquetes en namespaces
3
+ */
4
+ export interface ResolveOptions {
5
+ namespaces?: string[];
6
+ flat?: boolean;
7
+ }
8
+ /**
9
+ * Resolve packages in namespaces
10
+ */
11
+ export declare function resolvePackagesCommand(specs: string[], options?: ResolveOptions): Promise<string>;
12
+ /**
13
+ * CLI handler for resolve command
14
+ */
15
+ export declare function handleResolve(args: {
16
+ specs: string[];
17
+ namespaces?: string[];
18
+ flat?: boolean;
19
+ }): Promise<void>;
20
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Resolve Command - Resolver paquetes en namespaces
3
+ */
4
+ import { readRegistry } from "../core/registry.js";
5
+ import { resolvePackages, parsePackageSpecs, formatResolutionResults, } from "../core/resolver.js";
6
+ import { formatResolutionFlat } from "../formatters/flat.js";
7
+ import { DEFAULT_NAMESPACE } from "../constants.js";
8
+ /**
9
+ * Resolve packages in namespaces
10
+ */
11
+ export async function resolvePackagesCommand(specs, options = {}) {
12
+ const registry = await readRegistry();
13
+ const packages = parsePackageSpecs(specs);
14
+ if (packages.length === 0) {
15
+ throw new Error("No valid package specifications provided. Use format: pkg@version");
16
+ }
17
+ const namespaces = options.namespaces && options.namespaces.length > 0
18
+ ? options.namespaces
19
+ : [DEFAULT_NAMESPACE];
20
+ const results = resolvePackages(packages, namespaces, registry);
21
+ if (options.flat) {
22
+ return formatResolutionFlat(results);
23
+ }
24
+ return formatResolutionResults(results);
25
+ }
26
+ /**
27
+ * CLI handler for resolve command
28
+ */
29
+ export async function handleResolve(args) {
30
+ try {
31
+ const output = await resolvePackagesCommand(args.specs, {
32
+ namespaces: args.namespaces,
33
+ flat: args.flat,
34
+ });
35
+ console.log(output);
36
+ // Exit with error if any package not found
37
+ const registry = await readRegistry();
38
+ const packages = parsePackageSpecs(args.specs);
39
+ const namespaces = args.namespaces && args.namespaces.length > 0
40
+ ? args.namespaces
41
+ : [DEFAULT_NAMESPACE];
42
+ const results = resolvePackages(packages, namespaces, registry);
43
+ if (results.some(r => !r.found)) {
44
+ process.exit(2);
45
+ }
46
+ }
47
+ catch (error) {
48
+ console.error(`✗ Resolve failed: ${error.message}`);
49
+ process.exit(1);
50
+ }
51
+ }
52
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAOpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAe,EACf,UAA0B,EAAE;IAE5B,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;QACpE,CAAC,CAAC,OAAO,CAAC,UAAU;QACpB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAExB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEhE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAInC;IACC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,KAAK,EAAE;YACtD,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAC9D,CAAC,CAAC,IAAI,CAAC,UAAU;YACjB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACxB,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEhE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Resolve Command - Integration tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=resolve.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.spec.d.ts","sourceRoot":"","sources":["../../src/commands/resolve.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Resolve Command - Integration tests
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
5
+ import fs from "fs/promises";
6
+ import path from "path";
7
+ import os from "os";
8
+ import { resolvePackagesCommand } from "./resolve.js";
9
+ import { writeRegistry, createEmptyRegistry, addPackageToRegistry } from "../core/registry.js";
10
+ const TEST_STORE_PATH = path.join(os.tmpdir(), "devlink-resolve-test-" + Date.now());
11
+ vi.mock("../constants.js", async () => {
12
+ const actual = await vi.importActual("../constants.js");
13
+ return {
14
+ ...actual,
15
+ getStorePath: () => TEST_STORE_PATH,
16
+ getNamespacesPath: () => path.join(TEST_STORE_PATH, "namespaces"),
17
+ getNamespacePath: (ns) => path.join(TEST_STORE_PATH, "namespaces", ns),
18
+ getPackagePath: (ns, pkg, ver) => path.join(TEST_STORE_PATH, "namespaces", ns, pkg, ver),
19
+ getRegistryPath: () => path.join(TEST_STORE_PATH, "registry.json"),
20
+ };
21
+ });
22
+ describe("Resolve Command", () => {
23
+ beforeEach(async () => {
24
+ await fs.mkdir(TEST_STORE_PATH, { recursive: true });
25
+ const registry = createEmptyRegistry();
26
+ addPackageToRegistry(registry, "global", "@webforgeai/core", "1.0.0", {
27
+ signature: "global-v1",
28
+ published: "2026-02-12T10:00:00Z",
29
+ files: 10,
30
+ });
31
+ addPackageToRegistry(registry, "global", "@webforgeai/core", "2.0.0", {
32
+ signature: "global-v2",
33
+ published: "2026-02-12T11:00:00Z",
34
+ files: 12,
35
+ });
36
+ addPackageToRegistry(registry, "feature", "@webforgeai/core", "1.0.0", {
37
+ signature: "feature-v1",
38
+ published: "2026-02-12T12:00:00Z",
39
+ files: 11,
40
+ });
41
+ await writeRegistry(registry);
42
+ });
43
+ afterEach(async () => {
44
+ await fs.rm(TEST_STORE_PATH, { recursive: true, force: true });
45
+ });
46
+ it("should resolve package from global namespace", async () => {
47
+ const output = await resolvePackagesCommand(["@webforgeai/core@1.0.0"]);
48
+ expect(output).toContain("✓");
49
+ expect(output).toContain("@webforgeai/core@1.0.0");
50
+ expect(output).toContain("global");
51
+ });
52
+ it("should resolve from first matching namespace", async () => {
53
+ const output = await resolvePackagesCommand(["@webforgeai/core@1.0.0"], { namespaces: ["feature", "global"] });
54
+ expect(output).toContain("feature");
55
+ // Signature is truncated to 8 chars in output
56
+ expect(output).toContain("feature-");
57
+ });
58
+ it("should fall back to later namespaces", async () => {
59
+ const output = await resolvePackagesCommand(["@webforgeai/core@2.0.0"], { namespaces: ["feature", "global"] });
60
+ expect(output).toContain("global");
61
+ // Signature is truncated to 8 chars in output
62
+ expect(output).toContain("global-v");
63
+ });
64
+ it("should show not found for missing packages", async () => {
65
+ const output = await resolvePackagesCommand(["nonexistent@1.0.0"]);
66
+ expect(output).toContain("✗");
67
+ expect(output).toContain("not found");
68
+ });
69
+ it("should resolve multiple packages", async () => {
70
+ const output = await resolvePackagesCommand([
71
+ "@webforgeai/core@1.0.0",
72
+ "@webforgeai/core@2.0.0",
73
+ ]);
74
+ expect(output).toContain("@webforgeai/core@1.0.0");
75
+ expect(output).toContain("@webforgeai/core@2.0.0");
76
+ });
77
+ it("should support flat format", async () => {
78
+ const output = await resolvePackagesCommand(["@webforgeai/core@1.0.0"], { flat: true });
79
+ expect(output).toContain("@webforgeai/core@1.0.0");
80
+ expect(output).toContain("global");
81
+ expect(output).not.toContain("✓");
82
+ });
83
+ it("should throw for invalid specs", async () => {
84
+ await expect(resolvePackagesCommand(["invalid"])).rejects.toThrow("No valid package specifications");
85
+ });
86
+ });
87
+ //# sourceMappingURL=resolve.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.spec.js","sourceRoot":"","sources":["../../src/commands/resolve.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Verify Command - Verificar integridad del store
3
+ */
4
+ export interface VerifyResult {
5
+ orphansInRegistry: {
6
+ namespace: string;
7
+ package: string;
8
+ version: string;
9
+ }[];
10
+ orphansOnDisk: {
11
+ namespace: string;
12
+ package: string;
13
+ version: string;
14
+ }[];
15
+ signatureMismatches: {
16
+ namespace: string;
17
+ package: string;
18
+ version: string;
19
+ }[];
20
+ fixed: boolean;
21
+ }
22
+ /**
23
+ * Verify store integrity
24
+ */
25
+ export declare function verifyStore(fix?: boolean): Promise<VerifyResult>;
26
+ /**
27
+ * CLI handler for verify command
28
+ */
29
+ export declare function handleVerify(args: {
30
+ fix?: boolean;
31
+ }): Promise<void>;
32
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7E,aAAa,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzE,mBAAmB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/E,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAiF7E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+CzE"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Verify Command - Verificar integridad del store
3
+ */
4
+ import { withStoreLock } from "../core/lock.js";
5
+ import { readRegistry, writeRegistry, getNamespacesFromRegistry, getPackagesInNamespace, getVersionsInNamespace, removePackageFromRegistry, } from "../core/registry.js";
6
+ import { listNamespaces, packageVersionExists, readPackageSignature, findOrphanedPackages, deletePackageVersion, } from "../core/store.js";
7
+ /**
8
+ * Verify store integrity
9
+ */
10
+ export async function verifyStore(fix = false) {
11
+ const result = {
12
+ orphansInRegistry: [],
13
+ orphansOnDisk: [],
14
+ signatureMismatches: [],
15
+ fixed: false,
16
+ };
17
+ const registry = await readRegistry();
18
+ // Check for orphans in registry (entries without files on disk)
19
+ const registryNamespaces = getNamespacesFromRegistry(registry);
20
+ for (const ns of registryNamespaces) {
21
+ const packages = getPackagesInNamespace(registry, ns);
22
+ for (const pkg of packages) {
23
+ const versions = getVersionsInNamespace(registry, ns, pkg);
24
+ for (const version of versions) {
25
+ const exists = await packageVersionExists(ns, pkg, version);
26
+ if (!exists) {
27
+ result.orphansInRegistry.push({ namespace: ns, package: pkg, version });
28
+ }
29
+ else {
30
+ // Check signature
31
+ const diskSig = await readPackageSignature(ns, pkg, version);
32
+ const regEntry = registry.namespaces[ns]?.packages[pkg]?.versions[version];
33
+ if (diskSig && regEntry && diskSig !== regEntry.signature) {
34
+ result.signatureMismatches.push({ namespace: ns, package: pkg, version });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+ // Check for orphans on disk (files without registry entries)
41
+ const diskNamespaces = await listNamespaces();
42
+ for (const ns of diskNamespaces) {
43
+ const registeredPackages = new Set();
44
+ const nsEntry = registry.namespaces[ns];
45
+ if (nsEntry) {
46
+ for (const [pkg, pkgEntry] of Object.entries(nsEntry.packages)) {
47
+ for (const version of Object.keys(pkgEntry.versions)) {
48
+ registeredPackages.add(`${pkg}@${version}`);
49
+ }
50
+ }
51
+ }
52
+ const orphans = await findOrphanedPackages(ns, registeredPackages);
53
+ for (const orphan of orphans) {
54
+ result.orphansOnDisk.push({
55
+ namespace: ns,
56
+ package: orphan.packageName,
57
+ version: orphan.version,
58
+ });
59
+ }
60
+ }
61
+ // Fix issues if requested
62
+ if (fix && (result.orphansInRegistry.length > 0 || result.orphansOnDisk.length > 0)) {
63
+ await withStoreLock(async () => {
64
+ const registry = await readRegistry();
65
+ // Remove orphans from registry
66
+ for (const orphan of result.orphansInRegistry) {
67
+ removePackageFromRegistry(registry, orphan.namespace, orphan.package, orphan.version);
68
+ }
69
+ // Remove orphans from disk
70
+ for (const orphan of result.orphansOnDisk) {
71
+ await deletePackageVersion(orphan.namespace, orphan.package, orphan.version);
72
+ }
73
+ await writeRegistry(registry);
74
+ result.fixed = true;
75
+ });
76
+ }
77
+ return result;
78
+ }
79
+ /**
80
+ * CLI handler for verify command
81
+ */
82
+ export async function handleVerify(args) {
83
+ try {
84
+ console.log("🔍 Verifying store integrity...\n");
85
+ const result = await verifyStore(args.fix);
86
+ let hasIssues = false;
87
+ if (result.orphansInRegistry.length > 0) {
88
+ hasIssues = true;
89
+ console.log(`⚠️ Registry entries without files (${result.orphansInRegistry.length}):`);
90
+ for (const o of result.orphansInRegistry) {
91
+ console.log(` - ${o.namespace}/${o.package}@${o.version}`);
92
+ }
93
+ console.log();
94
+ }
95
+ if (result.orphansOnDisk.length > 0) {
96
+ hasIssues = true;
97
+ console.log(`⚠️ Files without registry entries (${result.orphansOnDisk.length}):`);
98
+ for (const o of result.orphansOnDisk) {
99
+ console.log(` - ${o.namespace}/${o.package}@${o.version}`);
100
+ }
101
+ console.log();
102
+ }
103
+ if (result.signatureMismatches.length > 0) {
104
+ hasIssues = true;
105
+ console.log(`⚠️ Signature mismatches (${result.signatureMismatches.length}):`);
106
+ for (const o of result.signatureMismatches) {
107
+ console.log(` - ${o.namespace}/${o.package}@${o.version}`);
108
+ }
109
+ console.log();
110
+ }
111
+ if (result.fixed) {
112
+ console.log("✓ Issues fixed");
113
+ }
114
+ else if (hasIssues && !args.fix) {
115
+ console.log("Run with --fix to repair issues");
116
+ process.exit(5);
117
+ }
118
+ else if (!hasIssues) {
119
+ console.log("✓ Store is healthy");
120
+ }
121
+ }
122
+ catch (error) {
123
+ console.error(`✗ Verify failed: ${error.message}`);
124
+ process.exit(1);
125
+ }
126
+ }
127
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Config - Carga y gestión de configuración
3
+ */
4
+ import type { DevLinkConfig, FactoryContext, ModeConfig, PackageVersions } from "./types.js";
5
+ /**
6
+ * Crea el contexto para las factories
7
+ */
8
+ export declare function createContext(packages: Record<string, PackageVersions>): FactoryContext;
9
+ /**
10
+ * Detecta el modo basado en la configuración o defaults
11
+ */
12
+ export declare function detectMode(config: DevLinkConfig, ctx: FactoryContext): "dev" | "prod";
13
+ /**
14
+ * Carga y normaliza la configuración
15
+ */
16
+ export declare function loadConfig(configPath: string): Promise<{
17
+ config: DevLinkConfig;
18
+ ctx: FactoryContext;
19
+ mode: "dev" | "prod";
20
+ modeConfig: ModeConfig;
21
+ }>;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GACxC,cAAc,CAOhB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,cAAc,GAClB,KAAK,GAAG,MAAM,CAYhB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,cAAc,CAAC;IACpB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC,CAqCD"}