@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,172 @@
1
+ # Resolve Command
2
+
3
+ Debug package resolution by showing where packages would be found.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ devlink resolve <pkg@version> [...] [options]
9
+ ```
10
+
11
+ ## Arguments
12
+
13
+ | Argument | Description |
14
+ |----------|-------------|
15
+ | `<pkg@version>` | Package spec(s) to resolve |
16
+
17
+ ## Options
18
+
19
+ | Option | Description |
20
+ |--------|-------------|
21
+ | `-n, --namespaces <list>` | Namespace precedence (comma-separated) |
22
+ | `--flat` | Use flat output format |
23
+ | `--repo <path>` | Use custom repo path |
24
+
25
+ ## Description
26
+
27
+ The `resolve` command shows:
28
+
29
+ - Which namespace a package would be resolved from
30
+ - The full path to the package
31
+ - The package signature
32
+ - Which namespaces were searched
33
+
34
+ This is useful for debugging resolution issues before running `install`.
35
+
36
+ ## Examples
37
+
38
+ ### Resolve Single Package
39
+
40
+ ```bash
41
+ devlink resolve @scope/core@1.0.0
42
+ ```
43
+
44
+ Output:
45
+ ```
46
+ Resolving with precedence: global
47
+
48
+ @scope/core@1.0.0
49
+ ✓ Found in: global
50
+ Path: ~/.devlink/namespaces/global/@scope/core/1.0.0
51
+ Signature: 6761ca1fefdde1b6e9ea372e7d6931e4
52
+
53
+ Summary: 1/1 resolved
54
+ ```
55
+
56
+ ### Resolve with Namespace Precedence
57
+
58
+ ```bash
59
+ devlink resolve @scope/core@1.0.0 -n feature-v2,global
60
+ ```
61
+
62
+ Output:
63
+ ```
64
+ Resolving with precedence: feature-v2 → global
65
+
66
+ @scope/core@1.0.0
67
+ ✓ Found in: feature-v2
68
+ Path: ~/.devlink/namespaces/feature-v2/@scope/core/1.0.0
69
+ Signature: different123456
70
+
71
+ Summary: 1/1 resolved
72
+ ```
73
+
74
+ ### Resolve Multiple Packages
75
+
76
+ ```bash
77
+ devlink resolve @scope/core@1.0.0 @scope/utils@2.0.0 -n feature-v2,global
78
+ ```
79
+
80
+ Output:
81
+ ```
82
+ Resolving with precedence: feature-v2 → global
83
+
84
+ @scope/core@1.0.0
85
+ ✓ Found in: feature-v2
86
+ Path: ~/.devlink/namespaces/feature-v2/@scope/core/1.0.0
87
+ Signature: abc123
88
+
89
+ @scope/utils@2.0.0
90
+ ⊘ Not in: feature-v2
91
+ ✓ Found in: global
92
+ Path: ~/.devlink/namespaces/global/@scope/utils/2.0.0
93
+ Signature: def456
94
+
95
+ Summary: 2/2 resolved
96
+ ```
97
+
98
+ ### Package Not Found
99
+
100
+ ```bash
101
+ devlink resolve @scope/missing@1.0.0 -n feature-v2,global
102
+ ```
103
+
104
+ Output:
105
+ ```
106
+ Resolving with precedence: feature-v2 → global
107
+
108
+ @scope/missing@1.0.0
109
+ ⊘ Not in: feature-v2
110
+ ⊘ Not in: global
111
+ ✗ Not found in any namespace
112
+
113
+ Summary: 0/1 resolved
114
+ ```
115
+
116
+ ### Flat Output
117
+
118
+ ```bash
119
+ devlink resolve @scope/core@1.0.0 @scope/utils@2.0.0 --flat
120
+ ```
121
+
122
+ Output:
123
+ ```
124
+ ✓ @scope/core@1.0.0 global 6761ca1f
125
+ ✓ @scope/utils@2.0.0 global a1b2c3d4
126
+ ```
127
+
128
+ ## Use Cases
129
+
130
+ ### Debug Installation Issues
131
+
132
+ Before running `install`, verify packages can be resolved:
133
+
134
+ ```bash
135
+ # Check all packages from your config
136
+ devlink resolve @scope/core@1.0.0 @scope/utils@1.0.0 -n feature-v2,global
137
+ ```
138
+
139
+ ### Verify Namespace Precedence
140
+
141
+ Check which namespace would be used:
142
+
143
+ ```bash
144
+ # Same package in multiple namespaces
145
+ devlink resolve @scope/core@1.0.0 -n feature-v2,global
146
+ # Shows: Found in feature-v2
147
+
148
+ devlink resolve @scope/core@1.0.0 -n global,feature-v2
149
+ # Shows: Found in global (different precedence)
150
+ ```
151
+
152
+ ### Check Package Availability
153
+
154
+ Verify a package was published correctly:
155
+
156
+ ```bash
157
+ devlink resolve @scope/new-pkg@1.0.0
158
+ ```
159
+
160
+ ## Resolution Algorithm
161
+
162
+ 1. Parse package spec (`name@version`)
163
+ 2. For each namespace in order:
164
+ - Check if `namespace/name/version` exists in registry
165
+ - If found, return path and signature
166
+ 3. If not found in any namespace, report as not found
167
+
168
+ ## See Also
169
+
170
+ - [List Command](list.md) - See all packages in the store
171
+ - [Namespaces](../store/namespaces.md) - Understanding namespace precedence
172
+ - [Install Command](../installation/install.md) - How resolution is used during install
@@ -0,0 +1,238 @@
1
+ # Configuration
2
+
3
+ DevLink uses a configuration file to define which packages to manage and how to resolve them.
4
+
5
+ ## Config File
6
+
7
+ Create `devlink.config.mjs` in your project root:
8
+
9
+ ```javascript
10
+ export default {
11
+ packages: { /* ... */ },
12
+ dev: () => ({ /* ... */ }),
13
+ prod: () => ({ /* ... */ }),
14
+ detectMode: (ctx) => { /* ... */ },
15
+ };
16
+ ```
17
+
18
+ ### Supported File Names
19
+
20
+ In order of priority:
21
+ 1. `devlink.config.mjs`
22
+ 2. `devlink.config.js`
23
+ 3. `devlink.config.cjs`
24
+
25
+ ## Configuration Options
26
+
27
+ ### packages
28
+
29
+ Defines which packages to manage and their versions per mode.
30
+
31
+ ```javascript
32
+ packages: {
33
+ "@scope/core": { dev: "1.0.0", prod: "1.0.0" },
34
+ "@scope/utils": { dev: "2.0.0", prod: "1.5.0" },
35
+ "simple-pkg": { dev: "1.0.0" }, // prod defaults to dev version
36
+ }
37
+ ```
38
+
39
+ ### dev
40
+
41
+ Configuration for development mode.
42
+
43
+ ```javascript
44
+ dev: (ctx) => ({
45
+ manager: "store", // Use DevLink store
46
+ namespaces: ["feature", "global"], // Namespace precedence
47
+ })
48
+ ```
49
+
50
+ ### prod
51
+
52
+ Configuration for production mode.
53
+
54
+ ```javascript
55
+ prod: (ctx) => ({
56
+ manager: "npm", // Use npm
57
+ args: ["--no-save"], // Additional npm arguments
58
+ })
59
+ ```
60
+
61
+ ### detectMode
62
+
63
+ Function to determine which mode to use.
64
+
65
+ ```javascript
66
+ detectMode: (ctx) => {
67
+ // ctx.env - Environment variables
68
+ // ctx.args - Command line arguments
69
+ // ctx.cwd - Current working directory
70
+
71
+ if (ctx.env.NODE_ENV === "development") return "dev";
72
+ if (ctx.env.SST_LOCAL === "true") return "dev";
73
+ if (ctx.args.includes("--dev")) return "dev";
74
+ return "prod";
75
+ }
76
+ ```
77
+
78
+ ## Context Object
79
+
80
+ The `ctx` object passed to functions contains:
81
+
82
+ ```typescript
83
+ interface Context {
84
+ env: Record<string, string>; // process.env
85
+ args: string[]; // Command line arguments
86
+ cwd: string; // Current working directory
87
+ }
88
+ ```
89
+
90
+ ## Manager Types
91
+
92
+ ### store
93
+
94
+ Uses the DevLink store to resolve packages:
95
+
96
+ ```javascript
97
+ {
98
+ manager: "store",
99
+ namespaces: ["feature-v2", "global"],
100
+ }
101
+ ```
102
+
103
+ ### npm
104
+
105
+ Uses npm to install packages:
106
+
107
+ ```javascript
108
+ {
109
+ manager: "npm",
110
+ args: ["--no-save", "--legacy-peer-deps"],
111
+ }
112
+ ```
113
+
114
+ ## Complete Example
115
+
116
+ ```javascript
117
+ import { fileURLToPath } from "url";
118
+ import { dirname } from "path";
119
+
120
+ const __dirname = dirname(fileURLToPath(import.meta.url));
121
+
122
+ export default {
123
+ // Packages to manage
124
+ packages: {
125
+ "@myorg/core": { dev: "1.0.0", prod: "1.0.0" },
126
+ "@myorg/utils": { dev: "1.0.0", prod: "1.0.0" },
127
+ "@myorg/http": { dev: "1.0.0", prod: "1.0.0" },
128
+ },
129
+
130
+ // Development mode: use local store
131
+ dev: (ctx) => ({
132
+ manager: "store",
133
+ namespaces: getNamespaces(ctx),
134
+ }),
135
+
136
+ // Production mode: use npm
137
+ prod: (ctx) => ({
138
+ manager: "npm",
139
+ args: ["--no-save"],
140
+ }),
141
+
142
+ // Mode detection
143
+ detectMode: (ctx) => {
144
+ // SST local development
145
+ if (ctx.env.SST_LOCAL === "true") return "dev";
146
+
147
+ // Explicit flags
148
+ if (ctx.args.includes("--dev")) return "dev";
149
+ if (ctx.args.includes("--prod")) return "prod";
150
+
151
+ // Environment variable
152
+ if (ctx.env.NODE_ENV === "development") return "dev";
153
+
154
+ return "prod";
155
+ },
156
+ };
157
+
158
+ // Helper to determine namespaces based on context
159
+ function getNamespaces(ctx) {
160
+ // Use feature namespace if specified
161
+ if (ctx.env.DEVLINK_NAMESPACE) {
162
+ return [ctx.env.DEVLINK_NAMESPACE, "global"];
163
+ }
164
+
165
+ // Default to global only
166
+ return ["global"];
167
+ }
168
+ ```
169
+
170
+ ## Namespace Override
171
+
172
+ The `-n` flag overrides configured namespaces:
173
+
174
+ ```bash
175
+ # Uses namespaces from config
176
+ devlink install
177
+
178
+ # Overrides to use feature-v2 first
179
+ devlink install -n feature-v2,global
180
+ ```
181
+
182
+ ## Mode Override
183
+
184
+ The `--dev` and `--prod` flags override mode detection:
185
+
186
+ ```bash
187
+ # Uses detectMode function
188
+ devlink install
189
+
190
+ # Forces dev mode
191
+ devlink install --dev
192
+
193
+ # Forces prod mode
194
+ devlink install --prod
195
+ ```
196
+
197
+ ## Tips
198
+
199
+ ### Dynamic Namespaces
200
+
201
+ Use environment variables for flexible namespace configuration:
202
+
203
+ ```javascript
204
+ dev: (ctx) => ({
205
+ manager: "store",
206
+ namespaces: ctx.env.FEATURE_BRANCH
207
+ ? [ctx.env.FEATURE_BRANCH, "global"]
208
+ : ["global"],
209
+ })
210
+ ```
211
+
212
+ ### Version Pinning
213
+
214
+ Pin exact versions for reproducibility:
215
+
216
+ ```javascript
217
+ packages: {
218
+ "@scope/core": { dev: "1.2.3", prod: "1.2.3" },
219
+ }
220
+ ```
221
+
222
+ ### Different Dev/Prod Versions
223
+
224
+ Use different versions for development and production:
225
+
226
+ ```javascript
227
+ packages: {
228
+ "@scope/core": {
229
+ dev: "2.0.0-beta.1", // Latest beta for development
230
+ prod: "1.5.0", // Stable for production
231
+ },
232
+ }
233
+ ```
234
+
235
+ ## See Also
236
+
237
+ - [Install Command](install.md) - Using the configuration
238
+ - [Namespaces](../store/namespaces.md) - Understanding namespace precedence
@@ -0,0 +1,184 @@
1
+ # Install Command
2
+
3
+ Installs packages from the DevLink store into a project.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ devlink install [options]
9
+ ```
10
+
11
+ ## Options
12
+
13
+ | Option | Description |
14
+ |--------|-------------|
15
+ | `-n, --namespaces <list>` | Override namespace precedence (comma-separated) |
16
+ | `-c, --config <path>` | Path to config file |
17
+ | `--dev` | Force dev mode |
18
+ | `--prod` | Force prod mode |
19
+ | `--repo <path>` | Use custom repo path |
20
+
21
+ ## Description
22
+
23
+ The `install` command:
24
+
25
+ 1. Reads `devlink.config.mjs` from the project
26
+ 2. Determines the mode (dev or prod)
27
+ 3. Resolves packages using namespace precedence
28
+ 4. Creates symlinks in `node_modules`
29
+ 5. Registers the project as a consumer
30
+ 6. Creates/updates `devlink.lock`
31
+
32
+ ## Configuration File
33
+
34
+ Create `devlink.config.mjs` in your project root:
35
+
36
+ ```javascript
37
+ export default {
38
+ packages: {
39
+ "@scope/core": { dev: "1.0.0", prod: "1.0.0" },
40
+ "@scope/utils": { dev: "2.0.0", prod: "1.5.0" },
41
+ },
42
+
43
+ dev: () => ({
44
+ manager: "store",
45
+ namespaces: ["feature-v2", "global"],
46
+ }),
47
+
48
+ prod: () => ({
49
+ manager: "npm",
50
+ args: ["--no-save"],
51
+ }),
52
+
53
+ detectMode: (ctx) => {
54
+ if (ctx.env.NODE_ENV === "development") return "dev";
55
+ if (ctx.args.includes("--dev")) return "dev";
56
+ return "prod";
57
+ },
58
+ };
59
+ ```
60
+
61
+ See [Configuration](configuration.md) for full reference.
62
+
63
+ ## Examples
64
+
65
+ ### Basic Install
66
+
67
+ ```bash
68
+ cd my-project
69
+ devlink install
70
+ ```
71
+
72
+ ### Force Dev Mode
73
+
74
+ ```bash
75
+ devlink install --dev
76
+ ```
77
+
78
+ ### Override Namespaces
79
+
80
+ ```bash
81
+ devlink install -n feature-v2,global
82
+ ```
83
+
84
+ ### Custom Config Path
85
+
86
+ ```bash
87
+ devlink install -c ./config/devlink.config.mjs
88
+ ```
89
+
90
+ ## Resolution Process
91
+
92
+ For each package in the config:
93
+
94
+ 1. Get version for current mode (dev/prod)
95
+ 2. Search namespaces in order
96
+ 3. Find first match
97
+ 4. Create symlink to store location
98
+
99
+ Example:
100
+ ```
101
+ Config: @scope/core@1.0.0
102
+ Namespaces: ["feature-v2", "global"]
103
+
104
+ 1. Search feature-v2/@scope/core/1.0.0 → Not found
105
+ 2. Search global/@scope/core/1.0.0 → Found!
106
+ 3. Symlink: node_modules/@scope/core → ~/.devlink/namespaces/global/@scope/core/1.0.0
107
+ ```
108
+
109
+ ## Lock File
110
+
111
+ After installation, `devlink.lock` is created/updated:
112
+
113
+ ```json
114
+ {
115
+ "packages": {
116
+ "@scope/core": {
117
+ "version": "1.0.0",
118
+ "namespace": "global",
119
+ "signature": "6761ca1f...",
120
+ "resolved": "~/.devlink/namespaces/global/@scope/core/1.0.0"
121
+ }
122
+ }
123
+ }
124
+ ```
125
+
126
+ This file:
127
+ - Records exact resolution for reproducibility
128
+ - Tracks signatures for change detection
129
+ - Should be committed to version control
130
+
131
+ ## Consumer Registration
132
+
133
+ Installing registers your project in `installations.json`, enabling:
134
+
135
+ - `devlink push` to update your project
136
+ - `devlink consumers` to list your project
137
+
138
+ ## Modes
139
+
140
+ ### Dev Mode
141
+
142
+ Uses packages from the DevLink store:
143
+
144
+ ```javascript
145
+ dev: () => ({
146
+ manager: "store",
147
+ namespaces: ["feature-v2", "global"],
148
+ })
149
+ ```
150
+
151
+ ### Prod Mode
152
+
153
+ Uses npm to install packages:
154
+
155
+ ```javascript
156
+ prod: () => ({
157
+ manager: "npm",
158
+ args: ["--no-save"],
159
+ })
160
+ ```
161
+
162
+ ## Errors
163
+
164
+ ### Package Not Found
165
+
166
+ ```
167
+ Error: @scope/core@1.0.0 not found in namespaces: feature-v2, global
168
+ ```
169
+
170
+ The package hasn't been published to any of the configured namespaces.
171
+
172
+ ### Config Not Found
173
+
174
+ ```
175
+ Error: devlink.config.mjs not found
176
+ ```
177
+
178
+ Create a configuration file in your project root.
179
+
180
+ ## See Also
181
+
182
+ - [Configuration](configuration.md) - Full config file reference
183
+ - [Namespaces](../store/namespaces.md) - Understanding namespace precedence
184
+ - [Push Command](../publishing/push.md) - How push updates consumers