@micelio/eslint-config 0.0.0-stage → 0.1.1
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/LICENSE +16 -0
- package/README.md +31 -2
- package/dist/index.d.ts +32 -0
- package/dist/index.js +79 -0
- package/dist/lint-standard.d.ts +2 -0
- package/dist/lint-standard.js +11 -0
- package/dist/standard.d.ts +34 -0
- package/dist/standard.js +82 -0
- package/licenses.json +24 -0
- package/package.json +51 -4
- package/standard-hashes.json +3 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
MIT No Attribution
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alejandro Ramirez Garcia and the Micelio contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
|
6
|
+
software and associated documentation files (the "Software"), to deal in the Software
|
|
7
|
+
without restriction, including without limitation the rights to use, copy, modify, merge,
|
|
8
|
+
publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
|
9
|
+
to whom the Software is furnished to do so.
|
|
10
|
+
|
|
11
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
12
|
+
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
|
13
|
+
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
|
14
|
+
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
15
|
+
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
16
|
+
DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @micelio/eslint-config
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The ESLint flat config of the Micelio repositories (sections 4 and 15 of the
|
|
4
|
+
engineering standard) and the licence allowlist that `npm run lint:licenses` reads.
|
|
5
|
+
|
|
6
|
+
```js
|
|
7
|
+
// eslint.config.js
|
|
8
|
+
import micelio from '@micelio/eslint-config'
|
|
9
|
+
|
|
10
|
+
export default [...micelio, { ignores: ['generated/**'] }]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
It extends `typescript-eslint`'s recommended rules and `eslint-config-prettier`, bans
|
|
14
|
+
promise chains and `console.log` (except in `scripts/`), and in `.ts` files requires
|
|
15
|
+
typed module boundaries (`explicit-module-boundary-types`), valid TSDoc (`tsdoc/syntax`) and a doc
|
|
16
|
+
comment on every public export (`jsdoc/require-jsdoc`). `eslint` and `typescript` are
|
|
17
|
+
peer dependencies. A flat-config override of `no-restricted-syntax` replaces the option
|
|
18
|
+
list, so a repository that adds selectors spreads `promiseChainRestriction` back in.
|
|
19
|
+
|
|
20
|
+
## Licence allowlist
|
|
21
|
+
|
|
22
|
+
`@micelio/eslint-config/licenses.json` holds `allowed`, `allowedPrefixes` and
|
|
23
|
+
`allowedGpl2`: the SPDX identifiers a production dependency may carry (ADR 0007). The
|
|
24
|
+
repository's `lint:licenses` script reads it and evaluates SPDX expressions against it.
|
|
25
|
+
|
|
26
|
+
## `lint:standard`
|
|
27
|
+
|
|
28
|
+
`micelio-lint-standard` checks that `docs/engineering-standard.md` is the copy published for the
|
|
29
|
+
version `AGENTS.md` pins (`` `standard: X.Y` ``), using the SHA-256 hashes in
|
|
30
|
+
`@micelio/eslint-config/standard-hashes.json`. Add it as `"lint:standard": "micelio-lint-standard"`
|
|
31
|
+
and to `npm run check`. A pinned version newer than the installed package knows fails with a message
|
|
32
|
+
that says to upgrade the package.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Linter } from 'eslint';
|
|
2
|
+
/**
|
|
3
|
+
* The `no-restricted-syntax` entry that bans `.then()`, `.catch()` and `.finally()` chains.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* A flat-config override of `no-restricted-syntax` replaces the whole option list, so a
|
|
7
|
+
* repository that adds its own selectors spreads this one back in:
|
|
8
|
+
* `['error', promiseChainRestriction, { selector: '…', message: '…' }]`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const promiseChainRestriction: {
|
|
11
|
+
readonly selector: "CallExpression[callee.type='MemberExpression'][callee.property.name=/^(then|catch|finally)$/]";
|
|
12
|
+
readonly message: "No promise chains: use await with try/catch (AGENTS.md, Async code).";
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The ESLint flat config shared by every Micelio repository (standard, sections 4 and 15).
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* It extends `typescript-eslint`'s recommended rules, turns off the rules Prettier owns,
|
|
19
|
+
* bans promise chains and `console.log` (outside `scripts/`) and, in `.ts` files, requires
|
|
20
|
+
* typed module boundaries, valid TSDoc (`tsdoc/syntax`) and a doc comment on every public export
|
|
21
|
+
* (`jsdoc/require-jsdoc`). Spread it in the repository's
|
|
22
|
+
* `eslint.config.js` and add the repository's own entries after it.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import micelio from '@micelio/eslint-config';
|
|
27
|
+
*
|
|
28
|
+
* export default [...micelio, { ignores: ['generated/**'] }];
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare const config: Linter.Config[];
|
|
32
|
+
export default config;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { defineConfig } from 'eslint/config';
|
|
2
|
+
import eslintConfigPrettier from 'eslint-config-prettier';
|
|
3
|
+
import jsdoc from 'eslint-plugin-jsdoc';
|
|
4
|
+
import tsdoc from 'eslint-plugin-tsdoc';
|
|
5
|
+
import tseslint from 'typescript-eslint';
|
|
6
|
+
/** Message shown when code chains a promise instead of awaiting it. */
|
|
7
|
+
const PROMISE_CHAIN_MESSAGE = 'No promise chains: use await with try/catch (AGENTS.md, Async code).';
|
|
8
|
+
/**
|
|
9
|
+
* The `no-restricted-syntax` entry that bans `.then()`, `.catch()` and `.finally()` chains.
|
|
10
|
+
*
|
|
11
|
+
* @remarks
|
|
12
|
+
* A flat-config override of `no-restricted-syntax` replaces the whole option list, so a
|
|
13
|
+
* repository that adds its own selectors spreads this one back in:
|
|
14
|
+
* `['error', promiseChainRestriction, { selector: '…', message: '…' }]`.
|
|
15
|
+
*/
|
|
16
|
+
export const promiseChainRestriction = {
|
|
17
|
+
selector: "CallExpression[callee.type='MemberExpression'][callee.property.name=/^(then|catch|finally)$/]",
|
|
18
|
+
message: PROMISE_CHAIN_MESSAGE,
|
|
19
|
+
};
|
|
20
|
+
/** Files that never need a doc comment: declarations, build output and tests. */
|
|
21
|
+
const UNDOCUMENTED_FILES = ['**/*.d.ts', 'dist/**', 'test/**', 'tests/**', 'e2e/**', '**/*.test.ts'];
|
|
22
|
+
/**
|
|
23
|
+
* The ESLint flat config shared by every Micelio repository (standard, sections 4 and 15).
|
|
24
|
+
*
|
|
25
|
+
* @remarks
|
|
26
|
+
* It extends `typescript-eslint`'s recommended rules, turns off the rules Prettier owns,
|
|
27
|
+
* bans promise chains and `console.log` (outside `scripts/`) and, in `.ts` files, requires
|
|
28
|
+
* typed module boundaries, valid TSDoc (`tsdoc/syntax`) and a doc comment on every public export
|
|
29
|
+
* (`jsdoc/require-jsdoc`). Spread it in the repository's
|
|
30
|
+
* `eslint.config.js` and add the repository's own entries after it.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* import micelio from '@micelio/eslint-config';
|
|
35
|
+
*
|
|
36
|
+
* export default [...micelio, { ignores: ['generated/**'] }];
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
const config = defineConfig({
|
|
40
|
+
ignores: ['dist/', 'build/', 'coverage/', 'node_modules/', '.tmp/', '.cache/'],
|
|
41
|
+
}, tseslint.configs.recommended, eslintConfigPrettier, {
|
|
42
|
+
files: ['**/*.ts', '**/*.js', '**/*.mjs'],
|
|
43
|
+
languageOptions: {
|
|
44
|
+
ecmaVersion: 2023,
|
|
45
|
+
sourceType: 'module',
|
|
46
|
+
},
|
|
47
|
+
rules: {
|
|
48
|
+
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
|
|
49
|
+
'no-restricted-syntax': ['error', promiseChainRestriction],
|
|
50
|
+
'no-console': ['error', { allow: ['warn', 'error'] }],
|
|
51
|
+
},
|
|
52
|
+
}, {
|
|
53
|
+
// Scripts talk to the terminal (standard, section 4, "Errors and logging")
|
|
54
|
+
files: ['scripts/**', '.claude/skills/**/scripts/**'],
|
|
55
|
+
rules: { 'no-console': 'off' },
|
|
56
|
+
}, {
|
|
57
|
+
files: ['**/*.ts'],
|
|
58
|
+
ignores: UNDOCUMENTED_FILES,
|
|
59
|
+
plugins: { tsdoc, jsdoc },
|
|
60
|
+
rules: {
|
|
61
|
+
// Exported functions declare their parameter and return types (standard, section 4)
|
|
62
|
+
'@typescript-eslint/explicit-module-boundary-types': 'error',
|
|
63
|
+
'tsdoc/syntax': 'error',
|
|
64
|
+
'jsdoc/require-jsdoc': [
|
|
65
|
+
'error',
|
|
66
|
+
{
|
|
67
|
+
publicOnly: true,
|
|
68
|
+
require: { FunctionDeclaration: true, ClassDeclaration: true },
|
|
69
|
+
contexts: [
|
|
70
|
+
'ExportNamedDeclaration > TSInterfaceDeclaration',
|
|
71
|
+
'ExportNamedDeclaration > TSTypeAliasDeclaration',
|
|
72
|
+
'ExportNamedDeclaration > TSEnumDeclaration',
|
|
73
|
+
'ExportNamedDeclaration > VariableDeclaration',
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
export default config;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { lintStandard } from './standard.js';
|
|
3
|
+
// `micelio-lint-standard [root]`: the `lint:standard` script of every Micelio repository.
|
|
4
|
+
const result = lintStandard(process.argv[2] ?? process.cwd());
|
|
5
|
+
if (result.ok) {
|
|
6
|
+
process.stdout.write(`${result.message}\n`);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
console.error(`error: ${result.message}`);
|
|
10
|
+
process.exitCode = 1;
|
|
11
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Where every Micelio repository keeps its copy of the standard. */
|
|
2
|
+
export declare const STANDARD_PATH = "docs/engineering-standard.md";
|
|
3
|
+
/** The SHA-256 of each released version of the standard, by `major.minor`. */
|
|
4
|
+
export type StandardHashes = Record<string, string>;
|
|
5
|
+
/** What `lintStandard` found. */
|
|
6
|
+
export interface StandardResult {
|
|
7
|
+
/** True when the local copy is the one published for the pinned version. */
|
|
8
|
+
ok: boolean;
|
|
9
|
+
/** One line for the terminal, naming the pinned version. */
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
/** Hex SHA-256 of the bytes of a file. */
|
|
13
|
+
export declare function hashOf(content: Buffer | string): string;
|
|
14
|
+
/** Reads the version a repository pins in its `AGENTS.md`, or `null` when there is no pin. */
|
|
15
|
+
export declare function readPin(agents: string): string | null;
|
|
16
|
+
/**
|
|
17
|
+
* Rewrites the pin of an `AGENTS.md`, and the sentence that repeats it, to `version`.
|
|
18
|
+
*
|
|
19
|
+
* @returns The new text, or `null` when `agents` has no pin to rewrite.
|
|
20
|
+
*/
|
|
21
|
+
export declare function setPin(agents: string, version: string): string | null;
|
|
22
|
+
/** Reads the version a copy of the standard says it is, or `null` when its header is missing. */
|
|
23
|
+
export declare function standardVersion(standard: string): string | null;
|
|
24
|
+
/** Loads the hashes bundled in this package. */
|
|
25
|
+
export declare function loadHashes(): StandardHashes;
|
|
26
|
+
/**
|
|
27
|
+
* Checks that the copy of the standard in `root` is the one published for the version its
|
|
28
|
+
* `AGENTS.md` pins (standard, section 16). A repository may pin an older version on purpose:
|
|
29
|
+
* the pinned one is checked, not the latest.
|
|
30
|
+
*
|
|
31
|
+
* @param root - The repository root.
|
|
32
|
+
* @param hashes - The published hashes; the ones bundled in this package by default.
|
|
33
|
+
*/
|
|
34
|
+
export declare function lintStandard(root: string, hashes?: StandardHashes): StandardResult;
|
package/dist/standard.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/** Where every Micelio repository keeps its copy of the standard. */
|
|
5
|
+
export const STANDARD_PATH = 'docs/engineering-standard.md';
|
|
6
|
+
/** The machine-readable pin in `AGENTS.md`: the version in backticks after `standard:`. */
|
|
7
|
+
const PIN = /(`standard:\s*)(\d+\.\d+)(`)/;
|
|
8
|
+
/** The sentence of `AGENTS.md` that says the same in words, kept in step with the pin. */
|
|
9
|
+
const PIN_IN_WORDS = /(follows standard version )(\d+\.\d+)/;
|
|
10
|
+
/** The version line of the standard itself: `Version 1.4 (2026-10-20).` */
|
|
11
|
+
const HEADER = /^Version (\d+\.\d+) /m;
|
|
12
|
+
/** Hex SHA-256 of the bytes of a file. */
|
|
13
|
+
export function hashOf(content) {
|
|
14
|
+
return createHash('sha256').update(content).digest('hex');
|
|
15
|
+
}
|
|
16
|
+
/** Reads the version a repository pins in its `AGENTS.md`, or `null` when there is no pin. */
|
|
17
|
+
export function readPin(agents) {
|
|
18
|
+
return PIN.exec(agents)?.[2] ?? null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Rewrites the pin of an `AGENTS.md`, and the sentence that repeats it, to `version`.
|
|
22
|
+
*
|
|
23
|
+
* @returns The new text, or `null` when `agents` has no pin to rewrite.
|
|
24
|
+
*/
|
|
25
|
+
export function setPin(agents, version) {
|
|
26
|
+
if (!PIN.test(agents))
|
|
27
|
+
return null;
|
|
28
|
+
return agents.replace(PIN, `$1${version}$3`).replace(PIN_IN_WORDS, `$1${version}`);
|
|
29
|
+
}
|
|
30
|
+
/** Reads the version a copy of the standard says it is, or `null` when its header is missing. */
|
|
31
|
+
export function standardVersion(standard) {
|
|
32
|
+
return HEADER.exec(standard)?.[1] ?? null;
|
|
33
|
+
}
|
|
34
|
+
/** Loads the hashes bundled in this package. */
|
|
35
|
+
export function loadHashes() {
|
|
36
|
+
const file = new URL('../standard-hashes.json', import.meta.url);
|
|
37
|
+
return JSON.parse(readFileSync(file, 'utf8'));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks that the copy of the standard in `root` is the one published for the version its
|
|
41
|
+
* `AGENTS.md` pins (standard, section 16). A repository may pin an older version on purpose:
|
|
42
|
+
* the pinned one is checked, not the latest.
|
|
43
|
+
*
|
|
44
|
+
* @param root - The repository root.
|
|
45
|
+
* @param hashes - The published hashes; the ones bundled in this package by default.
|
|
46
|
+
*/
|
|
47
|
+
export function lintStandard(root, hashes = loadHashes()) {
|
|
48
|
+
const agentsPath = join(root, 'AGENTS.md');
|
|
49
|
+
if (!existsSync(agentsPath)) {
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
message: 'AGENTS.md is missing: it pins the standard version (`standard: X.Y`).',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const pin = readPin(readFileSync(agentsPath, 'utf8'));
|
|
56
|
+
if (!pin) {
|
|
57
|
+
return {
|
|
58
|
+
ok: false,
|
|
59
|
+
message: 'AGENTS.md pins no standard version: add `standard: X.Y` (section 16).',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const copyPath = join(root, STANDARD_PATH);
|
|
63
|
+
if (!existsSync(copyPath)) {
|
|
64
|
+
return { ok: false, message: `${STANDARD_PATH} is missing; AGENTS.md pins standard ${pin}.` };
|
|
65
|
+
}
|
|
66
|
+
const expected = hashes[pin];
|
|
67
|
+
if (!expected) {
|
|
68
|
+
const known = Object.keys(hashes).join(', ');
|
|
69
|
+
return {
|
|
70
|
+
ok: false,
|
|
71
|
+
message: `Standard ${pin}, pinned in AGENTS.md, is unknown to this version of @micelio/eslint-config (it knows ${known}): upgrade the package or fix the pin.`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const actual = hashOf(readFileSync(copyPath));
|
|
75
|
+
if (actual !== expected) {
|
|
76
|
+
return {
|
|
77
|
+
ok: false,
|
|
78
|
+
message: `${STANDARD_PATH} does not match standard ${pin}, the version AGENTS.md pins (sha256 ${actual}, published ${expected}). Restore it, or sync it from bogd3v/micelio-engineering.`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return { ok: true, message: `Standard ${pin}: ${STANDARD_PATH} matches the published copy.` };
|
|
82
|
+
}
|
package/licenses.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Licences a production dependency may carry (ADR 0007, AGPL-3.0-only). SPDX expressions are judged by the repository's lint:licenses script: OR passes if one side is allowed, AND needs all, `X WITH exception` is judged by X. Dev-only dependencies are not distributed and only warn.",
|
|
3
|
+
"allowed": [
|
|
4
|
+
"MIT",
|
|
5
|
+
"ISC",
|
|
6
|
+
"BSD-2-Clause",
|
|
7
|
+
"BSD-3-Clause",
|
|
8
|
+
"0BSD",
|
|
9
|
+
"Apache-2.0",
|
|
10
|
+
"MPL-2.0",
|
|
11
|
+
"CC0-1.0",
|
|
12
|
+
"MIT-0",
|
|
13
|
+
"CC-BY-3.0",
|
|
14
|
+
"CC-BY-4.0",
|
|
15
|
+
"Unlicense",
|
|
16
|
+
"BlueOak-1.0.0",
|
|
17
|
+
"Python-2.0",
|
|
18
|
+
"Zlib",
|
|
19
|
+
"OFL-1.1",
|
|
20
|
+
"WTFPL"
|
|
21
|
+
],
|
|
22
|
+
"allowedPrefixes": ["LGPL-", "GPL-3.0", "AGPL-3.0"],
|
|
23
|
+
"allowedGpl2": ["GPL-2.0-or-later", "GPL-2.0+"]
|
|
24
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@micelio/eslint-config",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "The ESLint flat config of the Micelio repositories, the licence allowlist behind lint:licenses and lint:standard.",
|
|
5
|
+
"license": "MIT-0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/bogd3v/micelio-engineering.git",
|
|
9
|
+
"directory": "packages/eslint-config"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./licenses.json": "./licenses.json",
|
|
20
|
+
"./package.json": "./package.json",
|
|
21
|
+
"./standard-hashes.json": "./standard-hashes.json"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"licenses.json",
|
|
26
|
+
"standard-hashes.json",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=22.12"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"eslint-config-prettier": "^10.1.8",
|
|
35
|
+
"eslint-plugin-jsdoc": "^65.3.6",
|
|
36
|
+
"eslint-plugin-tsdoc": "0.5.4",
|
|
37
|
+
"typescript-eslint": "^8.71.2"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"eslint": "^10.12.0",
|
|
41
|
+
"typescript": "^5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public",
|
|
45
|
+
"provenance": true
|
|
46
|
+
},
|
|
47
|
+
"bin": {
|
|
48
|
+
"micelio-lint-standard": "./dist/lint-standard.js"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.20.5"
|
|
52
|
+
}
|
|
53
|
+
}
|