artifact-contracts 0.1.0 → 0.2.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/README.md +254 -2
- package/cli-contract.yaml +529 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/orchestrator.d.ts +3 -0
- package/dist/agents/orchestrator.d.ts.map +1 -0
- package/dist/agents/orchestrator.js +109 -0
- package/dist/agents/orchestrator.js.map +1 -0
- package/dist/agents/types.d.ts +21 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/cli/audit.d.ts +12 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +122 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/explain.d.ts +5 -0
- package/dist/cli/explain.d.ts.map +1 -0
- package/dist/cli/explain.js +47 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/list.d.ts +7 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +49 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/resolve.d.ts +5 -0
- package/dist/cli/resolve.d.ts.map +1 -0
- package/dist/cli/resolve.js +21 -0
- package/dist/cli/resolve.js.map +1 -0
- package/dist/cli/validate.d.ts +5 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +36 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/index.d.ts +10 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/lookup.d.ts +12 -0
- package/dist/core/lookup.d.ts.map +1 -0
- package/dist/core/lookup.js +24 -0
- package/dist/core/lookup.js.map +1 -0
- package/dist/core/matcher.d.ts +3 -0
- package/dist/core/matcher.d.ts.map +1 -0
- package/dist/core/matcher.js +14 -0
- package/dist/core/matcher.js.map +1 -0
- package/dist/core/resolver.d.ts +18 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +98 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/schema.d.ts +160 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +69 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/validator.d.ts +16 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +86 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/generated/commands.d.ts +2 -0
- package/dist/generated/commands.d.ts.map +1 -0
- package/dist/generated/commands.js +2 -0
- package/dist/generated/commands.js.map +1 -0
- package/dist/generated/dsl/agents.d.ts +34 -0
- package/dist/generated/dsl/agents.d.ts.map +1 -0
- package/dist/generated/dsl/agents.js +42 -0
- package/dist/generated/dsl/agents.js.map +1 -0
- package/dist/generated/dsl/handoffs.d.ts +339 -0
- package/dist/generated/dsl/handoffs.d.ts.map +1 -0
- package/dist/generated/dsl/handoffs.js +74 -0
- package/dist/generated/dsl/handoffs.js.map +1 -0
- package/dist/generated/dsl/index.d.ts +13 -0
- package/dist/generated/dsl/index.d.ts.map +1 -0
- package/dist/generated/dsl/index.js +10 -0
- package/dist/generated/dsl/index.js.map +1 -0
- package/dist/generated/dsl/tasks.d.ts +23 -0
- package/dist/generated/dsl/tasks.d.ts.map +1 -0
- package/dist/generated/dsl/tasks.js +25 -0
- package/dist/generated/dsl/tasks.js.map +1 -0
- package/dist/generated/dsl/workflows.d.ts +31 -0
- package/dist/generated/dsl/workflows.d.ts.map +1 -0
- package/dist/generated/dsl/workflows.js +32 -0
- package/dist/generated/dsl/workflows.js.map +1 -0
- package/dist/generated/index.d.ts +7 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +7 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/generated/policy.d.ts +146 -0
- package/dist/generated/policy.d.ts.map +1 -0
- package/dist/generated/policy.js +236 -0
- package/dist/generated/policy.js.map +1 -0
- package/dist/generated/program.d.ts +33 -0
- package/dist/generated/program.d.ts.map +1 -0
- package/dist/generated/program.js +92 -0
- package/dist/generated/program.js.map +1 -0
- package/dist/generated/schemas.d.ts +471 -0
- package/dist/generated/schemas.d.ts.map +1 -0
- package/dist/generated/schemas.js +640 -0
- package/dist/generated/schemas.js.map +1 -0
- package/dist/generated/types.d.ts +187 -0
- package/dist/generated/types.d.ts.map +1 -0
- package/dist/generated/types.js +3 -0
- package/dist/generated/types.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -0
- package/package.json +47 -10
- package/schemas/2026A.config.json +47 -0
- package/schemas/2026A.json +116 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import { parse as parseYaml } from "yaml";
|
|
4
|
+
import { ArtifactContractsDocumentSchema, ArtifactContractsConfigSchema, applyDefaults, } from "./schema.js";
|
|
5
|
+
export function loadConfig(configPath) {
|
|
6
|
+
const candidates = configPath
|
|
7
|
+
? [configPath]
|
|
8
|
+
: [
|
|
9
|
+
"artifact-contracts.config.yaml",
|
|
10
|
+
"artifact-contracts.config.yml",
|
|
11
|
+
];
|
|
12
|
+
for (const candidate of candidates) {
|
|
13
|
+
try {
|
|
14
|
+
const content = readFileSync(candidate, "utf-8");
|
|
15
|
+
const raw = parseYaml(content);
|
|
16
|
+
return ArtifactContractsConfigSchema.parse(raw);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
if (configPath)
|
|
20
|
+
throw new Error(`Config file not found: ${configPath}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
export function loadDocument(configPath) {
|
|
26
|
+
const config = loadConfig(configPath);
|
|
27
|
+
const configDir = configPath ? dirname(resolve(configPath)) : process.cwd();
|
|
28
|
+
const inputFiles = config?.input?.files ?? ["artifact-contracts.yaml"];
|
|
29
|
+
const filePath = resolve(configDir, inputFiles[0]);
|
|
30
|
+
let content;
|
|
31
|
+
try {
|
|
32
|
+
content = readFileSync(filePath, "utf-8");
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new Error(`Artifact contracts file not found: ${filePath}`);
|
|
36
|
+
}
|
|
37
|
+
const raw = parseYaml(content);
|
|
38
|
+
const expanded = expandVariables(raw, config?.variables ?? {});
|
|
39
|
+
const document = ArtifactContractsDocumentSchema.parse(expanded);
|
|
40
|
+
return { document, config, configDir };
|
|
41
|
+
}
|
|
42
|
+
function expandVariables(obj, variables) {
|
|
43
|
+
if (typeof obj === "string") {
|
|
44
|
+
const varMatch = obj.match(/^\$\{vars\.(\w+)\}$/);
|
|
45
|
+
if (varMatch) {
|
|
46
|
+
const varName = varMatch[1];
|
|
47
|
+
const value = variables[varName];
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
throw new Error(`Undefined variable: vars.${varName}`);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
return obj.replace(/\$\{vars\.(\w+)\}/g, (_match, varName) => {
|
|
54
|
+
const value = variables[varName];
|
|
55
|
+
if (value === undefined) {
|
|
56
|
+
throw new Error(`Undefined variable: vars.${varName}`);
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(value)) {
|
|
59
|
+
throw new Error(`Array variable vars.${varName} cannot be used in string interpolation`);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (Array.isArray(obj)) {
|
|
65
|
+
const result = [];
|
|
66
|
+
for (const item of obj) {
|
|
67
|
+
const expanded = expandVariables(item, variables);
|
|
68
|
+
if (Array.isArray(expanded)) {
|
|
69
|
+
result.push(...expanded);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
result.push(expanded);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
if (obj !== null && typeof obj === "object") {
|
|
78
|
+
const result = {};
|
|
79
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
80
|
+
result[key] = expandVariables(value, variables);
|
|
81
|
+
}
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
return obj;
|
|
85
|
+
}
|
|
86
|
+
export function resolveDocument(result) {
|
|
87
|
+
const { document } = result;
|
|
88
|
+
const resolved = {};
|
|
89
|
+
for (const [id, def] of Object.entries(document.artifacts)) {
|
|
90
|
+
resolved[id] = applyDefaults(def);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
artifactContracts: document.artifactContracts,
|
|
94
|
+
system: document.system,
|
|
95
|
+
artifacts: resolved,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const ARTIFACT_ID_PATTERN: RegExp;
|
|
3
|
+
export declare const AuthoritySchema: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
4
|
+
export declare const ManualEditSchema: z.ZodEnum<["allowed", "discouraged", "forbidden"]>;
|
|
5
|
+
export declare const ChangeControlSchema: z.ZodEnum<["none", "approval-required", "regeneration-required"]>;
|
|
6
|
+
export declare const VisibilitySchema: z.ZodEnum<["public", "internal", "private"]>;
|
|
7
|
+
export declare const ArtifactDefinitionSchema: z.ZodObject<{
|
|
8
|
+
type: z.ZodString;
|
|
9
|
+
description: z.ZodOptional<z.ZodString>;
|
|
10
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
11
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
12
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
13
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
14
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
15
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
16
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
17
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
18
|
+
type: z.ZodString;
|
|
19
|
+
description: z.ZodOptional<z.ZodString>;
|
|
20
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
21
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
22
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
23
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
24
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
25
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
26
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
27
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
28
|
+
type: z.ZodString;
|
|
29
|
+
description: z.ZodOptional<z.ZodString>;
|
|
30
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
31
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
32
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
33
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
34
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
35
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
36
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
37
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
38
|
+
export declare const SystemSchema: z.ZodObject<{
|
|
39
|
+
id: z.ZodString;
|
|
40
|
+
name: z.ZodOptional<z.ZodString>;
|
|
41
|
+
}, "strip", z.ZodTypeAny, {
|
|
42
|
+
id: string;
|
|
43
|
+
name?: string | undefined;
|
|
44
|
+
}, {
|
|
45
|
+
id: string;
|
|
46
|
+
name?: string | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
export declare const ArtifactContractsDocumentSchema: z.ZodObject<{
|
|
49
|
+
artifactContracts: z.ZodString;
|
|
50
|
+
system: z.ZodObject<{
|
|
51
|
+
id: z.ZodString;
|
|
52
|
+
name: z.ZodOptional<z.ZodString>;
|
|
53
|
+
}, "strip", z.ZodTypeAny, {
|
|
54
|
+
id: string;
|
|
55
|
+
name?: string | undefined;
|
|
56
|
+
}, {
|
|
57
|
+
id: string;
|
|
58
|
+
name?: string | undefined;
|
|
59
|
+
}>;
|
|
60
|
+
artifacts: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
61
|
+
type: z.ZodString;
|
|
62
|
+
description: z.ZodOptional<z.ZodString>;
|
|
63
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
64
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
65
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
66
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
67
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
68
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
69
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
70
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
71
|
+
type: z.ZodString;
|
|
72
|
+
description: z.ZodOptional<z.ZodString>;
|
|
73
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
74
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
75
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
76
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
77
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
78
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
79
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
80
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
81
|
+
type: z.ZodString;
|
|
82
|
+
description: z.ZodOptional<z.ZodString>;
|
|
83
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
84
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
85
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
86
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
87
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
88
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
89
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
90
|
+
}, z.ZodTypeAny, "passthrough">>>;
|
|
91
|
+
}, "strip", z.ZodTypeAny, {
|
|
92
|
+
artifactContracts: string;
|
|
93
|
+
system: {
|
|
94
|
+
id: string;
|
|
95
|
+
name?: string | undefined;
|
|
96
|
+
};
|
|
97
|
+
artifacts: Record<string, z.objectOutputType<{
|
|
98
|
+
type: z.ZodString;
|
|
99
|
+
description: z.ZodOptional<z.ZodString>;
|
|
100
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
101
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
102
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
103
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
104
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
105
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
106
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
107
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
108
|
+
}, {
|
|
109
|
+
artifactContracts: string;
|
|
110
|
+
system: {
|
|
111
|
+
id: string;
|
|
112
|
+
name?: string | undefined;
|
|
113
|
+
};
|
|
114
|
+
artifacts: Record<string, z.objectInputType<{
|
|
115
|
+
type: z.ZodString;
|
|
116
|
+
description: z.ZodOptional<z.ZodString>;
|
|
117
|
+
authority: z.ZodEnum<["canonical", "derived", "generated", "control"]>;
|
|
118
|
+
path_patterns: z.ZodArray<z.ZodString, "many">;
|
|
119
|
+
exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
120
|
+
manual_edit: z.ZodOptional<z.ZodEnum<["allowed", "discouraged", "forbidden"]>>;
|
|
121
|
+
change_control: z.ZodOptional<z.ZodEnum<["none", "approval-required", "regeneration-required"]>>;
|
|
122
|
+
visibility: z.ZodOptional<z.ZodEnum<["public", "internal", "private"]>>;
|
|
123
|
+
states: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
124
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
125
|
+
}>;
|
|
126
|
+
export declare const ConfigVariablesSchema: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
|
|
127
|
+
export declare const ArtifactContractsConfigSchema: z.ZodObject<{
|
|
128
|
+
input: z.ZodOptional<z.ZodObject<{
|
|
129
|
+
files: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
130
|
+
}, "strip", z.ZodTypeAny, {
|
|
131
|
+
files: string[];
|
|
132
|
+
}, {
|
|
133
|
+
files?: string[] | undefined;
|
|
134
|
+
}>>;
|
|
135
|
+
variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>>;
|
|
136
|
+
}, "strip", z.ZodTypeAny, {
|
|
137
|
+
input?: {
|
|
138
|
+
files: string[];
|
|
139
|
+
} | undefined;
|
|
140
|
+
variables?: Record<string, string | string[]> | undefined;
|
|
141
|
+
}, {
|
|
142
|
+
input?: {
|
|
143
|
+
files?: string[] | undefined;
|
|
144
|
+
} | undefined;
|
|
145
|
+
variables?: Record<string, string | string[]> | undefined;
|
|
146
|
+
}>;
|
|
147
|
+
export type Authority = z.infer<typeof AuthoritySchema>;
|
|
148
|
+
export type ManualEdit = z.infer<typeof ManualEditSchema>;
|
|
149
|
+
export type ChangeControl = z.infer<typeof ChangeControlSchema>;
|
|
150
|
+
export type Visibility = z.infer<typeof VisibilitySchema>;
|
|
151
|
+
export type ArtifactDefinition = z.infer<typeof ArtifactDefinitionSchema>;
|
|
152
|
+
export type ArtifactContractsDocument = z.infer<typeof ArtifactContractsDocumentSchema>;
|
|
153
|
+
export type ArtifactContractsConfig = z.infer<typeof ArtifactContractsConfigSchema>;
|
|
154
|
+
export interface ResolvedArtifact extends ArtifactDefinition {
|
|
155
|
+
manual_edit: ManualEdit;
|
|
156
|
+
change_control: ChangeControl;
|
|
157
|
+
visibility: Visibility;
|
|
158
|
+
}
|
|
159
|
+
export declare function applyDefaults(def: ArtifactDefinition): ResolvedArtifact;
|
|
160
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB,QAA6B,CAAC;AAE9D,eAAO,MAAM,eAAe,6DAK1B,CAAC;AAEH,eAAO,MAAM,gBAAgB,oDAI3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,mEAI9B,CAAC;AAEH,eAAO,MAAM,gBAAgB,8CAA4C,CAAC;AAE1E,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAYrB,CAAC;AAEjB,eAAO,MAAM,YAAY;;;;;;;;;EAGvB,CAAC;AAEH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI1C,CAAC;AAEH,eAAO,MAAM,qBAAqB,sFAGjC,CAAC;AAEF,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;EAOxC,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAC7C,OAAO,+BAA+B,CACvC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAC3C,OAAO,6BAA6B,CACrC,CAAC;AAEF,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,WAAW,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC;CACxB;AAeD,wBAAgB,aAAa,CAAC,GAAG,EAAE,kBAAkB,GAAG,gBAAgB,CAQvE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ARTIFACT_ID_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
3
|
+
export const AuthoritySchema = z.enum([
|
|
4
|
+
"canonical",
|
|
5
|
+
"derived",
|
|
6
|
+
"generated",
|
|
7
|
+
"control",
|
|
8
|
+
]);
|
|
9
|
+
export const ManualEditSchema = z.enum([
|
|
10
|
+
"allowed",
|
|
11
|
+
"discouraged",
|
|
12
|
+
"forbidden",
|
|
13
|
+
]);
|
|
14
|
+
export const ChangeControlSchema = z.enum([
|
|
15
|
+
"none",
|
|
16
|
+
"approval-required",
|
|
17
|
+
"regeneration-required",
|
|
18
|
+
]);
|
|
19
|
+
export const VisibilitySchema = z.enum(["public", "internal", "private"]);
|
|
20
|
+
export const ArtifactDefinitionSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
type: z.string().min(1),
|
|
23
|
+
description: z.string().optional(),
|
|
24
|
+
authority: AuthoritySchema,
|
|
25
|
+
path_patterns: z.array(z.string().min(1)).min(1),
|
|
26
|
+
exclude_patterns: z.array(z.string().min(1)).optional(),
|
|
27
|
+
manual_edit: ManualEditSchema.optional(),
|
|
28
|
+
change_control: ChangeControlSchema.optional(),
|
|
29
|
+
visibility: VisibilitySchema.optional(),
|
|
30
|
+
states: z.array(z.string()).optional(),
|
|
31
|
+
})
|
|
32
|
+
.passthrough();
|
|
33
|
+
export const SystemSchema = z.object({
|
|
34
|
+
id: z.string().min(1),
|
|
35
|
+
name: z.string().optional(),
|
|
36
|
+
});
|
|
37
|
+
export const ArtifactContractsDocumentSchema = z.object({
|
|
38
|
+
artifactContracts: z.string().min(1),
|
|
39
|
+
system: SystemSchema,
|
|
40
|
+
artifacts: z.record(z.string(), ArtifactDefinitionSchema),
|
|
41
|
+
});
|
|
42
|
+
export const ConfigVariablesSchema = z.record(z.string(), z.union([z.string(), z.array(z.string())]));
|
|
43
|
+
export const ArtifactContractsConfigSchema = z.object({
|
|
44
|
+
input: z
|
|
45
|
+
.object({
|
|
46
|
+
files: z.array(z.string()).default(["artifact-contracts.yaml"]),
|
|
47
|
+
})
|
|
48
|
+
.optional(),
|
|
49
|
+
variables: ConfigVariablesSchema.optional(),
|
|
50
|
+
});
|
|
51
|
+
const AUTHORITY_DEFAULTS = {
|
|
52
|
+
canonical: { manual_edit: "allowed", change_control: "none" },
|
|
53
|
+
derived: { manual_edit: "forbidden", change_control: "regeneration-required" },
|
|
54
|
+
generated: {
|
|
55
|
+
manual_edit: "forbidden",
|
|
56
|
+
change_control: "regeneration-required",
|
|
57
|
+
},
|
|
58
|
+
control: { manual_edit: "allowed", change_control: "approval-required" },
|
|
59
|
+
};
|
|
60
|
+
export function applyDefaults(def) {
|
|
61
|
+
const defaults = AUTHORITY_DEFAULTS[def.authority];
|
|
62
|
+
return {
|
|
63
|
+
...def,
|
|
64
|
+
manual_edit: def.manual_edit ?? defaults.manual_edit,
|
|
65
|
+
change_control: def.change_control ?? defaults.change_control,
|
|
66
|
+
visibility: def.visibility ?? "internal",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE9D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,WAAW;IACX,SAAS;IACT,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,SAAS;IACT,aAAa;IACb,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACxC,MAAM;IACN,mBAAmB;IACnB,uBAAuB;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,eAAe;IAC1B,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvD,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACxC,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IAC9C,UAAU,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC,MAAM,CAAC;IACtD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,EAAE,YAAY;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAC3C,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC,CAAC;KAChE,CAAC;SACD,QAAQ,EAAE;IACb,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAoBH,MAAM,kBAAkB,GAGpB;IACF,SAAS,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE;IAC7D,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,uBAAuB,EAAE;IAC9E,SAAS,EAAE;QACT,WAAW,EAAE,WAAW;QACxB,cAAc,EAAE,uBAAuB;KACxC;IACD,OAAO,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,mBAAmB,EAAE;CACzE,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,GAAuB;IACnD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO;QACL,GAAG,GAAG;QACN,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;QACpD,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc;QAC7D,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,UAAU;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type LoadResult } from "./resolver.js";
|
|
2
|
+
import { type LookupOverlap } from "./lookup.js";
|
|
3
|
+
export interface Diagnostic {
|
|
4
|
+
path: string;
|
|
5
|
+
message: string;
|
|
6
|
+
severity: "error" | "warning";
|
|
7
|
+
}
|
|
8
|
+
export interface ValidationResult {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
diagnostics: Diagnostic[];
|
|
11
|
+
overlaps: LookupOverlap[];
|
|
12
|
+
}
|
|
13
|
+
export declare function validateDocument(loadResult: LoadResult, options?: {
|
|
14
|
+
checkFiles?: boolean;
|
|
15
|
+
}): Promise<ValidationResult>;
|
|
16
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,gBAAgB,CAAC,CA4D3B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { ARTIFACT_ID_PATTERN, ArtifactContractsDocumentSchema, } from "./schema.js";
|
|
3
|
+
import { resolveDocument } from "./resolver.js";
|
|
4
|
+
import { detectOverlaps } from "./lookup.js";
|
|
5
|
+
export async function validateDocument(loadResult, options = {}) {
|
|
6
|
+
const diagnostics = [];
|
|
7
|
+
const { document } = loadResult;
|
|
8
|
+
const schemaResult = ArtifactContractsDocumentSchema.safeParse(document);
|
|
9
|
+
if (!schemaResult.success) {
|
|
10
|
+
for (const issue of schemaResult.error.issues) {
|
|
11
|
+
diagnostics.push({
|
|
12
|
+
path: issue.path.join("."),
|
|
13
|
+
message: issue.message,
|
|
14
|
+
severity: "error",
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return { valid: false, diagnostics, overlaps: [] };
|
|
18
|
+
}
|
|
19
|
+
for (const id of Object.keys(document.artifacts)) {
|
|
20
|
+
if (!ARTIFACT_ID_PATTERN.test(id)) {
|
|
21
|
+
diagnostics.push({
|
|
22
|
+
path: `artifacts.${id}`,
|
|
23
|
+
message: `Artifact ID "${id}" does not match naming convention: [a-z0-9-]+ (kebab-case)`,
|
|
24
|
+
severity: "error",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (id.includes(".")) {
|
|
28
|
+
diagnostics.push({
|
|
29
|
+
path: `artifacts.${id}`,
|
|
30
|
+
message: `Artifact ID "${id}" contains dots — reserved for future namespace extension`,
|
|
31
|
+
severity: "error",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const [id, def] of Object.entries(document.artifacts)) {
|
|
36
|
+
if (!def.path_patterns || def.path_patterns.length === 0) {
|
|
37
|
+
diagnostics.push({
|
|
38
|
+
path: `artifacts.${id}.path_patterns`,
|
|
39
|
+
message: `Artifact "${id}" has empty path_patterns`,
|
|
40
|
+
severity: "error",
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let overlaps = [];
|
|
45
|
+
if (options.checkFiles) {
|
|
46
|
+
overlaps = await checkFileOverlaps(loadResult);
|
|
47
|
+
for (const overlap of overlaps) {
|
|
48
|
+
diagnostics.push({
|
|
49
|
+
path: overlap.path,
|
|
50
|
+
message: `File "${overlap.path}" matches multiple artifacts: ${overlap.matchingArtifacts.join(", ")}`,
|
|
51
|
+
severity: "error",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
valid: diagnostics.filter((d) => d.severity === "error").length === 0,
|
|
57
|
+
diagnostics,
|
|
58
|
+
overlaps,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
async function checkFileOverlaps(loadResult) {
|
|
62
|
+
const resolved = resolveDocument(loadResult);
|
|
63
|
+
let filePaths;
|
|
64
|
+
try {
|
|
65
|
+
const output = execSync("git ls-files", {
|
|
66
|
+
encoding: "utf-8",
|
|
67
|
+
cwd: loadResult.configDir,
|
|
68
|
+
});
|
|
69
|
+
filePaths = output.trim().split("\n").filter(Boolean);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
try {
|
|
73
|
+
const { globSync } = await import("glob");
|
|
74
|
+
filePaths = globSync("**/*", {
|
|
75
|
+
cwd: loadResult.configDir,
|
|
76
|
+
dot: true,
|
|
77
|
+
nodir: true,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return detectOverlaps(filePaths, resolved.artifacts);
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/generated/commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/generated/commands.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AUTO-GENERATED by agent-contracts-runtime. DO NOT EDIT.
|
|
3
|
+
*
|
|
4
|
+
* Regenerate via: npx agent-runtime generate
|
|
5
|
+
*/
|
|
6
|
+
export interface AgentRule {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly description: string;
|
|
9
|
+
readonly severity: "mandatory" | "recommended" | "optional";
|
|
10
|
+
}
|
|
11
|
+
export interface EscalationCriterion {
|
|
12
|
+
readonly condition: string;
|
|
13
|
+
readonly action: "stop_and_report" | "report_to_architect" | "wait_for_approval";
|
|
14
|
+
}
|
|
15
|
+
export interface AgentContract {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly role_name: string;
|
|
18
|
+
readonly purpose: string;
|
|
19
|
+
readonly mode: "read-write" | "read-only";
|
|
20
|
+
readonly dispatch_only: boolean;
|
|
21
|
+
readonly can_read_artifacts: readonly string[];
|
|
22
|
+
readonly can_write_artifacts: readonly string[];
|
|
23
|
+
readonly can_execute_tools: readonly string[];
|
|
24
|
+
readonly can_invoke_agents: readonly string[];
|
|
25
|
+
readonly can_return_handoffs: readonly string[];
|
|
26
|
+
readonly responsibilities: readonly string[];
|
|
27
|
+
readonly constraints: readonly string[];
|
|
28
|
+
readonly rules: readonly AgentRule[];
|
|
29
|
+
readonly escalation_criteria: readonly EscalationCriterion[];
|
|
30
|
+
}
|
|
31
|
+
export declare const artifactQualityReviewer: AgentContract;
|
|
32
|
+
export declare const agentRegistry: Record<string, AgentContract>;
|
|
33
|
+
export type AgentId = keyof typeof agentRegistry;
|
|
34
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/generated/dsl/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;CAC7D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,mBAAmB,CAAC;CAClF;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC9D;AAED,eAAO,MAAM,uBAAuB,EAAE,aAgC5B,CAAC;AAEX,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAE9C,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,aAAa,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AUTO-GENERATED by agent-contracts-runtime. DO NOT EDIT.
|
|
3
|
+
*
|
|
4
|
+
* Regenerate via: npx agent-runtime generate
|
|
5
|
+
*/
|
|
6
|
+
export const artifactQualityReviewer = {
|
|
7
|
+
id: "artifact-quality-reviewer",
|
|
8
|
+
role_name: "Artifact Quality Reviewer",
|
|
9
|
+
purpose: "Performs semantic quality review of artifact-contracts definitions. Analyzes naming consistency, authority appropriateness, path_patterns coverage, and manual_edit/change_control correctness. Reports structured findings for human or agent consumption.",
|
|
10
|
+
mode: "read-only",
|
|
11
|
+
dispatch_only: false,
|
|
12
|
+
can_read_artifacts: [
|
|
13
|
+
"artifact-definitions",
|
|
14
|
+
"artifact-config"
|
|
15
|
+
],
|
|
16
|
+
can_write_artifacts: [],
|
|
17
|
+
can_execute_tools: [
|
|
18
|
+
"artifact-contracts-cli"
|
|
19
|
+
],
|
|
20
|
+
can_invoke_agents: [],
|
|
21
|
+
can_return_handoffs: [
|
|
22
|
+
"artifact-audit-result"
|
|
23
|
+
],
|
|
24
|
+
responsibilities: [
|
|
25
|
+
"Analyze artifact definitions for naming consistency and conventions",
|
|
26
|
+
"Check authority assignments against artifact types",
|
|
27
|
+
"Identify common file types missing from the registry",
|
|
28
|
+
"Detect potential path_patterns gaps or issues",
|
|
29
|
+
"Recommend appropriate manual_edit and change_control settings"
|
|
30
|
+
],
|
|
31
|
+
constraints: [
|
|
32
|
+
"Never modify artifact definitions or config directly",
|
|
33
|
+
"Base analysis on resolved definitions and loaded config context only",
|
|
34
|
+
"Report findings in the artifact-audit-result handoff schema"
|
|
35
|
+
],
|
|
36
|
+
rules: [],
|
|
37
|
+
escalation_criteria: [],
|
|
38
|
+
};
|
|
39
|
+
export const agentRegistry = {
|
|
40
|
+
"artifact-quality-reviewer": artifactQualityReviewer,
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/generated/dsl/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH,MAAM,CAAC,MAAM,uBAAuB,GAAkB;IACpD,EAAE,EAAE,2BAA2B;IAC/B,SAAS,EAAE,2BAA2B;IACtC,OAAO,EAAE,6PAA6P;IACtQ,IAAI,EAAE,WAAW;IACjB,aAAa,EAAE,KAAK;IACpB,kBAAkB,EAAE;QACpB,sBAAsB;QACtB,iBAAiB;KAClB;IACC,mBAAmB,EAAE,EAAE;IACvB,iBAAiB,EAAE;QACnB,wBAAwB;KACzB;IACC,iBAAiB,EAAE,EAAE;IACrB,mBAAmB,EAAE;QACrB,uBAAuB;KACxB;IACC,gBAAgB,EAAE;QAClB,qEAAqE;QACrE,oDAAoD;QACpD,sDAAsD;QACtD,+CAA+C;QAC/C,+DAA+D;KAChE;IACC,WAAW,EAAE;QACb,sDAAsD;QACtD,sEAAsE;QACtE,6DAA6D;KAC9D;IACC,KAAK,EAAE,EAAE;IACT,mBAAmB,EAAE,EAAE;CACf,CAAC;AAEX,MAAM,CAAC,MAAM,aAAa,GAAkC;IAC1D,2BAA2B,EAAE,uBAAuB;CAC5C,CAAC"}
|