@senior-skills/core 1.0.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/application/agent-selection.d.ts +42 -0
- package/dist/application/agent-selection.d.ts.map +1 -0
- package/dist/application/agent-selection.js +143 -0
- package/dist/application/agent-selection.js.map +1 -0
- package/dist/application/apply-skill-updates.d.ts +10 -0
- package/dist/application/apply-skill-updates.d.ts.map +1 -0
- package/dist/application/apply-skill-updates.js +75 -0
- package/dist/application/apply-skill-updates.js.map +1 -0
- package/dist/application/check-updates.d.ts +40 -0
- package/dist/application/check-updates.d.ts.map +1 -0
- package/dist/application/check-updates.js +130 -0
- package/dist/application/check-updates.js.map +1 -0
- package/dist/application/context.d.ts +28 -0
- package/dist/application/context.d.ts.map +1 -0
- package/dist/application/context.js +2 -0
- package/dist/application/context.js.map +1 -0
- package/dist/application/create-skill.d.ts +33 -0
- package/dist/application/create-skill.d.ts.map +1 -0
- package/dist/application/create-skill.js +58 -0
- package/dist/application/create-skill.js.map +1 -0
- package/dist/application/diagnose.d.ts +44 -0
- package/dist/application/diagnose.d.ts.map +1 -0
- package/dist/application/diagnose.js +228 -0
- package/dist/application/diagnose.js.map +1 -0
- package/dist/application/install-skills.d.ts +59 -0
- package/dist/application/install-skills.d.ts.map +1 -0
- package/dist/application/install-skills.js +191 -0
- package/dist/application/install-skills.js.map +1 -0
- package/dist/application/list-installed.d.ts +39 -0
- package/dist/application/list-installed.d.ts.map +1 -0
- package/dist/application/list-installed.js +68 -0
- package/dist/application/list-installed.js.map +1 -0
- package/dist/application/package-loader.d.ts +42 -0
- package/dist/application/package-loader.d.ts.map +1 -0
- package/dist/application/package-loader.js +320 -0
- package/dist/application/package-loader.js.map +1 -0
- package/dist/application/publish-skill.d.ts +41 -0
- package/dist/application/publish-skill.d.ts.map +1 -0
- package/dist/application/publish-skill.js +112 -0
- package/dist/application/publish-skill.js.map +1 -0
- package/dist/application/remove-skills.d.ts +34 -0
- package/dist/application/remove-skills.d.ts.map +1 -0
- package/dist/application/remove-skills.js +95 -0
- package/dist/application/remove-skills.js.map +1 -0
- package/dist/application/resolution-source.d.ts +25 -0
- package/dist/application/resolution-source.d.ts.map +1 -0
- package/dist/application/resolution-source.js +60 -0
- package/dist/application/resolution-source.js.map +1 -0
- package/dist/application/resolve-suggestions.d.ts +17 -0
- package/dist/application/resolve-suggestions.d.ts.map +1 -0
- package/dist/application/resolve-suggestions.js +77 -0
- package/dist/application/resolve-suggestions.js.map +1 -0
- package/dist/application/search-skills.d.ts +36 -0
- package/dist/application/search-skills.d.ts.map +1 -0
- package/dist/application/search-skills.js +78 -0
- package/dist/application/search-skills.js.map +1 -0
- package/dist/application/update-skills.d.ts +55 -0
- package/dist/application/update-skills.d.ts.map +1 -0
- package/dist/application/update-skills.js +115 -0
- package/dist/application/update-skills.js.map +1 -0
- package/dist/application/validate-package.d.ts +27 -0
- package/dist/application/validate-package.d.ts.map +1 -0
- package/dist/application/validate-package.js +165 -0
- package/dist/application/validate-package.js.map +1 -0
- package/dist/application/workspace.d.ts +22 -0
- package/dist/application/workspace.d.ts.map +1 -0
- package/dist/application/workspace.js +66 -0
- package/dist/application/workspace.js.map +1 -0
- package/dist/domain/agent.d.ts +89 -0
- package/dist/domain/agent.d.ts.map +1 -0
- package/dist/domain/agent.js +20 -0
- package/dist/domain/agent.js.map +1 -0
- package/dist/domain/errors.d.ts +91 -0
- package/dist/domain/errors.d.ts.map +1 -0
- package/dist/domain/errors.js +121 -0
- package/dist/domain/errors.js.map +1 -0
- package/dist/domain/integrity.d.ts +19 -0
- package/dist/domain/integrity.d.ts.map +1 -0
- package/dist/domain/integrity.js +0 -0
- package/dist/domain/integrity.js.map +1 -0
- package/dist/domain/js-literal.d.ts +22 -0
- package/dist/domain/js-literal.d.ts.map +1 -0
- package/dist/domain/js-literal.js +221 -0
- package/dist/domain/js-literal.js.map +1 -0
- package/dist/domain/lockfile.d.ts +36 -0
- package/dist/domain/lockfile.d.ts.map +1 -0
- package/dist/domain/lockfile.js +148 -0
- package/dist/domain/lockfile.js.map +1 -0
- package/dist/domain/manifest.d.ts +96 -0
- package/dist/domain/manifest.d.ts.map +1 -0
- package/dist/domain/manifest.js +448 -0
- package/dist/domain/manifest.js.map +1 -0
- package/dist/domain/path-safety.d.ts +19 -0
- package/dist/domain/path-safety.d.ts.map +1 -0
- package/dist/domain/path-safety.js +125 -0
- package/dist/domain/path-safety.js.map +1 -0
- package/dist/domain/posix-path.d.ts +28 -0
- package/dist/domain/posix-path.d.ts.map +1 -0
- package/dist/domain/posix-path.js +84 -0
- package/dist/domain/posix-path.js.map +1 -0
- package/dist/domain/receipt.d.ts +41 -0
- package/dist/domain/receipt.d.ts.map +1 -0
- package/dist/domain/receipt.js +93 -0
- package/dist/domain/receipt.js.map +1 -0
- package/dist/domain/registry-index.d.ts +41 -0
- package/dist/domain/registry-index.d.ts.map +1 -0
- package/dist/domain/registry-index.js +150 -0
- package/dist/domain/registry-index.js.map +1 -0
- package/dist/domain/resolver.d.ts +54 -0
- package/dist/domain/resolver.d.ts.map +1 -0
- package/dist/domain/resolver.js +238 -0
- package/dist/domain/resolver.js.map +1 -0
- package/dist/domain/skill-document.d.ts +16 -0
- package/dist/domain/skill-document.d.ts.map +1 -0
- package/dist/domain/skill-document.js +60 -0
- package/dist/domain/skill-document.js.map +1 -0
- package/dist/domain/skill-package.d.ts +43 -0
- package/dist/domain/skill-package.d.ts.map +1 -0
- package/dist/domain/skill-package.js +63 -0
- package/dist/domain/skill-package.js.map +1 -0
- package/dist/domain/skill-ref.d.ts +30 -0
- package/dist/domain/skill-ref.d.ts.map +1 -0
- package/dist/domain/skill-ref.js +119 -0
- package/dist/domain/skill-ref.js.map +1 -0
- package/dist/domain/validation.d.ts +30 -0
- package/dist/domain/validation.d.ts.map +1 -0
- package/dist/domain/validation.js +32 -0
- package/dist/domain/validation.js.map +1 -0
- package/dist/domain/version.d.ts +23 -0
- package/dist/domain/version.d.ts.map +1 -0
- package/dist/domain/version.js +81 -0
- package/dist/domain/version.js.map +1 -0
- package/dist/domain/workflow-document.d.ts +23 -0
- package/dist/domain/workflow-document.d.ts.map +1 -0
- package/dist/domain/workflow-document.js +56 -0
- package/dist/domain/workflow-document.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/agent-adapter.d.ts +65 -0
- package/dist/ports/agent-adapter.d.ts.map +1 -0
- package/dist/ports/agent-adapter.js +28 -0
- package/dist/ports/agent-adapter.js.map +1 -0
- package/dist/ports/config-store.d.ts +27 -0
- package/dist/ports/config-store.d.ts.map +1 -0
- package/dist/ports/config-store.js +2 -0
- package/dist/ports/config-store.js.map +1 -0
- package/dist/ports/infrastructure.d.ts +123 -0
- package/dist/ports/infrastructure.d.ts.map +1 -0
- package/dist/ports/infrastructure.js +9 -0
- package/dist/ports/infrastructure.js.map +1 -0
- package/dist/ports/installation.d.ts +86 -0
- package/dist/ports/installation.d.ts.map +1 -0
- package/dist/ports/installation.js +2 -0
- package/dist/ports/installation.js.map +1 -0
- package/dist/ports/skill-registry.d.ts +74 -0
- package/dist/ports/skill-registry.d.ts.map +1 -0
- package/dist/ports/skill-registry.js +2 -0
- package/dist/ports/skill-registry.js.map +1 -0
- package/dist/ports/updates.d.ts +31 -0
- package/dist/ports/updates.d.ts.map +1 -0
- package/dist/ports/updates.js +4 -0
- package/dist/ports/updates.js.map +1 -0
- package/dist/testing/doubles.d.ts +127 -0
- package/dist/testing/doubles.d.ts.map +1 -0
- package/dist/testing/doubles.js +299 -0
- package/dist/testing/doubles.js.map +1 -0
- package/dist/testing/in-memory-file-system.d.ts +61 -0
- package/dist/testing/in-memory-file-system.d.ts.map +1 -0
- package/dist/testing/in-memory-file-system.js +297 -0
- package/dist/testing/in-memory-file-system.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +10 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ApplicationContext } from './context.ts';
|
|
2
|
+
export type CheckStatus = 'ok' | 'warn' | 'fail' | 'skip';
|
|
3
|
+
export interface DiagnosticCheck {
|
|
4
|
+
readonly status: CheckStatus;
|
|
5
|
+
readonly title: string;
|
|
6
|
+
readonly detail?: string;
|
|
7
|
+
/** Extra lines shown indented under the check. */
|
|
8
|
+
readonly notes?: readonly string[];
|
|
9
|
+
readonly hint?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DiagnosticSection {
|
|
12
|
+
readonly title: string;
|
|
13
|
+
readonly checks: readonly DiagnosticCheck[];
|
|
14
|
+
}
|
|
15
|
+
export interface DoctorReport {
|
|
16
|
+
readonly sections: readonly DiagnosticSection[];
|
|
17
|
+
readonly ok: boolean;
|
|
18
|
+
readonly failures: number;
|
|
19
|
+
readonly warnings: number;
|
|
20
|
+
}
|
|
21
|
+
export interface DoctorOptions {
|
|
22
|
+
readonly startDir?: string;
|
|
23
|
+
/** Skip network calls, for offline diagnosis. */
|
|
24
|
+
readonly offline?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* `doctor` exists to answer "why did that not work?" without the user reading source.
|
|
28
|
+
*
|
|
29
|
+
* Every check reports *what it looked at*, not just a verdict, because the common failures
|
|
30
|
+
* here are environmental — an agent installed somewhere unusual, a read-only directory, a
|
|
31
|
+
* registry behind a proxy — and a bare red cross does not help with any of them.
|
|
32
|
+
*/
|
|
33
|
+
export declare class DiagnoseSystem {
|
|
34
|
+
private readonly ctx;
|
|
35
|
+
constructor(ctx: ApplicationContext);
|
|
36
|
+
execute(options?: DoctorOptions): Promise<DoctorReport>;
|
|
37
|
+
private environmentSection;
|
|
38
|
+
private registrySection;
|
|
39
|
+
private agentSections;
|
|
40
|
+
private directoryCheck;
|
|
41
|
+
/** Reads every install receipt and reports drift, corruption and unmanaged directories. */
|
|
42
|
+
private installationsSection;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=diagnose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/application/diagnose.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,iDAAiD;IACjD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,GAAG,EAAE,kBAAkB;IAI7B,OAAO,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAsBjE,OAAO,CAAC,kBAAkB;YAqBZ,eAAe;YAkDf,aAAa;YAmDb,cAAc;IA0C5B,2FAA2F;YAC7E,oBAAoB;CAmDnC"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { INSTALL_SCOPES } from "../domain/agent.js";
|
|
2
|
+
import { isAgentSkillsError } from "../domain/errors.js";
|
|
3
|
+
import { targetsFor, detectAgents } from "./agent-selection.js";
|
|
4
|
+
import { findProjectRoot } from "./workspace.js";
|
|
5
|
+
/**
|
|
6
|
+
* `doctor` exists to answer "why did that not work?" without the user reading source.
|
|
7
|
+
*
|
|
8
|
+
* Every check reports *what it looked at*, not just a verdict, because the common failures
|
|
9
|
+
* here are environmental — an agent installed somewhere unusual, a read-only directory, a
|
|
10
|
+
* registry behind a proxy — and a bare red cross does not help with any of them.
|
|
11
|
+
*/
|
|
12
|
+
export class DiagnoseSystem {
|
|
13
|
+
ctx;
|
|
14
|
+
constructor(ctx) {
|
|
15
|
+
this.ctx = ctx;
|
|
16
|
+
}
|
|
17
|
+
async execute(options = {}) {
|
|
18
|
+
const projectRoot = await findProjectRoot(this.ctx.fs, options.startDir ?? this.ctx.env.cwd(), this.ctx.env.homeDir());
|
|
19
|
+
const detections = await detectAgents(this.ctx);
|
|
20
|
+
const sections = [
|
|
21
|
+
this.environmentSection(projectRoot),
|
|
22
|
+
await this.registrySection(options.offline === true),
|
|
23
|
+
...(await this.agentSections(detections, projectRoot)),
|
|
24
|
+
await this.installationsSection(projectRoot),
|
|
25
|
+
];
|
|
26
|
+
const checks = sections.flatMap((section) => section.checks);
|
|
27
|
+
const failures = checks.filter((check) => check.status === 'fail').length;
|
|
28
|
+
const warnings = checks.filter((check) => check.status === 'warn').length;
|
|
29
|
+
return { sections, ok: failures === 0, failures, warnings };
|
|
30
|
+
}
|
|
31
|
+
environmentSection(projectRoot) {
|
|
32
|
+
const nodeVersion = typeof process === 'undefined' ? 'unknown' : process.version;
|
|
33
|
+
return {
|
|
34
|
+
title: 'Environment',
|
|
35
|
+
checks: [
|
|
36
|
+
{ status: 'ok', title: 'CLI', detail: this.ctx.toolVersion },
|
|
37
|
+
{ status: 'ok', title: 'Node', detail: nodeVersion },
|
|
38
|
+
{ status: 'ok', title: 'Platform', detail: this.ctx.env.platform() },
|
|
39
|
+
{ status: 'ok', title: 'Home', detail: this.ctx.env.homeDir() },
|
|
40
|
+
projectRoot === undefined
|
|
41
|
+
? {
|
|
42
|
+
status: 'skip',
|
|
43
|
+
title: 'Project',
|
|
44
|
+
detail: 'not inside a project',
|
|
45
|
+
hint: 'Project-scoped commands need a directory with .git, skills.lock or an agent directory',
|
|
46
|
+
}
|
|
47
|
+
: { status: 'ok', title: 'Project', detail: projectRoot },
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async registrySection(offline) {
|
|
52
|
+
const members = this.ctx.registry.members();
|
|
53
|
+
if (members.length === 0) {
|
|
54
|
+
return {
|
|
55
|
+
title: 'Registries',
|
|
56
|
+
checks: [
|
|
57
|
+
{
|
|
58
|
+
status: 'fail',
|
|
59
|
+
title: 'No registries configured',
|
|
60
|
+
hint: 'senior-skills registry add official <url>',
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const checks = [];
|
|
66
|
+
for (const [index, registry] of members.entries()) {
|
|
67
|
+
const precedence = `#${index + 1}`;
|
|
68
|
+
if (offline) {
|
|
69
|
+
checks.push({
|
|
70
|
+
status: 'skip',
|
|
71
|
+
title: `${registry.name} ${precedence}`,
|
|
72
|
+
detail: `${registry.kind} (offline, not contacted)`,
|
|
73
|
+
});
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await registry.refresh();
|
|
78
|
+
const results = await registry.search({ text: '', limit: 1000 });
|
|
79
|
+
checks.push({
|
|
80
|
+
status: registry.trusted ? 'ok' : 'warn',
|
|
81
|
+
title: `${registry.name} ${precedence}`,
|
|
82
|
+
detail: `${registry.kind} · ${results.length} skill${results.length === 1 ? '' : 's'}${registry.trusted ? '' : ' · marked untrusted'}`,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
checks.push({
|
|
87
|
+
status: 'fail',
|
|
88
|
+
title: `${registry.name} ${precedence}`,
|
|
89
|
+
detail: isAgentSkillsError(error) ? error.message : String(error),
|
|
90
|
+
hint: 'Check the URL and your network access, then re-run',
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { title: 'Registries', checks };
|
|
95
|
+
}
|
|
96
|
+
async agentSections(detections, projectRoot) {
|
|
97
|
+
const sections = [];
|
|
98
|
+
for (const adapter of this.ctx.agents.all()) {
|
|
99
|
+
const detection = detections.find((item) => item.agentId === adapter.id);
|
|
100
|
+
const enabled = this.ctx.config.agents[adapter.id]?.enabled !== false;
|
|
101
|
+
const checks = [];
|
|
102
|
+
checks.push({
|
|
103
|
+
status: detection?.installed === true ? 'ok' : detection?.strength === 'weak' ? 'warn' : 'skip',
|
|
104
|
+
title: 'Detected',
|
|
105
|
+
detail: detection === undefined
|
|
106
|
+
? 'detection failed'
|
|
107
|
+
: detection.installed
|
|
108
|
+
? `yes${detection.version === undefined ? '' : ` (${detection.version})`}`
|
|
109
|
+
: detection.strength === 'weak'
|
|
110
|
+
? 'weak evidence only'
|
|
111
|
+
: 'no',
|
|
112
|
+
notes: detection?.evidence.map((item) => `${item.kind}: ${item.detail}`) ?? [],
|
|
113
|
+
...(detection?.installed === true
|
|
114
|
+
? {}
|
|
115
|
+
: { hint: `Use --agent ${adapter.aliases[0] ?? adapter.id} to target it anyway` }),
|
|
116
|
+
});
|
|
117
|
+
if (!enabled) {
|
|
118
|
+
checks.push({
|
|
119
|
+
status: 'warn',
|
|
120
|
+
title: 'Enabled',
|
|
121
|
+
detail: 'disabled in config',
|
|
122
|
+
hint: `Set agents.${adapter.id}.enabled to true in ${this.ctx.env.homeDir()}`,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
for (const scope of INSTALL_SCOPES) {
|
|
126
|
+
if (scope === 'project' && projectRoot === undefined)
|
|
127
|
+
continue;
|
|
128
|
+
for (const target of targetsFor(this.ctx, adapter, scope, projectRoot)) {
|
|
129
|
+
checks.push(await this.directoryCheck(`${scope} ${target.kind} directory`, target.root));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
sections.push({ title: adapter.displayName, checks });
|
|
133
|
+
}
|
|
134
|
+
return sections;
|
|
135
|
+
}
|
|
136
|
+
async directoryCheck(title, path) {
|
|
137
|
+
try {
|
|
138
|
+
if (!(await this.ctx.fs.exists(path))) {
|
|
139
|
+
return {
|
|
140
|
+
status: 'skip',
|
|
141
|
+
title,
|
|
142
|
+
detail: `${path} (does not exist yet)`,
|
|
143
|
+
hint: 'It is created on first install',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const stat = await this.ctx.fs.lstat(path);
|
|
147
|
+
if (stat.isSymbolicLink) {
|
|
148
|
+
const target = await this.ctx.fs.readlink(path).catch(() => '(unreadable)');
|
|
149
|
+
const broken = !(await this.ctx.fs.exists(path).catch(() => false));
|
|
150
|
+
return {
|
|
151
|
+
status: broken ? 'fail' : 'warn',
|
|
152
|
+
title,
|
|
153
|
+
detail: `${path} -> ${target}${broken ? ' (broken link)' : ' (symlink)'}`,
|
|
154
|
+
...(broken ? { hint: 'Repair or remove the link before installing' } : {}),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (!stat.isDirectory) {
|
|
158
|
+
return { status: 'fail', title, detail: `${path} exists but is not a directory` };
|
|
159
|
+
}
|
|
160
|
+
if (!(await this.ctx.fs.isWritable(path))) {
|
|
161
|
+
return {
|
|
162
|
+
status: 'fail',
|
|
163
|
+
title,
|
|
164
|
+
detail: `${path} is not writable`,
|
|
165
|
+
hint: 'Fix the permissions, or install into a different scope',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return { status: 'ok', title, detail: path };
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return {
|
|
172
|
+
status: 'fail',
|
|
173
|
+
title,
|
|
174
|
+
detail: `${path}: ${isAgentSkillsError(error) ? error.message : String(error)}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Reads every install receipt and reports drift, corruption and unmanaged directories. */
|
|
179
|
+
async installationsSection(projectRoot) {
|
|
180
|
+
const checks = [];
|
|
181
|
+
let managed = 0;
|
|
182
|
+
let modified = 0;
|
|
183
|
+
let unmanaged = 0;
|
|
184
|
+
for (const adapter of this.ctx.agents.all()) {
|
|
185
|
+
for (const scope of INSTALL_SCOPES) {
|
|
186
|
+
if (scope === 'project' && projectRoot === undefined)
|
|
187
|
+
continue;
|
|
188
|
+
for (const target of targetsFor(this.ctx, adapter, scope, projectRoot)) {
|
|
189
|
+
let skills;
|
|
190
|
+
try {
|
|
191
|
+
skills = await this.ctx.installer.list(target);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
checks.push({
|
|
195
|
+
status: 'fail',
|
|
196
|
+
title: `${adapter.displayName} ${scope} ${target.kind} metadata`,
|
|
197
|
+
detail: isAgentSkillsError(error) ? error.message : String(error),
|
|
198
|
+
});
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
for (const skill of skills) {
|
|
202
|
+
if (skill.unmanaged) {
|
|
203
|
+
unmanaged += 1;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
managed += 1;
|
|
207
|
+
if (skill.modified) {
|
|
208
|
+
modified += 1;
|
|
209
|
+
checks.push({
|
|
210
|
+
status: 'warn',
|
|
211
|
+
title: `${skill.name} (${adapter.id}, ${scope}, ${target.kind})`,
|
|
212
|
+
detail: 'files changed since installation',
|
|
213
|
+
hint: `senior-skills install ${skill.name} --force to restore, or leave it if the edits are intentional`,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
checks.unshift({
|
|
221
|
+
status: 'ok',
|
|
222
|
+
title: 'Installed package metadata',
|
|
223
|
+
detail: `${managed} managed · ${modified} modified · ${unmanaged} not managed by senior-skills`,
|
|
224
|
+
});
|
|
225
|
+
return { title: 'Installations', checks };
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/application/diagnose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { AgentTarget, InstallScope } from '../domain/agent.ts';
|
|
2
|
+
import type { InstallResult } from '../ports/installation.ts';
|
|
3
|
+
import type { ValidationIssue } from '../domain/validation.ts';
|
|
4
|
+
import { type AgentSelection } from './agent-selection.ts';
|
|
5
|
+
import type { ApplicationContext } from './context.ts';
|
|
6
|
+
import { type InstallResolvedSkill } from './resolve-suggestions.ts';
|
|
7
|
+
export interface InstallOptions {
|
|
8
|
+
/** Raw `[registry:]name[@range]` strings from the command line. */
|
|
9
|
+
readonly refs: readonly string[];
|
|
10
|
+
readonly scope: InstallScope;
|
|
11
|
+
readonly agents?: readonly string[];
|
|
12
|
+
readonly projectRoot?: string;
|
|
13
|
+
readonly startDir?: string;
|
|
14
|
+
readonly registry?: string;
|
|
15
|
+
readonly force?: boolean;
|
|
16
|
+
readonly dryRun?: boolean;
|
|
17
|
+
/** Install exactly what was asked for, ignoring the dependency graph. */
|
|
18
|
+
readonly skipDependencies?: boolean;
|
|
19
|
+
/** Include only suggestions declared by the explicitly requested skills. */
|
|
20
|
+
readonly withSuggests?: boolean;
|
|
21
|
+
/** Update supplies ranges for already installed companions; new suggestions use normal pins. */
|
|
22
|
+
readonly suggestedVersionRanges?: Readonly<Record<string, string>>;
|
|
23
|
+
}
|
|
24
|
+
export interface InstallReport {
|
|
25
|
+
readonly scope: InstallScope;
|
|
26
|
+
readonly projectRoot?: string;
|
|
27
|
+
/** The roots actually written to: one per agent and package kind installed. */
|
|
28
|
+
readonly targets: readonly AgentTarget[];
|
|
29
|
+
readonly resolved: readonly InstallResolvedSkill[];
|
|
30
|
+
readonly results: readonly InstallResult[];
|
|
31
|
+
/** Non-fatal findings from package validation and optional-dependency skips. */
|
|
32
|
+
readonly warnings: readonly string[];
|
|
33
|
+
readonly dryRun: boolean;
|
|
34
|
+
readonly lockfileUpdated: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The install use case: resolve → fetch → verify → validate → install per agent → record.
|
|
38
|
+
*
|
|
39
|
+
* The service owns *ordering and policy*; it performs no filesystem mutation itself. Every
|
|
40
|
+
* write goes through the `InstallationEngine`, which is what keeps atomicity in one place.
|
|
41
|
+
*/
|
|
42
|
+
export declare class InstallSkills {
|
|
43
|
+
private readonly ctx;
|
|
44
|
+
constructor(ctx: ApplicationContext);
|
|
45
|
+
execute(options: InstallOptions): Promise<InstallReport>;
|
|
46
|
+
private resolve;
|
|
47
|
+
/**
|
|
48
|
+
* Fetches the payload, checks it against the lockfile pin, and validates it before any
|
|
49
|
+
* agent-specific work happens. Validation errors abort: installing a package we know is
|
|
50
|
+
* malformed just moves the failure into the agent.
|
|
51
|
+
*/
|
|
52
|
+
private fetchAndVerify;
|
|
53
|
+
/** Empty `compatibility` means "every agent"; a non-empty list is an allowlist. */
|
|
54
|
+
private isCompatible;
|
|
55
|
+
}
|
|
56
|
+
export declare function formatIssue(issue: ValidationIssue): string;
|
|
57
|
+
export type { AgentSelection };
|
|
58
|
+
export type { InstallResolvedSkill };
|
|
59
|
+
//# sourceMappingURL=install-skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.d.ts","sourceRoot":"","sources":["../../src/application/install-skills.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAsB,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIzF,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,gGAAgG;IAChG,QAAQ,CAAC,sBAAsB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,GAAG,EAAE,kBAAkB;IAI7B,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;YAqHhD,OAAO;IAkBrB;;;;OAIG;YACW,cAAc;IA8D5B,mFAAmF;IACnF,OAAO,CAAC,YAAY;CAIrB;AAiBD,wBAAgB,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAE1D;AAED,YAAY,EAAE,cAAc,EAAE,CAAC;AAC/B,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { AgentSkillsError, ErrorCode } from "../domain/errors.js";
|
|
2
|
+
import { assertIntegrityMatches, withSkill } from "../domain/lockfile.js";
|
|
3
|
+
import { Resolver } from "../domain/resolver.js";
|
|
4
|
+
import { parseSkillRef } from "../domain/skill-ref.js";
|
|
5
|
+
import { selectAgents } from "./agent-selection.js";
|
|
6
|
+
import { FederationResolutionSource } from "./resolution-source.js";
|
|
7
|
+
import { resolveSuggestions } from "./resolve-suggestions.js";
|
|
8
|
+
import { validatePackage } from "./validate-package.js";
|
|
9
|
+
import { pinsFrom, readLockfile, writeLockfile } from "./workspace.js";
|
|
10
|
+
/**
|
|
11
|
+
* The install use case: resolve → fetch → verify → validate → install per agent → record.
|
|
12
|
+
*
|
|
13
|
+
* The service owns *ordering and policy*; it performs no filesystem mutation itself. Every
|
|
14
|
+
* write goes through the `InstallationEngine`, which is what keeps atomicity in one place.
|
|
15
|
+
*/
|
|
16
|
+
export class InstallSkills {
|
|
17
|
+
ctx;
|
|
18
|
+
constructor(ctx) {
|
|
19
|
+
this.ctx = ctx;
|
|
20
|
+
}
|
|
21
|
+
async execute(options) {
|
|
22
|
+
if (options.withSuggests === true && options.skipDependencies === true) {
|
|
23
|
+
throw new AgentSkillsError(ErrorCode.USAGE, '--with-suggests cannot be combined with --no-deps', {
|
|
24
|
+
hints: [
|
|
25
|
+
'Use --with-suggests without --no-deps to include the suggestions and their dependencies',
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (options.refs.length === 0) {
|
|
30
|
+
throw new AgentSkillsError(ErrorCode.USAGE, 'No skills given', {
|
|
31
|
+
hints: ['senior-skills install java-performance'],
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const refs = options.refs.map((raw) => parseSkillRef(raw));
|
|
35
|
+
const selection = await selectAgents(this.ctx, {
|
|
36
|
+
scope: options.scope,
|
|
37
|
+
...(options.agents === undefined ? {} : { agents: options.agents }),
|
|
38
|
+
...(options.projectRoot === undefined ? {} : { projectRoot: options.projectRoot }),
|
|
39
|
+
...(options.startDir === undefined ? {} : { startDir: options.startDir }),
|
|
40
|
+
});
|
|
41
|
+
const lock = options.scope === 'project' && selection.projectRoot !== undefined
|
|
42
|
+
? await readLockfile(this.ctx.fs, selection.projectRoot)
|
|
43
|
+
: undefined;
|
|
44
|
+
const resolution = await this.resolve(refs, options, lock);
|
|
45
|
+
const warnings = [...resolution.warnings];
|
|
46
|
+
const results = [];
|
|
47
|
+
const used = new Map();
|
|
48
|
+
let nextLock = lock;
|
|
49
|
+
for (const skill of resolution.order) {
|
|
50
|
+
const fetched = await this.fetchAndVerify(skill, lock, warnings);
|
|
51
|
+
const kind = fetched.pkg.manifest.kind;
|
|
52
|
+
// A package goes only into the root its kind belongs in, and only for agents that have
|
|
53
|
+
// such a root at all: Codex has no user-invoked commands, so a command install there is
|
|
54
|
+
// reported as skipped rather than written into a directory it never reads.
|
|
55
|
+
const targets = selection.targets.filter((target) => target.kind === kind);
|
|
56
|
+
for (const adapter of selection.adapters) {
|
|
57
|
+
if (targets.some((target) => target.agentId === adapter.id))
|
|
58
|
+
continue;
|
|
59
|
+
warnings.push(`${adapter.displayName} has no ${kind} directory; ${skill.name}@${skill.version} was skipped for it`);
|
|
60
|
+
}
|
|
61
|
+
const installedInto = [];
|
|
62
|
+
for (const target of targets) {
|
|
63
|
+
if (!this.isCompatible(skill, target)) {
|
|
64
|
+
warnings.push(`${skill.name}@${skill.version} does not declare compatibility with ${target.agentId}; skipped`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const adapter = this.ctx.agents.find(target.agentId);
|
|
68
|
+
results.push(await this.ctx.installer.install({
|
|
69
|
+
pkg: fetched.pkg,
|
|
70
|
+
adapter,
|
|
71
|
+
target,
|
|
72
|
+
registry: fetched.registry,
|
|
73
|
+
resolved: fetched.resolved,
|
|
74
|
+
integrity: fetched.integrity,
|
|
75
|
+
dependencyOf: skill.requiredBy,
|
|
76
|
+
force: options.force === true,
|
|
77
|
+
dryRun: options.dryRun === true,
|
|
78
|
+
}));
|
|
79
|
+
installedInto.push(target);
|
|
80
|
+
used.set(`${target.agentId}:${target.scope}:${target.kind}`, target);
|
|
81
|
+
}
|
|
82
|
+
if (nextLock !== undefined) {
|
|
83
|
+
nextLock = withSkill(nextLock, skill.name, {
|
|
84
|
+
version: skill.version,
|
|
85
|
+
registry: fetched.registry,
|
|
86
|
+
resolved: fetched.resolved,
|
|
87
|
+
integrity: fetched.integrity,
|
|
88
|
+
agents: [...new Set(installedInto.map((target) => target.agentId))],
|
|
89
|
+
dependencies: dependencyVersions(skill, resolution.order),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const lockfileUpdated = nextLock !== undefined &&
|
|
94
|
+
selection.projectRoot !== undefined &&
|
|
95
|
+
options.dryRun !== true &&
|
|
96
|
+
results.length > 0;
|
|
97
|
+
if (lockfileUpdated) {
|
|
98
|
+
await writeLockfile(this.ctx.fs, selection.projectRoot, {
|
|
99
|
+
...nextLock,
|
|
100
|
+
generatedWith: this.ctx.toolVersion,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
scope: options.scope,
|
|
105
|
+
...(selection.projectRoot === undefined ? {} : { projectRoot: selection.projectRoot }),
|
|
106
|
+
targets: [...used.values()],
|
|
107
|
+
resolved: resolution.order,
|
|
108
|
+
results,
|
|
109
|
+
warnings,
|
|
110
|
+
dryRun: options.dryRun === true,
|
|
111
|
+
lockfileUpdated,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
async resolve(refs, options, lock) {
|
|
115
|
+
const source = new FederationResolutionSource(this.ctx.registry, options.registry);
|
|
116
|
+
const resolveOptions = {
|
|
117
|
+
// A bare `name` honours the lockfile pin; `name@latest` deliberately does not.
|
|
118
|
+
...(lock === undefined ? {} : { pinned: pinsFrom(lock) }),
|
|
119
|
+
...(options.skipDependencies === undefined
|
|
120
|
+
? {}
|
|
121
|
+
: { skipDependencies: options.skipDependencies }),
|
|
122
|
+
};
|
|
123
|
+
return options.withSuggests === true
|
|
124
|
+
? resolveSuggestions(source, refs, resolveOptions, options.suggestedVersionRanges)
|
|
125
|
+
: new Resolver(source).resolve(refs, resolveOptions);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Fetches the payload, checks it against the lockfile pin, and validates it before any
|
|
129
|
+
* agent-specific work happens. Validation errors abort: installing a package we know is
|
|
130
|
+
* malformed just moves the failure into the agent.
|
|
131
|
+
*/
|
|
132
|
+
async fetchAndVerify(skill, lock, warnings) {
|
|
133
|
+
const registry = this.ctx.registry.named(skill.registry);
|
|
134
|
+
if (registry === undefined) {
|
|
135
|
+
throw new AgentSkillsError(ErrorCode.REGISTRY_NOT_FOUND, `No registry named "${skill.registry}"`);
|
|
136
|
+
}
|
|
137
|
+
const fetched = await registry.fetch(skill.name, skill.version);
|
|
138
|
+
const locked = lock?.skills[skill.name];
|
|
139
|
+
if (locked !== undefined && locked.version === skill.version) {
|
|
140
|
+
assertIntegrityMatches(skill.name, locked.integrity, fetched.integrity);
|
|
141
|
+
}
|
|
142
|
+
if (skill.entry.integrity !== undefined && skill.entry.integrity !== fetched.integrity) {
|
|
143
|
+
throw new AgentSkillsError(ErrorCode.INTEGRITY_MISMATCH, `Integrity mismatch for ${skill.name}@${skill.version}`, {
|
|
144
|
+
details: [
|
|
145
|
+
`registry index declares: ${skill.entry.integrity}`,
|
|
146
|
+
`downloaded content is: ${fetched.integrity}`,
|
|
147
|
+
'',
|
|
148
|
+
'The payload does not match what the registry index says it should be.',
|
|
149
|
+
],
|
|
150
|
+
hints: ['Report this to the registry maintainers before installing'],
|
|
151
|
+
data: { name: skill.name, version: skill.version },
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const report = validatePackage(fetched.pkg, { adapters: this.ctx.agents.all() });
|
|
155
|
+
if (!report.ok) {
|
|
156
|
+
throw new AgentSkillsError(ErrorCode.INVALID_PACKAGE, `Package ${skill.name}@${skill.version} failed validation`, {
|
|
157
|
+
details: report.errors.map(formatIssue),
|
|
158
|
+
hints: ['This is a problem with the published package, not with your machine'],
|
|
159
|
+
data: { name: skill.name, version: skill.version, issues: report.errors },
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
for (const warning of report.warnings) {
|
|
163
|
+
warnings.push(`${skill.name}@${skill.version}: ${warning.message}`);
|
|
164
|
+
}
|
|
165
|
+
if (skill.entry.deprecated) {
|
|
166
|
+
warnings.push(`${skill.name}@${skill.version} is deprecated${skill.entry.deprecationReason === undefined ? '' : `: ${skill.entry.deprecationReason}`}`);
|
|
167
|
+
}
|
|
168
|
+
return fetched;
|
|
169
|
+
}
|
|
170
|
+
/** Empty `compatibility` means "every agent"; a non-empty list is an allowlist. */
|
|
171
|
+
isCompatible(skill, target) {
|
|
172
|
+
const declared = skill.manifest.compatibility;
|
|
173
|
+
return declared.length === 0 || declared.some((entry) => entry.id === target.agentId);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function dependencyVersions(skill, order) {
|
|
177
|
+
const versions = {};
|
|
178
|
+
for (const dependency of [
|
|
179
|
+
...skill.manifest.dependencies,
|
|
180
|
+
...skill.manifest.optionalDependencies,
|
|
181
|
+
]) {
|
|
182
|
+
const resolved = order.find((candidate) => candidate.name === dependency.name);
|
|
183
|
+
if (resolved !== undefined)
|
|
184
|
+
versions[dependency.name] = resolved.version;
|
|
185
|
+
}
|
|
186
|
+
return versions;
|
|
187
|
+
}
|
|
188
|
+
export function formatIssue(issue) {
|
|
189
|
+
return ` ${issue.at}: ${issue.message}${issue.hint === undefined ? '' : ` (${issue.hint})`}`;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=install-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/application/install-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type AgentTarget, type InstallScope } from '../domain/agent.ts';
|
|
2
|
+
import type { InstalledSkill } from '../ports/installation.ts';
|
|
3
|
+
import type { ApplicationContext } from './context.ts';
|
|
4
|
+
export interface ListOptions {
|
|
5
|
+
readonly agents?: readonly string[];
|
|
6
|
+
/** Omit to list both global and project scopes. */
|
|
7
|
+
readonly scope?: InstallScope;
|
|
8
|
+
readonly projectRoot?: string;
|
|
9
|
+
readonly startDir?: string;
|
|
10
|
+
/** Include directories in the skill root that the tool did not install. */
|
|
11
|
+
readonly includeUnmanaged?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ListEntry {
|
|
14
|
+
readonly target: AgentTarget;
|
|
15
|
+
readonly skills: readonly InstalledSkill[];
|
|
16
|
+
}
|
|
17
|
+
export interface ListReport {
|
|
18
|
+
readonly entries: readonly ListEntry[];
|
|
19
|
+
readonly projectRoot?: string;
|
|
20
|
+
readonly total: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Lists what is installed, per agent and scope.
|
|
24
|
+
*
|
|
25
|
+
* Unlike install, this never fails when an agent is undetected: showing an empty Codex
|
|
26
|
+
* section is more useful than an error, because the usual question is "what do I have?"
|
|
27
|
+
* rather than "what can I install into?".
|
|
28
|
+
*/
|
|
29
|
+
export declare class ListInstalled {
|
|
30
|
+
private readonly ctx;
|
|
31
|
+
constructor(ctx: ApplicationContext);
|
|
32
|
+
execute(options?: ListOptions): Promise<ListReport>;
|
|
33
|
+
/**
|
|
34
|
+
* Canonical form of a root for identity comparison. A root that does not exist yet has no
|
|
35
|
+
* canonical form to resolve — the resolved literal path is the best available identity.
|
|
36
|
+
*/
|
|
37
|
+
private canonical;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=list-installed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-installed.d.ts","sourceRoot":"","sources":["../../src/application/list-installed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2EAA2E;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,CAAC;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,GAAG,EAAE,kBAAkB;IAI7B,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAwD7D;;;OAGG;YACW,SAAS;CAIxB"}
|