@powerhousedao/ph-clint-cli 0.1.0-dev.86 → 0.1.0-dev.87

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.
Files changed (64) hide show
  1. package/dist/codegen/actions.d.ts +46 -0
  2. package/dist/codegen/actions.js +424 -0
  3. package/dist/codegen/builders/agent-base-md.d.ts +5 -0
  4. package/dist/codegen/builders/agent-base-md.js +18 -0
  5. package/dist/codegen/builders/agent-ts.d.ts +9 -0
  6. package/dist/codegen/builders/agent-ts.js +124 -0
  7. package/dist/codegen/builders/app-index-ts.d.ts +11 -0
  8. package/dist/codegen/builders/app-index-ts.js +43 -0
  9. package/dist/codegen/builders/build-skills-ts.d.ts +4 -0
  10. package/dist/codegen/builders/build-skills-ts.js +37 -0
  11. package/dist/codegen/builders/cli-package-json.d.ts +8 -0
  12. package/dist/codegen/builders/cli-package-json.js +128 -0
  13. package/dist/codegen/builders/cli-ts.d.ts +7 -0
  14. package/dist/codegen/builders/cli-ts.js +170 -0
  15. package/dist/codegen/builders/config-ts.d.ts +8 -0
  16. package/dist/codegen/builders/config-ts.js +11 -0
  17. package/dist/codegen/builders/demo-agent-ts.d.ts +8 -0
  18. package/dist/codegen/builders/demo-agent-ts.js +50 -0
  19. package/dist/codegen/builders/eslint-config-js.d.ts +4 -0
  20. package/dist/codegen/builders/eslint-config-js.js +16 -0
  21. package/dist/codegen/builders/framework-gen-ts.d.ts +25 -0
  22. package/dist/codegen/builders/framework-gen-ts.js +114 -0
  23. package/dist/codegen/builders/framework-ts.d.ts +21 -0
  24. package/dist/codegen/builders/framework-ts.js +100 -0
  25. package/dist/codegen/builders/gitignore.d.ts +4 -0
  26. package/dist/codegen/builders/gitignore.js +18 -0
  27. package/dist/codegen/builders/index.d.ts +52 -0
  28. package/dist/codegen/builders/index.js +85 -0
  29. package/dist/codegen/builders/jest-config-js.d.ts +4 -0
  30. package/dist/codegen/builders/jest-config-js.js +19 -0
  31. package/dist/codegen/builders/main-ts.d.ts +5 -0
  32. package/dist/codegen/builders/main-ts.js +13 -0
  33. package/dist/codegen/builders/manifest-json.d.ts +6 -0
  34. package/dist/codegen/builders/manifest-json.js +31 -0
  35. package/dist/codegen/builders/mastra-index-ts.d.ts +11 -0
  36. package/dist/codegen/builders/mastra-index-ts.js +72 -0
  37. package/dist/codegen/builders/publish-config-js.d.ts +8 -0
  38. package/dist/codegen/builders/publish-config-js.js +33 -0
  39. package/dist/codegen/builders/readme-md.d.ts +5 -0
  40. package/dist/codegen/builders/readme-md.js +45 -0
  41. package/dist/codegen/builders/root-package-json.d.ts +10 -0
  42. package/dist/codegen/builders/root-package-json.js +39 -0
  43. package/dist/codegen/builders/smoke-test-ts.d.ts +2 -0
  44. package/dist/codegen/builders/smoke-test-ts.js +15 -0
  45. package/dist/codegen/builders/tsconfig-json.d.ts +4 -0
  46. package/dist/codegen/builders/tsconfig-json.js +22 -0
  47. package/dist/codegen/exec.d.ts +2 -0
  48. package/dist/codegen/exec.js +14 -0
  49. package/dist/codegen/generated.d.ts +17 -0
  50. package/dist/codegen/generated.js +49 -0
  51. package/dist/codegen/hashes.d.ts +6 -0
  52. package/dist/codegen/hashes.js +60 -0
  53. package/dist/codegen/markers.d.ts +36 -0
  54. package/dist/codegen/markers.js +86 -0
  55. package/dist/codegen/migrate/flat-to-split.d.ts +15 -0
  56. package/dist/codegen/migrate/flat-to-split.js +119 -0
  57. package/dist/codegen/scaffold.d.ts +72 -0
  58. package/dist/codegen/scaffold.js +150 -0
  59. package/dist/codegen/write.d.ts +6 -0
  60. package/dist/codegen/write.js +32 -0
  61. package/dist/commands/clint-project-init.d.ts +2 -0
  62. package/dist/skills/sync.d.ts +40 -0
  63. package/dist/skills/sync.js +119 -0
  64. package/package.json +21 -21
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Low-level file-writing helpers for the code generator.
3
+ */
4
+ import fs from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ export async function writeFileEnsuringDir(filePath, content) {
7
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
8
+ await fs.writeFile(filePath, content, 'utf8');
9
+ }
10
+ function isEnoent(err) {
11
+ return (!!err &&
12
+ typeof err === 'object' &&
13
+ 'code' in err &&
14
+ err.code === 'ENOENT');
15
+ }
16
+ /**
17
+ * Returns true if the directory doesn't exist or only contains ignorable
18
+ * entries (`.git`, `.DS_Store`, `.ph/ph-clint-cli/project-spec.json`).
19
+ */
20
+ export async function isDirEmptyEnough(dir) {
21
+ let entries;
22
+ try {
23
+ entries = await fs.readdir(dir);
24
+ }
25
+ catch (err) {
26
+ if (isEnoent(err))
27
+ return true;
28
+ throw err;
29
+ }
30
+ const ignorable = new Set(['.git', '.DS_Store', '.ph']);
31
+ return entries.every((entry) => ignorable.has(entry));
32
+ }
@@ -88,6 +88,8 @@ export declare const init: import("@powerhousedao/ph-clint").Command<z.ZodObject
88
88
  proxyEnabled: boolean;
