@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,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure ports.
|
|
3
|
+
*
|
|
4
|
+
* Every interaction with the outside world goes through one of these. They are small on
|
|
5
|
+
* purpose: a small port is easy to fake in a test and easy to reimplement for a new
|
|
6
|
+
* runtime, and it keeps the domain honest about what it actually needs.
|
|
7
|
+
*/
|
|
8
|
+
export interface FileStat {
|
|
9
|
+
readonly isFile: boolean;
|
|
10
|
+
readonly isDirectory: boolean;
|
|
11
|
+
readonly isSymbolicLink: boolean;
|
|
12
|
+
readonly size: number;
|
|
13
|
+
readonly mtimeMs: number;
|
|
14
|
+
/** POSIX mode bits. Zero on filesystems that do not report them. */
|
|
15
|
+
readonly mode: number;
|
|
16
|
+
}
|
|
17
|
+
export interface DirEntry {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly isFile: boolean;
|
|
20
|
+
readonly isDirectory: boolean;
|
|
21
|
+
readonly isSymbolicLink: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The only port permitted to mutate the disk. Concentrating writes here is what lets the
|
|
25
|
+
* security model make categorical claims.
|
|
26
|
+
*
|
|
27
|
+
* Paths are OS-native absolute paths. Package-relative POSIX paths never reach this port.
|
|
28
|
+
*/
|
|
29
|
+
export interface FileSystem {
|
|
30
|
+
readFile(path: string): Promise<Uint8Array>;
|
|
31
|
+
readTextFile(path: string): Promise<string>;
|
|
32
|
+
writeFile(path: string, data: Uint8Array | string): Promise<void>;
|
|
33
|
+
exists(path: string): Promise<boolean>;
|
|
34
|
+
/** Never follows the final symlink, so link-planting is detectable. */
|
|
35
|
+
lstat(path: string): Promise<FileStat>;
|
|
36
|
+
stat(path: string): Promise<FileStat>;
|
|
37
|
+
readDir(path: string): Promise<readonly DirEntry[]>;
|
|
38
|
+
mkdirp(path: string): Promise<void>;
|
|
39
|
+
remove(path: string): Promise<void>;
|
|
40
|
+
/** Atomic within a filesystem; the installer guarantees same-filesystem staging. */
|
|
41
|
+
rename(from: string, to: string): Promise<void>;
|
|
42
|
+
copyFile(from: string, to: string): Promise<void>;
|
|
43
|
+
/** Fully resolved real path, with symlinks followed. Used to prove containment. */
|
|
44
|
+
realpath(path: string): Promise<string>;
|
|
45
|
+
readlink(path: string): Promise<string>;
|
|
46
|
+
/** Creates a uniquely-named directory under `parent`. */
|
|
47
|
+
makeTempDir(parent: string, prefix: string): Promise<string>;
|
|
48
|
+
/** Reports whether the process can write into `path` without actually writing. */
|
|
49
|
+
isWritable(path: string): Promise<boolean>;
|
|
50
|
+
join(...parts: readonly string[]): string;
|
|
51
|
+
resolve(...parts: readonly string[]): string;
|
|
52
|
+
dirname(path: string): string;
|
|
53
|
+
basename(path: string): string;
|
|
54
|
+
relative(from: string, to: string): string;
|
|
55
|
+
isAbsolute(path: string): boolean;
|
|
56
|
+
readonly separator: string;
|
|
57
|
+
}
|
|
58
|
+
export interface HttpResponse {
|
|
59
|
+
readonly status: number;
|
|
60
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
61
|
+
readonly body: Uint8Array;
|
|
62
|
+
}
|
|
63
|
+
export interface HttpRequestOptions {
|
|
64
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
65
|
+
readonly timeoutMs?: number;
|
|
66
|
+
/** Hard cap on the response body; exceeding it aborts rather than buffering. */
|
|
67
|
+
readonly maxBytes?: number;
|
|
68
|
+
}
|
|
69
|
+
export interface HttpClient {
|
|
70
|
+
get(url: string, options?: HttpRequestOptions): Promise<HttpResponse>;
|
|
71
|
+
}
|
|
72
|
+
export interface CommandResult {
|
|
73
|
+
readonly code: number;
|
|
74
|
+
readonly stdout: string;
|
|
75
|
+
readonly stderr: string;
|
|
76
|
+
}
|
|
77
|
+
export interface CommandOptions {
|
|
78
|
+
readonly cwd?: string;
|
|
79
|
+
readonly timeoutMs?: number;
|
|
80
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
81
|
+
}
|
|
82
|
+
/** Used only for `git` in the git registry, and for agent version probes during detection. */
|
|
83
|
+
export interface CommandRunner {
|
|
84
|
+
run(command: string, args: readonly string[], options?: CommandOptions): Promise<CommandResult>;
|
|
85
|
+
/** Absolute path of an executable on PATH, or undefined. */
|
|
86
|
+
which(command: string): Promise<string | undefined>;
|
|
87
|
+
}
|
|
88
|
+
export interface Hasher {
|
|
89
|
+
/** Returns an SRI-style string, e.g. `sha256-<base64>`. */
|
|
90
|
+
hash(data: Uint8Array): string;
|
|
91
|
+
hashFile(path: string): Promise<string>;
|
|
92
|
+
}
|
|
93
|
+
export interface ArchiveEntry {
|
|
94
|
+
/** Path as recorded in the archive, before any normalisation. Untrusted. */
|
|
95
|
+
readonly path: string;
|
|
96
|
+
readonly type: 'file' | 'directory' | 'symlink' | 'other';
|
|
97
|
+
readonly size: number;
|
|
98
|
+
readonly mode: number;
|
|
99
|
+
readonly linkTarget?: string;
|
|
100
|
+
readonly bytes: Uint8Array;
|
|
101
|
+
}
|
|
102
|
+
/** Reads `.tar.gz` payloads. Extraction *safety* is the installer's job, not this port's. */
|
|
103
|
+
export interface ArchiveReader {
|
|
104
|
+
read(data: Uint8Array): Promise<readonly ArchiveEntry[]>;
|
|
105
|
+
}
|
|
106
|
+
export interface Environment {
|
|
107
|
+
homeDir(): string;
|
|
108
|
+
cwd(): string;
|
|
109
|
+
tempDir(): string;
|
|
110
|
+
platform(): 'win32' | 'darwin' | 'linux' | string;
|
|
111
|
+
env(): Readonly<Record<string, string | undefined>>;
|
|
112
|
+
}
|
|
113
|
+
export interface Clock {
|
|
114
|
+
now(): Date;
|
|
115
|
+
}
|
|
116
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
117
|
+
export interface Logger {
|
|
118
|
+
debug(message: string, ...args: readonly unknown[]): void;
|
|
119
|
+
info(message: string, ...args: readonly unknown[]): void;
|
|
120
|
+
warn(message: string, ...args: readonly unknown[]): void;
|
|
121
|
+
error(message: string, ...args: readonly unknown[]): void;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=infrastructure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infrastructure.d.ts","sourceRoot":"","sources":["../../src/ports/infrastructure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infrastructure ports.
|
|
3
|
+
*
|
|
4
|
+
* Every interaction with the outside world goes through one of these. They are small on
|
|
5
|
+
* purpose: a small port is easy to fake in a test and easy to reimplement for a new
|
|
6
|
+
* runtime, and it keeps the domain honest about what it actually needs.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=infrastructure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infrastructure.js","sourceRoot":"","sources":["../../src/ports/infrastructure.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { AgentId, AgentTarget, InstallScope } from '../domain/agent.ts';
|
|
2
|
+
import type { InstallReceipt } from '../domain/receipt.ts';
|
|
3
|
+
import type { SkillPackage } from '../domain/skill-package.ts';
|
|
4
|
+
import type { SemanticVersion } from '../domain/version.ts';
|
|
5
|
+
import type { AgentAdapter } from './agent-adapter.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Turns an untrusted archive into a validated package.
|
|
8
|
+
*
|
|
9
|
+
* A port rather than a direct dependency so registries — which need it to serve tarballs —
|
|
10
|
+
* depend only on core, and the one hardened implementation stays in `@senior-skills/installer`.
|
|
11
|
+
*/
|
|
12
|
+
export interface PackageExtractor {
|
|
13
|
+
extract(data: Uint8Array, source: string): Promise<SkillPackage>;
|
|
14
|
+
}
|
|
15
|
+
export interface InstallRequest {
|
|
16
|
+
readonly pkg: SkillPackage;
|
|
17
|
+
readonly adapter: AgentAdapter;
|
|
18
|
+
readonly target: AgentTarget;
|
|
19
|
+
readonly registry: string;
|
|
20
|
+
readonly resolved: string;
|
|
21
|
+
readonly integrity: string;
|
|
22
|
+
/** Names of skills that pulled this one in; empty for a direct install. */
|
|
23
|
+
readonly dependencyOf: readonly string[];
|
|
24
|
+
/** Overwrite an existing install whose files were modified by hand. */
|
|
25
|
+
readonly force: boolean;
|
|
26
|
+
/** Compute and report the plan without writing anything outside staging. */
|
|
27
|
+
readonly dryRun: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type InstallOutcome = 'installed' | 'upgraded' | 'downgraded' | 'reinstalled' | 'unchanged';
|
|
30
|
+
export interface InstallResult {
|
|
31
|
+
readonly outcome: InstallOutcome;
|
|
32
|
+
readonly name: string;
|
|
33
|
+
readonly version: SemanticVersion;
|
|
34
|
+
readonly previousVersion?: SemanticVersion;
|
|
35
|
+
readonly agentId: AgentId;
|
|
36
|
+
readonly scope: InstallScope;
|
|
37
|
+
/** Absolute path of the installed skill directory. */
|
|
38
|
+
readonly directory: string;
|
|
39
|
+
/** Relative POSIX paths written, in sorted order. */
|
|
40
|
+
readonly files: readonly string[];
|
|
41
|
+
readonly receipt: InstallReceipt;
|
|
42
|
+
}
|
|
43
|
+
export interface UninstallRequest {
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly adapter: AgentAdapter;
|
|
46
|
+
readonly target: AgentTarget;
|
|
47
|
+
/** Delete files even when their content no longer matches the receipt. */
|
|
48
|
+
readonly force: boolean;
|
|
49
|
+
readonly dryRun: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface UninstallResult {
|
|
52
|
+
readonly name: string;
|
|
53
|
+
readonly version?: SemanticVersion;
|
|
54
|
+
readonly agentId: AgentId;
|
|
55
|
+
readonly scope: InstallScope;
|
|
56
|
+
readonly directory: string;
|
|
57
|
+
readonly removed: readonly string[];
|
|
58
|
+
/** Files left behind because they were modified after installation. */
|
|
59
|
+
readonly preserved: readonly string[];
|
|
60
|
+
}
|
|
61
|
+
export interface InstalledSkill {
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly version: SemanticVersion;
|
|
64
|
+
readonly agentId: AgentId;
|
|
65
|
+
readonly scope: InstallScope;
|
|
66
|
+
readonly directory: string;
|
|
67
|
+
readonly registry: string;
|
|
68
|
+
readonly installedAt: string;
|
|
69
|
+
/** True when the tool has no receipt for a directory that exists in the skill root. */
|
|
70
|
+
readonly unmanaged: boolean;
|
|
71
|
+
/** True when on-disk content no longer matches the receipt. */
|
|
72
|
+
readonly modified: boolean;
|
|
73
|
+
readonly dependencyOf: readonly string[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The one component allowed to mutate an agent's skill directory. Implemented once, in
|
|
77
|
+
* `@senior-skills/installer`, so atomicity, rollback and ownership tracking exist in exactly
|
|
78
|
+
* one place regardless of how many agents are supported.
|
|
79
|
+
*/
|
|
80
|
+
export interface InstallationEngine {
|
|
81
|
+
install(request: InstallRequest): Promise<InstallResult>;
|
|
82
|
+
uninstall(request: UninstallRequest): Promise<UninstallResult>;
|
|
83
|
+
list(target: AgentTarget): Promise<readonly InstalledSkill[]>;
|
|
84
|
+
read(target: AgentTarget, name: string): Promise<InstalledSkill | undefined>;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=installation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.d.ts","sourceRoot":"","sources":["../../src/ports/installation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installation.js","sourceRoot":"","sources":["../../src/ports/installation.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { IndexVersionEntry, RegistryKind } from '../domain/registry-index.ts';
|
|
2
|
+
import type { SkillManifest } from '../domain/manifest.ts';
|
|
3
|
+
import type { SkillPackage } from '../domain/skill-package.ts';
|
|
4
|
+
import type { SemanticVersion } from '../domain/version.ts';
|
|
5
|
+
export interface SkillSummary {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly description: string;
|
|
8
|
+
readonly keywords: readonly string[];
|
|
9
|
+
readonly latest: SemanticVersion;
|
|
10
|
+
readonly registry: string;
|
|
11
|
+
/** Set when another, higher-precedence registry also publishes this name. */
|
|
12
|
+
readonly shadowedBy?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SearchQuery {
|
|
15
|
+
readonly text: string;
|
|
16
|
+
readonly limit?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface RefreshOptions {
|
|
19
|
+
/** Ignore the cache TTL and re-fetch. */
|
|
20
|
+
readonly force?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface FetchedPackage {
|
|
23
|
+
readonly pkg: SkillPackage;
|
|
24
|
+
readonly registry: string;
|
|
25
|
+
/** Fully qualified source location, recorded in the lockfile and receipts. */
|
|
26
|
+
readonly resolved: string;
|
|
27
|
+
/** Integrity computed over the fetched bytes, not copied from the manifest. */
|
|
28
|
+
readonly integrity: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A registry answers four questions: what exists, what versions, what manifest, give me the
|
|
32
|
+
* bytes. Local, Git and HTTP implementations differ only in how they answer them, which is
|
|
33
|
+
* what lets the CLI stay ignorant of where skills come from.
|
|
34
|
+
*/
|
|
35
|
+
export interface SkillRegistry {
|
|
36
|
+
readonly name: string;
|
|
37
|
+
readonly kind: RegistryKind;
|
|
38
|
+
/** Configured trust flag. Untrusted registries are reported in `doctor` and `info`. */
|
|
39
|
+
readonly trusted: boolean;
|
|
40
|
+
refresh(options?: RefreshOptions): Promise<void>;
|
|
41
|
+
search(query: SearchQuery): Promise<readonly SkillSummary[]>;
|
|
42
|
+
has(name: string): Promise<boolean>;
|
|
43
|
+
versions(name: string): Promise<readonly IndexVersionEntry[]>;
|
|
44
|
+
manifest(name: string, version: SemanticVersion): Promise<SkillManifest>;
|
|
45
|
+
fetch(name: string, version: SemanticVersion): Promise<FetchedPackage>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Precedence-aware routing over several registries.
|
|
49
|
+
*
|
|
50
|
+
* Kept separate from {@link SkillRegistry} so a single-registry setup needs only the four
|
|
51
|
+
* questions, while the application can still ask *which* registry owns a name — the answer
|
|
52
|
+
* that ends up pinned in the lockfile and in receipts.
|
|
53
|
+
*/
|
|
54
|
+
export interface RegistryRouter {
|
|
55
|
+
/** Configured name of the first registry publishing `name`, or undefined. */
|
|
56
|
+
ownerOf(name: string): Promise<string | undefined>;
|
|
57
|
+
named(name: string): SkillRegistry | undefined;
|
|
58
|
+
members(): readonly SkillRegistry[];
|
|
59
|
+
}
|
|
60
|
+
export interface FederatedRegistry extends SkillRegistry, RegistryRouter {
|
|
61
|
+
}
|
|
62
|
+
export interface RegistryConfig {
|
|
63
|
+
readonly name: string;
|
|
64
|
+
readonly url: string;
|
|
65
|
+
readonly kind: RegistryKind;
|
|
66
|
+
readonly trusted: boolean;
|
|
67
|
+
/** Git ref for git registries. Defaults to the remote's default branch. */
|
|
68
|
+
readonly ref?: string;
|
|
69
|
+
}
|
|
70
|
+
/** Builds a driver for a configured registry. Lets the CLI stay free of driver imports. */
|
|
71
|
+
export interface RegistryFactory {
|
|
72
|
+
create(config: RegistryConfig): SkillRegistry;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=skill-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-registry.d.ts","sourceRoot":"","sources":["../../src/ports/skill-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/ports/skill-registry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SemanticVersion } from '../domain/version.ts';
|
|
2
|
+
import type { CommandResult } from './infrastructure.ts';
|
|
3
|
+
export interface UpdateState {
|
|
4
|
+
readonly checks: Record<string, {
|
|
5
|
+
checkedAt: number;
|
|
6
|
+
versions: readonly SemanticVersion[];
|
|
7
|
+
}>;
|
|
8
|
+
readonly dismissed: readonly string[];
|
|
9
|
+
readonly deferred: Record<string, number>;
|
|
10
|
+
}
|
|
11
|
+
export declare function emptyUpdateState(): UpdateState;
|
|
12
|
+
/** Advisory state, separate from configuration, receipts and lockfiles. */
|
|
13
|
+
export interface UpdateStateStore {
|
|
14
|
+
load(): Promise<UpdateState>;
|
|
15
|
+
save(state: UpdateState): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export interface ToolUpdateAction {
|
|
18
|
+
/** Human-readable command, constructed locally, never supplied by a registry. */
|
|
19
|
+
readonly label: string;
|
|
20
|
+
/** Absent for temporary installs and installation methods we cannot identify. */
|
|
21
|
+
readonly run?: () => Promise<CommandResult>;
|
|
22
|
+
}
|
|
23
|
+
export interface ToolUpdater {
|
|
24
|
+
latestVersion(): Promise<SemanticVersion | undefined>;
|
|
25
|
+
action(version: SemanticVersion): Promise<ToolUpdateAction>;
|
|
26
|
+
}
|
|
27
|
+
export interface SelectionPrompt {
|
|
28
|
+
/** Zero-based choice; undefined means Escape, EOF or interruption. */
|
|
29
|
+
choose(message: string, choices: readonly string[]): Promise<number | undefined>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/ports/updates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7F,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C;AAED,wBAAgB,gBAAgB,IAAI,WAAW,CAE9C;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,IAAI,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IACtD,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAClF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/ports/updates.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { type PackageKind } from '../domain/manifest.ts';
|
|
2
|
+
import { type SkillPackage } from '../domain/skill-package.ts';
|
|
3
|
+
import type { IndexVersionEntry } from '../domain/registry-index.ts';
|
|
4
|
+
import type { SemanticVersion } from '../domain/version.ts';
|
|
5
|
+
import type { SkillManifest } from '../domain/manifest.ts';
|
|
6
|
+
import type { Clock, CommandOptions, CommandResult, CommandRunner, Environment, Hasher, HttpClient, HttpRequestOptions, HttpResponse, Logger } from '../ports/infrastructure.ts';
|
|
7
|
+
import type { RegistryKind } from '../domain/registry-index.ts';
|
|
8
|
+
import type { FetchedPackage, SearchQuery, SkillRegistry, SkillSummary } from '../ports/skill-registry.ts';
|
|
9
|
+
/** Fixed clock, so anything that records a timestamp is assertable. */
|
|
10
|
+
export declare class FixedClock implements Clock {
|
|
11
|
+
private current;
|
|
12
|
+
constructor(iso?: string);
|
|
13
|
+
now(): Date;
|
|
14
|
+
advance(milliseconds: number): void;
|
|
15
|
+
}
|
|
16
|
+
export interface FakeEnvironmentOptions {
|
|
17
|
+
readonly homeDir?: string;
|
|
18
|
+
readonly cwd?: string;
|
|
19
|
+
readonly tempDir?: string;
|
|
20
|
+
readonly platform?: string;
|
|
21
|
+
readonly env?: Readonly<Record<string, string | undefined>>;
|
|
22
|
+
}
|
|
23
|
+
export declare class FakeEnvironment implements Environment {
|
|
24
|
+
private readonly options;
|
|
25
|
+
constructor(options?: FakeEnvironmentOptions);
|
|
26
|
+
homeDir(): string;
|
|
27
|
+
cwd(): string;
|
|
28
|
+
tempDir(): string;
|
|
29
|
+
platform(): string;
|
|
30
|
+
env(): Readonly<Record<string, string | undefined>>;
|
|
31
|
+
setEnv(key: string, value: string | undefined): void;
|
|
32
|
+
setCwd(cwd: string): void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Deterministic content hash. Not cryptographic — tests need a hash that changes when content
|
|
36
|
+
* changes and is stable across runs, and a real SHA-256 makes expected values unreadable.
|
|
37
|
+
*/
|
|
38
|
+
export declare class FakeHasher implements Hasher {
|
|
39
|
+
private readonly files;
|
|
40
|
+
hash(data: Uint8Array): string;
|
|
41
|
+
hashFile(path: string): Promise<string>;
|
|
42
|
+
register(path: string, bytes: Uint8Array): void;
|
|
43
|
+
}
|
|
44
|
+
/** Hashes through a filesystem, so `hashFile` works against the in-memory double. */
|
|
45
|
+
export declare function hasherOver(fs: {
|
|
46
|
+
readFile(path: string): Promise<Uint8Array>;
|
|
47
|
+
}): Hasher;
|
|
48
|
+
export declare class RecordingLogger implements Logger {
|
|
49
|
+
readonly lines: {
|
|
50
|
+
level: string;
|
|
51
|
+
message: string;
|
|
52
|
+
}[];
|
|
53
|
+
debug(message: string): void;
|
|
54
|
+
info(message: string): void;
|
|
55
|
+
warn(message: string): void;
|
|
56
|
+
error(message: string): void;
|
|
57
|
+
messages(level?: string): readonly string[];
|
|
58
|
+
}
|
|
59
|
+
export declare class FakeCommandRunner implements CommandRunner {
|
|
60
|
+
readonly calls: {
|
|
61
|
+
command: string;
|
|
62
|
+
args: readonly string[];
|
|
63
|
+
}[];
|
|
64
|
+
private readonly available;
|
|
65
|
+
private readonly results;
|
|
66
|
+
constructor(options?: {
|
|
67
|
+
available?: readonly string[];
|
|
68
|
+
results?: Record<string, CommandResult>;
|
|
69
|
+
});
|
|
70
|
+
run(command: string, args: readonly string[], _options?: CommandOptions): Promise<CommandResult>;
|
|
71
|
+
which(command: string): Promise<string | undefined>;
|
|
72
|
+
}
|
|
73
|
+
export declare class FakeHttpClient implements HttpClient {
|
|
74
|
+
readonly requests: string[];
|
|
75
|
+
private readonly responses;
|
|
76
|
+
constructor(responses?: Record<string, HttpResponse | string>);
|
|
77
|
+
get(url: string, _options?: HttpRequestOptions): Promise<HttpResponse>;
|
|
78
|
+
}
|
|
79
|
+
export interface BuildPackageOptions {
|
|
80
|
+
readonly name: string;
|
|
81
|
+
readonly version: string;
|
|
82
|
+
/** Defaults to `skill`. */
|
|
83
|
+
readonly kind?: PackageKind;
|
|
84
|
+
readonly description?: string;
|
|
85
|
+
readonly dependencies?: Readonly<Record<string, string>>;
|
|
86
|
+
readonly optionalDependencies?: Readonly<Record<string, string>>;
|
|
87
|
+
readonly agents?: readonly string[];
|
|
88
|
+
readonly extraFiles?: Readonly<Record<string, string>>;
|
|
89
|
+
readonly manifestExtras?: string;
|
|
90
|
+
/** Replaces the generated entrypoint body. */
|
|
91
|
+
readonly body?: string;
|
|
92
|
+
/** Extra `meta` keys, for workflow packages. */
|
|
93
|
+
readonly meta?: Readonly<Record<string, unknown>>;
|
|
94
|
+
}
|
|
95
|
+
/** Builds a valid in-memory package. Keeps every test from hand-writing YAML. */
|
|
96
|
+
export declare function buildPackage(options: BuildPackageOptions): SkillPackage;
|
|
97
|
+
export interface FakeRegistryOptions {
|
|
98
|
+
readonly name: string;
|
|
99
|
+
readonly packages: readonly SkillPackage[];
|
|
100
|
+
readonly kind?: RegistryKind;
|
|
101
|
+
readonly trusted?: boolean;
|
|
102
|
+
/** Versions marked deprecated, as `name@version`. */
|
|
103
|
+
readonly deprecated?: readonly string[];
|
|
104
|
+
/** Make every call fail, to test degradation paths. */
|
|
105
|
+
readonly offline?: boolean;
|
|
106
|
+
}
|
|
107
|
+
/** An in-memory {@link SkillRegistry}, sufficient for every resolver and federation test. */
|
|
108
|
+
export declare class FakeRegistry implements SkillRegistry {
|
|
109
|
+
readonly name: string;
|
|
110
|
+
readonly kind: RegistryKind;
|
|
111
|
+
readonly trusted: boolean;
|
|
112
|
+
readonly fetches: string[];
|
|
113
|
+
private readonly packages;
|
|
114
|
+
private readonly deprecated;
|
|
115
|
+
private readonly offline;
|
|
116
|
+
constructor(options: FakeRegistryOptions);
|
|
117
|
+
refresh(): Promise<void>;
|
|
118
|
+
search(query: SearchQuery): Promise<readonly SkillSummary[]>;
|
|
119
|
+
has(name: string): Promise<boolean>;
|
|
120
|
+
versions(name: string): Promise<readonly IndexVersionEntry[]>;
|
|
121
|
+
manifest(name: string, version: SemanticVersion): Promise<SkillManifest>;
|
|
122
|
+
fetch(name: string, version: SemanticVersion): Promise<FetchedPackage>;
|
|
123
|
+
private newest;
|
|
124
|
+
private require;
|
|
125
|
+
private assertOnline;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=doubles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubles.d.ts","sourceRoot":"","sources":["../../src/testing/doubles.ts"],"names":[],"mappings":"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"}
|