declapract-typescript-ehmpathy 0.47.11 → 0.47.13
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.
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# rhachet prod-deps bad practice
|
|
2
|
+
|
|
3
|
+
## what
|
|
4
|
+
|
|
5
|
+
detects `rhachet` and `rhachet-roles-*` packages listed as production dependencies and moves them to devDependencies.
|
|
6
|
+
|
|
7
|
+
## why
|
|
8
|
+
|
|
9
|
+
rhachet packages are build-time / development tooling only. they should never be shipped as production dependencies because:
|
|
10
|
+
|
|
11
|
+
1. **no runtime usage** — rhachet is used for agent role management, skill linking, and development workflows. none of this runs at runtime in production.
|
|
12
|
+
|
|
13
|
+
2. **bloated bundles** — including rhachet in prod deps unnecessarily inflates `node_modules` for deployed applications.
|
|
14
|
+
|
|
15
|
+
3. **dependency hygiene** — packages that are only used during development belong in `devDependencies`. at worst, if downstream packages need them, they should be declared as `peerDependencies`.
|
|
16
|
+
|
|
17
|
+
## packages covered
|
|
18
|
+
|
|
19
|
+
- `rhachet`
|
|
20
|
+
- `rhachet-roles-*` (e.g., `rhachet-roles-ehmpathy`, `rhachet-roles-bhrain`, `rhachet-roles-bhuild`)
|
|
21
|
+
|
|
22
|
+
## fix
|
|
23
|
+
|
|
24
|
+
moves all matching packages from `dependencies` to `devDependencies`, preserving their versions.
|
|
25
|
+
|
|
26
|
+
## correct placement
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"rhachet": "^1.19.0",
|
|
32
|
+
"rhachet-roles-ehmpathy": "^1.15.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
or, if downstream packages need to use them:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"rhachet": ">=1.0.0"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
never:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"rhachet": "^1.19.0"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { FileCheckFunction, FileFixFunction } from 'declapract';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* .what = detects rhachet and rhachet-roles-* packages in production dependencies
|
|
5
|
+
* .why = these packages should be devDependencies or peerDependencies, never direct prod deps
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const rhachetPackagePattern = /^rhachet(-roles-.*)?$/;
|
|
9
|
+
|
|
10
|
+
export const check: FileCheckFunction = (contents) => {
|
|
11
|
+
if (!contents) throw new Error('does not match bad practice');
|
|
12
|
+
|
|
13
|
+
const packageJSON = JSON.parse(contents);
|
|
14
|
+
const prodDeps = Object.keys(packageJSON.dependencies ?? {});
|
|
15
|
+
|
|
16
|
+
// check if any rhachet package is in prod dependencies
|
|
17
|
+
const rhachetInProdDeps = prodDeps.some((dep) =>
|
|
18
|
+
rhachetPackagePattern.test(dep),
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (rhachetInProdDeps) return; // matches bad practice
|
|
22
|
+
throw new Error('does not match bad practice');
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const fix: FileFixFunction = (contents) => {
|
|
26
|
+
if (!contents) return { contents };
|
|
27
|
+
|
|
28
|
+
const packageJSON = JSON.parse(contents);
|
|
29
|
+
const prodDeps = { ...packageJSON.dependencies };
|
|
30
|
+
const devDeps = { ...packageJSON.devDependencies };
|
|
31
|
+
|
|
32
|
+
// find all rhachet packages in prod deps and move them to dev deps
|
|
33
|
+
for (const dep of Object.keys(prodDeps)) {
|
|
34
|
+
if (rhachetPackagePattern.test(dep)) {
|
|
35
|
+
devDeps[dep] = prodDeps[dep];
|
|
36
|
+
delete prodDeps[dep];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const fixedPackageJSON = {
|
|
41
|
+
...packageJSON,
|
|
42
|
+
dependencies: Object.keys(prodDeps).length > 0 ? prodDeps : undefined,
|
|
43
|
+
devDependencies: Object.keys(devDeps).length > 0 ? devDeps : undefined,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return { contents: JSON.stringify(fixedPackageJSON, null, 2) };
|
|
47
|
+
};
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "declapract-typescript-ehmpathy",
|
|
3
3
|
"author": "ehmpathy",
|
|
4
4
|
"description": "declapract best practices declarations for typescript",
|
|
5
|
-
"version": "0.47.
|
|
5
|
+
"version": "0.47.13",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "src/index.js",
|
|
8
8
|
"repository": "ehmpathy/declapract-typescript-ehmpathy",
|