@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.
- package/dist/commands/identity.d.ts +5 -0
- package/dist/commands/identity.d.ts.map +1 -0
- package/dist/commands/identity.js +121 -0
- package/dist/commands/identity.js.map +1 -0
- package/dist/commands/init.d.ts +4 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +151 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +102 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/memory.d.ts +5 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +101 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/validate.d.ts +2 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +97 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +18 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +34 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/schema.d.ts +13 -0
- package/dist/lib/schema.d.ts.map +1 -0
- package/dist/lib/schema.js +83 -0
- package/dist/lib/schema.js.map +1 -0
- package/dist/lib/workspace.d.ts +37 -0
- package/dist/lib/workspace.d.ts.map +1 -0
- package/dist/lib/workspace.js +99 -0
- package/dist/lib/workspace.js.map +1 -0
- package/package.json +50 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|