@harness-engineering/cli 1.21.0 → 1.22.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/dist/agents/skills/claude-code/cleanup-dead-code/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/detect-doc-drift/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/enforce-architecture/skill.yaml +13 -0
- package/dist/agents/skills/claude-code/harness-code-review/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/harness-codebase-cleanup/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/harness-debugging/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/harness-dependency-health/skill.yaml +9 -0
- package/dist/agents/skills/claude-code/harness-hotspot-detector/skill.yaml +9 -0
- package/dist/agents/skills/claude-code/harness-integrity/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/harness-refactoring/skill.yaml +9 -0
- package/dist/agents/skills/claude-code/harness-security-scan/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/harness-soundness-review/skill.yaml +5 -0
- package/dist/agents/skills/claude-code/harness-supply-chain-audit/skill.yaml +3 -0
- package/dist/agents/skills/claude-code/harness-tdd/skill.yaml +3 -0
- package/dist/agents/skills/codex/cleanup-dead-code/skill.yaml +3 -0
- package/dist/agents/skills/codex/detect-doc-drift/skill.yaml +5 -0
- package/dist/agents/skills/codex/enforce-architecture/skill.yaml +13 -0
- package/dist/agents/skills/codex/harness-code-review/skill.yaml +5 -0
- package/dist/agents/skills/codex/harness-codebase-cleanup/skill.yaml +5 -0
- package/dist/agents/skills/codex/harness-debugging/skill.yaml +5 -0
- package/dist/agents/skills/codex/harness-dependency-health/skill.yaml +9 -0
- package/dist/agents/skills/codex/harness-hotspot-detector/skill.yaml +9 -0
- package/dist/agents/skills/codex/harness-integrity/skill.yaml +5 -0
- package/dist/agents/skills/codex/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/codex/harness-refactoring/skill.yaml +9 -0
- package/dist/agents/skills/codex/harness-security-scan/skill.yaml +3 -0
- package/dist/agents/skills/codex/harness-soundness-review/skill.yaml +5 -0
- package/dist/agents/skills/codex/harness-supply-chain-audit/skill.yaml +3 -0
- package/dist/agents/skills/codex/harness-tdd/skill.yaml +3 -0
- package/dist/agents/skills/cursor/cleanup-dead-code/skill.yaml +3 -0
- package/dist/agents/skills/cursor/detect-doc-drift/skill.yaml +5 -0
- package/dist/agents/skills/cursor/enforce-architecture/skill.yaml +13 -0
- package/dist/agents/skills/cursor/harness-code-review/skill.yaml +5 -0
- package/dist/agents/skills/cursor/harness-codebase-cleanup/skill.yaml +5 -0
- package/dist/agents/skills/cursor/harness-debugging/skill.yaml +5 -0
- package/dist/agents/skills/cursor/harness-dependency-health/skill.yaml +9 -0
- package/dist/agents/skills/cursor/harness-hotspot-detector/skill.yaml +9 -0
- package/dist/agents/skills/cursor/harness-integrity/skill.yaml +5 -0
- package/dist/agents/skills/cursor/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/cursor/harness-refactoring/skill.yaml +9 -0
- package/dist/agents/skills/cursor/harness-security-scan/skill.yaml +3 -0
- package/dist/agents/skills/cursor/harness-soundness-review/skill.yaml +5 -0
- package/dist/agents/skills/cursor/harness-supply-chain-audit/skill.yaml +3 -0
- package/dist/agents/skills/cursor/harness-tdd/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/cleanup-dead-code/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/detect-doc-drift/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/enforce-architecture/skill.yaml +13 -0
- package/dist/agents/skills/gemini-cli/harness-code-review/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/harness-codebase-cleanup/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/harness-debugging/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/harness-dependency-health/skill.yaml +9 -0
- package/dist/agents/skills/gemini-cli/harness-hotspot-detector/skill.yaml +9 -0
- package/dist/agents/skills/gemini-cli/harness-integrity/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/harness-perf/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/harness-refactoring/skill.yaml +9 -0
- package/dist/agents/skills/gemini-cli/harness-security-scan/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/harness-soundness-review/skill.yaml +5 -0
- package/dist/agents/skills/gemini-cli/harness-supply-chain-audit/skill.yaml +3 -0
- package/dist/agents/skills/gemini-cli/harness-tdd/skill.yaml +3 -0
- package/dist/{agents-md-TDTLYAQU.js → agents-md-PM7LO74M.js} +2 -1
- package/dist/{architecture-NANP4XPE.js → architecture-OVOCDTI6.js} +3 -2
- package/dist/assess-project-R2OZIDDS.js +9 -0
- package/dist/bin/harness-mcp.js +15 -13
- package/dist/bin/harness.js +21 -19
- package/dist/{check-phase-gate-I4NQOCSU.js → check-phase-gate-7JQ6EW5R.js} +4 -3
- package/dist/{chunk-M6TIO6NF.js → chunk-2PAPHA77.js} +1 -1
- package/dist/chunk-5FBWWMY2.js +293 -0
- package/dist/{chunk-YF5ROTWR.js → chunk-5QTWFO24.js} +8 -8
- package/dist/{chunk-CZZXE6BL.js → chunk-ASS5TD2Y.js} +1 -1
- package/dist/{chunk-L6LTNZQZ.js → chunk-B4WHXHF7.js} +1 -1
- package/dist/{chunk-TMSGI27F.js → chunk-DJEBBENF.js} +967 -385
- package/dist/{chunk-H6LXAH66.js → chunk-DXYOAQQC.js} +1 -1
- package/dist/{chunk-UVJFBKCX.js → chunk-FSLFBLYW.js} +7 -7
- package/dist/{chunk-SZ5TGZMI.js → chunk-GRJ7A4WT.js} +17 -2
- package/dist/{chunk-WXI5ONCU.js → chunk-IK5GSLW6.js} +4 -4
- package/dist/{chunk-SPUK5W4W.js → chunk-J7W4LTRK.js} +2 -2
- package/dist/{chunk-7G2ZUTZA.js → chunk-PUOMFNRO.js} +26 -3
- package/dist/{chunk-HKUX2X7O.js → chunk-SE4YPMLH.js} +9 -1
- package/dist/{chunk-UEKQ5G3V.js → chunk-SOTTK27D.js} +459 -37
- package/dist/{chunk-LRG3B43J.js → chunk-T5QWCVGK.js} +1 -1
- package/dist/{dist-U7EAO6T2.js → chunk-TEZI27SA.js} +401 -60
- package/dist/{chunk-YZYBQZVL.js → chunk-U44JNY3Y.js} +1539 -587
- package/dist/{chunk-HUDEBSR2.js → chunk-W6MPLFXU.js} +3 -3
- package/dist/{chunk-6GEYPBDU.js → chunk-ZEIEUCZL.js} +9 -9
- package/dist/{ci-workflow-Z4IUJBZL.js → ci-workflow-OTTEERPF.js} +2 -1
- package/dist/{create-skill-NDXQSTIK.js → create-skill-U3XCFRZN.js} +2 -2
- package/dist/dist-IA6XYKNO.js +92 -0
- package/dist/{dist-KV2ICL5X.js → dist-LCR2IO7U.js} +56 -3
- package/dist/{docs-2PCZVSGB.js → docs-CHAYSGOP.js} +4 -3
- package/dist/{engine-EOXMI5MD.js → engine-4MY2U5RZ.js} +2 -1
- package/dist/{entropy-VGXXBIGX.js → entropy-AKSZG7G5.js} +3 -2
- package/dist/{feedback-VTSPL3O7.js → feedback-QGCSW7SB.js} +1 -1
- package/dist/{generate-agent-definitions-QICSCGXB.js → generate-agent-definitions-KU6X2UQN.js} +2 -1
- package/dist/{graph-loader-KMHDQYDT.js → graph-loader-FJN4H7Y4.js} +1 -1
- package/dist/index.d.ts +58 -2
- package/dist/index.js +27 -23
- package/dist/{loader-7S4FYAPP.js → loader-AV5XEMER.js} +2 -1
- package/dist/{mcp-DF25USTE.js → mcp-LWHVQRG7.js} +15 -13
- package/dist/{performance-RV4DUMFI.js → performance-ETZVXXGQ.js} +4 -3
- package/dist/{review-pipeline-7KQJB4SI.js → review-pipeline-3ZS3GJSP.js} +1 -1
- package/dist/{runtime-XKOHGGRC.js → runtime-KQTJRK3H.js} +2 -1
- package/dist/{security-NLWTMK3G.js → security-LJCLZES6.js} +1 -1
- package/dist/{skill-executor-XEVDGXUM.js → skill-executor-2BZQLHYN.js} +2 -2
- package/dist/{validate-VHFE6J6O.js → validate-4IA5RPEX.js} +3 -2
- package/dist/{validate-cross-check-PFRKABCS.js → validate-cross-check-VX2BAHQI.js} +2 -1
- package/package.json +4 -4
|
@@ -26,7 +26,7 @@ var runSecurityScanDefinition = {
|
|
|
26
26
|
};
|
|
27
27
|
async function handleRunSecurityScan(input) {
|
|
28
28
|
try {
|
|
29
|
-
const core = await import("./dist-
|
|
29
|
+
const core = await import("./dist-LCR2IO7U.js");
|
|
30
30
|
const projectRoot = sanitizePath(input.path);
|
|
31
31
|
let configData = {};
|
|
32
32
|
try {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
findConfigFile,
|
|
3
3
|
loadConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GRJ7A4WT.js";
|
|
5
5
|
import {
|
|
6
6
|
resultToMcpResponse
|
|
7
7
|
} from "./chunk-IDZNPTYD.js";
|
|
@@ -31,7 +31,7 @@ var checkPerformanceDefinition = {
|
|
|
31
31
|
};
|
|
32
32
|
async function handleCheckPerformance(input) {
|
|
33
33
|
try {
|
|
34
|
-
const { EntropyAnalyzer } = await import("./dist-
|
|
34
|
+
const { EntropyAnalyzer } = await import("./dist-LCR2IO7U.js");
|
|
35
35
|
const typeFilter = input.type ?? "all";
|
|
36
36
|
const projectPath = sanitizePath(input.path);
|
|
37
37
|
let entryPoints;
|
|
@@ -54,10 +54,10 @@ async function handleCheckPerformance(input) {
|
|
|
54
54
|
});
|
|
55
55
|
let graphOptions;
|
|
56
56
|
try {
|
|
57
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
57
|
+
const { loadGraphStore } = await import("./graph-loader-FJN4H7Y4.js");
|
|
58
58
|
const store = await loadGraphStore(projectPath);
|
|
59
59
|
if (store) {
|
|
60
|
-
const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-
|
|
60
|
+
const { GraphComplexityAdapter, GraphCouplingAdapter } = await import("./dist-IA6XYKNO.js");
|
|
61
61
|
const complexityAdapter = new GraphComplexityAdapter(store);
|
|
62
62
|
const couplingAdapter = new GraphCouplingAdapter(store);
|
|
63
63
|
graphOptions = {
|
|
@@ -94,7 +94,7 @@ var getPerfBaselinesDefinition = {
|
|
|
94
94
|
};
|
|
95
95
|
async function handleGetPerfBaselines(input) {
|
|
96
96
|
try {
|
|
97
|
-
const { BaselineManager } = await import("./dist-
|
|
97
|
+
const { BaselineManager } = await import("./dist-LCR2IO7U.js");
|
|
98
98
|
const manager = new BaselineManager(sanitizePath(input.path));
|
|
99
99
|
const baselines = manager.load();
|
|
100
100
|
return resultToMcpResponse(
|
|
@@ -142,7 +142,7 @@ var updatePerfBaselinesDefinition = {
|
|
|
142
142
|
};
|
|
143
143
|
async function handleUpdatePerfBaselines(input) {
|
|
144
144
|
try {
|
|
145
|
-
const { BaselineManager } = await import("./dist-
|
|
145
|
+
const { BaselineManager } = await import("./dist-LCR2IO7U.js");
|
|
146
146
|
const manager = new BaselineManager(sanitizePath(input.path));
|
|
147
147
|
manager.save(input.results, input.commitHash);
|
|
148
148
|
const updated = manager.load();
|
|
@@ -172,7 +172,7 @@ var getCriticalPathsDefinition = {
|
|
|
172
172
|
};
|
|
173
173
|
async function handleGetCriticalPaths(input) {
|
|
174
174
|
try {
|
|
175
|
-
const { CriticalPathResolver } = await import("./dist-
|
|
175
|
+
const { CriticalPathResolver } = await import("./dist-LCR2IO7U.js");
|
|
176
176
|
const resolver = new CriticalPathResolver(sanitizePath(input.path));
|
|
177
177
|
const result = await resolver.resolve();
|
|
178
178
|
return resultToMcpResponse(Ok(result));
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-3WGJMBKH.js";
|
|
5
5
|
import {
|
|
6
6
|
ArchConfigSchema
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-U44JNY3Y.js";
|
|
8
8
|
import {
|
|
9
9
|
Err,
|
|
10
10
|
Ok
|
|
@@ -54,7 +54,9 @@ var PhaseGateMappingSchema = z.object({
|
|
|
54
54
|
/** Pattern for implementation files */
|
|
55
55
|
implPattern: z.string(),
|
|
56
56
|
/** Pattern for corresponding specification files */
|
|
57
|
-
specPattern: z.string()
|
|
57
|
+
specPattern: z.string(),
|
|
58
|
+
/** When true, validate that the spec file contains a numbered requirements section */
|
|
59
|
+
contentValidation: z.boolean().default(false)
|
|
58
60
|
});
|
|
59
61
|
var PhaseGatesConfigSchema = z.object({
|
|
60
62
|
/** Whether phase gate checks are enabled */
|
|
@@ -245,6 +247,19 @@ var HarnessConfigSchema = z.object({
|
|
|
245
247
|
/** Override the tier of specific skills (e.g., promote a Tier 3 skill to Tier 2) */
|
|
246
248
|
tierOverrides: z.record(z.string(), z.number().int().min(1).max(3)).default({})
|
|
247
249
|
}).optional(),
|
|
250
|
+
/** Spec-to-implementation traceability check settings */
|
|
251
|
+
traceability: z.object({
|
|
252
|
+
/** Whether traceability checks are enabled */
|
|
253
|
+
enabled: z.boolean().default(true),
|
|
254
|
+
/** Severity level when traceability coverage is below threshold */
|
|
255
|
+
severity: z.enum(["error", "warning"]).default("warning"),
|
|
256
|
+
/** Minimum required coverage percentage (0-100) */
|
|
257
|
+
minCoverage: z.number().min(0).max(100).default(0),
|
|
258
|
+
/** Glob patterns for specs to include in traceability checks */
|
|
259
|
+
includeSpecs: z.array(z.string()).default(["docs/changes/*/proposal.md"]),
|
|
260
|
+
/** Glob patterns for specs to exclude from traceability checks */
|
|
261
|
+
excludeSpecs: z.array(z.string()).default([])
|
|
262
|
+
}).optional(),
|
|
248
263
|
/** Roadmap sync and tracker integration settings */
|
|
249
264
|
roadmap: RoadmapConfigSchema.optional(),
|
|
250
265
|
/** How often (in ms) to check for CLI updates */
|
|
@@ -10,10 +10,10 @@ import {
|
|
|
10
10
|
|
|
11
11
|
// src/mcp/tools/entropy.ts
|
|
12
12
|
async function loadEntropyGraphOptions(projectPath) {
|
|
13
|
-
const { loadGraphStore } = await import("./graph-loader-
|
|
13
|
+
const { loadGraphStore } = await import("./graph-loader-FJN4H7Y4.js");
|
|
14
14
|
const store = await loadGraphStore(projectPath);
|
|
15
15
|
if (!store) return void 0;
|
|
16
|
-
const { GraphEntropyAdapter } = await import("./dist-
|
|
16
|
+
const { GraphEntropyAdapter } = await import("./dist-IA6XYKNO.js");
|
|
17
17
|
const adapter = new GraphEntropyAdapter(store);
|
|
18
18
|
const driftData = adapter.computeDriftData();
|
|
19
19
|
const deadCodeData = adapter.computeDeadCodeData();
|
|
@@ -123,7 +123,7 @@ function buildSummaryResponse(report) {
|
|
|
123
123
|
}
|
|
124
124
|
async function handleDetectEntropy(input) {
|
|
125
125
|
try {
|
|
126
|
-
const { EntropyAnalyzer } = await import("./dist-
|
|
126
|
+
const { EntropyAnalyzer } = await import("./dist-LCR2IO7U.js");
|
|
127
127
|
const typeFilter = input.type ?? "all";
|
|
128
128
|
const analyzer = new EntropyAnalyzer({
|
|
129
129
|
rootDir: sanitizePath(input.path),
|
|
@@ -142,7 +142,7 @@ async function handleDetectEntropy(input) {
|
|
|
142
142
|
return resultToMcpResponse(result);
|
|
143
143
|
}
|
|
144
144
|
if (!result.ok) return resultToMcpResponse(result);
|
|
145
|
-
const { createFixes, applyFixes, generateSuggestions } = await import("./dist-
|
|
145
|
+
const { createFixes, applyFixes, generateSuggestions } = await import("./dist-LCR2IO7U.js");
|
|
146
146
|
const report = result.value;
|
|
147
147
|
const deadCode = report.deadCode;
|
|
148
148
|
const fixTypesConfig = input.fixTypes ? { fixTypes: input.fixTypes } : void 0;
|
|
@@ -49,7 +49,7 @@ async function handleValidateProject(input) {
|
|
|
49
49
|
checks.config = "pass";
|
|
50
50
|
const config = configResult.value;
|
|
51
51
|
try {
|
|
52
|
-
const core = await import("./dist-
|
|
52
|
+
const core = await import("./dist-LCR2IO7U.js");
|
|
53
53
|
if (typeof core.validateFileStructure === "function" && Array.isArray(config.conventions)) {
|
|
54
54
|
const conventions = config.conventions;
|
|
55
55
|
const structureResult = await core.validateFileStructure(projectPath, conventions);
|
|
@@ -68,7 +68,7 @@ async function handleValidateProject(input) {
|
|
|
68
68
|
} catch {
|
|
69
69
|
}
|
|
70
70
|
try {
|
|
71
|
-
const core = await import("./dist-
|
|
71
|
+
const core = await import("./dist-LCR2IO7U.js");
|
|
72
72
|
if (typeof core.validateAgentsMap === "function") {
|
|
73
73
|
const agentsMapPath = path.join(projectPath, "AGENTS.md");
|
|
74
74
|
const agentsResult = await core.validateAgentsMap(agentsMapPath);
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-EBJQ6N4M.js";
|
|
4
4
|
import {
|
|
5
5
|
resolveConfig
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-GRJ7A4WT.js";
|
|
7
7
|
import {
|
|
8
8
|
ExitCode
|
|
9
9
|
} from "./chunk-3WGJMBKH.js";
|
|
@@ -138,11 +138,34 @@ async function runCheckPhaseGate(options) {
|
|
|
138
138
|
for (const implFile of implFiles) {
|
|
139
139
|
checkedFiles++;
|
|
140
140
|
const expectedSpec = resolveSpecPath(implFile, mapping.implPattern, mapping.specPattern, cwd);
|
|
141
|
+
const relImpl = path.relative(cwd, implFile).replace(/\\/g, "/");
|
|
142
|
+
const relSpec = path.relative(cwd, expectedSpec).replace(/\\/g, "/");
|
|
141
143
|
if (!fs.existsSync(expectedSpec)) {
|
|
142
144
|
missingSpecs.push({
|
|
143
|
-
implFile:
|
|
144
|
-
expectedSpec:
|
|
145
|
+
implFile: relImpl,
|
|
146
|
+
expectedSpec: relSpec
|
|
145
147
|
});
|
|
148
|
+
} else if (mapping.contentValidation) {
|
|
149
|
+
const content = fs.readFileSync(expectedSpec, "utf-8");
|
|
150
|
+
const sectionPattern = /^#+\s*(Observable Truths|Success Criteria|Acceptance Criteria)/im;
|
|
151
|
+
const sectionMatch = sectionPattern.exec(content);
|
|
152
|
+
if (!sectionMatch) {
|
|
153
|
+
missingSpecs.push({
|
|
154
|
+
implFile: relImpl,
|
|
155
|
+
expectedSpec: `${relSpec} (missing requirements section: expected Observable Truths, Success Criteria, or Acceptance Criteria heading)`
|
|
156
|
+
});
|
|
157
|
+
} else {
|
|
158
|
+
const sectionStart = sectionMatch.index + sectionMatch[0].length;
|
|
159
|
+
const nextHeadingMatch = /^#+\s/m.exec(content.slice(sectionStart));
|
|
160
|
+
const sectionContent = nextHeadingMatch ? content.slice(sectionStart, sectionStart + nextHeadingMatch.index) : content.slice(sectionStart);
|
|
161
|
+
const hasNumberedItem = /^\s*\d+\.\s+/m.test(sectionContent);
|
|
162
|
+
if (!hasNumberedItem) {
|
|
163
|
+
missingSpecs.push({
|
|
164
|
+
implFile: relImpl,
|
|
165
|
+
expectedSpec: `${relSpec} (requirements section "${sectionMatch[1]}" has no numbered items)`
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
146
169
|
}
|
|
147
170
|
}
|
|
148
171
|
}
|
|
@@ -52,6 +52,13 @@ var SkillCursorSchema = z.object({
|
|
|
52
52
|
var SkillCodexSchema = z.object({
|
|
53
53
|
instructions_override: z.string().optional()
|
|
54
54
|
});
|
|
55
|
+
var SkillAddressSchema = z.object({
|
|
56
|
+
signal: z.string(),
|
|
57
|
+
hard: z.boolean().optional(),
|
|
58
|
+
metric: z.string().optional(),
|
|
59
|
+
threshold: z.number().optional(),
|
|
60
|
+
weight: z.number().min(0).max(1).optional()
|
|
61
|
+
});
|
|
55
62
|
var SkillMetadataSchema = z.object({
|
|
56
63
|
name: z.string().regex(/^[a-z][a-z0-9-]*$/, "Name must be lowercase with hyphens"),
|
|
57
64
|
version: z.string().regex(/^\d+\.\d+\.\d+$/, "Version must be semver format"),
|
|
@@ -72,7 +79,8 @@ var SkillMetadataSchema = z.object({
|
|
|
72
79
|
keywords: z.array(z.string()).default([]),
|
|
73
80
|
stack_signals: z.array(z.string()).default([]),
|
|
74
81
|
cursor: SkillCursorSchema.optional(),
|
|
75
|
-
codex: SkillCodexSchema.optional()
|
|
82
|
+
codex: SkillCodexSchema.optional(),
|
|
83
|
+
addresses: z.array(SkillAddressSchema).default([])
|
|
76
84
|
});
|
|
77
85
|
|
|
78
86
|
export {
|