89
89
  observabilityEnabled: boolean;
90
90
  supportedResources: string[];
91
+ dockerfile?: string | undefined;
92
+ dockerTarget?: string | undefined;
91
93
  };
92
94
  scope?: string | undefined;
93
95
  documentId?: string | undefined;
@@ -0,0 +1,40 @@
1
+ import type { ExternalSkill } from '../spec/types.js';
2
+ /** On-disk manifest entry (what is currently installed). */
3
+ export interface ManifestEntry {
4
+ name: string;
5
+ githubUrl: string;
6
+ }
7
+ /** Persisted manifest — a simple JSON array. */
8
+ export type SkillsManifest = ManifestEntry[];
9
+ export interface SyncResult {
10
+ added: string[];
11
+ removed: string[];
12
+ unchanged: string[];
13
+ }
14
+ export interface SyncOptions {
15
+ /** Project root (CLI sub-tree when split layout). */
16
+ targetDir: string;
17
+ /** Desired state from the spec. */
18
+ desired: ExternalSkill[];
19
+ /** Optional log callback. */
20
+ log?: (msg: string) => void;
21
+ }
22
+ export declare function readManifest(targetDir: string): Promise<SkillsManifest>;
23
+ /**
24
+ * Compute the diff between desired (spec) and current (manifest) skills.
25
+ *
26
+ * Pure function — no I/O.
27
+ */
28
+ export declare function diffSkills(desired: ExternalSkill[], current: SkillsManifest): {
29
+ toAdd: ExternalSkill[];
30
+ toRemove: ManifestEntry[];
31
+ unchanged: string[];
32
+ };
33
+ /**
34
+ * Synchronise external skills on disk to match the spec.
35
+ *
36
+ * - Clones missing skills via `git clone --depth 1`.
37
+ * - Removes skills no longer in the spec.
38
+ * - Updates the `.skills-manifest.json`.
39
+ */
40
+ export declare function syncExternalSkills(opts: SyncOptions): Promise<SyncResult>;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * External skills synchronisation.
3
+ *
4
+ * Reads the desired external skills from a `ClintProjectSpec`, diffs them
5
+ * against a `.skills-manifest.json` on disk, and runs `git clone` / `rm -rf`
6
+ * to reconcile. Each external skill ends up as a subdirectory of
7
+ * `prompts/skills-ext/<name>/` so the build-skills pipeline picks it up.
8
+ */
9
+ import { spawn } from 'node:child_process';
10
+ import fs from 'node:fs/promises';
11
+ import path from 'node:path';
12
+ const MANIFEST_FILE = '.skills-manifest.json';
13
+ const SKILLS_DIR = path.join('prompts', 'skills-ext');
14
+ function manifestPath(targetDir) {
15
+ return path.join(targetDir, SKILLS_DIR, MANIFEST_FILE);
16
+ }
17
+ export async function readManifest(targetDir) {
18
+ try {
19
+ const raw = await fs.readFile(manifestPath(targetDir), 'utf8');
20
+ return JSON.parse(raw);
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ async function writeManifest(targetDir, manifest) {
27
+ const file = manifestPath(targetDir);
28
+ await fs.mkdir(path.dirname(file), { recursive: true });
29
+ await fs.writeFile(file, JSON.stringify(manifest, null, 2) + '\n', 'utf8');
30
+ }
31
+ function execGit(args, cwd) {
32
+ return new Promise((resolve, reject) => {
33
+ const proc = spawn('git', args, { cwd, stdio: ['ignore', 'pipe', 'pipe'] });
34
+ let stderr = '';
35
+ if (proc.stderr) {
36
+ proc.stderr.on('data', (d) => {
37
+ stderr += d.toString();
38
+ });
39
+ }
40
+ proc.on('close', (code) => resolve({ code: code ?? 1, stderr }));
41
+ proc.on('error', (err) => reject(err));
42
+ });
43
+ }
44
+ /**
45
+ * Compute the diff between desired (spec) and current (manifest) skills.
46
+ *
47
+ * Pure function — no I/O.
48
+ */
49
+ export function diffSkills(desired, current) {
50
+ const desiredMap = new Map(desired.map((s) => [s.name, s]));
51
+ const currentMap = new Map(current.map((s) => [s.name, s]));
52
+ const toAdd = [];
53
+ const toRemove = [];
54
+ const unchanged = [];
55
+ for (const [name, skill] of desiredMap) {
56
+ const existing = currentMap.get(name);
57
+ if (!existing) {
58
+ toAdd.push(skill);
59
+ }
60
+ else if (existing.githubUrl !== skill.githubUrl) {
61
+ // URL changed — remove old, add new.
62
+ toRemove.push(existing);
63
+ toAdd.push(skill);
64
+ }
65
+ else {
66
+ unchanged.push(name);
67
+ }
68
+ }
69
+ for (const [name, entry] of currentMap) {
70
+ if (!desiredMap.has(name)) {
71
+ toRemove.push(entry);
72
+ }
73
+ }
74
+ return { toAdd, toRemove, unchanged };
75
+ }
76
+ /**
77
+ * Synchronise external skills on disk to match the spec.
78
+ *
79
+ * - Clones missing skills via `git clone --depth 1`.
80
+ * - Removes skills no longer in the spec.
81
+ * - Updates the `.skills-manifest.json`.
82
+ */
83
+ export async function syncExternalSkills(opts) {
84
+ const { targetDir, desired, log } = opts;
85
+ const skillsDir = path.join(targetDir, SKILLS_DIR);
86
+ await fs.mkdir(skillsDir, { recursive: true });
87
+ const current = await readManifest(targetDir);
88
+ const { toAdd, toRemove, unchanged } = diffSkills(desired, current);
89
+ const result = { added: [], removed: [], unchanged };
90
+ // Remove skills.
91
+ for (const entry of toRemove) {
92
+ const dir = path.join(skillsDir, entry.name);
93
+ log?.(`Removing skill "${entry.name}"…`);
94
+ await fs.rm(dir, { recursive: true, force: true });
95
+ result.removed.push(entry.name);
96
+ }
97
+ // Add skills.
98
+ for (const skill of toAdd) {
99
+ const dir = path.join(skillsDir, skill.name);
100
+ log?.(`Cloning skill "${skill.name}" from ${skill.githubUrl}…`);
101
+ // Ensure the target doesn't exist (re-add after URL change).
102
+ await fs.rm(dir, { recursive: true, force: true });
103
+ const { code, stderr } = await execGit(['clone', '--depth', '1', skill.githubUrl, skill.name], skillsDir);
104
+ if (code !== 0) {
105
+ log?.(`Warning: git clone failed for "${skill.name}": ${stderr.trim()}`);
106
+ continue;
107
+ }
108
+ // Remove .git dir — we don't want a nested repo.
109
+ await fs.rm(path.join(dir, '.git'), { recursive: true, force: true });
110
+ result.added.push(skill.name);
111
+ }
112
+ // Write updated manifest.
113
+ const newManifest = desired.map((s) => ({
114
+ name: s.name,
115
+ githubUrl: s.githubUrl,
116
+ }));
117
+ await writeManifest(targetDir, newManifest);
118
+ return result;
119
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/ph-clint-cli",
3
- "version": "0.1.0-dev.86",
3
+ "version": "0.1.0-dev.87",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -12,21 +12,33 @@
12
12
  "files": [
13
13
  "dist"
14
14
  ],
15
+ "scripts": {
16
+ "build:skills": "tsx scripts/build-skills.ts",
17
+ "build": "pnpm build:skills && tsc",
18
+ "dev": "tsx src/main.ts",
19
+ "start": "node dist/main.js",
20
+ "test": "NODE_OPTIONS='--experimental-vm-modules' jest --detectOpenHandles --coverage",
21
+ "test:e2e": "NODE_OPTIONS='--experimental-vm-modules' jest --detectOpenHandles --testPathPatterns 'tests/(e2e|codegen-e2e)/' --testPathIgnorePatterns '/node_modules/'",
22
+ "lint": "eslint src",
23
+ "mastra:dev": "mastra dev",
24
+ "mastra:build": "mastra build",
25
+ "mastra:start": "mastra start"
26
+ },
15
27
  "dependencies": {
16
28
  "@electric-sql/pglite": "0.3.15",
17
- "@mastra/core": "^1.41.0",
18
- "@mastra/libsql": "^1.12.1",
19
- "@mastra/memory": "^1.20.2",
29
+ "@mastra/core": "1.41.0",
30
+ "@mastra/libsql": "1.12.1",
31
+ "@mastra/memory": "1.20.2",
32
+ "@powerhousedao/ph-clint": "0.1.0-dev.87",
33
+ "@powerhousedao/ph-clint-app": "0.1.0-dev.87",
34
+ "@powerhousedao/ph-clint-dev": "0.1.0-dev.87",
20
35
  "@powerhousedao/reactor": "6.0.0-dev.257",
21
36
  "@powerhousedao/reactor-api": "6.0.0-dev.257",
22
37
  "@powerhousedao/shared": "6.0.0-dev.257",
23
38
  "document-model": "6.0.0-dev.257",
24
39
  "kysely": "^0.27.0",
25
40
  "kysely-pglite-dialect": "^1.3.0",
26
- "zod": "4.3.6",
27
- "@powerhousedao/ph-clint": "0.1.0-dev.86",
28
- "@powerhousedao/ph-clint-dev": "0.1.0-dev.86",
29
- "@powerhousedao/ph-clint-app": "0.1.0-dev.86"
41
+ "zod": "4.3.6"
30
42
  },
31
43
  "devDependencies": {
32
44
  "@jest/globals": "^30.2.0",
@@ -38,17 +50,5 @@
38
50
  },
39
51
  "engines": {
40
52
  "node": ">=22.13.0"
41
- },
42
- "scripts": {
43
- "build:skills": "tsx scripts/build-skills.ts",
44
- "build": "pnpm build:skills && tsc",
45
- "dev": "tsx src/main.ts",
46
- "start": "node dist/main.js",
47
- "test": "NODE_OPTIONS='--experimental-vm-modules' jest --detectOpenHandles --coverage",
48
- "test:e2e": "NODE_OPTIONS='--experimental-vm-modules' jest --detectOpenHandles --testPathPatterns 'tests/(e2e|codegen-e2e)/' --testPathIgnorePatterns '/node_modules/'",
49
- "lint": "eslint src",
50
- "mastra:dev": "mastra dev",
51
- "mastra:build": "mastra build",
52
- "mastra:start": "mastra start"
53
53
  }
54
- }
54
+ }