@agentxm/client-core 0.3.2 → 0.4.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/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/branding.d.ts +2 -0
- package/dist/src/unstable/branding.d.ts.map +1 -0
- package/dist/src/unstable/branding.js +11 -0
- package/dist/src/unstable/branding.js.map +1 -0
- 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.d.ts +1 -1
- package/dist/src/unstable/lint/catalog/workspace/initialized.js +4 -6
- 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/initialization.js +1 -1
- package/dist/src/unstable/workspace/initialization.js.map +1 -1
- package/dist/src/unstable/workspace/service.d.ts.map +1 -1
- package/dist/src/unstable/workspace/service.js +30 -9
- 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 +7 -3
- package/site-content/{INSTALL.md → install.md} +5 -5
- 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
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
*
|
|
16
16
|
* One finding per affected skill (per-entity cascade); the first arm that
|
|
17
17
|
* fires for a skill emits its finding and the other arms for the same skill
|
|
18
|
-
* do not.
|
|
18
|
+
* do not. Configured skills keep the existing autofix arms; pack-provided
|
|
19
|
+
* implicit skills emit advisory findings because the repair is a pack-level
|
|
20
|
+
* reinstall.
|
|
19
21
|
*
|
|
20
22
|
* @experimental This API is unstable and may change without notice.
|
|
21
23
|
* @packageDocumentation
|
|
@@ -23,51 +25,109 @@
|
|
|
23
25
|
import * as Effect from "effect/Effect";
|
|
24
26
|
import * as Option from "effect/Option";
|
|
25
27
|
import * as Result from "effect/Result";
|
|
26
|
-
import
|
|
27
|
-
import {
|
|
28
|
+
import {} from "../../../lockfile/schema.js";
|
|
29
|
+
import {} from "../../../settings/schema.js";
|
|
30
|
+
import { decodeLockfile, decodeSettings } from "./helpers/decode.js";
|
|
31
|
+
import { isSameFinding } from "./helpers/finding.js";
|
|
28
32
|
import { disableSkillOp, enableSkillOp } from "./helpers/install-ops.js";
|
|
29
33
|
import { EMPTY_LINT_FINDINGS, EMPTY_OPERATIONS } from "./helpers/empty.js";
|
|
34
|
+
import { isUniversalSkillsRelativeDir, resolveUniversalDirPresence, } from "../../../extensions/universal-skills-dir.js";
|
|
35
|
+
import { buildRetainedSkillFqns, isImplicitRetainedSkill } from "./helpers/retained-skills.js";
|
|
30
36
|
const RULE_ID = "workspace/skills-artifacts-correct";
|
|
31
37
|
const SETTINGS_REL = ".axm/settings.json";
|
|
32
|
-
const SUG_ENABLE_PREFIX = "Re-enable skill ";
|
|
33
|
-
const SUG_DISABLE_PREFIX = "Disable skill ";
|
|
34
|
-
const decodeSettings = (input) => {
|
|
35
|
-
const result = Schema.decodeUnknownResult(SettingsSchema)(input, {
|
|
36
|
-
onExcessProperty: "ignore",
|
|
37
|
-
errors: "all",
|
|
38
|
-
});
|
|
39
|
-
return Result.isSuccess(result) ? Option.some(result.success) : Option.none();
|
|
40
|
-
};
|
|
41
38
|
const artifactPath = (agent, skillName) => `${agent.skills.dir}/${skillName}`;
|
|
42
39
|
const enableFinding = (name, reason) => ({
|
|
43
40
|
kind: "autofixable",
|
|
44
41
|
ruleId: RULE_ID,
|
|
45
42
|
severity: "error",
|
|
46
|
-
message: `Skill '${name}' is enabled but missing
|
|
47
|
-
|
|
43
|
+
message: `Skill '${name}' is listed as enabled, but it is missing from some declared agents. Missing from agents: ${reason}. ` +
|
|
44
|
+
"Run `axm lint --fix` to make it present for every declared agent.",
|
|
48
45
|
location: { file: SETTINGS_REL },
|
|
49
46
|
});
|
|
50
47
|
const disableFinding = (name, reason) => ({
|
|
51
48
|
kind: "autofixable",
|
|
52
49
|
ruleId: RULE_ID,
|
|
53
50
|
severity: "error",
|
|
54
|
-
message: `Skill '${name}' is disabled but still
|
|
55
|
-
|
|
51
|
+
message: `Skill '${name}' is listed as disabled, but it is still present in some declared agents. Present for agents: ${reason}. ` +
|
|
52
|
+
"Run `axm lint --fix` to remove it from those agents.",
|
|
56
53
|
location: { file: SETTINGS_REL },
|
|
57
54
|
});
|
|
58
55
|
const inconsistentFinding = (name, details) => ({
|
|
59
56
|
kind: "autofixable",
|
|
60
57
|
ruleId: RULE_ID,
|
|
61
58
|
severity: "error",
|
|
62
|
-
message: `Skill '${name}'
|
|
63
|
-
|
|
59
|
+
message: `Skill '${name}' is present for some declared agents but missing from others. ${details}. ` +
|
|
60
|
+
"Run `axm lint --fix` to make its presence consistent across the declared agents.",
|
|
61
|
+
location: { file: SETTINGS_REL },
|
|
62
|
+
});
|
|
63
|
+
const implicitEnableFinding = (name, reason) => ({
|
|
64
|
+
kind: "advisory",
|
|
65
|
+
ruleId: RULE_ID,
|
|
66
|
+
severity: "error",
|
|
67
|
+
message: `Pack-provided skill '${name}' is missing from some declared agents. Missing from agents: ${reason}. ` +
|
|
68
|
+
"Run `axm install` to reinstall the owning pack declarations and recreate the missing artifacts.",
|
|
64
69
|
location: { file: SETTINGS_REL },
|
|
65
70
|
});
|
|
66
|
-
const
|
|
67
|
-
const
|
|
71
|
+
const collectArtifactViolations = (existenceBySkill) => {
|
|
72
|
+
const violations = [];
|
|
73
|
+
for (const { name, enabled, presentAgents, missingAgents, implicit } of existenceBySkill) {
|
|
74
|
+
if (enabled) {
|
|
75
|
+
if (missingAgents.length === 0) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (implicit) {
|
|
79
|
+
violations.push({
|
|
80
|
+
finding: implicitEnableFinding(name, missingAgents.join(", ")),
|
|
81
|
+
});
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (presentAgents.length === 0) {
|
|
85
|
+
violations.push({
|
|
86
|
+
finding: enableFinding(name, missingAgents.join(", ")),
|
|
87
|
+
operation: enableSkillOp({ name }),
|
|
88
|
+
});
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
violations.push({
|
|
92
|
+
finding: inconsistentFinding(name, `Present for agents: ${presentAgents.join(", ")}. Missing from agents: ${missingAgents.join(", ")}`),
|
|
93
|
+
operation: enableSkillOp({ name }),
|
|
94
|
+
});
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (presentAgents.length > 0) {
|
|
98
|
+
violations.push({
|
|
99
|
+
finding: disableFinding(name, presentAgents.join(", ")),
|
|
100
|
+
operation: disableSkillOp({ name }),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return violations;
|
|
105
|
+
};
|
|
106
|
+
const collectImplicitSkillNames = (settings, lockfile) => {
|
|
107
|
+
const declaredSkills = settings.skills ?? {};
|
|
108
|
+
const retainedFqns = buildRetainedSkillFqns(settings, lockfile);
|
|
109
|
+
return Object.entries(lockfile.skills)
|
|
110
|
+
.filter(([name, entry]) => isImplicitRetainedSkill(name, entry, declaredSkills, retainedFqns))
|
|
111
|
+
.map(([name]) => name)
|
|
112
|
+
.sort((left, right) => left.localeCompare(right));
|
|
113
|
+
};
|
|
114
|
+
const collectImplicitSkillNamesFromLockfile = (settings, lockfileResult) => {
|
|
115
|
+
if (Result.isFailure(lockfileResult)) {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const lockOption = lockfileResult.success;
|
|
119
|
+
if (Option.isNone(lockOption)) {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const lockfile = decodeLockfile(lockOption.value);
|
|
123
|
+
if (Option.isNone(lockfile)) {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
return collectImplicitSkillNames(settings, lockfile.value);
|
|
127
|
+
};
|
|
68
128
|
export const skillsArtifactsCorrectRule = {
|
|
69
129
|
id: RULE_ID,
|
|
70
|
-
description: "
|
|
130
|
+
description: "Skill directories match each skill's enabled state across declared agents.",
|
|
71
131
|
kind: "autofixing",
|
|
72
132
|
severity: "error",
|
|
73
133
|
check: (context) => Effect.gen(function* () {
|
|
@@ -79,51 +139,78 @@ export const skillsArtifactsCorrectRule = {
|
|
|
79
139
|
if (Option.isNone(settings)) {
|
|
80
140
|
return EMPTY_LINT_FINDINGS;
|
|
81
141
|
}
|
|
142
|
+
const lockfileResult = yield* Effect.result(context.workspace.lockfile);
|
|
143
|
+
const implicitSkillNames = collectImplicitSkillNamesFromLockfile(settings.value, lockfileResult);
|
|
82
144
|
const declaredAgentIds = new Set(settings.value.agents ?? []);
|
|
83
145
|
if (declaredAgentIds.size === 0) {
|
|
84
146
|
return EMPTY_LINT_FINDINGS;
|
|
85
147
|
}
|
|
86
148
|
const knownAgents = yield* context.workspace.knownAgents;
|
|
87
149
|
const declaredAgents = knownAgents.filter((a) => declaredAgentIds.has(a.id));
|
|
88
|
-
const
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
findings.push(disableFinding(name, `present in: ${presentAgents.join(", ")}`));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return findings;
|
|
150
|
+
const universalAgentIds = new Set(declaredAgents.filter((a) => isUniversalSkillsRelativeDir(a.skills.dir)).map((a) => a.id));
|
|
151
|
+
const existenceBySkill = yield* Effect.all([
|
|
152
|
+
...Object.entries(settings.value.skills ?? {}).map(([name, entry]) => ({
|
|
153
|
+
name,
|
|
154
|
+
enabled: entry.enabled,
|
|
155
|
+
implicit: false,
|
|
156
|
+
})),
|
|
157
|
+
...implicitSkillNames.map((name) => ({ name, enabled: true, implicit: true })),
|
|
158
|
+
].map(({ name, enabled, implicit }) => Effect.all(declaredAgents.map((agent) => context.workspace
|
|
159
|
+
.exists(artifactPath(agent, name))
|
|
160
|
+
.pipe(Effect.map((exists) => ({ agentId: agent.id, exists })))), { concurrency: "unbounded" }).pipe(Effect.map((perAgentExists) => {
|
|
161
|
+
const collapsed = resolveUniversalDirPresence(perAgentExists, universalAgentIds);
|
|
162
|
+
return {
|
|
163
|
+
name,
|
|
164
|
+
enabled,
|
|
165
|
+
presentAgents: collapsed.filter((p) => p.exists).map((p) => p.agentId),
|
|
166
|
+
missingAgents: collapsed.filter((p) => !p.exists).map((p) => p.agentId),
|
|
167
|
+
implicit,
|
|
168
|
+
};
|
|
169
|
+
}))), { concurrency: "unbounded" });
|
|
170
|
+
const violations = collectArtifactViolations(existenceBySkill);
|
|
171
|
+
return violations.map((violation) => violation.finding);
|
|
114
172
|
}),
|
|
115
|
-
fix: (
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
173
|
+
fix: (context, finding) => Effect.gen(function* () {
|
|
174
|
+
const settingsResult = yield* Effect.result(context.workspace.settings);
|
|
175
|
+
if (Result.isFailure(settingsResult)) {
|
|
118
176
|
return EMPTY_OPERATIONS;
|
|
119
177
|
}
|
|
120
|
-
|
|
121
|
-
|
|
178
|
+
const settings = decodeSettings(settingsResult.success);
|
|
179
|
+
if (Option.isNone(settings)) {
|
|
180
|
+
return EMPTY_OPERATIONS;
|
|
122
181
|
}
|
|
123
|
-
|
|
124
|
-
|
|
182
|
+
const lockfileResult = yield* Effect.result(context.workspace.lockfile);
|
|
183
|
+
const implicitSkillNames = collectImplicitSkillNamesFromLockfile(settings.value, lockfileResult);
|
|
184
|
+
const declaredAgentIds = new Set(settings.value.agents ?? []);
|
|
185
|
+
if (declaredAgentIds.size === 0) {
|
|
186
|
+
return EMPTY_OPERATIONS;
|
|
125
187
|
}
|
|
126
|
-
|
|
188
|
+
const knownAgents = yield* context.workspace.knownAgents;
|
|
189
|
+
const declaredAgents = knownAgents.filter((a) => declaredAgentIds.has(a.id));
|
|
190
|
+
const universalAgentIds = new Set(declaredAgents.filter((a) => isUniversalSkillsRelativeDir(a.skills.dir)).map((a) => a.id));
|
|
191
|
+
const existenceBySkill = yield* Effect.all([
|
|
192
|
+
...Object.entries(settings.value.skills ?? {}).map(([name, entry]) => ({
|
|
193
|
+
name,
|
|
194
|
+
enabled: entry.enabled,
|
|
195
|
+
implicit: false,
|
|
196
|
+
})),
|
|
197
|
+
...implicitSkillNames.map((name) => ({ name, enabled: true, implicit: true })),
|
|
198
|
+
].map(({ name, enabled, implicit }) => Effect.all(declaredAgents.map((agent) => context.workspace
|
|
199
|
+
.exists(artifactPath(agent, name))
|
|
200
|
+
.pipe(Effect.map((exists) => ({ agentId: agent.id, exists })))), { concurrency: "unbounded" }).pipe(Effect.map((perAgentExists) => {
|
|
201
|
+
const collapsed = resolveUniversalDirPresence(perAgentExists, universalAgentIds);
|
|
202
|
+
return {
|
|
203
|
+
name,
|
|
204
|
+
enabled,
|
|
205
|
+
presentAgents: collapsed.filter((p) => p.exists).map((p) => p.agentId),
|
|
206
|
+
missingAgents: collapsed.filter((p) => !p.exists).map((p) => p.agentId),
|
|
207
|
+
implicit,
|
|
208
|
+
};
|
|
209
|
+
}))), { concurrency: "unbounded" });
|
|
210
|
+
const violation = collectArtifactViolations(existenceBySkill).find((candidate) => candidate.finding.kind === "autofixable" &&
|
|
211
|
+
candidate.operation !== undefined &&
|
|
212
|
+
isSameFinding(candidate.finding, finding));
|
|
213
|
+
return violation?.operation === undefined ? EMPTY_OPERATIONS : [violation.operation];
|
|
127
214
|
}),
|
|
128
215
|
};
|
|
129
216
|
//# sourceMappingURL=skills-artifacts-correct.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-artifacts-correct.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-artifacts-correct.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills-artifacts-correct.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-artifacts-correct.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
* 3. Duplicate FQNs — when two settings entries normalize to the same
|
|
15
15
|
* owner/type/name FQN, both entries emit a finding.
|
|
16
16
|
*
|
|
17
|
-
* One finding per affected entity (per-entity cascade). Advisory —
|
|
18
|
-
*
|
|
17
|
+
* One finding per affected entity (per-entity cascade). Advisory — no lint
|
|
18
|
+
* autofix; resolve invalid or duplicate declarations with install/uninstall
|
|
19
|
+
* commands.
|
|
19
20
|
*
|
|
20
21
|
* @experimental This API is unstable and may change without notice.
|
|
21
22
|
* @packageDocumentation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-declarations-valid.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-declarations-valid.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills-declarations-valid.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-declarations-valid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,eAAe,CAAC;AA0CnE,eAAO,MAAM,2BAA2B,EAAE,YAAY,CAAC,oBAAoB,CAuD1E,CAAC"}
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
* 3. Duplicate FQNs — when two settings entries normalize to the same
|
|
15
15
|
* owner/type/name FQN, both entries emit a finding.
|
|
16
16
|
*
|
|
17
|
-
* One finding per affected entity (per-entity cascade). Advisory —
|
|
18
|
-
*
|
|
17
|
+
* One finding per affected entity (per-entity cascade). Advisory — no lint
|
|
18
|
+
* autofix; resolve invalid or duplicate declarations with install/uninstall
|
|
19
|
+
* commands.
|
|
19
20
|
*
|
|
20
21
|
* @experimental This API is unstable and may change without notice.
|
|
21
22
|
* @packageDocumentation
|
|
@@ -23,83 +24,39 @@
|
|
|
23
24
|
import * as Effect from "effect/Effect";
|
|
24
25
|
import * as Option from "effect/Option";
|
|
25
26
|
import * as Result from "effect/Result";
|
|
26
|
-
import
|
|
27
|
-
import { SettingsSchema } from "../../../settings/schema.js";
|
|
28
|
-
import { parseRegistrySource } from "./helpers/registry-source.js";
|
|
27
|
+
import { decodeSettings } from "./helpers/decode.js";
|
|
29
28
|
import { EMPTY_ADVISORY_FINDINGS } from "./helpers/empty.js";
|
|
29
|
+
import { categorizeEntry } from "./helpers/source-categorize.js";
|
|
30
30
|
const RULE_ID = "workspace/skills-declarations-valid";
|
|
31
31
|
const SETTINGS_REL = ".axm/settings.json";
|
|
32
|
-
const decodeSettings = (input) => {
|
|
33
|
-
const result = Schema.decodeUnknownResult(SettingsSchema)(input, {
|
|
34
|
-
onExcessProperty: "ignore",
|
|
35
|
-
errors: "all",
|
|
36
|
-
});
|
|
37
|
-
return Result.isSuccess(result) ? Option.some(result.success) : Option.none();
|
|
38
|
-
};
|
|
39
|
-
// Pattern definitions — follow the existing doctor check's logic (see
|
|
40
|
-
// `workspace/doctor/checks/extensions-installed.ts`).
|
|
41
|
-
const BARE_NAME_RE = /^[a-z0-9][a-z0-9-]*(?:@[^\s/:]+)?$/i;
|
|
42
|
-
const NON_REGISTRY_MARKERS = [
|
|
43
|
-
/^\.\//,
|
|
44
|
-
/^\.\.\//,
|
|
45
|
-
/^\//,
|
|
46
|
-
/^file:\/\//,
|
|
47
|
-
/:\/\//,
|
|
48
|
-
/^[a-z][a-z0-9+.-]*:/i,
|
|
49
|
-
];
|
|
50
|
-
const isClearlyNonRegistrySource = (source) => NON_REGISTRY_MARKERS.some((pattern) => pattern.test(source));
|
|
51
|
-
const categorizeEntry = (name, source) => {
|
|
52
|
-
// Delegate to the canonical parser — it handles `@owner/type/name@version`.
|
|
53
|
-
const parsed = parseRegistrySource(source);
|
|
54
|
-
if (parsed !== undefined) {
|
|
55
|
-
return {
|
|
56
|
-
name,
|
|
57
|
-
source,
|
|
58
|
-
kind: "registry",
|
|
59
|
-
registryFqn: `${parsed.owner}/${parsed.type}/${parsed.name}`,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
if (isClearlyNonRegistrySource(source)) {
|
|
63
|
-
return { name, source, kind: "non-registry" };
|
|
64
|
-
}
|
|
65
|
-
if (BARE_NAME_RE.test(source)) {
|
|
66
|
-
return { name, source, kind: "bare" };
|
|
67
|
-
}
|
|
68
|
-
return { name, source, kind: "registry-no-owner" };
|
|
69
|
-
};
|
|
70
32
|
const findingForBareName = (entry) => ({
|
|
71
33
|
kind: "advisory",
|
|
72
34
|
ruleId: RULE_ID,
|
|
73
35
|
severity: "error",
|
|
74
|
-
message: `Skill '${entry.name}'
|
|
75
|
-
|
|
76
|
-
`Prefix the source with @owner/ to resolve via the default registry.`,
|
|
77
|
-
`Declare the source host explicitly in settings.sources[].`,
|
|
78
|
-
],
|
|
36
|
+
message: `Skill '${entry.name}' uses bare source '${entry.source}', so axm cannot tell which registry skill you mean. ` +
|
|
37
|
+
"Run `axm skills install @owner/skills/<name>` with the owner-qualified source you intend.",
|
|
79
38
|
location: { file: SETTINGS_REL },
|
|
80
39
|
});
|
|
81
40
|
const findingForMissingOwner = (entry) => ({
|
|
82
41
|
kind: "advisory",
|
|
83
42
|
ruleId: RULE_ID,
|
|
84
43
|
severity: "error",
|
|
85
|
-
message: `Skill '${entry.name}'
|
|
86
|
-
|
|
44
|
+
message: `Skill '${entry.name}' source '${entry.source}' looks like a registry skill reference but is missing the \`@owner\` prefix. ` +
|
|
45
|
+
"Run `axm skills install @owner/skills/<name>` with the owner-qualified source you intend.",
|
|
87
46
|
location: { file: SETTINGS_REL },
|
|
88
47
|
});
|
|
89
48
|
const findingForDuplicate = (entry, duplicates) => ({
|
|
90
49
|
kind: "advisory",
|
|
91
50
|
ruleId: RULE_ID,
|
|
92
51
|
severity: "error",
|
|
93
|
-
message: `Skill '${entry.name}'
|
|
94
|
-
|
|
95
|
-
`
|
|
96
|
-
`Rename conflicting entries to distinct keys.`,
|
|
97
|
-
],
|
|
52
|
+
message: `Skill '${entry.name}' points to the same registry skill as these entries: ${duplicates.join(", ")}. ` +
|
|
53
|
+
"Run `axm skills uninstall <name>` for each duplicate entry you do not want to keep. " +
|
|
54
|
+
"If needed, run `axm skills install <source>` for the declaration you do want to keep.",
|
|
98
55
|
location: { file: SETTINGS_REL },
|
|
99
56
|
});
|
|
100
57
|
export const skillsDeclarationsValidRule = {
|
|
101
58
|
id: RULE_ID,
|
|
102
|
-
description: "Declared skills
|
|
59
|
+
description: "Declared skills use unique, resolvable sources.",
|
|
103
60
|
kind: "advisory",
|
|
104
61
|
severity: "error",
|
|
105
62
|
check: (context) => Effect.gen(function* () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-declarations-valid.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-declarations-valid.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills-declarations-valid.js","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-declarations-valid.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-integrity-valid.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-integrity-valid.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"skills-integrity-valid.d.ts","sourceRoot":"","sources":["../../../../../../src/unstable/lint/catalog/workspace/skills-integrity-valid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAGV,cAAc,EAEf,MAAM,eAAe,CAAC;AA6GvB,eAAO,MAAM,wBAAwB,EAAE,cAAc,CAAC,oBAAoB,CAwEzE,CAAC"}
|