@powerhousedao/ph-clint-cli 0.1.0-dev.15 → 0.1.0-dev.17

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,56 @@
1
+ /**
2
+ * `ph-clint clint-skills-sync` — reconcile external skills on disk to match
3
+ * the project spec. Clones missing skills from GitHub, removes skills no
4
+ * longer referenced, and updates `.skills-manifest.json`.
5
+ */
6
+ import path from 'node:path';
7
+ import { defineCommand } from '@powerhousedao/ph-clint';
8
+ import { z } from 'zod';
9
+ import { readProjectSpec } from '../spec/file.js';
10
+ import { syncExternalSkills } from '../skills/sync.js';
11
+ const inputSchema = z.object({
12
+ dir: z
13
+ .string()
14
+ .optional()
15
+ .describe('Project directory (defaults to the current directory)'),
16
+ });
17
+ export const skillsSync = defineCommand({
18
+ id: 'clint-skills-sync',
19
+ description: 'Synchronise external skills from the project spec',
20
+ inputSchema,
21
+ execute: async (input, { workdir, stdout, log }) => {
22
+ const targetDir = path.resolve(workdir, input.dir ?? '.');
23
+ const spec = await readProjectSpec(targetDir);
24
+ if (!spec) {
25
+ return {
26
+ text: `Error: no spec found at ${targetDir}/.ph/ph-clint-cli/project-spec.json.\n` +
27
+ 'Run `ph-clint clint-project-init` first to scaffold a new project.',
28
+ };
29
+ }
30
+ const result = await syncExternalSkills({
31
+ targetDir,
32
+ desired: spec.externalSkills,
33
+ log: (msg) => {
34
+ if (log)
35
+ log.info(msg);
36
+ else
37
+ stdout(msg + '\n');
38
+ },
39
+ });
40
+ const lines = [];
41
+ if (result.added.length > 0) {
42
+ lines.push(`Added: ${result.added.join(', ')}`);
43
+ }
44
+ if (result.removed.length > 0) {
45
+ lines.push(`Removed: ${result.removed.join(', ')}`);
46
+ }
47
+ if (result.added.length === 0 && result.removed.length === 0) {
48
+ lines.push('External skills are up to date.');
49
+ }
50
+ stdout(lines.join('\n') + '\n');
51
+ return {
52
+ text: lines.join('\n'),
53
+ data: result,
54
+ };
55
+ },
56
+ });
@@ -32,38 +32,7 @@ export declare const defineCommand: <TInput extends z.ZodType, TOutput = unknown
32
32
  phVersion: string;
33
33
  projectDocumentId?: string | undefined;
34
34
  apiKey?: string | undefined;
