@1claw/cli 0.36.6 → 0.37.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,168 @@
1
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { templatesCacheDir, bundledTemplatesDir } from "../lib/paths.js";
5
+ const REQUIRED_FIELDS = [
6
+ "name",
7
+ "display_name",
8
+ "version",
9
+ "description",
10
+ "author",
11
+ "language",
12
+ ];
13
+ function normalizeManifest(raw, name) {
14
+ for (const f of REQUIRED_FIELDS) {
15
+ if (!raw[f]) {
16
+ throw new Error(`Template "${name}" manifest is missing required field "${f}".`);
17
+ }
18
+ }
19
+ const lang = String(raw.language);
20
+ if (lang !== "python" && lang !== "node") {
21
+ throw new Error(`Template "${name}" has invalid language "${lang}". Must be "python" or "node".`);
22
+ }
23
+ const docker = (raw.docker ?? {});
24
+ return {
25
+ name: String(raw.name),
26
+ display_name: String(raw.display_name),
27
+ version: String(raw.version),
28
+ description: String(raw.description).trim(),
29
+ author: String(raw.author ?? "unknown"),
30
+ language: lang,
31
+ homepage: raw.homepage ? String(raw.homepage) : undefined,
32
+ docker: {
33
+ base_image: String(docker.base_image ?? "python:3.12-slim"),
34
+ context_files: asStringArray(docker.context_files),
35
+ env: asStringRecord(docker.env),
36
+ health_endpoint: String(docker.health_endpoint ?? "/health"),
37
+ health_port: Number(docker.health_port ?? 3000),
38
+ },
39
+ post_spawn_message: raw.post_spawn_message
40
+ ? String(raw.post_spawn_message).trim()
41
+ : undefined,
42
+ };
43
+ }
44
+ function asStringArray(v) {
45
+ if (!Array.isArray(v))
46
+ return [];
47
+ return v.map((x) => String(x));
48
+ }
49
+ function asStringRecord(v) {
50
+ if (!v || typeof v !== "object")
51
+ return {};
52
+ const out = {};
53
+ for (const [k, val] of Object.entries(v)) {
54
+ out[k] = String(val);
55
+ }
56
+ return out;
57
+ }
58
+ /**
59
+ * Try to find a template directory, checking (in order):
60
+ * 1. Local cache (~/.config/1claw/templates/<name>/)
61
+ * 2. Bundled templates (packages/agent-templates/templates/<name>/ via submodule)
62
+ */
63
+ export function findTemplateDir(name) {
64
+ const cached = join(templatesCacheDir(), name);
65
+ if (existsSync(join(cached, "template.yaml")))
66
+ return cached;
67
+ const bundled = bundledTemplatesDir();
68
+ if (bundled) {
69
+ const dir = join(bundled, name);
70
+ if (existsSync(join(dir, "template.yaml")))
71
+ return dir;
72
+ }
73
+ return null;
74
+ }
75
+ /** Load and validate a single template manifest by name. */
76
+ export function loadTemplate(name) {
77
+ const dir = findTemplateDir(name);
78
+ if (!dir) {
79
+ const available = listTemplateNames();
80
+ throw new Error(`Unknown template "${name}". Available templates: ${available.join(", ") || "(none)"}.\n` +
81
+ ` Run \`1claw spawn --list\` to see all templates, or \`1claw spawn --refresh\` to update.`);
82
+ }
83
+ const manifestPath = join(dir, "template.yaml");
84
+ const raw = parseYaml(readFileSync(manifestPath, "utf-8"));
85
+ const manifest = normalizeManifest(raw, name);
86
+ if (manifest.name !== name) {
87
+ manifest.name = name;
88
+ }
89
+ return manifest;
90
+ }
91
+ /** Get the resolved directory path for a template. */
92
+ export function getTemplateDir(name) {
93
+ const dir = findTemplateDir(name);
94
+ if (!dir) {
95
+ throw new Error(`Template "${name}" not found.`);
96
+ }
97
+ return dir;
98
+ }
99
+ function scanDir(root) {
100
+ if (!existsSync(root))
101
+ return [];
102
+ try {
103
+ return readdirSync(root)
104
+ .filter((d) => {
105
+ try {
106
+ return (statSync(join(root, d)).isDirectory() &&
107
+ existsSync(join(root, d, "template.yaml")));
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ })
113
+ .sort();
114
+ }
115
+ catch {
116
+ return [];
117
+ }
118
+ }
119
+ /** List all available template names (cached + bundled, deduplicated). */
120
+ export function listTemplateNames() {
121
+ const names = new Set();
122
+ for (const n of scanDir(templatesCacheDir()))
123
+ names.add(n);
124
+ const bundled = bundledTemplatesDir();
125
+ if (bundled) {
126
+ for (const n of scanDir(bundled))
127
+ names.add(n);
128
+ }
129
+ return [...names].sort();
130
+ }
131
+ /** List all available templates as manifests. */
132
+ export function listTemplates() {
133
+ return listTemplateNames().map((n) => loadTemplate(n));
134
+ }
135
+ /** Parse the registry.yaml index (from bundled or fetched). */
136
+ export function parseRegistryIndex(content) {
137
+ const raw = parseYaml(content);
138
+ if (!raw || typeof raw !== "object") {
139
+ throw new Error("Invalid registry.yaml format.");
140
+ }
141
+ const version = Number(raw.version ?? 1);
142
+ const templates = Array.isArray(raw.templates)
143
+ ? raw.templates.map((t) => ({
144
+ name: String(t.name ?? ""),
145
+ display_name: String(t.display_name ?? t.name ?? ""),
146
+ version: String(t.version ?? "0.0.0"),
147
+ language: String(t.language ?? "python"),
148
+ description: String(t.description ?? ""),
149
+ }))
150
+ : [];
151
+ return { version, templates };
152
+ }
153
+ /** Load the bundled registry.yaml if available. */
154
+ export function loadBundledRegistry() {
155
+ const bundled = bundledTemplatesDir();
156
+ if (!bundled)
157
+ return null;
158
+ const registryPath = join(bundled, "..", "registry.yaml");
159
+ if (!existsSync(registryPath))
160
+ return null;
161
+ try {
162
+ return parseRegistryIndex(readFileSync(registryPath, "utf-8"));
163
+ }
164
+ catch {
165
+ return null;
166
+ }
167
+ }
168
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/templates/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAmCzE,MAAM,eAAe,GAAG;IACpB,MAAM;IACN,cAAc;IACd,SAAS;IACT,aAAa;IACb,QAAQ;IACR,UAAU;CACJ,CAAC;AAEX,SAAS,iBAAiB,CACtB,GAA4B,EAC5B,IAAY;IAEZ,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACX,aAAa,IAAI,yCAAyC,CAAC,IAAI,CAClE,CAAC;QACN,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACX,aAAa,IAAI,2BAA2B,IAAI,gCAAgC,CACnF,CAAC;IACN,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAA4B,CAAC;IAC7D,OAAO;QACH,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;QAC3C,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QACvC,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,MAAM,EAAE;YACJ,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,kBAAkB,CAAC;YAC3D,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC;YAClD,GAAG,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC;YAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,IAAI,SAAS,CAAC;YAC5D,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC;SAClD;QACD,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;YACtC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE;YACvC,CAAC,CAAC,SAAS;KAClB,CAAC;AACN,CAAC;AAED,SAAS,aAAa,CAAC,CAAU;IAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,CAAU;IAC9B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAA4B,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAE7D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACX,qBAAqB,IAAI,2BAA2B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK;YACrF,4FAA4F,CACnG,CAAC;IACN,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,CACjB,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CACX,CAAC;IAC7B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAC;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,IAAI,CAAC;gBACD,OAAO,CACH,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;oBACrC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAC7C,CAAC;YACN,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC;aACD,IAAI,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB;IAC7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,aAAa;IACzB,OAAO,iBAAiB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAC9C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAA4B,CAAC;IAC1D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC1C,CAAC,CAAE,GAAG,CAAC,SAAuC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrD,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAC1B,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YACpD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC;YACrC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC;YACxC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;SAC3C,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,mBAAmB;IAC/B,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC;QACD,OAAO,kBAAkB,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1claw/cli",
3
- "version": "0.36.6",
3
+ "version": "0.37.0",
4
4
  "description": "CLI for 1Claw — secrets management for AI agents and humans",
5
5
  "license": "MIT",
6
6
  "repository": {