@sdd-method/cli-core 0.1.0
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/LIBRARY_SPEC.md +36 -0
- package/LICENSE +201 -0
- package/NOTICE +17 -0
- package/README.md +67 -0
- package/dist/archetypes/index.d.ts +5 -0
- package/dist/archetypes/index.d.ts.map +1 -0
- package/dist/archetypes/index.js +5 -0
- package/dist/archetypes/index.js.map +1 -0
- package/dist/archetypes/registry.d.ts +12 -0
- package/dist/archetypes/registry.d.ts.map +1 -0
- package/dist/archetypes/registry.js +77 -0
- package/dist/archetypes/registry.js.map +1 -0
- package/dist/archetypes/render.d.ts +29 -0
- package/dist/archetypes/render.d.ts.map +1 -0
- package/dist/archetypes/render.js +110 -0
- package/dist/archetypes/render.js.map +1 -0
- package/dist/archetypes/repo-config.d.ts +30 -0
- package/dist/archetypes/repo-config.d.ts.map +1 -0
- package/dist/archetypes/repo-config.js +44 -0
- package/dist/archetypes/repo-config.js.map +1 -0
- package/dist/archetypes/types.d.ts +31 -0
- package/dist/archetypes/types.d.ts.map +1 -0
- package/dist/archetypes/types.js +2 -0
- package/dist/archetypes/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/list.d.ts +12 -0
- package/dist/list.d.ts.map +1 -0
- package/dist/list.js +64 -0
- package/dist/list.js.map +1 -0
- package/dist/mcp/envelope.d.ts +23 -0
- package/dist/mcp/envelope.d.ts.map +1 -0
- package/dist/mcp/envelope.js +30 -0
- package/dist/mcp/envelope.js.map +1 -0
- package/dist/mcp/index.d.ts +15 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +12 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/lifecycle.d.ts +15 -0
- package/dist/mcp/lifecycle.d.ts.map +1 -0
- package/dist/mcp/lifecycle.js +24 -0
- package/dist/mcp/lifecycle.js.map +1 -0
- package/dist/mcp/sdd-client.d.ts +36 -0
- package/dist/mcp/sdd-client.d.ts.map +1 -0
- package/dist/mcp/sdd-client.js +76 -0
- package/dist/mcp/sdd-client.js.map +1 -0
- package/dist/mcp/types.d.ts +25 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +13 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/pins/artifacts.d.ts +17 -0
- package/dist/pins/artifacts.d.ts.map +1 -0
- package/dist/pins/artifacts.js +12 -0
- package/dist/pins/artifacts.js.map +1 -0
- package/dist/pins/contracts.d.ts +17 -0
- package/dist/pins/contracts.d.ts.map +1 -0
- package/dist/pins/contracts.js +12 -0
- package/dist/pins/contracts.js.map +1 -0
- package/dist/pins/index.d.ts +5 -0
- package/dist/pins/index.d.ts.map +1 -0
- package/dist/pins/index.js +3 -0
- package/dist/pins/index.js.map +1 -0
- package/dist/repo-kind.d.ts +13 -0
- package/dist/repo-kind.d.ts.map +1 -0
- package/dist/repo-kind.js +42 -0
- package/dist/repo-kind.js.map +1 -0
- package/dist/stability/index.d.ts +22 -0
- package/dist/stability/index.d.ts.map +1 -0
- package/dist/stability/index.js +12 -0
- package/dist/stability/index.js.map +1 -0
- package/dist/validate/archetype-metadata-check.d.ts +24 -0
- package/dist/validate/archetype-metadata-check.d.ts.map +1 -0
- package/dist/validate/archetype-metadata-check.js +44 -0
- package/dist/validate/archetype-metadata-check.js.map +1 -0
- package/dist/validate/index.d.ts +5 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +3 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/manifest-check.d.ts +29 -0
- package/dist/validate/manifest-check.d.ts.map +1 -0
- package/dist/validate/manifest-check.js +96 -0
- package/dist/validate/manifest-check.js.map +1 -0
- package/dist/workspace.d.ts +7 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +31 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-kind marker file conventions per ADR 0118 (Partner CLI Role
|
|
3
|
+
* Framework) §6 — every SDD repo carries a `.sdd-repo-kind` marker
|
|
4
|
+
* naming its profile. Adopter code-CLIs read the marker to choose
|
|
5
|
+
* profile-conditional verb shapes.
|
|
6
|
+
*/
|
|
7
|
+
export type Profile = "platform" | "application" | "integration";
|
|
8
|
+
export type RepoKind = "platform-product" | "application-product" | "integration-product";
|
|
9
|
+
export declare const REPO_KIND_FILE = ".sdd-repo-kind";
|
|
10
|
+
export declare function profileFromRepoKind(kind: RepoKind): Profile;
|
|
11
|
+
export declare function isRepoKind(value: string): value is RepoKind;
|
|
12
|
+
export declare function readRepoKind(repoRoot: string): Promise<RepoKind | null>;
|
|
13
|
+
//# sourceMappingURL=repo-kind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-kind.d.ts","sourceRoot":"","sources":["../src/repo-kind.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAAC;AAEjE,MAAM,MAAM,QAAQ,GAChB,kBAAkB,GAClB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAQ/C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE3D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAW7E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-kind marker file conventions per ADR 0118 (Partner CLI Role
|
|
3
|
+
* Framework) §6 — every SDD repo carries a `.sdd-repo-kind` marker
|
|
4
|
+
* naming its profile. Adopter code-CLIs read the marker to choose
|
|
5
|
+
* profile-conditional verb shapes.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
export const REPO_KIND_FILE = ".sdd-repo-kind";
|
|
10
|
+
const PROFILE_BY_REPO_KIND = {
|
|
11
|
+
"platform-product": "platform",
|
|
12
|
+
"application-product": "application",
|
|
13
|
+
"integration-product": "integration",
|
|
14
|
+
};
|
|
15
|
+
export function profileFromRepoKind(kind) {
|
|
16
|
+
return PROFILE_BY_REPO_KIND[kind];
|
|
17
|
+
}
|
|
18
|
+
export function isRepoKind(value) {
|
|
19
|
+
return value in PROFILE_BY_REPO_KIND;
|
|
20
|
+
}
|
|
21
|
+
export async function readRepoKind(repoRoot) {
|
|
22
|
+
const path = join(repoRoot, REPO_KIND_FILE);
|
|
23
|
+
const raw = await tryReadFile(path);
|
|
24
|
+
if (raw === null)
|
|
25
|
+
return null;
|
|
26
|
+
const value = raw.trim();
|
|
27
|
+
if (!isRepoKind(value)) {
|
|
28
|
+
throw new Error(`Unrecognised ${REPO_KIND_FILE} value: ${JSON.stringify(value)} at ${path}`);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
async function tryReadFile(path) {
|
|
33
|
+
try {
|
|
34
|
+
return await readFile(path, "utf8");
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (err.code === "ENOENT")
|
|
38
|
+
return null;
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=repo-kind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-kind.js","sourceRoot":"","sources":["../src/repo-kind.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,MAAM,oBAAoB,GAAwC;IAChE,kBAAkB,EAAE,UAAU;IAC9B,qBAAqB,EAAE,aAAa;IACpC,qBAAqB,EAAE,aAAa;CACrC,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,IAAc;IAChD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,IAAI,oBAAoB,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,gBAAgB,cAAc,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAC5E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stability-class surfacing surface per ADR 0118 §4.5 + ADR 0127.
|
|
3
|
+
*
|
|
4
|
+
* v0.1.0 ships the shape (types + entry point). Runtime implementation
|
|
5
|
+
* is deferred to a later release — adopters implementing stability-class
|
|
6
|
+
* gating today should compose against this shape and provide their own
|
|
7
|
+
* checker until the upstream implementation lands.
|
|
8
|
+
*/
|
|
9
|
+
export interface StabilityContext {
|
|
10
|
+
tier: string;
|
|
11
|
+
pinnedArtefacts: ReadonlyArray<{
|
|
12
|
+
id: string;
|
|
13
|
+
stabilityClass: "provisional" | "locked";
|
|
14
|
+
}>;
|
|
15
|
+
allowProvisional: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface StabilityCheckResult {
|
|
18
|
+
status: "pass" | "refuse" | "warn";
|
|
19
|
+
violations: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function checkStabilityClass(_context: StabilityContext): Promise<StabilityCheckResult>;
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stability/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,aAAa,CAAC;QAC7B,EAAE,EAAE,MAAM,CAAC;QACX,cAAc,EAAE,aAAa,GAAG,QAAQ,CAAC;KAC1C,CAAC,CAAC;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAI/B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stability-class surfacing surface per ADR 0118 §4.5 + ADR 0127.
|
|
3
|
+
*
|
|
4
|
+
* v0.1.0 ships the shape (types + entry point). Runtime implementation
|
|
5
|
+
* is deferred to a later release — adopters implementing stability-class
|
|
6
|
+
* gating today should compose against this shape and provide their own
|
|
7
|
+
* checker until the upstream implementation lands.
|
|
8
|
+
*/
|
|
9
|
+
export async function checkStabilityClass(_context) {
|
|
10
|
+
throw new Error("checkStabilityClass: not implemented in v0.1.0. The stability-class shape is documented per ADR 0118 §4.5 + ADR 0127; runtime implementation lands in a later release.");
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stability/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgBH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAA0B;IAE1B,MAAM,IAAI,KAAK,CACb,wKAAwK,CACzK,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archetype-metadata validator — checks that an archetype-rendered
|
|
3
|
+
* service repo carries the files an adopter expects to find after
|
|
4
|
+
* scaffolding. The default expected-file list covers the common
|
|
5
|
+
* Node + TypeScript shape; adopters with archetypes that produce
|
|
6
|
+
* different layouts (Python services, Go services, etc.) can pass
|
|
7
|
+
* their own `expectedFiles` list.
|
|
8
|
+
*/
|
|
9
|
+
export interface ArchetypeMetadataCheckIssue {
|
|
10
|
+
level: "error" | "warn" | "info";
|
|
11
|
+
message: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ArchetypeMetadataCheckResult {
|
|
14
|
+
serviceRepoPath: string;
|
|
15
|
+
present: boolean;
|
|
16
|
+
ok: boolean;
|
|
17
|
+
issues: ArchetypeMetadataCheckIssue[];
|
|
18
|
+
}
|
|
19
|
+
export interface ArchetypeMetadataCheckOptions {
|
|
20
|
+
/** Files (or directories) expected to exist under the service repo. Defaults to a Node + TypeScript scaffold shape. */
|
|
21
|
+
readonly expectedFiles?: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function checkArchetypeMetadata(serviceRepoPath: string, options?: ArchetypeMetadataCheckOptions): Promise<ArchetypeMetadataCheckResult>;
|
|
24
|
+
//# sourceMappingURL=archetype-metadata-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archetype-metadata-check.d.ts","sourceRoot":"","sources":["../../src/validate/archetype-metadata-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,2BAA2B,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,uHAAuH;IACvH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAQD,wBAAsB,sBAAsB,CAC1C,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,4BAA4B,CAAC,CAoBvC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archetype-metadata validator — checks that an archetype-rendered
|
|
3
|
+
* service repo carries the files an adopter expects to find after
|
|
4
|
+
* scaffolding. The default expected-file list covers the common
|
|
5
|
+
* Node + TypeScript shape; adopters with archetypes that produce
|
|
6
|
+
* different layouts (Python services, Go services, etc.) can pass
|
|
7
|
+
* their own `expectedFiles` list.
|
|
8
|
+
*/
|
|
9
|
+
import { access } from "node:fs/promises";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
const DEFAULT_EXPECTED_FILES = [
|
|
12
|
+
"package.json",
|
|
13
|
+
"tsconfig.json",
|
|
14
|
+
"src",
|
|
15
|
+
];
|
|
16
|
+
export async function checkArchetypeMetadata(serviceRepoPath, options = {}) {
|
|
17
|
+
const expected = options.expectedFiles ?? DEFAULT_EXPECTED_FILES;
|
|
18
|
+
const issues = [];
|
|
19
|
+
const present = await exists(serviceRepoPath);
|
|
20
|
+
if (!present) {
|
|
21
|
+
issues.push({
|
|
22
|
+
level: "info",
|
|
23
|
+
message: "service repo directory not present (normal if not yet scaffolded)",
|
|
24
|
+
});
|
|
25
|
+
return { serviceRepoPath, present: false, ok: true, issues };
|
|
26
|
+
}
|
|
27
|
+
for (const file of expected) {
|
|
28
|
+
if (!(await exists(join(serviceRepoPath, file)))) {
|
|
29
|
+
issues.push({ level: "warn", message: `missing expected ${file}` });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const ok = !issues.some((i) => i.level === "error");
|
|
33
|
+
return { serviceRepoPath, present: true, ok, issues };
|
|
34
|
+
}
|
|
35
|
+
async function exists(p) {
|
|
36
|
+
try {
|
|
37
|
+
await access(p);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=archetype-metadata-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archetype-metadata-check.js","sourceRoot":"","sources":["../../src/validate/archetype-metadata-check.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAmBjC,MAAM,sBAAsB,GAAsB;IAChD,cAAc;IACd,eAAe;IACf,KAAK;CACN,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,eAAuB,EACvB,UAAyC,EAAE;IAE3C,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,IAAI,sBAAsB,CAAC;IACjE,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,mEAAmE;SAC7E,CAAC,CAAC;QACH,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,CAAS;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { checkManifest } from "./manifest-check.js";
|
|
2
|
+
export type { ManifestCheckIssue, ManifestCheckResult, ManifestVocabulary, } from "./manifest-check.js";
|
|
3
|
+
export { checkArchetypeMetadata } from "./archetype-metadata-check.js";
|
|
4
|
+
export type { ArchetypeMetadataCheckIssue, ArchetypeMetadataCheckResult, ArchetypeMetadataCheckOptions, } from "./archetype-metadata-check.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EACV,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest schema validator — checks an SDD repo's `manifest.yaml` (or
|
|
3
|
+
* equivalent) for the canonical fields and shape per ADR 0143 – ADR 0147.
|
|
4
|
+
*
|
|
5
|
+
* The shape checks (string typing, repo pattern `{org}/{repo}`,
|
|
6
|
+
* description length window) are method-defined and universal. The
|
|
7
|
+
* domain + service_type *vocabularies* are adopter-defined — every
|
|
8
|
+
* adopter ships its own controlled vocabulary. To validate against an
|
|
9
|
+
* adopter vocabulary, pass `ManifestVocabulary` with the allowed values;
|
|
10
|
+
* to validate shape only, omit it.
|
|
11
|
+
*/
|
|
12
|
+
export interface ManifestCheckIssue {
|
|
13
|
+
level: "error" | "warn";
|
|
14
|
+
field: string;
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ManifestCheckResult {
|
|
18
|
+
path: string;
|
|
19
|
+
ok: boolean;
|
|
20
|
+
issues: ManifestCheckIssue[];
|
|
21
|
+
}
|
|
22
|
+
export interface ManifestVocabulary {
|
|
23
|
+
/** Allowed values for the `domain` field. If absent, only string typing is checked. */
|
|
24
|
+
readonly domains?: readonly string[];
|
|
25
|
+
/** Allowed values for the `service_type` field. If absent, only string typing is checked. */
|
|
26
|
+
readonly serviceTypes?: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
export declare function checkManifest(manifestPath: string, vocabulary?: ManifestVocabulary): Promise<ManifestCheckResult>;
|
|
29
|
+
//# sourceMappingURL=manifest-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-check.d.ts","sourceRoot":"","sources":["../../src/validate/manifest-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,6FAA6F;IAC7F,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,UAAU,GAAE,kBAAuB,GAClC,OAAO,CAAC,mBAAmB,CAAC,CAkE9B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manifest schema validator — checks an SDD repo's `manifest.yaml` (or
|
|
3
|
+
* equivalent) for the canonical fields and shape per ADR 0143 – ADR 0147.
|
|
4
|
+
*
|
|
5
|
+
* The shape checks (string typing, repo pattern `{org}/{repo}`,
|
|
6
|
+
* description length window) are method-defined and universal. The
|
|
7
|
+
* domain + service_type *vocabularies* are adopter-defined — every
|
|
8
|
+
* adopter ships its own controlled vocabulary. To validate against an
|
|
9
|
+
* adopter vocabulary, pass `ManifestVocabulary` with the allowed values;
|
|
10
|
+
* to validate shape only, omit it.
|
|
11
|
+
*/
|
|
12
|
+
import { readFile } from "node:fs/promises";
|
|
13
|
+
import { parse as parseYaml } from "yaml";
|
|
14
|
+
const REPO_PATTERN = /^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+$/;
|
|
15
|
+
export async function checkManifest(manifestPath, vocabulary = {}) {
|
|
16
|
+
const issues = [];
|
|
17
|
+
let raw;
|
|
18
|
+
try {
|
|
19
|
+
raw = await readFile(manifestPath, "utf8");
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
issues.push({
|
|
23
|
+
level: "error",
|
|
24
|
+
field: "<file>",
|
|
25
|
+
message: `cannot read manifest: ${err.message}`,
|
|
26
|
+
});
|
|
27
|
+
return { path: manifestPath, ok: false, issues };
|
|
28
|
+
}
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = parseYaml(raw);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
issues.push({
|
|
35
|
+
level: "error",
|
|
36
|
+
field: "<yaml>",
|
|
37
|
+
message: `YAML parse error: ${err.message}`,
|
|
38
|
+
});
|
|
39
|
+
return { path: manifestPath, ok: false, issues };
|
|
40
|
+
}
|
|
41
|
+
if (!parsed || typeof parsed !== "object") {
|
|
42
|
+
issues.push({
|
|
43
|
+
level: "error",
|
|
44
|
+
field: "<root>",
|
|
45
|
+
message: "manifest must be an object",
|
|
46
|
+
});
|
|
47
|
+
return { path: manifestPath, ok: false, issues };
|
|
48
|
+
}
|
|
49
|
+
const doc = parsed;
|
|
50
|
+
check(doc, "repo", issues, (value) => {
|
|
51
|
+
if (typeof value !== "string")
|
|
52
|
+
return "must be a string";
|
|
53
|
+
if (!REPO_PATTERN.test(value))
|
|
54
|
+
return "must match {org}/{repo} pattern";
|
|
55
|
+
return null;
|
|
56
|
+
});
|
|
57
|
+
check(doc, "domain", issues, (value) => {
|
|
58
|
+
if (typeof value !== "string")
|
|
59
|
+
return "must be a string";
|
|
60
|
+
if (vocabulary.domains && !vocabulary.domains.includes(value)) {
|
|
61
|
+
return `unknown domain; expected one of: ${vocabulary.domains.join(", ")}`;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
});
|
|
65
|
+
check(doc, "service_type", issues, (value) => {
|
|
66
|
+
if (typeof value !== "string")
|
|
67
|
+
return "must be a string";
|
|
68
|
+
if (vocabulary.serviceTypes &&
|
|
69
|
+
!vocabulary.serviceTypes.includes(value)) {
|
|
70
|
+
return `unknown service_type; expected one of: ${vocabulary.serviceTypes.join(", ")}`;
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
});
|
|
74
|
+
check(doc, "description", issues, (value) => {
|
|
75
|
+
if (typeof value !== "string")
|
|
76
|
+
return "must be a string";
|
|
77
|
+
if (value.length < 10)
|
|
78
|
+
return "must be at least 10 characters";
|
|
79
|
+
if (value.length > 500)
|
|
80
|
+
return "must be at most 500 characters";
|
|
81
|
+
return null;
|
|
82
|
+
});
|
|
83
|
+
const ok = !issues.some((i) => i.level === "error");
|
|
84
|
+
return { path: manifestPath, ok, issues };
|
|
85
|
+
}
|
|
86
|
+
function check(doc, field, issues, validator) {
|
|
87
|
+
if (!(field in doc)) {
|
|
88
|
+
issues.push({ level: "error", field, message: "required field missing" });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const err = validator(doc[field]);
|
|
92
|
+
if (err) {
|
|
93
|
+
issues.push({ level: "error", field, message: err });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=manifest-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-check.js","sourceRoot":"","sources":["../../src/validate/manifest-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAqBxD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAAoB,EACpB,aAAiC,EAAE;IAEnC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,yBAA0B,GAAa,CAAC,OAAO,EAAE;SAC3D,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,qBAAsB,GAAa,CAAC,OAAO,EAAE;SACvD,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,4BAA4B;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAE9C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,kBAAkB,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,iCAAiC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QACrC,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,kBAAkB,CAAC;QACzD,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,OAAO,oCAAoC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,kBAAkB,CAAC;QACzD,IACE,UAAU,CAAC,YAAY;YACvB,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EACxC,CAAC;YACD,OAAO,0CAA0C,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,kBAAkB,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE;YAAE,OAAO,gCAAgC,CAAC;QAC/D,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,gCAAgC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,KAAK,CACZ,GAA4B,EAC5B,KAAa,EACb,MAA4B,EAC5B,SAA4C;IAE5C,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAClC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace-root discovery — walks up from a starting directory to find
|
|
3
|
+
* the nearest SDD repo (one carrying the `.sdd-repo-kind` marker).
|
|
4
|
+
* Implements the sibling-SDD layout convention from ADR 0045.
|
|
5
|
+
*/
|
|
6
|
+
export declare function findSddRoot(startDir: string): Promise<string | null>;
|
|
7
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAY1E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace-root discovery — walks up from a starting directory to find
|
|
3
|
+
* the nearest SDD repo (one carrying the `.sdd-repo-kind` marker).
|
|
4
|
+
* Implements the sibling-SDD layout convention from ADR 0045.
|
|
5
|
+
*/
|
|
6
|
+
import { access } from "node:fs/promises";
|
|
7
|
+
import { dirname, join, resolve } from "node:path";
|
|
8
|
+
import { REPO_KIND_FILE } from "./repo-kind.js";
|
|
9
|
+
export async function findSddRoot(startDir) {
|
|
10
|
+
let current = resolve(startDir);
|
|
11
|
+
while (true) {
|
|
12
|
+
if (await markerExists(current)) {
|
|
13
|
+
return current;
|
|
14
|
+
}
|
|
15
|
+
const parent = dirname(current);
|
|
16
|
+
if (parent === current) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
current = parent;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function markerExists(dir) {
|
|
23
|
+
try {
|
|
24
|
+
await access(join(dir, REPO_KIND_FILE));
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sdd-method/cli-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Upstream shared TypeScript/Node core for SDD adopter partner-cli and platform-cli binaries. Implements the method-defined surfaces (archetypes, stability, pins, MCP envelope/lifecycle/sdd-client, workspace/repo-kind discovery, manifest + archetype-metadata validation) that recur across every SDD adopter's code-CLI pair per ADR 0118 + ADR 0120 + ADR 0127. Scope locked in ADR 0152.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"sdd-method",
|
|
7
|
+
"sdd",
|
|
8
|
+
"spec-driven-development",
|
|
9
|
+
"cli-core",
|
|
10
|
+
"partner-cli",
|
|
11
|
+
"platform-cli"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/tomfosteruk/sdd-cli-core#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/tomfosteruk/sdd-cli-core/issues"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/tomfosteruk/sdd-cli-core.git"
|
|
20
|
+
},
|
|
21
|
+
"license": "Apache-2.0",
|
|
22
|
+
"author": "Tom Foster",
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": "./dist/index.js",
|
|
28
|
+
"./archetypes": "./dist/archetypes/index.js",
|
|
29
|
+
"./stability": "./dist/stability/index.js",
|
|
30
|
+
"./pins": "./dist/pins/index.js",
|
|
31
|
+
"./pins/contracts": "./dist/pins/contracts.js",
|
|
32
|
+
"./pins/artifacts": "./dist/pins/artifacts.js",
|
|
33
|
+
"./mcp": "./dist/mcp/index.js",
|
|
34
|
+
"./validate": "./dist/validate/index.js"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LIBRARY_SPEC.md",
|
|
40
|
+
"LICENSE",
|
|
41
|
+
"NOTICE"
|
|
42
|
+
],
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"test": "npm run build && vitest run",
|
|
47
|
+
"test:watch": "vitest",
|
|
48
|
+
"prepublishOnly": "npm run build"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.0.0",
|
|
52
|
+
"typescript": "^5.5.0",
|
|
53
|
+
"vitest": "^2.0.0"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=20.0.0"
|
|
57
|
+
},
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
63
|
+
"yaml": "^2.5.0",
|
|
64
|
+
"zod": "^4.3.6"
|
|
65
|
+
}
|
|
66
|
+
}
|