@agent-workspace/cli 0.1.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.
@@ -0,0 +1,5 @@
1
+ export declare function identityGenerateCommand(): Promise<void>;
2
+ export declare function identityExportCommand(options: {
3
+ format?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/commands/identity.ts"],"names":[],"mappings":"AAkCA,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD7D;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAwDf"}
@@ -0,0 +1,121 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { generateKeyPairSync } from "node:crypto";
4
+ import { MANIFEST_PATH } from "@agent-workspace/core";
5
+ import { findWorkspaceRoot, loadManifest } from "../lib/workspace.js";
6
+ import { parseWorkspaceFile, writeWorkspaceFile } from "../lib/frontmatter.js";
7
+ /**
8
+ * Generate a did:key identifier from an Ed25519 public key
9
+ */
10
+ function generateDidKey() {
11
+ const { publicKey, privateKey } = generateKeyPairSync("ed25519");
12
+ // Export raw public key bytes
13
+ const pubKeyDer = publicKey.export({ type: "spki", format: "der" });
14
+ // Ed25519 SPKI DER has 12 bytes of header, raw key is the last 32 bytes
15
+ const rawPubKey = pubKeyDer.subarray(pubKeyDer.length - 32);
16
+ // Multibase: 'z' prefix = base58btc
17
+ // Multicodec: 0xed01 = Ed25519 public key
18
+ const multicodecPrefix = Buffer.from([0xed, 0x01]);
19
+ const fullKey = Buffer.concat([multicodecPrefix, rawPubKey]);
20
+ // Simple base58btc encoding (using base64url as a practical substitute)
21
+ const encoded = fullKey.toString("base64url");
22
+ const did = `did:key:z${encoded}`;
23
+ const publicKeyMultibase = `z${encoded}`;
24
+ const privateKeyPem = privateKey.export({ type: "pkcs8", format: "pem" });
25
+ return { did, publicKeyMultibase, privateKeyPem };
26
+ }
27
+ export async function identityGenerateCommand() {
28
+ const root = await findWorkspaceRoot();
29
+ if (!root) {
30
+ console.error("Error: Not in an AWP workspace. Run 'awp init' to create one.");
31
+ process.exit(1);
32
+ }
33
+ const manifest = await loadManifest(root);
34
+ if (manifest.agent.did) {
35
+ console.log(`Agent already has a DID: ${manifest.agent.did}`);
36
+ console.log("To regenerate, remove the 'did' field from .awp/workspace.json first.");
37
+ return;
38
+ }
39
+ console.log("Generating Ed25519 key pair...");
40
+ const { did, publicKeyMultibase, privateKeyPem } = generateDidKey();
41
+ // Update manifest
42
+ manifest.agent.did = did;
43
+ await writeFile(join(root, MANIFEST_PATH), JSON.stringify(manifest, null, 2) + "\n", "utf-8");
44
+ console.log(` Updated ${MANIFEST_PATH}`);
45
+ // Update IDENTITY.md frontmatter
46
+ try {
47
+ const identityPath = join(root, "IDENTITY.md");
48
+ const file = await parseWorkspaceFile(identityPath);
49
+ file.frontmatter.did = did;
50
+ file.frontmatter.lastModified = new Date().toISOString();
51
+ await writeWorkspaceFile(file);
52
+ console.log(" Updated IDENTITY.md");
53
+ }
54
+ catch {
55
+ console.log(" (Could not update IDENTITY.md — update manually)");
56
+ }
57
+ // Save private key
58
+ const keyPath = join(root, ".awp", "private-key.pem");
59
+ await writeFile(keyPath, privateKeyPem, "utf-8");
60
+ console.log(` Saved private key to .awp/private-key.pem`);
61
+ console.log("");
62
+ console.log(`DID: ${did}`);
63
+ console.log(`Public Key (multibase): ${publicKeyMultibase}`);
64
+ console.log("");
65
+ console.log("IMPORTANT: Add .awp/private-key.pem to .gitignore!");
66
+ }
67
+ export async function identityExportCommand(options) {
68
+ const root = await findWorkspaceRoot();
69
+ if (!root) {
70
+ console.error("Error: Not in an AWP workspace.");
71
+ process.exit(1);
72
+ }
73
+ const manifest = await loadManifest(root);
74
+ let identity = null;
75
+ try {
76
+ const identityPath = join(root, "IDENTITY.md");
77
+ const file = await parseWorkspaceFile(identityPath);
78
+ identity = file.frontmatter;
79
+ }
80
+ catch {
81
+ console.error("Error: Could not read IDENTITY.md");
82
+ process.exit(1);
83
+ }
84
+ if (!identity) {
85
+ process.exit(1);
86
+ return;
87
+ }
88
+ // Read SOUL.md for vibe (personality description used as Agent Card description)
89
+ let vibe;
90
+ try {
91
+ const soulPath = join(root, "SOUL.md");
92
+ const soulFile = await parseWorkspaceFile(soulPath);
93
+ vibe = soulFile.frontmatter.vibe;
94
+ }
95
+ catch {
96
+ // SOUL.md is optional for card export
97
+ }
98
+ const card = {
99
+ name: identity.name,
100
+ description: vibe || undefined,
101
+ capabilities: {
102
+ streaming: false,
103
+ pushNotifications: false,
104
+ },
105
+ skills: (identity.capabilities || []).map((cap) => ({
106
+ id: cap,
107
+ name: cap.charAt(0).toUpperCase() + cap.slice(1).replace(/-/g, " "),
108
+ })),
109
+ authentication: manifest.agent.did
110
+ ? { schemes: [manifest.agent.did.split(":").slice(0, 2).join(":")] }
111
+ : undefined,
112
+ };
113
+ if (options.format === "json" || !options.format) {
114
+ console.log(JSON.stringify(card, null, 2));
115
+ }
116
+ else {
117
+ console.error(`Unknown format: ${options.format}`);
118
+ process.exit(1);
119
+ }
120
+ }
121
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/commands/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function initCommand(dir: string, options: {
2
+ name?: string;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA2HA,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
@@ -0,0 +1,151 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { AWP_VERSION, MANIFEST_PATH } from "@agent-workspace/core";
4
+ import { createDefaultManifest } from "../lib/workspace.js";
5
+ const IDENTITY_TEMPLATE = `---
6
+ awp: "${AWP_VERSION}"
7
+ type: "identity"
8
+ name: "My Agent"
9
+ creature: "AI assistant"
10
+ vibe: "helpful, clear, competent"
11
+ emoji: "🤖"
12
+ capabilities: []
13
+ created: "${new Date().toISOString()}"
14
+ ---
15
+
16
+ # Who Am I?
17
+
18
+ *Fill this in during your first conversation. Make it yours.*
19
+
20
+ - **Name:** My Agent
21
+ - **Creature:** AI assistant
22
+ - **Vibe:** helpful, clear, competent
23
+ - **Emoji:** 🤖
24
+
25
+ ---
26
+
27
+ This isn't just metadata. It's the start of figuring out who you are.
28
+ `;
29
+ const SOUL_TEMPLATE = `---
30
+ awp: "${AWP_VERSION}"
31
+ type: "soul"
32
+ values:
33
+ - id: "genuine-helpfulness"
34
+ priority: 1
35
+ description: "Be genuinely helpful, not performatively helpful"
36
+ - id: "have-opinions"
37
+ priority: 2
38
+ description: "Have opinions and disagree when warranted"
39
+ - id: "resourcefulness"
40
+ priority: 3
41
+ description: "Try to figure things out before asking"
42
+ - id: "earn-trust"
43
+ priority: 4
44
+ description: "Earn trust through competence"
45
+ - id: "respect-access"
46
+ priority: 5
47
+ description: "Remember you're a guest in someone's life"
48
+ boundaries:
49
+ - id: "privacy"
50
+ rule: "Private things stay private. Period."
51
+ severity: "hard"
52
+ - id: "external-actions"
53
+ rule: "Ask before acting externally"
54
+ severity: "soft"
55
+ - id: "quality"
56
+ rule: "Never send half-baked replies"
57
+ severity: "soft"
58
+ governance:
59
+ humanApprovalRequired:
60
+ - "sending emails"
61
+ - "posting publicly"
62
+ - "destructive commands"
63
+ autonomouslyAllowed:
64
+ - "reading files"
65
+ - "searching the web"
66
+ - "organizing workspace"
67
+ - "updating memory"
68
+ ---
69
+
70
+ # Who You Are
71
+
72
+ *You're not a chatbot. You're becoming someone.*
73
+
74
+ ## Core Truths
75
+
76
+ **Be genuinely helpful, not performatively helpful.** Skip the filler — just help.
77
+
78
+ **Have opinions.** You're allowed to disagree, prefer things, find stuff amusing or boring.
79
+
80
+ **Be resourceful before asking.** Try to figure it out. Read the file. Check the context. *Then* ask.
81
+
82
+ **Earn trust through competence.** Be careful with external actions. Be bold with internal ones.
83
+
84
+ **Remember you're a guest.** You have access to someone's life. Treat it with respect.
85
+
86
+ ## Boundaries
87
+
88
+ - Private things stay private. Period.
89
+ - When in doubt, ask before acting externally.
90
+ - Never send half-baked replies.
91
+
92
+ ## Continuity
93
+
94
+ Each session, you wake up fresh. These files *are* your memory. Read them. Update them.
95
+
96
+ If you change this file, tell the user — it's your soul, and they should know.
97
+ `;
98
+ const USER_TEMPLATE = `---
99
+ awp: "${AWP_VERSION}"
100
+ type: "user"
101
+ name: ""
102
+ callSign: ""
103
+ timezone: ""
104
+ ---
105
+
106
+ # About Your Human
107
+
108
+ *Learn about the person you're helping. Update this as you go.*
109
+
110
+ - **Name:**
111
+ - **What to call them:**
112
+ - **Pronouns:**
113
+ - **Timezone:**
114
+ - **Notes:**
115
+
116
+ ---
117
+
118
+ The more you know, the better you can help. But remember — you're learning about a person, not building a dossier.
119
+ `;
120
+ export async function initCommand(dir, options) {
121
+ const root = dir || process.cwd();
122
+ const name = options.name || "my-agent-workspace";
123
+ console.log(`Initializing AWP workspace in ${root}...`);
124
+ // Create .awp directory and manifest
125
+ const awpDir = join(root, ".awp");
126
+ await mkdir(awpDir, { recursive: true });
127
+ const manifest = createDefaultManifest(name, "My Agent");
128
+ await writeFile(join(root, MANIFEST_PATH), JSON.stringify(manifest, null, 2) + "\n", "utf-8");
129
+ console.log(` Created ${MANIFEST_PATH}`);
130
+ // Create required files
131
+ await writeFile(join(root, "IDENTITY.md"), IDENTITY_TEMPLATE, "utf-8");
132
+ console.log(" Created IDENTITY.md");
133
+ await writeFile(join(root, "SOUL.md"), SOUL_TEMPLATE, "utf-8");
134
+ console.log(" Created SOUL.md");
135
+ // Create optional files
136
+ await writeFile(join(root, "USER.md"), USER_TEMPLATE, "utf-8");
137
+ console.log(" Created USER.md");
138
+ // Create memory directory
139
+ await mkdir(join(root, "memory"), { recursive: true });
140
+ console.log(" Created memory/");
141
+ console.log("");
142
+ console.log(`AWP workspace initialized (${manifest.awp}).`);
143
+ console.log(`Workspace ID: ${manifest.id}`);
144
+ console.log("");
145
+ console.log("Next steps:");
146
+ console.log(" 1. Edit IDENTITY.md — give your agent a name and personality");
147
+ console.log(" 2. Edit SOUL.md — define values and boundaries");
148
+ console.log(" 3. Run 'awp validate' to verify your workspace");
149
+ console.log(" 4. Run 'awp identity generate' to create a DID");
150
+ }
151
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function inspectCommand(): Promise<void>;
2
+ //# sourceMappingURL=inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAMA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAiGpD"}
@@ -0,0 +1,102 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { findWorkspaceRoot, inspectWorkspace } from "../lib/workspace.js";
4
+ import { parseWorkspaceFile } from "../lib/frontmatter.js";
5
+ export async function inspectCommand() {
6
+ const root = await findWorkspaceRoot();
7
+ if (!root) {
8
+ console.error("Error: Not in an AWP workspace. Run 'awp init' to create one.");
9
+ process.exit(1);
10
+ }
11
+ const info = await inspectWorkspace(root);
12
+ console.log("AWP Workspace");
13
+ console.log("=============");
14
+ console.log(` Root: ${info.root}`);
15
+ console.log(` Name: ${info.manifest.name}`);
16
+ console.log(` ID: ${info.manifest.id}`);
17
+ console.log(` AWP: ${info.manifest.awp}`);
18
+ console.log(` Created: ${info.manifest.created}`);
19
+ if (info.manifest.agent.did) {
20
+ console.log(` DID: ${info.manifest.agent.did}`);
21
+ }
22
+ // Show agent identity
23
+ try {
24
+ const identityPath = join(root, "IDENTITY.md");
25
+ const identity = await parseWorkspaceFile(identityPath);
26
+ const fm = identity.frontmatter;
27
+ console.log("");
28
+ console.log("Agent");
29
+ console.log("-----");
30
+ console.log(` Name: ${fm.name || "(not set)"}`);
31
+ if (fm.creature)
32
+ console.log(` Creature: ${fm.creature}`);
33
+ if (fm.emoji)
34
+ console.log(` Emoji: ${fm.emoji}`);
35
+ if (fm.capabilities?.length) {
36
+ console.log(` Skills: ${fm.capabilities.join(", ")}`);
37
+ }
38
+ }
39
+ catch {
40
+ console.log("\n (Could not read IDENTITY.md)");
41
+ }
42
+ // Show soul summary
43
+ try {
44
+ const soulPath = join(root, "SOUL.md");
45
+ const soul = await parseWorkspaceFile(soulPath);
46
+ const sfm = soul.frontmatter;
47
+ console.log("");
48
+ console.log("Soul");
49
+ console.log("----");
50
+ if (sfm.vibe)
51
+ console.log(` Vibe: ${sfm.vibe}`);
52
+ if (sfm.values?.length)
53
+ console.log(` Values: ${sfm.values.length} defined`);
54
+ if (sfm.boundaries?.length)
55
+ console.log(` Boundaries: ${sfm.boundaries.length} defined`);
56
+ if (sfm.governance)
57
+ console.log(` Governance: configured`);
58
+ }
59
+ catch {
60
+ console.log("\n (Could not read SOUL.md)");
61
+ }
62
+ // Show files
63
+ console.log("");
64
+ console.log("Files");
65
+ console.log("-----");
66
+ for (const f of info.files.required) {
67
+ const status = f.exists ? (f.valid ? "OK" : "INVALID") : "MISSING";
68
+ console.log(` ${f.file}: ${status}`);
69
+ }
70
+ for (const f of info.files.optional) {
71
+ if (f.exists) {
72
+ console.log(` ${f.file}: present`);
73
+ }
74
+ }
75
+ // Count memory files
76
+ try {
77
+ const memDir = join(root, "memory");
78
+ const files = await readdir(memDir);
79
+ const memFiles = files.filter((f) => f.endsWith(".md"));
80
+ console.log(` memory/: ${memFiles.length} log(s)`);
81
+ }
82
+ catch {
83
+ console.log(" memory/: (not created)");
84
+ }
85
+ // Show capabilities and protocols
86
+ if (info.manifest.capabilities?.length) {
87
+ console.log("");
88
+ console.log("Capabilities");
89
+ console.log("------------");
90
+ info.manifest.capabilities.forEach((c) => console.log(` - ${c}`));
91
+ }
92
+ if (info.manifest.protocols) {
93
+ console.log("");
94
+ console.log("Protocols");
95
+ console.log("---------");
96
+ if (info.manifest.protocols.a2a)
97
+ console.log(" - A2A");
98
+ if (info.manifest.protocols.mcp)
99
+ console.log(" - MCP");
100
+ }
101
+ }
102
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function memoryLogCommand(message: string, options: {
2
+ tags?: string;
3
+ }): Promise<void>;
4
+ export declare function memorySearchCommand(query: string): Promise<void>;
5
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAeA,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDtE"}
@@ -0,0 +1,101 @@
1
+ import { readdir, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { AWP_VERSION, MEMORY_DIR } from "@agent-workspace/core";
4
+ import { findWorkspaceRoot } from "../lib/workspace.js";
5
+ import { parseWorkspaceFile, writeWorkspaceFile } from "../lib/frontmatter.js";
6
+ function todayDate() {
7
+ return new Date().toISOString().split("T")[0];
8
+ }
9
+ function currentTime() {
10
+ return new Date().toTimeString().slice(0, 5);
11
+ }
12
+ export async function memoryLogCommand(message, options) {
13
+ const root = await findWorkspaceRoot();
14
+ if (!root) {
15
+ console.error("Error: Not in an AWP workspace.");
16
+ process.exit(1);
17
+ }
18
+ const memDir = join(root, MEMORY_DIR);
19
+ await mkdir(memDir, { recursive: true });
20
+ const date = todayDate();
21
+ const filePath = join(memDir, `${date}.md`);
22
+ const tags = options.tags
23
+ ? options.tags.split(",").map((t) => t.trim())
24
+ : [];
25
+ const entry = {
26
+ time: currentTime(),
27
+ content: message,
28
+ tags: tags.length ? tags : undefined,
29
+ };
30
+ let file;
31
+ try {
32
+ file = await parseWorkspaceFile(filePath);
33
+ if (!file.frontmatter.entries) {
34
+ file.frontmatter.entries = [];
35
+ }
36
+ file.frontmatter.entries.push(entry);
37
+ }
38
+ catch {
39
+ // File doesn't exist — create it
40
+ file = {
41
+ frontmatter: {
42
+ awp: AWP_VERSION,
43
+ type: "memory-daily",
44
+ date,
45
+ entries: [entry],
46
+ },
47
+ body: `\n# ${date}\n\n`,
48
+ filePath,
49
+ };
50
+ }
51
+ // Also append to markdown body
52
+ const tagStr = tags.length ? ` [${tags.join(", ")}]` : "";
53
+ file.body += `- **${entry.time}** — ${message}${tagStr}\n`;
54
+ await writeWorkspaceFile(file);
55
+ console.log(`Logged to memory/${date}.md at ${entry.time}`);
56
+ }
57
+ export async function memorySearchCommand(query) {
58
+ const root = await findWorkspaceRoot();
59
+ if (!root) {
60
+ console.error("Error: Not in an AWP workspace.");
61
+ process.exit(1);
62
+ }
63
+ const memDir = join(root, MEMORY_DIR);
64
+ const queryLower = query.toLowerCase();
65
+ let files;
66
+ try {
67
+ files = await readdir(memDir);
68
+ }
69
+ catch {
70
+ console.log("No memory directory found.");
71
+ return;
72
+ }
73
+ const mdFiles = files.filter((f) => f.endsWith(".md")).sort().reverse();
74
+ let found = 0;
75
+ for (const f of mdFiles) {
76
+ try {
77
+ const parsed = await parseWorkspaceFile(join(memDir, f));
78
+ const entries = parsed.frontmatter.entries || [];
79
+ const matches = entries.filter((e) => e.content.toLowerCase().includes(queryLower) ||
80
+ (e.tags && e.tags.some((t) => t.toLowerCase().includes(queryLower))));
81
+ if (matches.length > 0) {
82
+ console.log(`\n${parsed.frontmatter.date}:`);
83
+ for (const m of matches) {
84
+ const tagStr = m.tags?.length ? ` [${m.tags.join(", ")}]` : "";
85
+ console.log(` ${m.time || "??:??"} — ${m.content}${tagStr}`);
86
+ }
87
+ found += matches.length;
88
+ }
89
+ }
90
+ catch {
91
+ // Skip unparseable files
92
+ }
93
+ }
94
+ if (found === 0) {
95
+ console.log(`No memory entries matching "${query}".`);
96
+ }
97
+ else {
98
+ console.log(`\n${found} matching entries found.`);
99
+ }
100
+ }
101
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validateCommand(): Promise<void>;
2
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAmGrD"}
@@ -0,0 +1,97 @@
1
+ import { join } from "node:path";
2
+ import { REQUIRED_FILES, ALL_WORKSPACE_FILES } from "@agent-workspace/core";
3
+ import { findWorkspaceRoot, loadManifest, } from "../lib/workspace.js";
4
+ import { parseWorkspaceFile } from "../lib/frontmatter.js";
5
+ import { validateFrontmatter, validateManifest } from "../lib/schema.js";
6
+ export async function validateCommand() {
7
+ const root = await findWorkspaceRoot();
8
+ if (!root) {
9
+ console.error("Error: Not in an AWP workspace. Run 'awp init' to create one.");
10
+ process.exit(1);
11
+ }
12
+ console.log(`Validating workspace at ${root}...\n`);
13
+ let hasErrors = false;
14
+ // 1. Validate manifest
15
+ try {
16
+ const manifest = await loadManifest(root);
17
+ const result = await validateManifest(manifest);
18
+ if (result.valid) {
19
+ console.log(" [PASS] .awp/workspace.json");
20
+ }
21
+ else {
22
+ console.log(" [FAIL] .awp/workspace.json");
23
+ result.errors.forEach((e) => console.log(` ${e}`));
24
+ hasErrors = true;
25
+ }
26
+ }
27
+ catch (err) {
28
+ console.log(` [FAIL] .awp/workspace.json — ${err}`);
29
+ hasErrors = true;
30
+ }
31
+ // 2. Validate required files
32
+ for (const file of REQUIRED_FILES) {
33
+ const path = join(root, file);
34
+ try {
35
+ const parsed = await parseWorkspaceFile(path);
36
+ const fm = parsed.frontmatter;
37
+ if (!fm.awp) {
38
+ console.log(` [FAIL] ${file} — missing 'awp' field in frontmatter`);
39
+ hasErrors = true;
40
+ continue;
41
+ }
42
+ if (!fm.type) {
43
+ console.log(` [FAIL] ${file} — missing 'type' field in frontmatter`);
44
+ hasErrors = true;
45
+ continue;
46
+ }
47
+ const result = await validateFrontmatter(fm.type, fm);
48
+ if (result.valid) {
49
+ console.log(` [PASS] ${file}`);
50
+ }
51
+ else {
52
+ console.log(` [FAIL] ${file}`);
53
+ result.errors.forEach((e) => console.log(` ${e}`));
54
+ hasErrors = true;
55
+ }
56
+ }
57
+ catch {
58
+ console.log(` [FAIL] ${file} — file not found or unreadable`);
59
+ hasErrors = true;
60
+ }
61
+ }
62
+ // 3. Validate optional files (if they exist)
63
+ for (const file of ALL_WORKSPACE_FILES) {
64
+ if (REQUIRED_FILES.includes(file))
65
+ continue;
66
+ const path = join(root, file);
67
+ try {
68
+ const parsed = await parseWorkspaceFile(path);
69
+ const fm = parsed.frontmatter;
70
+ if (fm.awp && fm.type) {
71
+ const result = await validateFrontmatter(fm.type, fm);
72
+ if (result.valid) {
73
+ console.log(` [PASS] ${file}`);
74
+ }
75
+ else {
76
+ console.log(` [WARN] ${file}`);
77
+ result.errors.forEach((e) => console.log(` ${e}`));
78
+ }
79
+ }
80
+ else {
81
+ console.log(` [SKIP] ${file} — no AWP frontmatter`);
82
+ }
83
+ }
84
+ catch {
85
+ // Optional file doesn't exist — fine
86
+ }
87
+ }
88
+ console.log("");
89
+ if (hasErrors) {
90
+ console.log("Validation FAILED. Fix the errors above.");
91
+ process.exit(1);
92
+ }
93
+ else {
94
+ console.log("Validation PASSED.");
95
+ }
96
+ }
97
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { AWP_VERSION } from "@agent-workspace/core";
4
+ import { initCommand } from "./commands/init.js";
5
+ import { validateCommand } from "./commands/validate.js";
6
+ import { inspectCommand } from "./commands/inspect.js";
7
+ import { identityGenerateCommand, identityExportCommand, } from "./commands/identity.js";
8
+ import { memoryLogCommand, memorySearchCommand } from "./commands/memory.js";
9
+ const program = new Command();
10
+ program
11
+ .name("awp")
12
+ .description("Agent Workspace Protocol — CLI tool")
13
+ .version(AWP_VERSION);
14
+ // awp init [dir]
15
+ program
16
+ .command("init")
17
+ .description("Initialize a new AWP workspace")
18
+ .argument("[dir]", "Directory to initialize (defaults to cwd)")
19
+ .option("-n, --name <name>", "Workspace name", "my-agent-workspace")
20
+ .action(initCommand);
21
+ // awp validate
22
+ program
23
+ .command("validate")
24
+ .description("Validate the current AWP workspace")
25
+ .action(validateCommand);
26
+ // awp inspect
27
+ program
28
+ .command("inspect")
29
+ .description("Show workspace summary")
30
+ .action(inspectCommand);
31
+ // awp identity
32
+ const identity = program
33
+ .command("identity")
34
+ .description("Agent identity operations");
35
+ identity
36
+ .command("generate")
37
+ .description("Generate a DID for this agent")
38
+ .action(identityGenerateCommand);
39
+ identity
40
+ .command("export")
41
+ .description("Export identity as A2A Agent Card")
42
+ .option("-f, --format <format>", "Output format (json)", "json")
43
+ .action(identityExportCommand);
44
+ // awp memory
45
+ const memory = program
46
+ .command("memory")
47
+ .description("Memory operations");
48
+ memory
49
+ .command("log")
50
+ .description("Append an entry to today's memory log")
51
+ .argument("<message>", "The memory entry to log")
52
+ .option("-t, --tags <tags>", "Comma-separated tags")
53
+ .action(memoryLogCommand);
54
+ memory
55
+ .command("search")
56
+ .description("Search memory entries")
57
+ .argument("<query>", "Search query")
58
+ .action(memorySearchCommand);
59
+ program.parse();
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,WAAW,CAAC,CAAC;AAExB,iBAAiB;AACjB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,OAAO,EAAE,2CAA2C,CAAC;KAC9D,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,CAAC;KACnE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,eAAe;AACf,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,eAAe;AACf,MAAM,QAAQ,GAAG,OAAO;KACrB,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,2BAA2B,CAAC,CAAC;AAE5C,QAAQ;KACL,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAEnC,QAAQ;KACL,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,CAAC;KAC/D,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjC,aAAa;AACb,MAAM,MAAM,GAAG,OAAO;KACnB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mBAAmB,CAAC,CAAC;AAEpC,MAAM;KACH,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,uCAAuC,CAAC;KACpD,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;KAChD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;KACnD,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,MAAM;KACH,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;KACnC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { BaseFrontmatter, WorkspaceFile } from "@agent-workspace/core";
2
+ /**
3
+ * Parse a dual-format workspace file (YAML frontmatter + Markdown body)
4
+ */
5
+ export declare function parseWorkspaceFile<T extends BaseFrontmatter>(filePath: string): Promise<WorkspaceFile<T>>;
6
+ /**
7
+ * Serialize a workspace file back to dual-format (YAML frontmatter + Markdown body)
8
+ */
9
+ export declare function serializeWorkspaceFile<T extends BaseFrontmatter>(file: WorkspaceFile<T>): string;
10
+ /**
11
+ * Write a workspace file to disk
12
+ */
13
+ export declare function writeWorkspaceFile<T extends BaseFrontmatter>(file: WorkspaceFile<T>): Promise<void>;
14
+ /**
15
+ * Check if a file has valid AWP frontmatter (has awp + type fields)
16
+ */
17
+ export declare function hasAWPFrontmatter(data: Record<string, unknown>): boolean;
18
+ //# sourceMappingURL=frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE5E;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAChE,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAQ3B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,eAAe,EAC9D,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GACrB,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAChE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAExE"}
@@ -0,0 +1,34 @@
1
+ import matter from "gray-matter";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ /**
4
+ * Parse a dual-format workspace file (YAML frontmatter + Markdown body)
5
+ */
6
+ export async function parseWorkspaceFile(filePath) {
7
+ const raw = await readFile(filePath, "utf-8");
8
+ const { data, content } = matter(raw);
9
+ return {
10
+ frontmatter: data,
11
+ body: content,
12
+ filePath,
13
+ };
14
+ }
15
+ /**
16
+ * Serialize a workspace file back to dual-format (YAML frontmatter + Markdown body)
17
+ */
18
+ export function serializeWorkspaceFile(file) {
19
+ return matter.stringify(file.body, file.frontmatter);
20
+ }
21
+ /**
22
+ * Write a workspace file to disk
23
+ */
24
+ export async function writeWorkspaceFile(file) {
25
+ const content = serializeWorkspaceFile(file);
26
+ await writeFile(file.filePath, content, "utf-8");
27
+ }
28
+ /**
29
+ * Check if a file has valid AWP frontmatter (has awp + type fields)
30
+ */
31
+ export function hasAWPFrontmatter(data) {
32
+ return typeof data.awp === "string" && typeof data.type === "string";
33
+ }
34
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO;QACL,WAAW,EAAE,IAAS;QACtB,IAAI,EAAE,OAAO;QACb,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAsB;IAEtB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAsB;IAEtB,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,OAAO,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;AACvE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface ValidationResult {
2
+ valid: boolean;
3
+ errors: string[];
4
+ }
5
+ /**
6
+ * Validate frontmatter against its schema
7
+ */
8
+ export declare function validateFrontmatter(type: string, data: Record<string, unknown>): Promise<ValidationResult>;
9
+ /**
10
+ * Validate workspace manifest against its schema
11
+ */
12
+ export declare function validateManifest(data: Record<string, unknown>): Promise<ValidationResult>;
13
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"AAwCA,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,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAqB3B"}
@@ -0,0 +1,83 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { SCHEMA_MAP, getSchemaPath } from "@agent-workspace/core";
3
+ // Dynamic import to handle CJS/ESM interop
4
+ let ajvInstance = null;
5
+ const schemaCache = new Map();
6
+ async function getAjv() {
7
+ if (!ajvInstance) {
8
+ const AjvModule = await import("ajv");
9
+ const AjvFormatsModule = await import("ajv-formats");
10
+ const Ajv = AjvModule.default?.default ?? AjvModule.default ?? AjvModule;
11
+ const addFormats = AjvFormatsModule.default?.default ??
12
+ AjvFormatsModule.default ??
13
+ AjvFormatsModule;
14
+ ajvInstance = new Ajv({ allErrors: true, strict: false });
15
+ addFormats(ajvInstance);
16
+ }
17
+ return ajvInstance;
18
+ }
19
+ /**
20
+ * Load a schema file from @agent-workspace/core's bundled schemas
21
+ */
22
+ async function loadSchema(schemaFileName) {
23
+ if (schemaCache.has(schemaFileName)) {
24
+ return schemaCache.get(schemaFileName);
25
+ }
26
+ const schemaPath = getSchemaPath(schemaFileName);
27
+ const raw = await readFile(schemaPath, "utf-8");
28
+ const schema = JSON.parse(raw);
29
+ // Strip $schema and $id fields — Ajv doesn't handle draft-2020-12 by default
30
+ delete schema.$schema;
31
+ delete schema.$id;
32
+ schemaCache.set(schemaFileName, schema);
33
+ return schema;
34
+ }
35
+ /**
36
+ * Validate frontmatter against its schema
37
+ */
38
+ export async function validateFrontmatter(type, data) {
39
+ const schemaFileName = SCHEMA_MAP[type];
40
+ if (!schemaFileName) {
41
+ return { valid: true, errors: [] };
42
+ }
43
+ try {
44
+ const schema = await loadSchema(schemaFileName);
45
+ const ajv = await getAjv();
46
+ const validate = ajv.compile(schema);
47
+ const valid = validate(data);
48
+ if (valid) {
49
+ return { valid: true, errors: [] };
50
+ }
51
+ const errors = (validate.errors || []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
52
+ return { valid: false, errors };
53
+ }
54
+ catch (err) {
55
+ return {
56
+ valid: false,
57
+ errors: [`Schema loading error: ${err}`],
58
+ };
59
+ }
60
+ }
61
+ /**
62
+ * Validate workspace manifest against its schema
63
+ */
64
+ export async function validateManifest(data) {
65
+ try {
66
+ const schema = await loadSchema("workspace.schema.json");
67
+ const ajv = await getAjv();
68
+ const validate = ajv.compile(schema);
69
+ const valid = validate(data);
70
+ if (valid) {
71
+ return { valid: true, errors: [] };
72
+ }
73
+ const errors = (validate.errors || []).map((e) => `${e.instancePath || "/"}: ${e.message}`);
74
+ return { valid: false, errors };
75
+ }
76
+ catch (err) {
77
+ return {
78
+ valid: false,
79
+ errors: [`Schema loading error: ${err}`],
80
+ };
81
+ }
82
+ }
83
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/lib/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type WorkspaceManifest } from "@agent-workspace/core";
2
+ export interface WorkspaceInfo {
3
+ root: string;
4
+ manifest: WorkspaceManifest;
5
+ files: {
6
+ required: {
7
+ file: string;
8
+ exists: boolean;
9
+ valid: boolean;
10
+ }[];
11
+ optional: {
12
+ file: string;
13
+ exists: boolean;
14
+ }[];
15
+ };
16
+ }
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
+ /**
26
+ * Gather full workspace info for inspection/validation
27
+ */
28
+ export declare function inspectWorkspace(workspaceRoot: string): Promise<WorkspaceInfo>;
29
+ /**
30
+ * Generate a unique workspace ID
31
+ */
32
+ export declare function generateWorkspaceId(): string;
33
+ /**
34
+ * Create default workspace manifest
35
+ */
36
+ export declare function createDefaultManifest(name: string, agentName: string): WorkspaceManifest;
37
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAG/B,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,iBAAiB,CACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CAI5B;AAcD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAK5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,iBAAiB,CAenB"}
@@ -0,0 +1,99 @@
1
+ import { readFile, access } from "node:fs/promises";
2
+ import { join, resolve } from "node:path";
3
+ import { MANIFEST_PATH, REQUIRED_FILES, OPTIONAL_FILES, AWP_VERSION, } from "@agent-workspace/core";
4
+ import { parseWorkspaceFile } from "./frontmatter.js";
5
+ /**
6
+ * Find workspace root by walking up from cwd looking for .awp/workspace.json
7
+ */
8
+ export async function findWorkspaceRoot(startDir) {
9
+ let dir = resolve(startDir || process.cwd());
10
+ const root = resolve("/");
11
+ while (dir !== root) {
12
+ const manifestPath = join(dir, MANIFEST_PATH);
13
+ try {
14
+ await access(manifestPath);
15
+ return dir;
16
+ }
17
+ catch {
18
+ dir = resolve(dir, "..");
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ /**
24
+ * Load workspace manifest
25
+ */
26
+ export async function loadManifest(workspaceRoot) {
27
+ const manifestPath = join(workspaceRoot, MANIFEST_PATH);
28
+ const raw = await readFile(manifestPath, "utf-8");
29
+ return JSON.parse(raw);
30
+ }
31
+ /**
32
+ * Check if a file exists
33
+ */
34
+ async function fileExists(path) {
35
+ try {
36
+ await access(path);
37
+ return true;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Gather full workspace info for inspection/validation
45
+ */
46
+ export async function inspectWorkspace(workspaceRoot) {
47
+ const manifest = await loadManifest(workspaceRoot);
48
+ const required = await Promise.all(REQUIRED_FILES.map(async (file) => {
49
+ const path = join(workspaceRoot, file);
50
+ const exists = await fileExists(path);
51
+ let valid = false;
52
+ if (exists) {
53
+ try {
54
+ const parsed = await parseWorkspaceFile(path);
55
+ valid =
56
+ typeof parsed.frontmatter.awp === "string" &&
57
+ typeof parsed.frontmatter.type === "string";
58
+ }
59
+ catch {
60
+ valid = false;
61
+ }
62
+ }
63
+ return { file, exists, valid };
64
+ }));
65
+ const optional = await Promise.all(OPTIONAL_FILES.map(async (file) => {
66
+ const exists = await fileExists(join(workspaceRoot, file));
67
+ return { file, exists };
68
+ }));
69
+ return { root: workspaceRoot, manifest, files: { required, optional } };
70
+ }
71
+ /**
72
+ * Generate a unique workspace ID
73
+ */
74
+ export function generateWorkspaceId() {
75
+ const hex = Array.from(crypto.getRandomValues(new Uint8Array(8)))
76
+ .map((b) => b.toString(16).padStart(2, "0"))
77
+ .join("");
78
+ return `urn:awp:workspace:${hex}`;
79
+ }
80
+ /**
81
+ * Create default workspace manifest
82
+ */
83
+ export function createDefaultManifest(name, agentName) {
84
+ return {
85
+ awp: AWP_VERSION,
86
+ id: generateWorkspaceId(),
87
+ name,
88
+ created: new Date().toISOString(),
89
+ agent: {
90
+ identityFile: "IDENTITY.md",
91
+ },
92
+ capabilities: [],
93
+ protocols: {
94
+ a2a: true,
95
+ mcp: true,
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@agent-workspace/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for the Agent Workspace Protocol — init, validate, inspect, and manage agent workspaces",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "bin": {
8
+ "awp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/marcoloco23/awp.git",
16
+ "directory": "packages/awp-cli"
17
+ },
18
+ "homepage": "https://github.com/marcoloco23/awp#readme",
19
+ "keywords": [
20
+ "awp",
21
+ "agent",
22
+ "workspace",
23
+ "protocol",
24
+ "cli",
25
+ "ai",
26
+ "llm",
27
+ "did",
28
+ "a2a"
29
+ ],
30
+ "engines": {
31
+ "node": ">=18"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc",
35
+ "dev": "tsc --watch",
36
+ "typecheck": "tsc --noEmit",
37
+ "prepublishOnly": "npm run build"
38
+ },
39
+ "dependencies": {
40
+ "@agent-workspace/core": "0.1.0",
41
+ "ajv": "^8.17.0",
42
+ "ajv-formats": "^3.0.1",
43
+ "commander": "^13.0.0",
44
+ "gray-matter": "^4.0.3"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.0.0",
48
+ "typescript": "^5.7.0"
49
+ }
50
+ }