@agent-workspace/cli 0.2.1 → 0.5.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/commands/artifact.d.ts +1 -0
- package/dist/commands/artifact.d.ts.map +1 -1
- package/dist/commands/artifact.js +76 -15
- package/dist/commands/artifact.js.map +1 -1
- package/dist/commands/contract.d.ts +32 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +237 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/identity.d.ts.map +1 -1
- package/dist/commands/identity.js +3 -2
- package/dist/commands/identity.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +30 -0
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/memory.d.ts +12 -1
- package/dist/commands/memory.d.ts.map +1 -1
- package/dist/commands/memory.js +72 -18
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/project.d.ts +23 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +181 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reputation.d.ts +25 -0
- package/dist/commands/reputation.d.ts.map +1 -0
- package/dist/commands/reputation.js +227 -0
- package/dist/commands/reputation.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +182 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/swarm.d.ts +40 -0
- package/dist/commands/swarm.d.ts.map +1 -0
- package/dist/commands/swarm.js +373 -0
- package/dist/commands/swarm.js.map +1 -0
- package/dist/commands/task.d.ts +41 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +381 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +101 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/index.js +198 -20
- package/dist/index.js.map +1 -1
- package/dist/lib/artifact.d.ts +2 -8
- package/dist/lib/artifact.d.ts.map +1 -1
- package/dist/lib/artifact.js +3 -21
- package/dist/lib/artifact.js.map +1 -1
- package/dist/lib/artifact.test.d.ts +2 -0
- package/dist/lib/artifact.test.d.ts.map +1 -0
- package/dist/lib/artifact.test.js +41 -0
- package/dist/lib/artifact.test.js.map +1 -0
- package/dist/lib/contract.d.ts +27 -0
- package/dist/lib/contract.d.ts.map +1 -0
- package/dist/lib/contract.js +83 -0
- package/dist/lib/contract.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +2 -11
- package/dist/lib/frontmatter.d.ts.map +1 -1
- package/dist/lib/frontmatter.js +2 -25
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/project.d.ts +54 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +153 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/reputation.d.ts +20 -0
- package/dist/lib/reputation.d.ts.map +1 -0
- package/dist/lib/reputation.js +51 -0
- package/dist/lib/reputation.js.map +1 -0
- package/dist/lib/reputation.test.d.ts +2 -0
- package/dist/lib/reputation.test.d.ts.map +1 -0
- package/dist/lib/reputation.test.js +112 -0
- package/dist/lib/reputation.test.js.map +1 -0
- package/dist/lib/schema.d.ts.map +1 -1
- package/dist/lib/schema.js +9 -5
- package/dist/lib/schema.js.map +1 -1
- package/dist/lib/swarm.d.ts +22 -0
- package/dist/lib/swarm.d.ts.map +1 -0
- package/dist/lib/swarm.js +59 -0
- package/dist/lib/swarm.js.map +1 -0
- package/dist/lib/workspace.d.ts +3 -9
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +6 -42
- package/dist/lib/workspace.js.map +1 -1
- package/dist/lib/workspace.test.d.ts +2 -0
- package/dist/lib/workspace.test.d.ts.map +1 -0
- package/dist/lib/workspace.test.js +36 -0
- package/dist/lib/workspace.test.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ProjectFrontmatter, TaskFrontmatter, ProjectMember, ReputationDimension } from "@agent-workspace/core";
|
|
2
|
+
import type { WorkspaceFile } from "@agent-workspace/core";
|
|
3
|
+
/**
|
|
4
|
+
* Validate a slug
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateSlug(slug: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Get the file path for a project slug
|
|
9
|
+
*/
|
|
10
|
+
export declare function slugToProjectPath(workspaceRoot: string, slug: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get the tasks directory for a project slug
|
|
13
|
+
*/
|
|
14
|
+
export declare function slugToTaskDir(workspaceRoot: string, projectSlug: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Get the file path for a task within a project
|
|
17
|
+
*/
|
|
18
|
+
export declare function slugToTaskPath(workspaceRoot: string, projectSlug: string, taskSlug: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Load a project by slug
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadProject(workspaceRoot: string, slug: string): Promise<WorkspaceFile<ProjectFrontmatter>>;
|
|
23
|
+
/**
|
|
24
|
+
* List all projects in the workspace
|
|
25
|
+
*/
|
|
26
|
+
export declare function listProjects(workspaceRoot: string): Promise<WorkspaceFile<ProjectFrontmatter>[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Load a task by project slug and task slug
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadTask(workspaceRoot: string, projectSlug: string, taskSlug: string): Promise<WorkspaceFile<TaskFrontmatter>>;
|
|
31
|
+
/**
|
|
32
|
+
* List all tasks for a project
|
|
33
|
+
*/
|
|
34
|
+
export declare function listTasks(workspaceRoot: string, projectSlug: string): Promise<WorkspaceFile<TaskFrontmatter>[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Ensure the tasks directory exists for a project
|
|
37
|
+
*/
|
|
38
|
+
export declare function ensureTaskDir(workspaceRoot: string, projectSlug: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Recalculate taskCount and completedCount for a project from its tasks.
|
|
41
|
+
*/
|
|
42
|
+
export declare function computeProjectCounts(workspaceRoot: string, projectSlug: string): Promise<{
|
|
43
|
+
taskCount: number;
|
|
44
|
+
completedCount: number;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Check reputation gates for a project member.
|
|
48
|
+
* Returns warnings for any scores below the threshold.
|
|
49
|
+
*/
|
|
50
|
+
export declare function checkReputationGates(member: ProjectMember, dimensions: Record<string, ReputationDimension> | undefined, domainCompetence: Record<string, ReputationDimension> | undefined, now?: Date): {
|
|
51
|
+
passed: boolean;
|
|
52
|
+
warnings: string[];
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK3D;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAG5C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC,CA0B9C;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAGzC;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC,CA0B3C;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAOxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,EAC3D,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,SAAS,EACjE,GAAG,GAAE,IAAiB,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA2CzC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { readdir, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { PROJECTS_DIR } from "@agent-workspace/core";
|
|
4
|
+
import { parseWorkspaceFile } from "./frontmatter.js";
|
|
5
|
+
import { computeDecayedScore } from "./reputation.js";
|
|
6
|
+
const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
7
|
+
/**
|
|
8
|
+
* Validate a slug
|
|
9
|
+
*/
|
|
10
|
+
export function validateSlug(slug) {
|
|
11
|
+
return SLUG_PATTERN.test(slug);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the file path for a project slug
|
|
15
|
+
*/
|
|
16
|
+
export function slugToProjectPath(workspaceRoot, slug) {
|
|
17
|
+
return join(workspaceRoot, PROJECTS_DIR, `${slug}.md`);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the tasks directory for a project slug
|
|
21
|
+
*/
|
|
22
|
+
export function slugToTaskDir(workspaceRoot, projectSlug) {
|
|
23
|
+
return join(workspaceRoot, PROJECTS_DIR, projectSlug, "tasks");
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the file path for a task within a project
|
|
27
|
+
*/
|
|
28
|
+
export function slugToTaskPath(workspaceRoot, projectSlug, taskSlug) {
|
|
29
|
+
return join(workspaceRoot, PROJECTS_DIR, projectSlug, "tasks", `${taskSlug}.md`);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load a project by slug
|
|
33
|
+
*/
|
|
34
|
+
export async function loadProject(workspaceRoot, slug) {
|
|
35
|
+
const filePath = slugToProjectPath(workspaceRoot, slug);
|
|
36
|
+
return parseWorkspaceFile(filePath);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* List all projects in the workspace
|
|
40
|
+
*/
|
|
41
|
+
export async function listProjects(workspaceRoot) {
|
|
42
|
+
const projDir = join(workspaceRoot, PROJECTS_DIR);
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
entries = await readdir(projDir);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
|
|
51
|
+
const projects = [];
|
|
52
|
+
for (const f of mdFiles) {
|
|
53
|
+
try {
|
|
54
|
+
const parsed = await parseWorkspaceFile(join(projDir, f));
|
|
55
|
+
if (parsed.frontmatter.type === "project") {
|
|
56
|
+
projects.push(parsed);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Skip unparseable files
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return projects;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Load a task by project slug and task slug
|
|
67
|
+
*/
|
|
68
|
+
export async function loadTask(workspaceRoot, projectSlug, taskSlug) {
|
|
69
|
+
const filePath = slugToTaskPath(workspaceRoot, projectSlug, taskSlug);
|
|
70
|
+
return parseWorkspaceFile(filePath);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* List all tasks for a project
|
|
74
|
+
*/
|
|
75
|
+
export async function listTasks(workspaceRoot, projectSlug) {
|
|
76
|
+
const taskDir = slugToTaskDir(workspaceRoot, projectSlug);
|
|
77
|
+
let entries;
|
|
78
|
+
try {
|
|
79
|
+
entries = await readdir(taskDir);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
|
|
85
|
+
const tasks = [];
|
|
86
|
+
for (const f of mdFiles) {
|
|
87
|
+
try {
|
|
88
|
+
const parsed = await parseWorkspaceFile(join(taskDir, f));
|
|
89
|
+
if (parsed.frontmatter.type === "task") {
|
|
90
|
+
tasks.push(parsed);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Skip unparseable files
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return tasks;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Ensure the tasks directory exists for a project
|
|
101
|
+
*/
|
|
102
|
+
export async function ensureTaskDir(workspaceRoot, projectSlug) {
|
|
103
|
+
const taskDir = slugToTaskDir(workspaceRoot, projectSlug);
|
|
104
|
+
await mkdir(taskDir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Recalculate taskCount and completedCount for a project from its tasks.
|
|
108
|
+
*/
|
|
109
|
+
export async function computeProjectCounts(workspaceRoot, projectSlug) {
|
|
110
|
+
const tasks = await listTasks(workspaceRoot, projectSlug);
|
|
111
|
+
const taskCount = tasks.length;
|
|
112
|
+
const completedCount = tasks.filter((t) => t.frontmatter.status === "completed").length;
|
|
113
|
+
return { taskCount, completedCount };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check reputation gates for a project member.
|
|
117
|
+
* Returns warnings for any scores below the threshold.
|
|
118
|
+
*/
|
|
119
|
+
export function checkReputationGates(member, dimensions, domainCompetence, now = new Date()) {
|
|
120
|
+
const warnings = [];
|
|
121
|
+
if (!member.minReputation) {
|
|
122
|
+
return { passed: true, warnings };
|
|
123
|
+
}
|
|
124
|
+
for (const [gate, minScore] of Object.entries(member.minReputation)) {
|
|
125
|
+
// Handle domain-competence gates (e.g., "domain-competence:ai-research")
|
|
126
|
+
if (gate.startsWith("domain-competence:")) {
|
|
127
|
+
const domain = gate.slice("domain-competence:".length);
|
|
128
|
+
const dim = domainCompetence?.[domain];
|
|
129
|
+
if (!dim) {
|
|
130
|
+
warnings.push(`No domain data for "${domain}" (required: ${minScore})`);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const decayed = computeDecayedScore(dim, now);
|
|
134
|
+
if (decayed < minScore) {
|
|
135
|
+
warnings.push(`${domain} domain score ${decayed.toFixed(2)} < required ${minScore}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// Standard dimension gate
|
|
140
|
+
const dim = dimensions?.[gate];
|
|
141
|
+
if (!dim) {
|
|
142
|
+
warnings.push(`No data for dimension "${gate}" (required: ${minScore})`);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const decayed = computeDecayedScore(dim, now);
|
|
146
|
+
if (decayed < minScore) {
|
|
147
|
+
warnings.push(`${gate} score ${decayed.toFixed(2)} < required ${minScore}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return { passed: warnings.length === 0, warnings };
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ReputationProfileFrontmatter } from "@agent-workspace/core";
|
|
2
|
+
import type { WorkspaceFile } from "@agent-workspace/core";
|
|
3
|
+
import { computeConfidence, computeDecayedScore, updateDimension, validateSlug } from "@agent-workspace/utils";
|
|
4
|
+
export { computeConfidence, computeDecayedScore, updateDimension, validateSlug };
|
|
5
|
+
export declare const DEFAULT_ALPHA = 0.15;
|
|
6
|
+
export declare const DEFAULT_DECAY_RATE = 0.02;
|
|
7
|
+
export declare const SCORE_FLOOR = 0.5;
|
|
8
|
+
/**
|
|
9
|
+
* Get the file path for a reputation profile slug
|
|
10
|
+
*/
|
|
11
|
+
export declare function slugToProfilePath(workspaceRoot: string, slug: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Load a reputation profile by slug
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadProfile(workspaceRoot: string, slug: string): Promise<WorkspaceFile<ReputationProfileFrontmatter>>;
|
|
16
|
+
/**
|
|
17
|
+
* List all reputation profiles in the workspace
|
|
18
|
+
*/
|
|
19
|
+
export declare function listProfiles(workspaceRoot: string): Promise<WorkspaceFile<ReputationProfileFrontmatter>[]>;
|
|
20
|
+
//# sourceMappingURL=reputation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../../src/lib/reputation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,YAAY,EAEb,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAGjF,eAAO,MAAM,aAAa,OAAwB,CAAC;AACnD,eAAO,MAAM,kBAAkB,OAAwB,CAAC;AACxD,eAAO,MAAM,WAAW,MAAsB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,CAAC,CAGtD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAwBxD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { REPUTATION_DIR, REPUTATION_EWMA_ALPHA, REPUTATION_DECAY_RATE, REPUTATION_BASELINE, } from "@agent-workspace/core";
|
|
4
|
+
import { computeConfidence, computeDecayedScore, updateDimension, validateSlug, parseWorkspaceFile, } from "@agent-workspace/utils";
|
|
5
|
+
// Re-export from @agent-workspace/utils for backwards compatibility
|
|
6
|
+
export { computeConfidence, computeDecayedScore, updateDimension, validateSlug };
|
|
7
|
+
// Re-export constants for backwards compatibility
|
|
8
|
+
export const DEFAULT_ALPHA = REPUTATION_EWMA_ALPHA;
|
|
9
|
+
export const DEFAULT_DECAY_RATE = REPUTATION_DECAY_RATE;
|
|
10
|
+
export const SCORE_FLOOR = REPUTATION_BASELINE;
|
|
11
|
+
/**
|
|
12
|
+
* Get the file path for a reputation profile slug
|
|
13
|
+
*/
|
|
14
|
+
export function slugToProfilePath(workspaceRoot, slug) {
|
|
15
|
+
return join(workspaceRoot, REPUTATION_DIR, `${slug}.md`);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load a reputation profile by slug
|
|
19
|
+
*/
|
|
20
|
+
export async function loadProfile(workspaceRoot, slug) {
|
|
21
|
+
const filePath = slugToProfilePath(workspaceRoot, slug);
|
|
22
|
+
return parseWorkspaceFile(filePath);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* List all reputation profiles in the workspace
|
|
26
|
+
*/
|
|
27
|
+
export async function listProfiles(workspaceRoot) {
|
|
28
|
+
const repDir = join(workspaceRoot, REPUTATION_DIR);
|
|
29
|
+
let files;
|
|
30
|
+
try {
|
|
31
|
+
files = await readdir(repDir);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
const mdFiles = files.filter((f) => f.endsWith(".md")).sort();
|
|
37
|
+
const profiles = [];
|
|
38
|
+
for (const f of mdFiles) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = await parseWorkspaceFile(join(repDir, f));
|
|
41
|
+
if (parsed.frontmatter.type === "reputation-profile") {
|
|
42
|
+
profiles.push(parsed);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// Skip unparseable files
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return profiles;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=reputation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../src/lib/reputation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,oEAAoE;AACpE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAEjF,kDAAkD;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAE/C;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAAqB,EAAE,IAAY;IACnE,OAAO,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAqB,EACrB,IAAY;IAEZ,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACxD,OAAO,kBAAkB,CAA+B,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,aAAqB;IAErB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAkD,EAAE,CAAC;IAEnE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAA+B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACvF,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation.test.d.ts","sourceRoot":"","sources":["../../src/lib/reputation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { validateSlug, slugToProfilePath, computeDecayedScore, updateDimension, computeConfidence, DEFAULT_ALPHA, DEFAULT_DECAY_RATE, SCORE_FLOOR, } from "./reputation.js";
|
|
3
|
+
describe("reputation utilities", () => {
|
|
4
|
+
describe("validateSlug", () => {
|
|
5
|
+
it("accepts valid lowercase alphanumeric slugs", () => {
|
|
6
|
+
expect(validateSlug("agent-name")).toBe(true);
|
|
7
|
+
expect(validateSlug("agent123")).toBe(true);
|
|
8
|
+
expect(validateSlug("a")).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it("rejects invalid slugs", () => {
|
|
11
|
+
expect(validateSlug("")).toBe(false);
|
|
12
|
+
expect(validateSlug("Agent-Name")).toBe(false);
|
|
13
|
+
expect(validateSlug("-starts-hyphen")).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
describe("slugToProfilePath", () => {
|
|
17
|
+
it("generates correct file path", () => {
|
|
18
|
+
expect(slugToProfilePath("/workspace", "agent-name")).toBe("/workspace/reputation/agent-name.md");
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe("computeConfidence", () => {
|
|
22
|
+
it("returns 0 for zero samples", () => {
|
|
23
|
+
expect(computeConfidence(0)).toBe(0);
|
|
24
|
+
});
|
|
25
|
+
it("increases with sample size", () => {
|
|
26
|
+
const c1 = computeConfidence(1);
|
|
27
|
+
const c5 = computeConfidence(5);
|
|
28
|
+
const c10 = computeConfidence(10);
|
|
29
|
+
expect(c1).toBeGreaterThan(0);
|
|
30
|
+
expect(c5).toBeGreaterThan(c1);
|
|
31
|
+
expect(c10).toBeGreaterThan(c5);
|
|
32
|
+
});
|
|
33
|
+
it("asymptotes toward 1", () => {
|
|
34
|
+
const c100 = computeConfidence(100);
|
|
35
|
+
expect(c100).toBeLessThanOrEqual(1);
|
|
36
|
+
expect(c100).toBeGreaterThan(0.9);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe("computeDecayedScore", () => {
|
|
40
|
+
const baseDate = new Date("2024-01-15T12:00:00Z");
|
|
41
|
+
it("returns original score if no time has passed", () => {
|
|
42
|
+
const dim = {
|
|
43
|
+
score: 0.8,
|
|
44
|
+
confidence: 0.5,
|
|
45
|
+
sampleSize: 5,
|
|
46
|
+
lastSignal: baseDate.toISOString(),
|
|
47
|
+
};
|
|
48
|
+
const decayed = computeDecayedScore(dim, baseDate);
|
|
49
|
+
expect(decayed).toBe(0.8);
|
|
50
|
+
});
|
|
51
|
+
it("decays score toward 0.5 over time", () => {
|
|
52
|
+
const dim = {
|
|
53
|
+
score: 0.9,
|
|
54
|
+
confidence: 0.5,
|
|
55
|
+
sampleSize: 5,
|
|
56
|
+
lastSignal: baseDate.toISOString(),
|
|
57
|
+
};
|
|
58
|
+
// 6 months later
|
|
59
|
+
const futureDate = new Date("2024-07-15T12:00:00Z");
|
|
60
|
+
const decayed = computeDecayedScore(dim, futureDate);
|
|
61
|
+
expect(decayed).toBeLessThan(0.9);
|
|
62
|
+
expect(decayed).toBeGreaterThan(0.5);
|
|
63
|
+
});
|
|
64
|
+
it("decays low scores up toward 0.5", () => {
|
|
65
|
+
const dim = {
|
|
66
|
+
score: 0.2,
|
|
67
|
+
confidence: 0.5,
|
|
68
|
+
sampleSize: 5,
|
|
69
|
+
lastSignal: baseDate.toISOString(),
|
|
70
|
+
};
|
|
71
|
+
// 6 months later
|
|
72
|
+
const futureDate = new Date("2024-07-15T12:00:00Z");
|
|
73
|
+
const decayed = computeDecayedScore(dim, futureDate);
|
|
74
|
+
expect(decayed).toBeGreaterThan(0.2);
|
|
75
|
+
expect(decayed).toBeLessThan(0.5);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("updateDimension", () => {
|
|
79
|
+
it("creates new dimension for first signal", () => {
|
|
80
|
+
const now = new Date("2024-01-15T12:00:00Z");
|
|
81
|
+
const dim = updateDimension(undefined, 0.8, now);
|
|
82
|
+
expect(dim.score).toBe(0.8);
|
|
83
|
+
expect(dim.sampleSize).toBe(1);
|
|
84
|
+
expect(dim.lastSignal).toBe(now.toISOString());
|
|
85
|
+
expect(dim.confidence).toBeGreaterThan(0);
|
|
86
|
+
});
|
|
87
|
+
it("updates existing dimension with EWMA", () => {
|
|
88
|
+
const oldDate = new Date("2024-01-15T12:00:00Z");
|
|
89
|
+
const existing = {
|
|
90
|
+
score: 0.5,
|
|
91
|
+
confidence: 0.09,
|
|
92
|
+
sampleSize: 1,
|
|
93
|
+
lastSignal: oldDate.toISOString(),
|
|
94
|
+
};
|
|
95
|
+
const newDate = new Date("2024-01-16T12:00:00Z");
|
|
96
|
+
const updated = updateDimension(existing, 1.0, newDate);
|
|
97
|
+
// EWMA with alpha=0.15: 0.15 * 1.0 + 0.85 * ~0.5
|
|
98
|
+
expect(updated.score).toBeGreaterThan(0.5);
|
|
99
|
+
expect(updated.score).toBeLessThan(1.0);
|
|
100
|
+
expect(updated.sampleSize).toBe(2);
|
|
101
|
+
expect(updated.confidence).toBeGreaterThan(existing.confidence);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe("constants", () => {
|
|
105
|
+
it("has expected default values", () => {
|
|
106
|
+
expect(DEFAULT_ALPHA).toBe(0.15);
|
|
107
|
+
expect(DEFAULT_DECAY_RATE).toBe(0.02);
|
|
108
|
+
expect(SCORE_FLOOR).toBe(0.5);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=reputation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reputation.test.js","sourceRoot":"","sources":["../../src/lib/reputation.test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"AAgEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA0B3B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqB/F"}
|
package/dist/lib/schema.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
2
|
import { SCHEMA_MAP, getSchemaPath } from "@agent-workspace/core";
|
|
3
|
-
// Dynamic import to handle CJS/ESM interop
|
|
4
3
|
let ajvInstance = null;
|
|
5
4
|
const schemaCache = new Map();
|
|
6
5
|
async function getAjv() {
|
|
7
6
|
if (!ajvInstance) {
|
|
8
7
|
const AjvModule = await import("ajv");
|
|
9
8
|
const AjvFormatsModule = await import("ajv-formats");
|
|
10
|
-
|
|
9
|
+
// Handle ESM/CJS interop
|
|
10
|
+
const AjvClass = AjvModule.default?.default ??
|
|
11
|
+
AjvModule.default ??
|
|
12
|
+
AjvModule;
|
|
11
13
|
const addFormats = AjvFormatsModule.default?.default ??
|
|
12
14
|
AjvFormatsModule.default ??
|
|
13
15
|
AjvFormatsModule;
|
|
14
|
-
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
17
|
+
ajvInstance = new AjvClass({ allErrors: true, strict: false });
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
19
|
addFormats(ajvInstance);
|
|
16
20
|
}
|
|
17
21
|
return ajvInstance;
|
|
@@ -48,7 +52,7 @@ export async function validateFrontmatter(type, data) {
|
|
|
48
52
|
if (valid) {
|
|
49
53
|
return { valid: true, errors: [] };
|
|
50
54
|
}
|
|
51
|
-
const errors = (validate.errors
|
|
55
|
+
const errors = (validate.errors ?? []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
|
|
52
56
|
return { valid: false, errors };
|
|
53
57
|
}
|
|
54
58
|
catch (err) {
|
|
@@ -70,7 +74,7 @@ export async function validateManifest(data) {
|
|
|
70
74
|
if (valid) {
|
|
71
75
|
return { valid: true, errors: [] };
|
|
72
76
|
}
|
|
73
|
-
const errors = (validate.errors
|
|
77
|
+
const errors = (validate.errors ?? []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
|
|
74
78
|
return { valid: false, errors };
|
|
75
79
|
}
|
|
76
80
|
catch (err) {
|
package/dist/lib/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SwarmFrontmatter, WorkspaceFile } from "@agent-workspace/core";
|
|
2
|
+
/**
|
|
3
|
+
* Validate a swarm slug
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateSlug(slug: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Get the file path for a swarm slug
|
|
8
|
+
*/
|
|
9
|
+
export declare function slugToSwarmPath(workspaceRoot: string, slug: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Load a swarm by slug
|
|
12
|
+
*/
|
|
13
|
+
export declare function loadSwarm(workspaceRoot: string, slug: string): Promise<WorkspaceFile<SwarmFrontmatter>>;
|
|
14
|
+
/**
|
|
15
|
+
* List all swarms in the workspace
|
|
16
|
+
*/
|
|
17
|
+
export declare function listSwarms(workspaceRoot: string): Promise<WorkspaceFile<SwarmFrontmatter>[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Ensure the swarms directory exists
|
|
20
|
+
*/
|
|
21
|
+
export declare function ensureSwarmsDir(workspaceRoot: string): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=swarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/lib/swarm.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAK7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAG1C;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAwB5C;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readdir, mkdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { SWARMS_DIR } from "@agent-workspace/core";
|
|
4
|
+
import { parseWorkspaceFile } from "./frontmatter.js";
|
|
5
|
+
const SLUG_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
6
|
+
/**
|
|
7
|
+
* Validate a swarm slug
|
|
8
|
+
*/
|
|
9
|
+
export function validateSlug(slug) {
|
|
10
|
+
return SLUG_PATTERN.test(slug);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Get the file path for a swarm slug
|
|
14
|
+
*/
|
|
15
|
+
export function slugToSwarmPath(workspaceRoot, slug) {
|
|
16
|
+
return join(workspaceRoot, SWARMS_DIR, `${slug}.md`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load a swarm by slug
|
|
20
|
+
*/
|
|
21
|
+
export async function loadSwarm(workspaceRoot, slug) {
|
|
22
|
+
const filePath = slugToSwarmPath(workspaceRoot, slug);
|
|
23
|
+
return parseWorkspaceFile(filePath);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* List all swarms in the workspace
|
|
27
|
+
*/
|
|
28
|
+
export async function listSwarms(workspaceRoot) {
|
|
29
|
+
const swarmsDir = join(workspaceRoot, SWARMS_DIR);
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = await readdir(swarmsDir);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const mdFiles = entries.filter((f) => f.endsWith(".md")).sort();
|
|
38
|
+
const swarms = [];
|
|
39
|
+
for (const f of mdFiles) {
|
|
40
|
+
try {
|
|
41
|
+
const parsed = await parseWorkspaceFile(join(swarmsDir, f));
|
|
42
|
+
if (parsed.frontmatter.type === "swarm") {
|
|
43
|
+
swarms.push(parsed);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Skip unparseable files
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return swarms;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Ensure the swarms directory exists
|
|
54
|
+
*/
|
|
55
|
+
export async function ensureSwarmsDir(workspaceRoot) {
|
|
56
|
+
const swarmsDir = join(workspaceRoot, SWARMS_DIR);
|
|
57
|
+
await mkdir(swarmsDir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=swarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/lib/swarm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,IAAY;IACjE,OAAO,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,aAAqB,EACrB,IAAY;IAEZ,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,kBAAkB,CAAmB,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,aAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAClD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,MAAM,MAAM,GAAsC,EAAE,CAAC;IAErD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAmB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9E,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAAqB;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
|
package/dist/lib/workspace.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { type WorkspaceManifest } from "@agent-workspace/core";
|
|
2
|
+
import { findWorkspaceRoot, loadManifest, fileExists } from "@agent-workspace/utils";
|
|
3
|
+
export { findWorkspaceRoot, loadManifest, fileExists };
|
|
2
4
|
export interface WorkspaceInfo {
|
|
3
5
|
root: string;
|
|
4
6
|
manifest: WorkspaceManifest;
|
|
@@ -14,14 +16,6 @@ export interface WorkspaceInfo {
|
|
|
14
16
|
}[];
|
|
15
17
|
};
|
|
16
18
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Find workspace root by walking up from cwd looking for .awp/workspace.json
|
|
19
|
-
*/
|
|
20
|
-
export declare function findWorkspaceRoot(startDir?: string): Promise<string | null>;
|
|
21
|
-
/**
|
|
22
|
-
* Load workspace manifest
|
|
23
|
-
*/
|
|
24
|
-
export declare function loadManifest(workspaceRoot: string): Promise<WorkspaceManifest>;
|
|
25
19
|
/**
|
|
26
20
|
* Gather full workspace info for inspection/validation
|
|
27
21
|
*/
|
|
@@ -33,5 +27,5 @@ export declare function generateWorkspaceId(): string;
|
|
|
33
27
|
/**
|
|
34
28
|
* Create default workspace manifest
|
|
35
29
|
*/
|
|
36
|
-
export declare function createDefaultManifest(name: string,
|
|
30
|
+
export declare function createDefaultManifest(name: string, _agentName?: string): WorkspaceManifest;
|
|
37
31
|
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIrF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE;QACL,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;QAC9D,QAAQ,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,EAAE,CAAC;KAC/C,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAe1F"}
|