@agentxm/client-core 0.3.1 → 0.3.3
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 +1 -1
- package/dist/src/unstable/agents/detection.d.ts.map +1 -1
- package/dist/src/unstable/agents/detection.js +2 -1
- package/dist/src/unstable/agents/detection.js.map +1 -1
- package/dist/src/unstable/cli-renderer/ansi-chrome.d.ts.map +1 -1
- package/dist/src/unstable/cli-renderer/ansi-chrome.js +4 -1
- package/dist/src/unstable/cli-renderer/ansi-chrome.js.map +1 -1
- package/dist/src/unstable/extensions/index.d.ts +1 -0
- package/dist/src/unstable/extensions/index.d.ts.map +1 -1
- package/dist/src/unstable/extensions/index.js +1 -0
- package/dist/src/unstable/extensions/index.js.map +1 -1
- package/dist/src/unstable/extensions/universal-skills-dir.d.ts +54 -0
- package/dist/src/unstable/extensions/universal-skills-dir.d.ts.map +1 -0
- package/dist/src/unstable/extensions/universal-skills-dir.js +68 -0
- package/dist/src/unstable/extensions/universal-skills-dir.js.map +1 -0
- package/dist/src/unstable/lint/catalog/pack/manifest-keys-recognized.js +1 -1
- package/dist/src/unstable/lint/catalog/pack/manifest-keys-recognized.js.map +1 -1
- package/dist/src/unstable/lint/catalog/pack/manifest-present.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/pack/manifest-present.js +2 -5
- package/dist/src/unstable/lint/catalog/pack/manifest-present.js.map +1 -1
- package/dist/src/unstable/lint/catalog/pack/manifest-schema-valid.js +1 -1
- package/dist/src/unstable/lint/catalog/pack/manifest-schema-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/shared/schema-rule.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/shared/schema-rule.js +12 -5
- package/dist/src/unstable/lint/catalog/shared/schema-rule.js.map +1 -1
- package/dist/src/unstable/lint/catalog/skill/frontmatter-parseable.js +8 -11
- package/dist/src/unstable/lint/catalog/skill/frontmatter-parseable.js.map +1 -1
- package/dist/src/unstable/lint/catalog/skill/manifest-keys-recognized.js +1 -1
- package/dist/src/unstable/lint/catalog/skill/manifest-keys-recognized.js.map +1 -1
- package/dist/src/unstable/lint/catalog/skill/manifest-present.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/skill/manifest-present.js +2 -5
- package/dist/src/unstable/lint/catalog/skill/manifest-present.js.map +1 -1
- package/dist/src/unstable/lint/catalog/skill/manifest-schema-valid.js +1 -1
- package/dist/src/unstable/lint/catalog/skill/manifest-schema-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/skill/skill-md-present.js +2 -3
- package/dist/src/unstable/lint/catalog/skill/skill-md-present.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/agents-detected-declared.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/agents-detected-declared.js +5 -15
- package/dist/src/unstable/lint/catalog/workspace/agents-detected-declared.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/agents-recognized.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/agents-recognized.js +4 -15
- package/dist/src/unstable/lint/catalog/workspace/agents-recognized.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/helpers/decode.d.ts +14 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/decode.d.ts.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/decode.js +28 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/decode.js.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/finding.d.ts +10 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/finding.d.ts.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/finding.js +11 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/finding.js.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/retained-skills.d.ts +24 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/retained-skills.d.ts.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/retained-skills.js +41 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/retained-skills.js.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/source-categorize.d.ts +16 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/source-categorize.d.ts.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/source-categorize.js +37 -0
- package/dist/src/unstable/lint/catalog/workspace/helpers/source-categorize.js.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/initialized.js +3 -5
- package/dist/src/unstable/lint/catalog/workspace/initialized.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/lockfile-valid.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/lockfile-valid.js +8 -21
- package/dist/src/unstable/lint/catalog/workspace/lockfile-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/packs-declarations-valid.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/packs-declarations-valid.js +12 -49
- package/dist/src/unstable/lint/catalog/workspace/packs-declarations-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/packs-dependencies-resolved.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/packs-dependencies-resolved.js +23 -17
- package/dist/src/unstable/lint/catalog/workspace/packs-dependencies-resolved.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/packs-members-retained.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/packs-members-retained.js +24 -29
- package/dist/src/unstable/lint/catalog/workspace/packs-members-retained.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/settings-schema-valid.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/settings-schema-valid.js +3 -6
- package/dist/src/unstable/lint/catalog/workspace/settings-schema-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-correct.d.ts +3 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-correct.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-correct.js +142 -55
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-correct.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-declarations-valid.d.ts +3 -2
- package/dist/src/unstable/lint/catalog/workspace/skills-declarations-valid.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-declarations-valid.js +13 -56
- package/dist/src/unstable/lint/catalog/workspace/skills-declarations-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-integrity-valid.d.ts +3 -2
- package/dist/src/unstable/lint/catalog/workspace/skills-integrity-valid.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-integrity-valid.js +71 -54
- package/dist/src/unstable/lint/catalog/workspace/skills-integrity-valid.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-lockfile-aligned.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-lockfile-aligned.js +76 -150
- package/dist/src/unstable/lint/catalog/workspace/skills-lockfile-aligned.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-managed.d.ts +15 -0
- package/dist/src/unstable/lint/catalog/workspace/skills-managed.d.ts.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace/skills-managed.js +102 -0
- package/dist/src/unstable/lint/catalog/workspace/skills-managed.js.map +1 -0
- package/dist/src/unstable/lint/catalog/workspace-accessor/platform.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace-accessor/platform.js +2 -1
- package/dist/src/unstable/lint/catalog/workspace-accessor/platform.js.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace.d.ts +9 -5
- package/dist/src/unstable/lint/catalog/workspace.d.ts.map +1 -1
- package/dist/src/unstable/lint/catalog/workspace.js +20 -11
- package/dist/src/unstable/lint/catalog/workspace.js.map +1 -1
- package/dist/src/unstable/lint/cli.d.ts +45 -27
- package/dist/src/unstable/lint/cli.d.ts.map +1 -1
- package/dist/src/unstable/lint/cli.js +819 -59
- package/dist/src/unstable/lint/cli.js.map +1 -1
- package/dist/src/unstable/lint/index.d.ts +1 -1
- package/dist/src/unstable/lint/index.d.ts.map +1 -1
- package/dist/src/unstable/lint/index.js +1 -1
- package/dist/src/unstable/lint/index.js.map +1 -1
- package/dist/src/unstable/lint/issues-to-findings.d.ts +5 -5
- package/dist/src/unstable/lint/issues-to-findings.js +78 -15
- package/dist/src/unstable/lint/issues-to-findings.js.map +1 -1
- package/dist/src/unstable/lint/rule.d.ts +0 -8
- package/dist/src/unstable/lint/rule.d.ts.map +1 -1
- package/dist/src/unstable/skills/operations/install.d.ts.map +1 -1
- package/dist/src/unstable/skills/operations/install.js +2 -0
- package/dist/src/unstable/skills/operations/install.js.map +1 -1
- package/dist/src/unstable/workspace/classifier-records.d.ts.map +1 -1
- package/dist/src/unstable/workspace/classifier-records.js +1 -0
- package/dist/src/unstable/workspace/classifier-records.js.map +1 -1
- package/dist/src/unstable/workspace/classifier.d.ts +13 -2
- package/dist/src/unstable/workspace/classifier.d.ts.map +1 -1
- package/dist/src/unstable/workspace/classifier.js +14 -2
- package/dist/src/unstable/workspace/classifier.js.map +1 -1
- package/dist/src/unstable/workspace/service.d.ts.map +1 -1
- package/dist/src/unstable/workspace/service.js +29 -8
- package/dist/src/unstable/workspace/service.js.map +1 -1
- package/dist/src/unstable/workspace/taxonomy-types.d.ts +1 -0
- package/dist/src/unstable/workspace/taxonomy-types.d.ts.map +1 -1
- package/package.json +3 -3
- package/site-content/INSTALL.md +4 -4
- package/site-content/__generated__/schemas/axm-lock.schema.json +727 -1124
- package/site-content/__generated__/schemas/axm-package-meta.schema.json +3 -16
- package/site-content/__generated__/schemas/command.schema.json +29 -130
- package/site-content/__generated__/schemas/extension-pack.schema.json +36 -154
- package/site-content/__generated__/schemas/mcp-server.schema.json +21 -134
- package/site-content/__generated__/schemas/settings.schema.json +111 -291
- package/site-content/__generated__/schemas/skill.schema.json +23 -143
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-clean.d.ts +0 -30
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-clean.d.ts.map +0 -1
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-clean.js +0 -232
- package/dist/src/unstable/lint/catalog/workspace/skills-artifacts-clean.js.map +0 -1
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
* installed directory (`.axm/extensions/<owner>/skills/<name>/src/` for
|
|
7
7
|
* registry sources; `.axm/extensions/external/skills/<name>/` for
|
|
8
8
|
* non-registry) exists and its hash matches. Integrity-mismatch entries
|
|
9
|
-
* each emit one
|
|
10
|
-
* `force: true
|
|
9
|
+
* each emit one finding. Configured mismatches are autofixable via
|
|
10
|
+
* `install-skill` with `force: true`; pack-provided implicit mismatches are
|
|
11
|
+
* advisory because the repair is a pack-level reinstall.
|
|
11
12
|
*
|
|
12
13
|
* The integrity check MUST walk the workspace filesystem — `context.workspace`
|
|
13
14
|
* exposes `exists` only; the accessor layer surfaces the pre-computed
|
|
@@ -26,38 +27,31 @@
|
|
|
26
27
|
import * as Effect from "effect/Effect";
|
|
27
28
|
import * as Option from "effect/Option";
|
|
28
29
|
import * as Result from "effect/Result";
|
|
29
|
-
import
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
30
|
+
import {} from "../../../lockfile/schema.js";
|
|
31
|
+
import {} from "../../../settings/schema.js";
|
|
32
|
+
import { decodeLockfile, decodeSettings } from "./helpers/decode.js";
|
|
33
|
+
import { isSameFinding } from "./helpers/finding.js";
|
|
32
34
|
import { installSkillOp } from "./helpers/install-ops.js";
|
|
33
35
|
import { EMPTY_LINT_FINDINGS, EMPTY_OPERATIONS } from "./helpers/empty.js";
|
|
36
|
+
import { buildRetainedSkillFqns, isImplicitRetainedSkill } from "./helpers/retained-skills.js";
|
|
34
37
|
const RULE_ID = "workspace/skills-integrity-valid";
|
|
35
38
|
const LOCKFILE_REL = ".axm/axm-lock.yaml";
|
|
36
|
-
const SUG_INTEGRITY_PREFIX = "Reinstall skill ";
|
|
37
|
-
const decodeSettings = (input) => {
|
|
38
|
-
const result = Schema.decodeUnknownResult(SettingsSchema)(input, {
|
|
39
|
-
onExcessProperty: "ignore",
|
|
40
|
-
errors: "all",
|
|
41
|
-
});
|
|
42
|
-
return Result.isSuccess(result) ? Option.some(result.success) : Option.none();
|
|
43
|
-
};
|
|
44
|
-
const decodeLockfile = (input) => {
|
|
45
|
-
const result = Schema.decodeUnknownResult(LockfileSchema)(input, {
|
|
46
|
-
onExcessProperty: "ignore",
|
|
47
|
-
errors: "all",
|
|
48
|
-
});
|
|
49
|
-
return Result.isSuccess(result) ? Option.some(result.success) : Option.none();
|
|
50
|
-
};
|
|
51
39
|
const integrityFinding = (name, reason) => ({
|
|
52
40
|
kind: "autofixable",
|
|
53
41
|
ruleId: RULE_ID,
|
|
54
42
|
severity: "error",
|
|
55
|
-
message: `Skill '${name}'
|
|
56
|
-
|
|
43
|
+
message: `Skill '${name}' is listed in the lockfile, but its installed source files do not match the lockfile entry. Detail: ${reason}. ` +
|
|
44
|
+
"Run `axm lint --fix` to reinstall it.",
|
|
45
|
+
location: { file: LOCKFILE_REL },
|
|
46
|
+
});
|
|
47
|
+
const implicitIntegrityFinding = (name, reason) => ({
|
|
48
|
+
kind: "advisory",
|
|
49
|
+
ruleId: RULE_ID,
|
|
50
|
+
severity: "error",
|
|
51
|
+
message: `Pack-provided skill '${name}' is listed in the lockfile, but its installed source files do not match the lockfile entry. Detail: ${reason}. ` +
|
|
52
|
+
"Run `axm install` to reinstall it from the owning pack declarations.",
|
|
57
53
|
location: { file: LOCKFILE_REL },
|
|
58
54
|
});
|
|
59
|
-
const NAME_FROM_SUGGESTION_RE = /'([^']+)'/;
|
|
60
|
-
const extractSkillName = (suggestion) => NAME_FROM_SUGGESTION_RE.exec(suggestion)?.[1];
|
|
61
55
|
/**
|
|
62
56
|
* Compute a stable integrity marker for the skill's installed `src/` tree.
|
|
63
57
|
*
|
|
@@ -70,12 +64,12 @@ const extractSkillName = (suggestion) => NAME_FROM_SUGGESTION_RE.exec(suggestion
|
|
|
70
64
|
* NOT exist as an integrity mismatch. A deeper byte-by-byte hash check
|
|
71
65
|
* defers to the CLI-layer adapter that owns filesystem walks.
|
|
72
66
|
*/
|
|
73
|
-
const
|
|
67
|
+
const integrityReason = (lockEntry, probeExists) => {
|
|
74
68
|
if (lockEntry.sourceHash === undefined) {
|
|
75
69
|
return Option.none();
|
|
76
70
|
}
|
|
77
71
|
if (!probeExists) {
|
|
78
|
-
return Option.some(
|
|
72
|
+
return Option.some("the installed source directory is missing");
|
|
79
73
|
}
|
|
80
74
|
return Option.none();
|
|
81
75
|
};
|
|
@@ -85,9 +79,37 @@ const skillSrcProbe = (name, entry) => {
|
|
|
85
79
|
}
|
|
86
80
|
return `.axm/extensions/external/skills/${name}/SKILL.md`;
|
|
87
81
|
};
|
|
82
|
+
const collectIntegrityViolations = (settings, lockfile, probes) => {
|
|
83
|
+
const declaredSkills = settings.skills ?? {};
|
|
84
|
+
const retainedFqns = buildRetainedSkillFqns(settings, lockfile);
|
|
85
|
+
const violations = [];
|
|
86
|
+
for (const { name, entry, exists } of probes) {
|
|
87
|
+
const reason = integrityReason(entry, exists);
|
|
88
|
+
if (Option.isNone(reason)) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (name in declaredSkills) {
|
|
92
|
+
const declared = declaredSkills[name];
|
|
93
|
+
if (declared === undefined) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
violations.push({
|
|
97
|
+
finding: integrityFinding(name, reason.value),
|
|
98
|
+
operation: installSkillOp({ name, source: declared.source, force: true }),
|
|
99
|
+
});
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (isImplicitRetainedSkill(name, entry, declaredSkills, retainedFqns)) {
|
|
103
|
+
violations.push({
|
|
104
|
+
finding: implicitIntegrityFinding(name, reason.value),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return violations;
|
|
109
|
+
};
|
|
88
110
|
export const skillsIntegrityValidRule = {
|
|
89
111
|
id: RULE_ID,
|
|
90
|
-
description: "
|
|
112
|
+
description: "Installed skill source files match the lockfile.",
|
|
91
113
|
kind: "autofixing",
|
|
92
114
|
severity: "error",
|
|
93
115
|
check: (context) => Effect.gen(function* () {
|
|
@@ -108,42 +130,37 @@ export const skillsIntegrityValidRule = {
|
|
|
108
130
|
if (Option.isNone(lockfile)) {
|
|
109
131
|
return EMPTY_LINT_FINDINGS;
|
|
110
132
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
// lock entries are owned by workspace/skills-lockfile-aligned
|
|
117
|
-
// (orphan arm); running integrity alongside it would produce
|
|
118
|
-
// contradictory autofix Operations (install + uninstall).
|
|
119
|
-
if (!(name in declaredSkills)) {
|
|
120
|
-
continue;
|
|
121
|
-
}
|
|
122
|
-
const probe = skillSrcProbe(name, entry);
|
|
123
|
-
const exists = yield* context.workspace.exists(probe);
|
|
124
|
-
const finding = checkIntegrity(name, entry, exists);
|
|
125
|
-
if (Option.isSome(finding)) {
|
|
126
|
-
findings.push(finding.value);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
return findings;
|
|
133
|
+
const probes = yield* Effect.all(Object.entries(lockfile.value.skills).map(([name, entry]) => context.workspace
|
|
134
|
+
.exists(skillSrcProbe(name, entry))
|
|
135
|
+
.pipe(Effect.map((exists) => ({ name, entry, exists })))), { concurrency: "unbounded" });
|
|
136
|
+
const violations = collectIntegrityViolations(settings.value, lockfile.value, probes);
|
|
137
|
+
return violations.map((violation) => violation.finding);
|
|
130
138
|
}),
|
|
131
139
|
fix: (context, finding) => Effect.gen(function* () {
|
|
132
|
-
const name = extractSkillName(finding.suggestions[0]);
|
|
133
|
-
if (name === undefined) {
|
|
134
|
-
return EMPTY_OPERATIONS;
|
|
135
|
-
}
|
|
136
140
|
const settingsResult = yield* Effect.result(context.workspace.settings);
|
|
137
|
-
|
|
141
|
+
const lockfileResult = yield* Effect.result(context.workspace.lockfile);
|
|
142
|
+
if (Result.isFailure(settingsResult) || Result.isFailure(lockfileResult)) {
|
|
138
143
|
return EMPTY_OPERATIONS;
|
|
139
144
|
}
|
|
140
145
|
const settings = decodeSettings(settingsResult.success);
|
|
141
146
|
if (Option.isNone(settings)) {
|
|
142
147
|
return EMPTY_OPERATIONS;
|
|
143
148
|
}
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
const lockOption = lockfileResult.success;
|
|
150
|
+
if (Option.isNone(lockOption)) {
|
|
151
|
+
return EMPTY_OPERATIONS;
|
|
152
|
+
}
|
|
153
|
+
const lockfile = decodeLockfile(lockOption.value);
|
|
154
|
+
if (Option.isNone(lockfile)) {
|
|
155
|
+
return EMPTY_OPERATIONS;
|
|
156
|
+
}
|
|
157
|
+
const probes = yield* Effect.all(Object.entries(lockfile.value.skills).map(([name, entry]) => context.workspace
|
|
158
|
+
.exists(skillSrcProbe(name, entry))
|
|
159
|
+
.pipe(Effect.map((exists) => ({ name, entry, exists })))), { concurrency: "unbounded" });
|
|
160
|
+
const violation = collectIntegrityViolations(settings.value, lockfile.value, probes).find((candidate) => candidate.finding.kind === "autofixable" &&
|
|
161
|
+
candidate.operation !== undefined &&
|
|
162
|
+
isSameFinding(candidate.finding, finding));
|
|
163
|
+
return violation?.operation === undefined ? EMPTY_OPERATIONS : [violation.operation];
|
|
147
164
|
}),
|
|
148
165
|
};
|
|
149
166
|
//# sourceMappingURL=skills-integrity-valid.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-integrity-valid.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-integrity-valid.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills-integrity-valid.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-integrity-valid.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-lockfile-aligned.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-lockfile-aligned.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"skills-lockfile-aligned.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-lockfile-aligned.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAsB,cAAc,EAAe,MAAM,eAAe,CAAC;AAwHrF,eAAO,MAAM,yBAAyB,EAAE,cAAc,CAAC,oBAAoB,CAuD1E,CAAC"}
|
|
@@ -26,91 +26,98 @@
|
|
|
26
26
|
import * as Effect from "effect/Effect";
|
|
27
27
|
import * as Option from "effect/Option";
|
|
28
28
|
import * as Result from "effect/Result";
|
|
29
|
-
import
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
29
|
+
import {} from "../../../lockfile/schema.js";
|
|
30
|
+
import {} from "../../../settings/schema.js";
|
|
31
|
+
import { decodeLockfile, decodeSettings } from "./helpers/decode.js";
|
|
32
32
|
import { installSkillOp, uninstallSkillOp } from "./helpers/install-ops.js";
|
|
33
33
|
import { parseRegistrySource } from "./helpers/registry-source.js";
|
|
34
34
|
import { EMPTY_LINT_FINDINGS, EMPTY_OPERATIONS } from "./helpers/empty.js";
|
|
35
|
+
import { isSameFinding } from "./helpers/finding.js";
|
|
36
|
+
import { buildRetainedSkillFqns, isRegistrySkillLockEntry, isImplicitRetainedSkill, } from "./helpers/retained-skills.js";
|
|
35
37
|
const RULE_ID = "workspace/skills-lockfile-aligned";
|
|
36
38
|
const LOCKFILE_REL = ".axm/axm-lock.yaml";
|
|
37
|
-
const SUG_MISSING_PREFIX = "Install skill ";
|
|
38
|
-
const SUG_ORPHAN_PREFIX = "Uninstall orphan skill ";
|
|
39
|
-
const SUG_VERSION_PREFIX = "Reinstall skill ";
|
|
40
|
-
const decodeSettings = (input) => {
|
|
41
|
-
const result = Schema.decodeUnknownResult(SettingsSchema)(input, {
|
|
42
|
-
onExcessProperty: "ignore",
|
|
43
|
-
errors: "all",
|
|
44
|
-
});
|
|
45
|
-
return Result.isSuccess(result) ? Option.some(result.success) : Option.none();
|
|
46
|
-
};
|
|
47
|
-
const decodeLockfile = (input) => {
|
|
48
|
-
const result = Schema.decodeUnknownResult(LockfileSchema)(input, {
|
|
49
|
-
onExcessProperty: "ignore",
|
|
50
|
-
errors: "all",
|
|
51
|
-
});
|
|
52
|
-
return Result.isSuccess(result) ? Option.some(result.success) : Option.none();
|
|
53
|
-
};
|
|
54
39
|
const missingFinding = (name, source) => ({
|
|
55
40
|
kind: "autofixable",
|
|
56
41
|
ruleId: RULE_ID,
|
|
57
42
|
severity: "error",
|
|
58
|
-
message: `Skill '${name}' is
|
|
59
|
-
|
|
43
|
+
message: `Skill '${name}' is listed in settings.skills but missing from the lockfile. ` +
|
|
44
|
+
`Run \`axm lint --fix\` to reinstall it from '${source}' and add the lock entry.`,
|
|
60
45
|
location: { file: LOCKFILE_REL },
|
|
61
46
|
});
|
|
62
47
|
const orphanFinding = (name) => ({
|
|
63
48
|
kind: "autofixable",
|
|
64
49
|
ruleId: RULE_ID,
|
|
65
50
|
severity: "error",
|
|
66
|
-
message: `Skill '${name}' is
|
|
67
|
-
|
|
51
|
+
message: `Skill '${name}' is listed in the lockfile but not in settings.skills. ` +
|
|
52
|
+
"Run `axm lint --fix` to remove that lockfile entry.",
|
|
68
53
|
location: { file: LOCKFILE_REL },
|
|
69
54
|
});
|
|
70
55
|
const versionFinding = (name, details) => ({
|
|
71
56
|
kind: "autofixable",
|
|
72
57
|
ruleId: RULE_ID,
|
|
73
58
|
severity: "error",
|
|
74
|
-
message: `Skill '${name}'
|
|
75
|
-
|
|
59
|
+
message: `Skill '${name}' is listed in settings.skills and the lockfile, but the versions do not match. ` +
|
|
60
|
+
`${details}. Run \`axm lint --fix\` to reinstall it at the declared version.`,
|
|
76
61
|
location: { file: LOCKFILE_REL },
|
|
77
62
|
});
|
|
78
63
|
// -----------------------------------------------------------------------------
|
|
79
64
|
// Retention helpers
|
|
80
65
|
// -----------------------------------------------------------------------------
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
66
|
+
const collectAlignmentViolations = (settings, lockfile) => {
|
|
67
|
+
const declaredSkills = settings.skills ?? {};
|
|
68
|
+
const lockSkills = lockfile.skills;
|
|
69
|
+
const retainedFqns = buildRetainedSkillFqns(settings, lockfile);
|
|
70
|
+
const violations = [];
|
|
71
|
+
const affected = new Set();
|
|
72
|
+
for (const [name, entry] of Object.entries(declaredSkills)) {
|
|
73
|
+
if (name in lockSkills) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
violations.push({
|
|
77
|
+
finding: missingFinding(name, entry.source),
|
|
78
|
+
operation: installSkillOp({ name, source: entry.source, force: false }),
|
|
79
|
+
});
|
|
80
|
+
affected.add(`declared:${name}`);
|
|
85
81
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
82
|
+
for (const [name, entry] of Object.entries(lockSkills)) {
|
|
83
|
+
if (name in declaredSkills) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (isImplicitRetainedSkill(name, entry, declaredSkills, retainedFqns)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
violations.push({
|
|
90
|
+
finding: orphanFinding(name),
|
|
91
|
+
operation: uninstallSkillOp({ name }),
|
|
92
|
+
});
|
|
93
|
+
affected.add(`lock:${name}`);
|
|
94
|
+
}
|
|
95
|
+
for (const [name, entry] of Object.entries(declaredSkills)) {
|
|
96
|
+
if (affected.has(`declared:${name}`)) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const lockEntry = lockSkills[name];
|
|
100
|
+
if (lockEntry === undefined || !isRegistrySkillLockEntry(lockEntry)) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const parsed = parseRegistrySource(entry.source);
|
|
104
|
+
if (parsed === undefined) {
|
|
103
105
|
continue;
|
|
104
106
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
const constraint = parsed.versionConstraint;
|
|
108
|
+
if (constraint === undefined || constraint === lockEntry.resolvedVersion) {
|
|
109
|
+
continue;
|
|
107
110
|
}
|
|
111
|
+
violations.push({
|
|
112
|
+
finding: versionFinding(name, `Declared version: ${constraint}. Locked version: ${lockEntry.resolvedVersion}`),
|
|
113
|
+
operation: installSkillOp({ name, source: entry.source, force: true }),
|
|
114
|
+
});
|
|
108
115
|
}
|
|
109
|
-
return
|
|
116
|
+
return violations;
|
|
110
117
|
};
|
|
111
118
|
export const skillsLockfileAlignedRule = {
|
|
112
119
|
id: RULE_ID,
|
|
113
|
-
description: "
|
|
120
|
+
description: "Declared skills and lockfile entries stay aligned.",
|
|
114
121
|
kind: "autofixing",
|
|
115
122
|
severity: "error",
|
|
116
123
|
check: (context) => Effect.gen(function* () {
|
|
@@ -133,110 +140,29 @@ export const skillsLockfileAlignedRule = {
|
|
|
133
140
|
// workspace/lockfile-valid owns the schema arm.
|
|
134
141
|
return EMPTY_LINT_FINDINGS;
|
|
135
142
|
}
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
const retainedFqns = buildRetainedSkillFqns(settings.value, lockfile.value);
|
|
139
|
-
const findings = [];
|
|
140
|
-
const affected = new Set();
|
|
141
|
-
// Arm 1: missing — declared but no lock entry.
|
|
142
|
-
for (const [name, entry] of Object.entries(declaredSkills)) {
|
|
143
|
-
if (!(name in lockSkills)) {
|
|
144
|
-
findings.push(missingFinding(name, entry.source));
|
|
145
|
-
affected.add(`declared:${name}`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// Arm 2: orphan — lock entry but no declaration, and not retained by
|
|
149
|
-
// an installed declared pack.
|
|
150
|
-
for (const [name, entry] of Object.entries(lockSkills)) {
|
|
151
|
-
if (name in declaredSkills) {
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
if (entry.retainedByPack === true && retainedFqns.has(lockEntryFqn(entry, name))) {
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
findings.push(orphanFinding(name));
|
|
158
|
-
affected.add(`lock:${name}`);
|
|
159
|
-
}
|
|
160
|
-
// Arm 3: version skew — declared AND in lock, but registry-shaped
|
|
161
|
-
// source constraint not satisfied by resolvedVersion.
|
|
162
|
-
for (const [name, entry] of Object.entries(declaredSkills)) {
|
|
163
|
-
if (affected.has(`declared:${name}`)) {
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
const lockEntry = lockSkills[name];
|
|
167
|
-
if (lockEntry === undefined || !isRegistryEntry(lockEntry)) {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
const parsed = parseRegistrySource(entry.source);
|
|
171
|
-
if (parsed === undefined) {
|
|
172
|
-
continue;
|
|
173
|
-
}
|
|
174
|
-
const constraint = parsed.versionConstraint;
|
|
175
|
-
if (constraint === undefined) {
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
// Simple exact-match semver check: the only non-heuristic arm we
|
|
179
|
-
// can enforce without pulling in the semver lib here. Range checks
|
|
180
|
-
// defer to the CLI adapter (Phase 5).
|
|
181
|
-
if (constraint !== lockEntry.resolvedVersion) {
|
|
182
|
-
findings.push(versionFinding(name, `declared ${constraint}, locked ${lockEntry.resolvedVersion}`));
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return findings;
|
|
143
|
+
const violations = collectAlignmentViolations(settings.value, lockfile.value);
|
|
144
|
+
return violations.map((violation) => violation.finding);
|
|
186
145
|
}),
|
|
187
146
|
fix: (context, finding) => Effect.gen(function* () {
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
return EMPTY_OPERATIONS;
|
|
193
|
-
}
|
|
194
|
-
const settingsResult = yield* Effect.result(context.workspace.settings);
|
|
195
|
-
if (Result.isFailure(settingsResult)) {
|
|
196
|
-
return EMPTY_OPERATIONS;
|
|
197
|
-
}
|
|
198
|
-
const settings = decodeSettings(settingsResult.success);
|
|
199
|
-
if (Option.isNone(settings)) {
|
|
200
|
-
return EMPTY_OPERATIONS;
|
|
201
|
-
}
|
|
202
|
-
const entry = settings.value.skills?.[name];
|
|
203
|
-
if (entry === undefined) {
|
|
204
|
-
return EMPTY_OPERATIONS;
|
|
205
|
-
}
|
|
206
|
-
return [installSkillOp({ name, source: entry.source, force: false })];
|
|
147
|
+
const settingsResult = yield* Effect.result(context.workspace.settings);
|
|
148
|
+
const lockfileResult = yield* Effect.result(context.workspace.lockfile);
|
|
149
|
+
if (Result.isFailure(settingsResult) || Result.isFailure(lockfileResult)) {
|
|
150
|
+
return EMPTY_OPERATIONS;
|
|
207
151
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
152
|
+
const settings = decodeSettings(settingsResult.success);
|
|
153
|
+
if (Option.isNone(settings)) {
|
|
154
|
+
return EMPTY_OPERATIONS;
|
|
155
|
+
}
|
|
156
|
+
const lockOption = lockfileResult.success;
|
|
157
|
+
if (Option.isNone(lockOption)) {
|
|
158
|
+
return EMPTY_OPERATIONS;
|
|
214
159
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return EMPTY_OPERATIONS;
|
|
219
|
-
}
|
|
220
|
-
const settingsResult = yield* Effect.result(context.workspace.settings);
|
|
221
|
-
if (Result.isFailure(settingsResult)) {
|
|
222
|
-
return EMPTY_OPERATIONS;
|
|
223
|
-
}
|
|
224
|
-
const settings = decodeSettings(settingsResult.success);
|
|
225
|
-
if (Option.isNone(settings)) {
|
|
226
|
-
return EMPTY_OPERATIONS;
|
|
227
|
-
}
|
|
228
|
-
const entry = settings.value.skills?.[name];
|
|
229
|
-
if (entry === undefined) {
|
|
230
|
-
return EMPTY_OPERATIONS;
|
|
231
|
-
}
|
|
232
|
-
return [installSkillOp({ name, source: entry.source, force: true })];
|
|
160
|
+
const lockfile = decodeLockfile(lockOption.value);
|
|
161
|
+
if (Option.isNone(lockfile)) {
|
|
162
|
+
return EMPTY_OPERATIONS;
|
|
233
163
|
}
|
|
234
|
-
|
|
164
|
+
const violation = collectAlignmentViolations(settings.value, lockfile.value).find((candidate) => isSameFinding(candidate.finding, finding));
|
|
165
|
+
return violation === undefined ? EMPTY_OPERATIONS : [violation.operation];
|
|
235
166
|
}),
|
|
236
167
|
};
|
|
237
|
-
const NAME_FROM_SUGGESTION_RE = /'([^']+)'/;
|
|
238
|
-
const extractSkillName = (suggestion) => {
|
|
239
|
-
const match = NAME_FROM_SUGGESTION_RE.exec(suggestion);
|
|
240
|
-
return match?.[1];
|
|
241
|
-
};
|
|
242
168
|
//# sourceMappingURL=skills-lockfile-aligned.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-lockfile-aligned.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-lockfile-aligned.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-lockfile-aligned.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-lockfile-aligned.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `workspace/skills-managed` — installed skill directories are managed by the
|
|
3
|
+
* axm workspace.
|
|
4
|
+
*
|
|
5
|
+
* A skill artifact is unmanaged iff the workspace classifier classifies the
|
|
6
|
+
* detected skill name as `lifecycle: "unmanaged"`. The rule emits one advisory
|
|
7
|
+
* finding per unmanaged artifact location reported by the classifier.
|
|
8
|
+
*
|
|
9
|
+
* @experimental This API is unstable and may change without notice.
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
import type { WorkspaceRuleContext } from "../../context.js";
|
|
13
|
+
import type { AdvisoryRule } from "../../rule.js";
|
|
14
|
+
export declare const skillsManagedRule: AdvisoryRule<WorkspaceRuleContext>;
|
|
15
|
+
//# sourceMappingURL=skills-managed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-managed.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-managed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,eAAe,CAAC;AAoBnE,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,oBAAoB,CA6FhE,CAAC"}
|