35
- }, import("@powerhousedao/ph-clint").InferRegistry<readonly [{
36
- readonly version: 1;
37
- readonly reducer: import("document-model").Reducer<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
38
- readonly actions: {
39
- enableRoutine: (input: import("@powerhousedao/ph-clint-app").EnableRoutineInput) => import("@powerhousedao/ph-clint-app").EnableRoutineAction;
40
- disableRoutine: (input: import("@powerhousedao/ph-clint-app").DisableRoutineInput) => import("@powerhousedao/ph-clint-app").DisableRoutineAction;
41
- enableMastra: (input: import("@powerhousedao/ph-clint-app").EnableMastraInput) => import("@powerhousedao/ph-clint-app").EnableMastraAction;
42
- disableMastra: (input: import("@powerhousedao/ph-clint-app").DisableMastraInput) => import("@powerhousedao/ph-clint-app").DisableMastraAction;
43
- enablePowerhouse: (input: import("@powerhousedao/ph-clint-app").EnablePowerhouseInput) => import("@powerhousedao/ph-clint-app").EnablePowerhouseAction;
44
- setPowerhouseSwitchboard: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardAction;
45
- setPowerhouseConnect: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseConnectInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseConnectAction;
46
- setPackageName: (input: import("@powerhousedao/ph-clint-app").SetPackageNameInput) => import("@powerhousedao/ph-clint-app").SetPackageNameAction;
47
- clearBin: (input: import("@powerhousedao/ph-clint-app").ClearBinInput) => import("@powerhousedao/ph-clint-app").ClearBinAction;
48
- setBin: (input: import("@powerhousedao/ph-clint-app").SetBinInput) => import("@powerhousedao/ph-clint-app").SetBinAction;
49
- setDescription: (input: import("@powerhousedao/ph-clint-app").SetDescriptionInput) => import("@powerhousedao/ph-clint-app").SetDescriptionAction;
50
- setVersion: (input: import("@powerhousedao/ph-clint-app").SetVersionInput) => import("@powerhousedao/ph-clint-app").SetVersionAction;
51
- clearScope: (input: import("@powerhousedao/ph-clint-app").ClearScopeInput) => import("@powerhousedao/ph-clint-app").ClearScopeAction;
52
- setScope: (input: import("@powerhousedao/ph-clint-app").SetScopeInput) => import("@powerhousedao/ph-clint-app").SetScopeAction;
53
- setName: (name: string | {
54
- name: string;
55
- }) => import("document-model").SetNameAction;
56
- undo: (count?: number, scope?: string) => import("document-model").UndoAction;
57
- redo: (count?: number, scope?: string) => import("document-model").RedoAction;
58
- prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
59
- loadState: <TState extends import("document-model").PHBaseState = import("document-model").PHBaseState>(state: TState & {
60
- name: string;
61
- }, operations: number) => import("document-model").LoadStateAction;
62
- noop: (scope?: string) => import("document-model").NOOPAction;
63
- };
64
- readonly utils: import("document-model").DocumentModelUtils<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
65
- readonly documentModel: import("document-model").DocumentModelPHState;
66
- }]>>) => Promise<TOutput>;
35
+ }, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>) => Promise<TOutput>;
67
36
  }) => import("@powerhousedao/ph-clint").Command<TInput, TOutput, {
68
37
  model: string;
69
38
  devServicePort: number;
@@ -76,75 +45,13 @@ export declare const defineCommand: <TInput extends z.ZodType, TOutput = unknown
76
45
  phVersion: string;
77
46
  projectDocumentId?: string | undefined;
78
47
  apiKey?: string | undefined;
79
- }, import("@powerhousedao/ph-clint").InferRegistry<readonly [{
80
- readonly version: 1;
81
- readonly reducer: import("document-model").Reducer<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
82
- readonly actions: {
83
- enableRoutine: (input: import("@powerhousedao/ph-clint-app").EnableRoutineInput) => import("@powerhousedao/ph-clint-app").EnableRoutineAction;
84
- disableRoutine: (input: import("@powerhousedao/ph-clint-app").DisableRoutineInput) => import("@powerhousedao/ph-clint-app").DisableRoutineAction;
85
- enableMastra: (input: import("@powerhousedao/ph-clint-app").EnableMastraInput) => import("@powerhousedao/ph-clint-app").EnableMastraAction;
86
- disableMastra: (input: import("@powerhousedao/ph-clint-app").DisableMastraInput) => import("@powerhousedao/ph-clint-app").DisableMastraAction;
87
- enablePowerhouse: (input: import("@powerhousedao/ph-clint-app").EnablePowerhouseInput) => import("@powerhousedao/ph-clint-app").EnablePowerhouseAction;
88
- setPowerhouseSwitchboard: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardAction;
89
- setPowerhouseConnect: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseConnectInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseConnectAction;
90
- setPackageName: (input: import("@powerhousedao/ph-clint-app").SetPackageNameInput) => import("@powerhousedao/ph-clint-app").SetPackageNameAction;
91
- clearBin: (input: import("@powerhousedao/ph-clint-app").ClearBinInput) => import("@powerhousedao/ph-clint-app").ClearBinAction;
92
- setBin: (input: import("@powerhousedao/ph-clint-app").SetBinInput) => import("@powerhousedao/ph-clint-app").SetBinAction;
93
- setDescription: (input: import("@powerhousedao/ph-clint-app").SetDescriptionInput) => import("@powerhousedao/ph-clint-app").SetDescriptionAction;
94
- setVersion: (input: import("@powerhousedao/ph-clint-app").SetVersionInput) => import("@powerhousedao/ph-clint-app").SetVersionAction;
95
- clearScope: (input: import("@powerhousedao/ph-clint-app").ClearScopeInput) => import("@powerhousedao/ph-clint-app").ClearScopeAction;
96
- setScope: (input: import("@powerhousedao/ph-clint-app").SetScopeInput) => import("@powerhousedao/ph-clint-app").SetScopeAction;
97
- setName: (name: string | {
98
- name: string;
99
- }) => import("document-model").SetNameAction;
100
- undo: (count?: number, scope?: string) => import("document-model").UndoAction;
101
- redo: (count?: number, scope?: string) => import("document-model").RedoAction;
102
- prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
103
- loadState: <TState_1 extends import("document-model").PHBaseState = import("document-model").PHBaseState>(state: TState_1 & {
104
- name: string;
105
- }, operations: number) => import("document-model").LoadStateAction;
106
- noop: (scope?: string) => import("document-model").NOOPAction;
107
- };
108
- readonly utils: import("document-model").DocumentModelUtils<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
109
- readonly documentModel: import("document-model").DocumentModelPHState;
110
- }]>>) => import("@powerhousedao/ph-clint").Trigger<TState, {
48
+ }, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>) => import("@powerhousedao/ph-clint").Trigger<TState, {
111
49
  model: string;
112
50
  devServicePort: number;
113
51
  phVersion: string;
114
52
  projectDocumentId?: string | undefined;
115
53
  apiKey?: string | undefined;
116
- }, import("@powerhousedao/ph-clint").InferRegistry<readonly [{
117
- readonly version: 1;
118
- readonly reducer: import("document-model").Reducer<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
119
- readonly actions: {
120
- enableRoutine: (input: import("@powerhousedao/ph-clint-app").EnableRoutineInput) => import("@powerhousedao/ph-clint-app").EnableRoutineAction;
121
- disableRoutine: (input: import("@powerhousedao/ph-clint-app").DisableRoutineInput) => import("@powerhousedao/ph-clint-app").DisableRoutineAction;
122
- enableMastra: (input: import("@powerhousedao/ph-clint-app").EnableMastraInput) => import("@powerhousedao/ph-clint-app").EnableMastraAction;
123
- disableMastra: (input: import("@powerhousedao/ph-clint-app").DisableMastraInput) => import("@powerhousedao/ph-clint-app").DisableMastraAction;
124
- enablePowerhouse: (input: import("@powerhousedao/ph-clint-app").EnablePowerhouseInput) => import("@powerhousedao/ph-clint-app").EnablePowerhouseAction;
125
- setPowerhouseSwitchboard: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardAction;
126
- setPowerhouseConnect: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseConnectInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseConnectAction;
127
- setPackageName: (input: import("@powerhousedao/ph-clint-app").SetPackageNameInput) => import("@powerhousedao/ph-clint-app").SetPackageNameAction;
128
- clearBin: (input: import("@powerhousedao/ph-clint-app").ClearBinInput) => import("@powerhousedao/ph-clint-app").ClearBinAction;
129
- setBin: (input: import("@powerhousedao/ph-clint-app").SetBinInput) => import("@powerhousedao/ph-clint-app").SetBinAction;
130
- setDescription: (input: import("@powerhousedao/ph-clint-app").SetDescriptionInput) => import("@powerhousedao/ph-clint-app").SetDescriptionAction;
131
- setVersion: (input: import("@powerhousedao/ph-clint-app").SetVersionInput) => import("@powerhousedao/ph-clint-app").SetVersionAction;
132
- clearScope: (input: import("@powerhousedao/ph-clint-app").ClearScopeInput) => import("@powerhousedao/ph-clint-app").ClearScopeAction;
133
- setScope: (input: import("@powerhousedao/ph-clint-app").SetScopeInput) => import("@powerhousedao/ph-clint-app").SetScopeAction;
134
- setName: (name: string | {
135
- name: string;
136
- }) => import("document-model").SetNameAction;
137
- undo: (count?: number, scope?: string) => import("document-model").UndoAction;
138
- redo: (count?: number, scope?: string) => import("document-model").RedoAction;
139
- prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
140
- loadState: <TState_1 extends import("document-model").PHBaseState = import("document-model").PHBaseState>(state: TState_1 & {
141
- name: string;
142
- }, operations: number) => import("document-model").LoadStateAction;
143
- noop: (scope?: string) => import("document-model").NOOPAction;
144
- };
145
- readonly utils: import("document-model").DocumentModelUtils<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
146
- readonly documentModel: import("document-model").DocumentModelPHState;
147
- }]>>, defineService: (options: import("@powerhousedao/ph-clint").ServiceDefinition<{
54
+ }, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>, defineService: (options: import("@powerhousedao/ph-clint").ServiceDefinition<{
148
55
  model: string;
149
56
  devServicePort: number;
150
57
  phVersion: string;
@@ -160,38 +67,7 @@ export declare const defineCommand: <TInput extends z.ZodType, TOutput = unknown
160
67
  pending: number;
161
68
  } = {
162
69
  pending: number;
163
- }>(options: import("@powerhousedao/ph-clint").DocumentChangeTriggerOptions<import("@powerhousedao/ph-clint").InferRegistry<readonly [{
164
- readonly version: 1;
165
- readonly reducer: import("document-model").Reducer<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
166
- readonly actions: {
167
- enableRoutine: (input: import("@powerhousedao/ph-clint-app").EnableRoutineInput) => import("@powerhousedao/ph-clint-app").EnableRoutineAction;
168
- disableRoutine: (input: import("@powerhousedao/ph-clint-app").DisableRoutineInput) => import("@powerhousedao/ph-clint-app").DisableRoutineAction;
169
- enableMastra: (input: import("@powerhousedao/ph-clint-app").EnableMastraInput) => import("@powerhousedao/ph-clint-app").EnableMastraAction;
170
- disableMastra: (input: import("@powerhousedao/ph-clint-app").DisableMastraInput) => import("@powerhousedao/ph-clint-app").DisableMastraAction;
171
- enablePowerhouse: (input: import("@powerhousedao/ph-clint-app").EnablePowerhouseInput) => import("@powerhousedao/ph-clint-app").EnablePowerhouseAction;
172
- setPowerhouseSwitchboard: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardAction;
173
- setPowerhouseConnect: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseConnectInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseConnectAction;
174
- setPackageName: (input: import("@powerhousedao/ph-clint-app").SetPackageNameInput) => import("@powerhousedao/ph-clint-app").SetPackageNameAction;
175
- clearBin: (input: import("@powerhousedao/ph-clint-app").ClearBinInput) => import("@powerhousedao/ph-clint-app").ClearBinAction;
176
- setBin: (input: import("@powerhousedao/ph-clint-app").SetBinInput) => import("@powerhousedao/ph-clint-app").SetBinAction;
177
- setDescription: (input: import("@powerhousedao/ph-clint-app").SetDescriptionInput) => import("@powerhousedao/ph-clint-app").SetDescriptionAction;
178
- setVersion: (input: import("@powerhousedao/ph-clint-app").SetVersionInput) => import("@powerhousedao/ph-clint-app").SetVersionAction;
179
- clearScope: (input: import("@powerhousedao/ph-clint-app").ClearScopeInput) => import("@powerhousedao/ph-clint-app").ClearScopeAction;
180
- setScope: (input: import("@powerhousedao/ph-clint-app").SetScopeInput) => import("@powerhousedao/ph-clint-app").SetScopeAction;
181
- setName: (name: string | {
182
- name: string;
183
- }) => import("document-model").SetNameAction;
184
- undo: (count?: number, scope?: string) => import("document-model").UndoAction;
185
- redo: (count?: number, scope?: string) => import("document-model").RedoAction;
186
- prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
187
- loadState: <TState_1 extends import("document-model").PHBaseState = import("document-model").PHBaseState>(state: TState_1 & {
188
- name: string;
189
- }, operations: number) => import("document-model").LoadStateAction;
190
- noop: (scope?: string) => import("document-model").NOOPAction;
191
- };
192
- readonly utils: import("document-model").DocumentModelUtils<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
193
- readonly documentModel: import("document-model").DocumentModelPHState;
194
- }]>, T, {
70
+ }>(options: import("@powerhousedao/ph-clint").DocumentChangeTriggerOptions<import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>, T, {
195
71
  model: string;
196
72
  devServicePort: number;
197
73
  phVersion: string;
@@ -203,37 +79,6 @@ export declare const defineCommand: <TInput extends z.ZodType, TOutput = unknown
203
79
  phVersion: string;
204
80
  projectDocumentId?: string | undefined;
205
81
  apiKey?: string | undefined;
206
- }, import("@powerhousedao/ph-clint").InferRegistry<readonly [{
207
- readonly version: 1;
208
- readonly reducer: import("document-model").Reducer<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
209
- readonly actions: {
210
- enableRoutine: (input: import("@powerhousedao/ph-clint-app").EnableRoutineInput) => import("@powerhousedao/ph-clint-app").EnableRoutineAction;
211
- disableRoutine: (input: import("@powerhousedao/ph-clint-app").DisableRoutineInput) => import("@powerhousedao/ph-clint-app").DisableRoutineAction;
212
- enableMastra: (input: import("@powerhousedao/ph-clint-app").EnableMastraInput) => import("@powerhousedao/ph-clint-app").EnableMastraAction;
213
- disableMastra: (input: import("@powerhousedao/ph-clint-app").DisableMastraInput) => import("@powerhousedao/ph-clint-app").DisableMastraAction;
214
- enablePowerhouse: (input: import("@powerhousedao/ph-clint-app").EnablePowerhouseInput) => import("@powerhousedao/ph-clint-app").EnablePowerhouseAction;
215
- setPowerhouseSwitchboard: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardAction;
216
- setPowerhouseConnect: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseConnectInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseConnectAction;
217
- setPackageName: (input: import("@powerhousedao/ph-clint-app").SetPackageNameInput) => import("@powerhousedao/ph-clint-app").SetPackageNameAction;
218
- clearBin: (input: import("@powerhousedao/ph-clint-app").ClearBinInput) => import("@powerhousedao/ph-clint-app").ClearBinAction;
219
- setBin: (input: import("@powerhousedao/ph-clint-app").SetBinInput) => import("@powerhousedao/ph-clint-app").SetBinAction;
220
- setDescription: (input: import("@powerhousedao/ph-clint-app").SetDescriptionInput) => import("@powerhousedao/ph-clint-app").SetDescriptionAction;
221
- setVersion: (input: import("@powerhousedao/ph-clint-app").SetVersionInput) => import("@powerhousedao/ph-clint-app").SetVersionAction;
222
- clearScope: (input: import("@powerhousedao/ph-clint-app").ClearScopeInput) => import("@powerhousedao/ph-clint-app").ClearScopeAction;
223
- setScope: (input: import("@powerhousedao/ph-clint-app").SetScopeInput) => import("@powerhousedao/ph-clint-app").SetScopeAction;
224
- setName: (name: string | {
225
- name: string;
226
- }) => import("document-model").SetNameAction;
227
- undo: (count?: number, scope?: string) => import("document-model").UndoAction;
228
- redo: (count?: number, scope?: string) => import("document-model").RedoAction;
229
- prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
230
- loadState: <TState_1 extends import("document-model").PHBaseState = import("document-model").PHBaseState>(state: TState_1 & {
231
- name: string;
232
- }, operations: number) => import("document-model").LoadStateAction;
233
- noop: (scope?: string) => import("document-model").NOOPAction;
234
- };
235
- readonly utils: import("document-model").DocumentModelUtils<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
236
- readonly documentModel: import("document-model").DocumentModelPHState;
237
- }]>>;
82
+ }, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>;
238
83
  export { registry } from './framework.gen.js';
239
84
  export type { Registry } from './framework.gen.js';
@@ -2,36 +2,5 @@
2
2
  * Typed document registry derived from the reactor package's document models.
3
3
  * Regenerated whenever the spec's `documentTypes` list changes.
4
4
  */
5
- export declare const registry: import("@powerhousedao/ph-clint").InferRegistry<readonly [{
6
- readonly version: 1;
7
- readonly reducer: import("document-model").Reducer<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
8
- readonly actions: {
9
- enableRoutine: (input: import("@powerhousedao/ph-clint-app").EnableRoutineInput) => import("@powerhousedao/ph-clint-app").EnableRoutineAction;
10
- disableRoutine: (input: import("@powerhousedao/ph-clint-app").DisableRoutineInput) => import("@powerhousedao/ph-clint-app").DisableRoutineAction;
11
- enableMastra: (input: import("@powerhousedao/ph-clint-app").EnableMastraInput) => import("@powerhousedao/ph-clint-app").EnableMastraAction;
12
- disableMastra: (input: import("@powerhousedao/ph-clint-app").DisableMastraInput) => import("@powerhousedao/ph-clint-app").DisableMastraAction;
13
- enablePowerhouse: (input: import("@powerhousedao/ph-clint-app").EnablePowerhouseInput) => import("@powerhousedao/ph-clint-app").EnablePowerhouseAction;
14
- setPowerhouseSwitchboard: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseSwitchboardAction;
15
- setPowerhouseConnect: (input: import("@powerhousedao/ph-clint-app").SetPowerhouseConnectInput) => import("@powerhousedao/ph-clint-app").SetPowerhouseConnectAction;
16
- setPackageName: (input: import("@powerhousedao/ph-clint-app").SetPackageNameInput) => import("@powerhousedao/ph-clint-app").SetPackageNameAction;
17
- clearBin: (input: import("@powerhousedao/ph-clint-app").ClearBinInput) => import("@powerhousedao/ph-clint-app").ClearBinAction;
18
- setBin: (input: import("@powerhousedao/ph-clint-app").SetBinInput) => import("@powerhousedao/ph-clint-app").SetBinAction;
19
- setDescription: (input: import("@powerhousedao/ph-clint-app").SetDescriptionInput) => import("@powerhousedao/ph-clint-app").SetDescriptionAction;
20
- setVersion: (input: import("@powerhousedao/ph-clint-app").SetVersionInput) => import("@powerhousedao/ph-clint-app").SetVersionAction;
21
- clearScope: (input: import("@powerhousedao/ph-clint-app").ClearScopeInput) => import("@powerhousedao/ph-clint-app").ClearScopeAction;
22
- setScope: (input: import("@powerhousedao/ph-clint-app").SetScopeInput) => import("@powerhousedao/ph-clint-app").SetScopeAction;
23
- setName: (name: string | {
24
- name: string;
25
- }) => import("document-model").SetNameAction;
26
- undo: (count?: number, scope?: string) => import("document-model").UndoAction;
27
- redo: (count?: number, scope?: string) => import("document-model").RedoAction;
28
- prune: (start?: number, end?: number, scope?: string) => import("document-model").SchemaPruneAction;
29
- loadState: <TState extends import("document-model").PHBaseState = import("document-model").PHBaseState>(state: TState & {
30
- name: string;
31
- }, operations: number) => import("document-model").LoadStateAction;
32
- noop: (scope?: string) => import("document-model").NOOPAction;
33
- };
34
- readonly utils: import("document-model").DocumentModelUtils<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>;
35
- readonly documentModel: import("document-model").DocumentModelPHState;
36
- }]>;
5
+ export declare const registry: import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>;
37
6
  export type Registry = typeof registry;
@@ -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
+ }
@@ -8,11 +8,6 @@ import { clintProjectSpecSchema, } from './types.js';
8
8
  export function specFromDocumentState(state) {
9
9
  if (!state.name)
10
10
  return null;
11
- // `documentTypes` is a forward-compatible field — older `ph-clint-project`
12
- // document states don't declare it yet. Pull through if present, otherwise
13
- // leave it to the schema default (`[]`). Codegen treats the empty list as
14
- // "no registry entries" and emits an empty `defineRegistry([...])`.
15
- const documentTypes = state.documentTypes ?? undefined;
16
11
  const parsed = clintProjectSpecSchema.safeParse({
17
12
  name: state.name,
18
13
  scope: state.scope ?? undefined,
@@ -20,11 +15,20 @@ export function specFromDocumentState(state) {
20
15
  description: state.description,
21
16
  bin: state.bin ?? undefined,
22
17
  features: {
23
- powerhouse: { ...state.features.powerhouse },
18
+ powerhouse: state.features.powerhouse,
24
19
  mastra: { ...state.features.mastra },
25
20
  routine: { ...state.features.routine },
26
21
  },
27
- ...(Array.isArray(documentTypes) ? { documentTypes } : {}),
22
+ packages: state.packages.map((p) => ({
23
+ id: p.id,
24
+ packageName: p.packageName,
25
+ documentTypes: [...p.documentTypes],
26
+ })),
27
+ externalSkills: state.externalSkills.map((s) => ({
28
+ id: s.id,
29
+ name: s.name,
30
+ githubUrl: s.githubUrl,
31
+ })),
28
32
  });
29
33
  return parsed.success ? parsed.data : null;
30
34
  }
@@ -9,6 +9,32 @@
9
9
  * generator step actually needs it.
10
10
  */
11
11
  import { z } from 'zod';
12
+ /**
13
+ * Ordered Powerhouse integration level. Higher levels imply all lower ones:
14
+ * Disabled → Reactor → Switchboard → Connect
15
+ */
16
+ export declare const POWERHOUSE_LEVELS: readonly ["Disabled", "Reactor", "Switchboard", "Connect"];
17
+ export declare const powerhouseLevelSchema: z.ZodDefault<z.ZodEnum<{
18
+ Disabled: "Disabled";
19
+ Reactor: "Reactor";
20
+ Switchboard: "Switchboard";
21
+ Connect: "Connect";
22
+ }>>;
23
+ export type PowerhouseLevel = z.infer<typeof powerhouseLevelSchema>;
24
+ /** Check whether `level` is at least `threshold` in the ordered enum. */
25
+ export declare function phAtLeast(level: PowerhouseLevel, threshold: PowerhouseLevel): boolean;
26
+ export declare const powerhousePackageSchema: z.ZodObject<{
27
+ id: z.ZodString;
28
+ packageName: z.ZodString;
29
+ documentTypes: z.ZodDefault<z.ZodArray<z.ZodString>>;
30
+ }, z.core.$strip>;
31
+ export type PowerhousePackage = z.infer<typeof powerhousePackageSchema>;
32
+ export declare const externalSkillSchema: z.ZodObject<{
33
+ id: z.ZodString;
34
+ name: z.ZodString;
35
+ githubUrl: z.ZodString;
36
+ }, z.core.$strip>;
37
+ export type ExternalSkill = z.infer<typeof externalSkillSchema>;
12
38
  export declare const clintProjectSpecSchema: z.ZodObject<{
13
39
  name: z.ZodString;
14
40
  scope: z.ZodOptional<z.ZodString>;
@@ -16,11 +42,12 @@ export declare const clintProjectSpecSchema: z.ZodObject<{
16
42
  description: z.ZodDefault<z.ZodString>;
17
43
  bin: z.ZodOptional<z.ZodString>;
18
44
  features: z.ZodDefault<z.ZodObject<{
19
- powerhouse: z.ZodDefault<z.ZodObject<{
20
- enabled: z.ZodDefault<z.ZodBoolean>;
21
- switchboard: z.ZodDefault<z.ZodBoolean>;
22
- connect: z.ZodDefault<z.ZodBoolean>;
23
- }, z.core.$strip>>;
45
+ powerhouse: z.ZodDefault<z.ZodEnum<{
46
+ Disabled: "Disabled";
47
+ Reactor: "Reactor";
48
+ Switchboard: "Switchboard";
49
+ Connect: "Connect";
50
+ }>>;
24
51
  mastra: z.ZodDefault<z.ZodObject<{
25
52
  enabled: z.ZodDefault<z.ZodBoolean>;
26
53
  }, z.core.$strip>>;
@@ -28,7 +55,16 @@ export declare const clintProjectSpecSchema: z.ZodObject<{
28
55
  enabled: z.ZodDefault<z.ZodBoolean>;
29
56
  }, z.core.$strip>>;
30
57
  }, z.core.$strip>>;
31
- documentTypes: z.ZodDefault<z.ZodArray<z.ZodString>>;
58
+ packages: z.ZodDefault<z.ZodArray<z.ZodObject<{
59
+ id: z.ZodString;
60
+ packageName: z.ZodString;
61
+ documentTypes: z.ZodDefault<z.ZodArray<z.ZodString>>;
62
+ }, z.core.$strip>>>;
63
+ externalSkills: z.ZodDefault<z.ZodArray<z.ZodObject<{
64
+ id: z.ZodString;
65
+ name: z.ZodString;
66
+ githubUrl: z.ZodString;
67
+ }, z.core.$strip>>>;
32
68
  }, z.core.$strip>;
33
69
  export type ClintProjectSpec = z.infer<typeof clintProjectSpecSchema>;
34
70
  export type ClintProjectSpecInput = z.input<typeof clintProjectSpecSchema>;
@@ -45,6 +81,19 @@ export declare function getCliFolderName(spec: ClintProjectSpec): string;
45
81
  * Name of the reactor-package sub-folder when the project is split.
46
82
  */
47
83
  export declare function getAppFolderName(spec: ClintProjectSpec): string;
84
+ /**
85
+ * Flat list of all document types across all packages. Convenience for
86
+ * codegen that needs to iterate every registered document type regardless
87
+ * of which package provides it.
88
+ */
89
+ export declare function getAllDocumentTypes(spec: ClintProjectSpec): string[];
90
+ /**
91
+ * The app npm package name (`@scope/{name}-app` or `{name}-app`).
92
+ * Matches what the document model reducer stores in `packages[].packageName`.
93
+ */
94
+ export declare function getAppPackageName(spec: ClintProjectSpec): string;
95
+ /** Directory name for the app package (`{name}-app`, no scope prefix). */
96
+ export declare function getAppDirName(spec: ClintProjectSpec): string;
48
97
  /**
49
98
  * Folder slug for a documentType ID. The slug is the portion after the last
50
99
  * `/` (e.g. `powerhouse/ph-clint-project` → `ph-clint-project`). Matches the