@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.
- package/AGENTS.md +880 -0
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/__tests__/e2e.spec.d.ts +8 -0
- package/dist/__tests__/e2e.spec.d.ts.map +1 -0
- package/dist/__tests__/e2e.spec.js +253 -0
- package/dist/__tests__/e2e.spec.js.map +1 -0
- package/dist/__tests__/integration.spec.d.ts +8 -0
- package/dist/__tests__/integration.spec.d.ts.map +1 -0
- package/dist/__tests__/integration.spec.js +274 -0
- package/dist/__tests__/integration.spec.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +610 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/consumers.d.ts +37 -0
- package/dist/commands/consumers.d.ts.map +1 -0
- package/dist/commands/consumers.js +107 -0
- package/dist/commands/consumers.js.map +1 -0
- package/dist/commands/docs.d.ts +59 -0
- package/dist/commands/docs.d.ts.map +1 -0
- package/dist/commands/docs.js +262 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/docs.spec.d.ts +5 -0
- package/dist/commands/docs.spec.d.ts.map +1 -0
- package/dist/commands/docs.spec.js +213 -0
- package/dist/commands/docs.spec.js.map +1 -0
- package/dist/commands/index.d.ts +13 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +13 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install.d.ts +31 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +234 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +22 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +45 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/list.spec.d.ts +5 -0
- package/dist/commands/list.spec.d.ts.map +1 -0
- package/dist/commands/list.spec.js +95 -0
- package/dist/commands/list.spec.js.map +1 -0
- package/dist/commands/prune.d.ts +27 -0
- package/dist/commands/prune.d.ts.map +1 -0
- package/dist/commands/prune.js +74 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/publish.d.ts +16 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +225 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/publish.spec.d.ts +5 -0
- package/dist/commands/publish.spec.d.ts.map +1 -0
- package/dist/commands/publish.spec.js +98 -0
- package/dist/commands/publish.spec.js.map +1 -0
- package/dist/commands/push.d.ts +16 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +164 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/remove.d.ts +24 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +80 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/remove.spec.d.ts +5 -0
- package/dist/commands/remove.spec.d.ts.map +1 -0
- package/dist/commands/remove.spec.js +87 -0
- package/dist/commands/remove.spec.js.map +1 -0
- package/dist/commands/resolve.d.ts +20 -0
- package/dist/commands/resolve.d.ts.map +1 -0
- package/dist/commands/resolve.js +52 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/resolve.spec.d.ts +5 -0
- package/dist/commands/resolve.spec.d.ts.map +1 -0
- package/dist/commands/resolve.spec.js +87 -0
- package/dist/commands/resolve.spec.js.map +1 -0
- package/dist/commands/verify.d.ts +32 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +127 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +70 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +65 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +116 -0
- package/dist/constants.js.map +1 -0
- package/dist/constants.spec.d.ts +5 -0
- package/dist/constants.spec.d.ts.map +1 -0
- package/dist/constants.spec.js +72 -0
- package/dist/constants.spec.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/installations.d.ts +79 -0
- package/dist/core/installations.d.ts.map +1 -0
- package/dist/core/installations.js +207 -0
- package/dist/core/installations.js.map +1 -0
- package/dist/core/installations.spec.d.ts +5 -0
- package/dist/core/installations.spec.d.ts.map +1 -0
- package/dist/core/installations.spec.js +261 -0
- package/dist/core/installations.spec.js.map +1 -0
- package/dist/core/lock.d.ts +37 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +198 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/lock.spec.d.ts +5 -0
- package/dist/core/lock.spec.d.ts.map +1 -0
- package/dist/core/lock.spec.js +161 -0
- package/dist/core/lock.spec.js.map +1 -0
- package/dist/core/registry.d.ts +80 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +231 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.spec.d.ts +5 -0
- package/dist/core/registry.spec.d.ts.map +1 -0
- package/dist/core/registry.spec.js +281 -0
- package/dist/core/registry.spec.js.map +1 -0
- package/dist/core/resolver.d.ts +55 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +127 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/resolver.spec.d.ts +5 -0
- package/dist/core/resolver.spec.d.ts.map +1 -0
- package/dist/core/resolver.spec.js +202 -0
- package/dist/core/resolver.spec.js.map +1 -0
- package/dist/core/store.d.ts +65 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +245 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/store.spec.d.ts +5 -0
- package/dist/core/store.spec.d.ts.map +1 -0
- package/dist/core/store.spec.js +195 -0
- package/dist/core/store.spec.js.map +1 -0
- package/dist/formatters/flat.d.ts +41 -0
- package/dist/formatters/flat.d.ts.map +1 -0
- package/dist/formatters/flat.js +131 -0
- package/dist/formatters/flat.js.map +1 -0
- package/dist/formatters/flat.spec.d.ts +5 -0
- package/dist/formatters/flat.spec.d.ts.map +1 -0
- package/dist/formatters/flat.spec.js +130 -0
- package/dist/formatters/flat.spec.js.map +1 -0
- package/dist/formatters/index.d.ts +6 -0
- package/dist/formatters/index.d.ts.map +1 -0
- package/dist/formatters/index.js +6 -0
- package/dist/formatters/index.js.map +1 -0
- package/dist/formatters/tree.d.ts +29 -0
- package/dist/formatters/tree.d.ts.map +1 -0
- package/dist/formatters/tree.js +256 -0
- package/dist/formatters/tree.js.map +1 -0
- package/dist/formatters/tree.spec.d.ts +5 -0
- package/dist/formatters/tree.spec.d.ts.map +1 -0
- package/dist/formatters/tree.spec.js +127 -0
- package/dist/formatters/tree.spec.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/installer.d.ts +13 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +171 -0
- package/dist/installer.js.map +1 -0
- package/dist/store.d.ts +78 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +344 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +235 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/README.md +68 -0
- package/docs/inspection/consumers.md +178 -0
- package/docs/inspection/list.md +182 -0
- package/docs/inspection/resolve.md +172 -0
- package/docs/installation/configuration.md +238 -0
- package/docs/installation/install.md +184 -0
- package/docs/maintenance/prune.md +159 -0
- package/docs/maintenance/remove.md +174 -0
- package/docs/maintenance/verify.md +174 -0
- package/docs/publishing/publish.md +146 -0
- package/docs/publishing/push.md +146 -0
- package/docs/store/locking.md +118 -0
- package/docs/store/namespaces.md +141 -0
- package/docs/store/structure.md +163 -0
- package/package.json +58 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 UnlimitechCloud
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# @unlimitechcloud/devlink
|
|
2
|
+
|
|
3
|
+
A modern local package development and linking tool with namespace support, designed for monorepos and multi-project workflows.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@unlimitechcloud/devlink)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
## Why DevLink?
|
|
9
|
+
|
|
10
|
+
When developing multiple packages locally, you need a way to test changes across projects without publishing to npm. DevLink provides:
|
|
11
|
+
|
|
12
|
+
- **Namespace isolation** - Different projects can use different versions or variants of the same package without conflicts
|
|
13
|
+
- **Multi-version support** - Test multiple versions of the same package simultaneously across different projects
|
|
14
|
+
- **Automatic consumer updates** - Push changes to all dependent projects with one command
|
|
15
|
+
- **Declarative configuration** - Define dependencies in a config file, not CLI flags
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Global installation (recommended)
|
|
21
|
+
npm install -g @unlimitechcloud/devlink
|
|
22
|
+
|
|
23
|
+
# Or use with npx
|
|
24
|
+
npx @unlimitechcloud/devlink <command>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
### 1. Publish Your Library
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
cd my-library
|
|
33
|
+
devlink publish
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
This copies your package to the DevLink store (`~/.devlink/namespaces/global/`).
|
|
37
|
+
|
|
38
|
+
### 2. Configure Your Consumer Project
|
|
39
|
+
|
|
40
|
+
Create `devlink.config.mjs` in your project root:
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
export default {
|
|
44
|
+
packages: {
|
|
45
|
+
"@myorg/my-library": { dev: "1.0.0" },
|
|
46
|
+
"@myorg/utils": { dev: "2.0.0" },
|
|
47
|
+
},
|
|
48
|
+
dev: () => ({
|
|
49
|
+
manager: "store",
|
|
50
|
+
namespaces: ["global"],
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 3. Install from Store
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
cd my-project
|
|
59
|
+
devlink install --dev
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
DevLink copies the packages from the store to your `node_modules`.
|
|
63
|
+
|
|
64
|
+
### 4. Push Updates
|
|
65
|
+
|
|
66
|
+
After making changes to your library:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd my-library
|
|
70
|
+
devlink push
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
This publishes the new version AND automatically updates all consumer projects.
|
|
74
|
+
|
|
75
|
+
## Commands Reference
|
|
76
|
+
|
|
77
|
+
| Command | Description | Common Options |
|
|
78
|
+
|---------|-------------|----------------|
|
|
79
|
+
| `publish` | Publish package to the store | `-n, --namespace` |
|
|
80
|
+
| `push` | Publish and update all consumers | `-n, --namespace` |
|
|
81
|
+
| `install` | Install packages from store | `--dev`, `--prod`, `-n` |
|
|
82
|
+
| `list` | List packages in store | `-n`, `-p`, `--flat` |
|
|
83
|
+
| `resolve` | Debug package resolution | `-n, --namespaces` |
|
|
84
|
+
| `consumers` | List/manage consumer projects | `--prune` |
|
|
85
|
+
| `remove` | Remove packages or namespaces | `-n, --namespace` |
|
|
86
|
+
| `verify` | Check store integrity | `--fix` |
|
|
87
|
+
| `prune` | Remove orphaned packages | `--dry-run` |
|
|
88
|
+
| `docs` | Display embedded documentation | `<topic>` |
|
|
89
|
+
|
|
90
|
+
### Command Details
|
|
91
|
+
|
|
92
|
+
#### `devlink publish`
|
|
93
|
+
|
|
94
|
+
Publishes the current package to the DevLink store.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
devlink publish # Publish to global namespace
|
|
98
|
+
devlink publish -n feature-v2 # Publish to feature-v2 namespace
|
|
99
|
+
devlink publish --repo ~/custom # Use custom store location
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### `devlink push`
|
|
103
|
+
|
|
104
|
+
Publishes and automatically updates all consumer projects that use this package.
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
devlink push # Publish and update consumers
|
|
108
|
+
devlink push -n feature-v2 # Push to specific namespace
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
#### `devlink install`
|
|
112
|
+
|
|
113
|
+
Installs packages from the store based on your `devlink.config.mjs`.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
devlink install # Install using default mode
|
|
117
|
+
devlink install --dev # Force dev mode
|
|
118
|
+
devlink install --prod # Force prod mode
|
|
119
|
+
devlink install -n feature,global # Override namespace precedence
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
#### `devlink list`
|
|
123
|
+
|
|
124
|
+
Lists all packages in the store.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
devlink list # Tree view by namespace
|
|
128
|
+
devlink list --flat # Flat output (for scripting)
|
|
129
|
+
devlink list -n global # Filter by namespace
|
|
130
|
+
devlink list -p @myorg # Filter by scope
|
|
131
|
+
devlink list -p @myorg/core # Filter by package
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### `devlink resolve`
|
|
135
|
+
|
|
136
|
+
Shows how packages would be resolved given namespace precedence.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
devlink resolve @myorg/core@1.0.0
|
|
140
|
+
devlink resolve @myorg/core@1.0.0 -n feature,global
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
#### `devlink consumers`
|
|
144
|
+
|
|
145
|
+
Lists projects that have installed packages from the store.
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
devlink consumers # List all consumers
|
|
149
|
+
devlink consumers -p @myorg/core # Filter by package
|
|
150
|
+
devlink consumers --prune # Remove dead projects
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### `devlink remove`
|
|
154
|
+
|
|
155
|
+
Removes packages, versions, or entire namespaces.
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
devlink remove @myorg/core@1.0.0 # Remove specific version
|
|
159
|
+
devlink remove @myorg/core # Remove all versions
|
|
160
|
+
devlink remove feature-v2 # Remove entire namespace
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
#### `devlink docs`
|
|
164
|
+
|
|
165
|
+
Access embedded documentation from the CLI.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
devlink docs # Show documentation tree
|
|
169
|
+
devlink docs agents # AI agent guide
|
|
170
|
+
devlink docs store/namespaces # Specific topic
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Configuration
|
|
174
|
+
|
|
175
|
+
### `devlink.config.mjs`
|
|
176
|
+
|
|
177
|
+
```javascript
|
|
178
|
+
export default {
|
|
179
|
+
// Packages to manage
|
|
180
|
+
packages: {
|
|
181
|
+
"@myorg/core": {
|
|
182
|
+
dev: "1.0.0", // Version for dev mode
|
|
183
|
+
prod: "1.0.0" // Version for prod mode (optional)
|
|
184
|
+
},
|
|
185
|
+
"@myorg/utils": { dev: "2.0.0" },
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
// Dev mode configuration
|
|
189
|
+
dev: () => ({
|
|
190
|
+
manager: "store", // Use DevLink store
|
|
191
|
+
namespaces: ["feature", "global"], // Namespace precedence
|
|
192
|
+
}),
|
|
193
|
+
|
|
194
|
+
// Prod mode configuration (optional)
|
|
195
|
+
prod: () => ({
|
|
196
|
+
manager: "npm", // Use npm registry
|
|
197
|
+
}),
|
|
198
|
+
};
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Global Options
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
--repo <path> # Use custom store location (default: ~/.devlink)
|
|
205
|
+
-h, --help # Show help
|
|
206
|
+
-v, --version # Show version
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Environment variable: `DEVLINK_REPO` can also set the store location.
|
|
210
|
+
|
|
211
|
+
## Namespaces
|
|
212
|
+
|
|
213
|
+
Namespaces allow different projects to use different variants of the same package without conflicts. Each namespace is an isolated context in the store:
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# Feature branch development
|
|
217
|
+
devlink publish -n feature-auth
|
|
218
|
+
|
|
219
|
+
# Team-specific packages
|
|
220
|
+
devlink publish -n team-platform
|
|
221
|
+
|
|
222
|
+
# Environment-specific
|
|
223
|
+
devlink publish -n staging
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Use cases:**
|
|
227
|
+
- Test experimental changes in one project while others use stable versions
|
|
228
|
+
- Multiple developers working on different features of the same package
|
|
229
|
+
- A/B testing different implementations
|
|
230
|
+
|
|
231
|
+
Resolution follows namespace precedence:
|
|
232
|
+
```javascript
|
|
233
|
+
namespaces: ["feature-auth", "global"]
|
|
234
|
+
// First looks in feature-auth, falls back to global
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## Example Workflows
|
|
238
|
+
|
|
239
|
+
### Feature Branch Development
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Developer A: Working on auth feature
|
|
243
|
+
cd packages/auth
|
|
244
|
+
devlink publish -n feature-auth
|
|
245
|
+
|
|
246
|
+
# Developer B: Testing auth changes
|
|
247
|
+
# devlink.config.mjs: namespaces: ["feature-auth", "global"]
|
|
248
|
+
devlink install --dev
|
|
249
|
+
|
|
250
|
+
# After feature is merged
|
|
251
|
+
devlink publish # Publish to global
|
|
252
|
+
devlink remove feature-auth # Clean up
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Monorepo Development
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
# Publish all packages
|
|
259
|
+
cd packages/core && devlink publish
|
|
260
|
+
cd packages/utils && devlink publish
|
|
261
|
+
cd packages/ui && devlink publish
|
|
262
|
+
|
|
263
|
+
# Consumer app
|
|
264
|
+
cd apps/web
|
|
265
|
+
devlink install --dev
|
|
266
|
+
|
|
267
|
+
# After changes to core
|
|
268
|
+
cd packages/core
|
|
269
|
+
devlink push # Updates apps/web automatically
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Use with AI Agents
|
|
273
|
+
|
|
274
|
+
DevLink includes comprehensive documentation for AI coding assistants. The `AGENTS.md` file provides a self-contained guide that AI agents can use to understand and operate DevLink.
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
# View the AI agent guide
|
|
278
|
+
devlink docs agents
|
|
279
|
+
|
|
280
|
+
# Or read the file directly
|
|
281
|
+
cat AGENTS.md
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
AI agents can use DevLink to:
|
|
285
|
+
- Publish local packages during development
|
|
286
|
+
- Install dependencies from the local store
|
|
287
|
+
- Push updates to consumer projects
|
|
288
|
+
- Manage namespaces for isolated testing
|
|
289
|
+
|
|
290
|
+
## Store Structure
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
~/.devlink/
|
|
294
|
+
├── namespaces/
|
|
295
|
+
│ ├── global/
|
|
296
|
+
│ │ └── @myorg/
|
|
297
|
+
│ │ └── core/
|
|
298
|
+
│ │ └── 1.0.0/
|
|
299
|
+
│ │ ├── package.json
|
|
300
|
+
│ │ └── dist/
|
|
301
|
+
│ └── feature-v2/
|
|
302
|
+
│ └── ...
|
|
303
|
+
├── registry.json # Package index
|
|
304
|
+
├── installations.json # Consumer tracking
|
|
305
|
+
└── .lock # File locking
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Documentation
|
|
309
|
+
|
|
310
|
+
📚 **[Full Documentation](docs/README.md)**
|
|
311
|
+
|
|
312
|
+
- [Store Structure](docs/store/structure.md) - How the store is organized
|
|
313
|
+
- [Namespaces](docs/store/namespaces.md) - Isolation and precedence
|
|
314
|
+
- [Configuration](docs/installation/configuration.md) - Config file reference
|
|
315
|
+
- [File Locking](docs/store/locking.md) - Concurrent operation safety
|
|
316
|
+
|
|
317
|
+
## Feedback
|
|
318
|
+
|
|
319
|
+
We welcome feedback, suggestions, and ideas for improvement. Please open an [issue](https://github.com/unlimitechcloud/devlink/issues) to share your thoughts.
|
|
320
|
+
|
|
321
|
+
Note: This project does not accept code contributions via pull requests.
|
|
322
|
+
|
|
323
|
+
## About This Project
|
|
324
|
+
|
|
325
|
+
This tool was built following the principles defined in the whitepaper **"A Formal Definition of AI-First"** by [Unlimitech Cloud LLC](https://unlimitech.cloud).
|
|
326
|
+
|
|
327
|
+
📄 [Read the Whitepaper](https://ulcl.link/whpp-ai-first) | [More Whitepapers](https://ulcl.link/whpp)
|
|
328
|
+
|
|
329
|
+
The whitepaper provides a formal functional definition that enables seamless integration with AI coding assistants and autonomous agents—making tools like DevLink naturally AI-ready.
|
|
330
|
+
|
|
331
|
+
This project represents Unlimitech Cloud LLC's commitment to knowledge sharing: contributing frameworks and practical tools that help organizations navigate complex challenges. We believe sharing knowledge openly strengthens the broader ecosystem and creates value for everyone.
|
|
332
|
+
|
|
333
|
+
## License
|
|
334
|
+
|
|
335
|
+
MIT © [Unlimitech Cloud LLC](https://unlimitech.cloud)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/e2e.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Tests - Verificación física del store
|
|
3
|
+
*
|
|
4
|
+
* Estos tests usan los fixtures reales y verifican la estructura
|
|
5
|
+
* física del store después de cada operación.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
|
|
8
|
+
import fs from "fs/promises";
|
|
9
|
+
import path from "path";
|
|
10
|
+
import os from "os";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
12
|
+
// Get fixtures path relative to this file
|
|
13
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
const FIXTURES_PATH = path.resolve(__dirname, "../../fixtures/packages");
|
|
15
|
+
// Test store in temp directory
|
|
16
|
+
const TEST_STORE_PATH = path.join(os.tmpdir(), "devlink-e2e-" + Date.now());
|
|
17
|
+
// Import after setting up mocks would be complex, so we'll use dynamic imports
|
|
18
|
+
// and manually set environment or use the actual modules with a test store
|
|
19
|
+
describe("E2E: Store Operations", () => {
|
|
20
|
+
// Helper to get paths
|
|
21
|
+
const getStorePath = () => TEST_STORE_PATH;
|
|
22
|
+
const getNamespacesPath = () => path.join(TEST_STORE_PATH, "namespaces");
|
|
23
|
+
const getNamespacePath = (ns) => path.join(getNamespacesPath(), ns);
|
|
24
|
+
const getPackagePath = (ns, pkg, ver) => path.join(getNamespacePath(ns), pkg, ver);
|
|
25
|
+
const getRegistryPath = () => path.join(TEST_STORE_PATH, "registry.json");
|
|
26
|
+
beforeAll(async () => {
|
|
27
|
+
// Verify fixtures exist
|
|
28
|
+
const v1Path = path.join(FIXTURES_PATH, "@test/sample-lib-v1");
|
|
29
|
+
const v2Path = path.join(FIXTURES_PATH, "@test/sample-lib-v2");
|
|
30
|
+
const utilsPath = path.join(FIXTURES_PATH, "utils-helper");
|
|
31
|
+
await expect(fs.access(v1Path)).resolves.not.toThrow();
|
|
32
|
+
await expect(fs.access(v2Path)).resolves.not.toThrow();
|
|
33
|
+
await expect(fs.access(utilsPath)).resolves.not.toThrow();
|
|
34
|
+
});
|
|
35
|
+
beforeEach(async () => {
|
|
36
|
+
// Clean store before each test
|
|
37
|
+
await fs.rm(TEST_STORE_PATH, { recursive: true, force: true });
|
|
38
|
+
await fs.mkdir(TEST_STORE_PATH, { recursive: true });
|
|
39
|
+
});
|
|
40
|
+
afterAll(async () => {
|
|
41
|
+
// Cleanup
|
|
42
|
+
await fs.rm(TEST_STORE_PATH, { recursive: true, force: true });
|
|
43
|
+
});
|
|
44
|
+
describe("Fixture Verification", () => {
|
|
45
|
+
it("should have v1 fixture with correct structure", async () => {
|
|
46
|
+
const v1Path = path.join(FIXTURES_PATH, "@test/sample-lib-v1");
|
|
47
|
+
// Check package.json
|
|
48
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(v1Path, "package.json"), "utf-8"));
|
|
49
|
+
expect(pkgJson.name).toBe("@test/sample-lib");
|
|
50
|
+
expect(pkgJson.version).toBe("1.0.0");
|
|
51
|
+
// Check dist files
|
|
52
|
+
await expect(fs.access(path.join(v1Path, "dist/index.js"))).resolves.not.toThrow();
|
|
53
|
+
await expect(fs.access(path.join(v1Path, "dist/index.d.ts"))).resolves.not.toThrow();
|
|
54
|
+
});
|
|
55
|
+
it("should have v2 fixture with correct structure", async () => {
|
|
56
|
+
const v2Path = path.join(FIXTURES_PATH, "@test/sample-lib-v2");
|
|
57
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(v2Path, "package.json"), "utf-8"));
|
|
58
|
+
expect(pkgJson.name).toBe("@test/sample-lib");
|
|
59
|
+
expect(pkgJson.version).toBe("2.0.0");
|
|
60
|
+
// v2 should have more functions
|
|
61
|
+
const indexContent = await fs.readFile(path.join(v2Path, "dist/index.js"), "utf-8");
|
|
62
|
+
expect(indexContent).toContain("multiply");
|
|
63
|
+
expect(indexContent).toContain("subtract");
|
|
64
|
+
});
|
|
65
|
+
it("should have utils-helper fixture", async () => {
|
|
66
|
+
const utilsPath = path.join(FIXTURES_PATH, "utils-helper");
|
|
67
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(utilsPath, "package.json"), "utf-8"));
|
|
68
|
+
expect(pkgJson.name).toBe("utils-helper");
|
|
69
|
+
expect(pkgJson.version).toBe("1.0.0");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("Manual Store Operations", () => {
|
|
73
|
+
it("should create correct directory structure when publishing", async () => {
|
|
74
|
+
// Simulate what publish does manually
|
|
75
|
+
const ns = "global";
|
|
76
|
+
const pkg = "@test/sample-lib";
|
|
77
|
+
const version = "1.0.0";
|
|
78
|
+
const sourcePath = path.join(FIXTURES_PATH, "@test/sample-lib-v1");
|
|
79
|
+
const destPath = getPackagePath(ns, pkg, version);
|
|
80
|
+
// Create namespace directory
|
|
81
|
+
await fs.mkdir(destPath, { recursive: true });
|
|
82
|
+
// Copy files
|
|
83
|
+
const files = ["package.json", "dist/index.js", "dist/index.d.ts"];
|
|
84
|
+
for (const file of files) {
|
|
85
|
+
const src = path.join(sourcePath, file);
|
|
86
|
+
const dest = path.join(destPath, file);
|
|
87
|
+
await fs.mkdir(path.dirname(dest), { recursive: true });
|
|
88
|
+
await fs.copyFile(src, dest);
|
|
89
|
+
}
|
|
90
|
+
// Verify structure
|
|
91
|
+
const expectedStructure = [
|
|
92
|
+
"namespaces/global/@test/sample-lib/1.0.0/package.json",
|
|
93
|
+
"namespaces/global/@test/sample-lib/1.0.0/dist/index.js",
|
|
94
|
+
"namespaces/global/@test/sample-lib/1.0.0/dist/index.d.ts",
|
|
95
|
+
];
|
|
96
|
+
for (const expectedPath of expectedStructure) {
|
|
97
|
+
const fullPath = path.join(TEST_STORE_PATH, expectedPath);
|
|
98
|
+
await expect(fs.access(fullPath)).resolves.not.toThrow();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
it("should support multiple versions of same package", async () => {
|
|
102
|
+
const ns = "global";
|
|
103
|
+
const pkg = "@test/sample-lib";
|
|
104
|
+
// Publish v1
|
|
105
|
+
const v1Source = path.join(FIXTURES_PATH, "@test/sample-lib-v1");
|
|
106
|
+
const v1Dest = getPackagePath(ns, pkg, "1.0.0");
|
|
107
|
+
await fs.mkdir(v1Dest, { recursive: true });
|
|
108
|
+
await fs.copyFile(path.join(v1Source, "package.json"), path.join(v1Dest, "package.json"));
|
|
109
|
+
// Publish v2
|
|
110
|
+
const v2Source = path.join(FIXTURES_PATH, "@test/sample-lib-v2");
|
|
111
|
+
const v2Dest = getPackagePath(ns, pkg, "2.0.0");
|
|
112
|
+
await fs.mkdir(v2Dest, { recursive: true });
|
|
113
|
+
await fs.copyFile(path.join(v2Source, "package.json"), path.join(v2Dest, "package.json"));
|
|
114
|
+
// Verify both versions exist
|
|
115
|
+
const v1PkgJson = JSON.parse(await fs.readFile(path.join(v1Dest, "package.json"), "utf-8"));
|
|
116
|
+
const v2PkgJson = JSON.parse(await fs.readFile(path.join(v2Dest, "package.json"), "utf-8"));
|
|
117
|
+
expect(v1PkgJson.version).toBe("1.0.0");
|
|
118
|
+
expect(v2PkgJson.version).toBe("2.0.0");
|
|
119
|
+
// List versions in directory
|
|
120
|
+
const pkgDir = path.join(getNamespacePath(ns), pkg);
|
|
121
|
+
const versions = await fs.readdir(pkgDir);
|
|
122
|
+
expect(versions).toContain("1.0.0");
|
|
123
|
+
expect(versions).toContain("2.0.0");
|
|
124
|
+
});
|
|
125
|
+
it("should support same package in different namespaces", async () => {
|
|
126
|
+
const pkg = "@test/sample-lib";
|
|
127
|
+
const version = "1.0.0";
|
|
128
|
+
const source = path.join(FIXTURES_PATH, "@test/sample-lib-v1");
|
|
129
|
+
// Publish to global
|
|
130
|
+
const globalDest = getPackagePath("global", pkg, version);
|
|
131
|
+
await fs.mkdir(globalDest, { recursive: true });
|
|
132
|
+
await fs.copyFile(path.join(source, "package.json"), path.join(globalDest, "package.json"));
|
|
133
|
+
// Publish to feature namespace
|
|
134
|
+
const featureDest = getPackagePath("feature-branch", pkg, version);
|
|
135
|
+
await fs.mkdir(featureDest, { recursive: true });
|
|
136
|
+
await fs.copyFile(path.join(source, "package.json"), path.join(featureDest, "package.json"));
|
|
137
|
+
// Verify both namespaces have the package
|
|
138
|
+
await expect(fs.access(path.join(globalDest, "package.json"))).resolves.not.toThrow();
|
|
139
|
+
await expect(fs.access(path.join(featureDest, "package.json"))).resolves.not.toThrow();
|
|
140
|
+
// List namespaces
|
|
141
|
+
const namespaces = await fs.readdir(getNamespacesPath());
|
|
142
|
+
expect(namespaces).toContain("global");
|
|
143
|
+
expect(namespaces).toContain("feature-branch");
|
|
144
|
+
});
|
|
145
|
+
it("should create valid registry.json structure", async () => {
|
|
146
|
+
// Create registry manually
|
|
147
|
+
const registry = {
|
|
148
|
+
version: "1.0.0",
|
|
149
|
+
namespaces: {
|
|
150
|
+
global: {
|
|
151
|
+
created: new Date().toISOString(),
|
|
152
|
+
packages: {
|
|
153
|
+
"@test/sample-lib": {
|
|
154
|
+
versions: {
|
|
155
|
+
"1.0.0": {
|
|
156
|
+
signature: "abc12345",
|
|
157
|
+
published: new Date().toISOString(),
|
|
158
|
+
files: 3,
|
|
159
|
+
},
|
|
160
|
+
"2.0.0": {
|
|
161
|
+
signature: "def67890",
|
|
162
|
+
published: new Date().toISOString(),
|
|
163
|
+
files: 3,
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
"utils-helper": {
|
|
168
|
+
versions: {
|
|
169
|
+
"1.0.0": {
|
|
170
|
+
signature: "ghi11111",
|
|
171
|
+
published: new Date().toISOString(),
|
|
172
|
+
files: 2,
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
"feature-branch": {
|
|
179
|
+
created: new Date().toISOString(),
|
|
180
|
+
packages: {
|
|
181
|
+
"@test/sample-lib": {
|
|
182
|
+
versions: {
|
|
183
|
+
"1.0.0-beta": {
|
|
184
|
+
signature: "jkl22222",
|
|
185
|
+
published: new Date().toISOString(),
|
|
186
|
+
files: 3,
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
await fs.writeFile(getRegistryPath(), JSON.stringify(registry, null, 2));
|
|
195
|
+
// Read and verify
|
|
196
|
+
const readRegistry = JSON.parse(await fs.readFile(getRegistryPath(), "utf-8"));
|
|
197
|
+
expect(readRegistry.version).toBe("1.0.0");
|
|
198
|
+
expect(Object.keys(readRegistry.namespaces)).toHaveLength(2);
|
|
199
|
+
expect(readRegistry.namespaces.global.packages["@test/sample-lib"].versions["1.0.0"]).toBeDefined();
|
|
200
|
+
expect(readRegistry.namespaces.global.packages["@test/sample-lib"].versions["2.0.0"]).toBeDefined();
|
|
201
|
+
expect(readRegistry.namespaces["feature-branch"].packages["@test/sample-lib"].versions["1.0.0-beta"]).toBeDefined();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe("Store Integrity", () => {
|
|
205
|
+
it("should detect orphaned files (files without registry entry)", async () => {
|
|
206
|
+
// Create file on disk without registry entry
|
|
207
|
+
const orphanPath = getPackagePath("global", "orphan-pkg", "1.0.0");
|
|
208
|
+
await fs.mkdir(orphanPath, { recursive: true });
|
|
209
|
+
await fs.writeFile(path.join(orphanPath, "package.json"), JSON.stringify({ name: "orphan-pkg", version: "1.0.0" }));
|
|
210
|
+
// Create empty registry
|
|
211
|
+
const registry = {
|
|
212
|
+
version: "1.0.0",
|
|
213
|
+
namespaces: {
|
|
214
|
+
global: { created: new Date().toISOString(), packages: {} },
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
await fs.writeFile(getRegistryPath(), JSON.stringify(registry, null, 2));
|
|
218
|
+
// Verify orphan exists on disk but not in registry
|
|
219
|
+
await expect(fs.access(orphanPath)).resolves.not.toThrow();
|
|
220
|
+
const readRegistry = JSON.parse(await fs.readFile(getRegistryPath(), "utf-8"));
|
|
221
|
+
expect(readRegistry.namespaces.global.packages["orphan-pkg"]).toBeUndefined();
|
|
222
|
+
});
|
|
223
|
+
it("should detect orphaned registry entries (registry without files)", async () => {
|
|
224
|
+
// Create registry with entry but no files
|
|
225
|
+
const registry = {
|
|
226
|
+
version: "1.0.0",
|
|
227
|
+
namespaces: {
|
|
228
|
+
global: {
|
|
229
|
+
created: new Date().toISOString(),
|
|
230
|
+
packages: {
|
|
231
|
+
"ghost-pkg": {
|
|
232
|
+
versions: {
|
|
233
|
+
"1.0.0": {
|
|
234
|
+
signature: "ghost123",
|
|
235
|
+
published: new Date().toISOString(),
|
|
236
|
+
files: 1,
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
await fs.writeFile(getRegistryPath(), JSON.stringify(registry, null, 2));
|
|
245
|
+
// Verify registry has entry but no files on disk
|
|
246
|
+
const readRegistry = JSON.parse(await fs.readFile(getRegistryPath(), "utf-8"));
|
|
247
|
+
expect(readRegistry.namespaces.global.packages["ghost-pkg"]).toBeDefined();
|
|
248
|
+
const ghostPath = getPackagePath("global", "ghost-pkg", "1.0.0");
|
|
249
|
+
await expect(fs.access(ghostPath)).rejects.toThrow();
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=e2e.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"e2e.spec.js","sourceRoot":"","sources":["../../src/__tests__/e2e.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/integration.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|