@powerhousedao/ph-clint-cli 0.1.0-dev.3 → 0.1.0-dev.31
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/cli.js +31 -12
- package/dist/codegen/builders/agent-ts.d.ts +4 -4
- package/dist/codegen/builders/agent-ts.js +83 -2
- package/dist/codegen/builders/app-index-ts.d.ts +3 -10
- package/dist/codegen/builders/app-index-ts.js +10 -14
- package/dist/codegen/builders/cli-package-json.js +48 -8
- package/dist/codegen/builders/cli-ts.js +63 -22
- package/dist/codegen/builders/config-ts.js +11 -15
- package/dist/codegen/builders/demo-agent-ts.d.ts +8 -0
- package/dist/codegen/builders/demo-agent-ts.js +44 -0
- package/dist/codegen/builders/framework-gen-ts.d.ts +4 -5
- package/dist/codegen/builders/framework-gen-ts.js +22 -19
- package/dist/codegen/builders/framework-ts.js +33 -7
- package/dist/codegen/builders/index.d.ts +9 -1
- package/dist/codegen/builders/index.js +28 -4
- package/dist/codegen/builders/manifest-json.d.ts +6 -0
- package/dist/codegen/builders/manifest-json.js +31 -0
- package/dist/codegen/builders/mastra-index-ts.d.ts +3 -0
- package/dist/codegen/builders/mastra-index-ts.js +47 -5
- package/dist/codegen/builders/publish-config-ts.d.ts +6 -0
- package/dist/codegen/builders/publish-config-ts.js +21 -0
- package/dist/codegen/builders/readme-md.js +8 -7
- package/dist/codegen/builders/root-package-json.d.ts +3 -0
- package/dist/codegen/builders/root-package-json.js +24 -11
- package/dist/codegen/index.js +26 -12
- package/dist/codegen/scaffold.d.ts +21 -3
- package/dist/codegen/scaffold.js +90 -16
- package/dist/commands/clint-project-build.js +10 -27
- package/dist/commands/clint-project-init.d.ts +30 -6
- package/dist/commands/clint-project-init.js +45 -9
- package/dist/commands/clint-project-publish.d.ts +1 -0
- package/dist/commands/clint-project-publish.js +5 -3
- package/dist/commands/clint-project-regen.js +2 -2
- package/dist/commands/clint-skills-sync.d.ts +10 -0
- package/dist/commands/clint-skills-sync.js +56 -0
- package/dist/config.d.ts +3 -5
- package/dist/config.js +5 -7
- package/dist/framework.d.ts +5 -169
- package/dist/framework.gen.d.ts +1 -32
- package/dist/framework.gen.js +1 -1
- package/dist/framework.js +0 -4
- package/{prompts/agent-profiles/AgentBase.md → dist/gen/agent-profiles/PhClintDevAgent.md} +1 -1
- package/dist/gen/skills/cli-setup/.cli-docs.md +135 -0
- package/dist/gen/skills/cli-setup/SKILL.md +125 -0
- package/dist/gen/skills/cli-setup/references/00.assess-cli-needs.md +53 -0
- package/dist/gen/skills/cli-setup/references/01.define-config-schema.md +78 -0
- package/dist/gen/skills/cli-setup/references/02.wire-cli.md +141 -0
- package/dist/gen/skills/cli-setup/references/03.add-entrypoint.md +128 -0
- package/dist/gen/skills/cli-setup/references/expected-outcome.md +3 -0
- package/dist/gen/skills/command-definition/.cli-docs.md +84 -0
- package/dist/gen/skills/command-definition/SKILL.md +99 -0
- package/dist/gen/skills/command-definition/references/00.assess-requirements.md +58 -0
- package/dist/gen/skills/command-definition/references/01.define-schema.md +72 -0
- package/dist/gen/skills/command-definition/references/02.implement-execute.md +118 -0
- package/dist/gen/skills/command-definition/references/03.add-prompting.md +54 -0
- package/dist/gen/skills/command-definition/references/expected-outcome.md +3 -0
- package/dist/gen/skills/service-definition/.cli-docs.md +214 -0
- package/dist/gen/skills/service-definition/SKILL.md +148 -0
- package/dist/gen/skills/service-definition/references/00.assess-service.md +69 -0
- package/dist/gen/skills/service-definition/references/01.define-service.md +166 -0
- package/dist/gen/skills/service-definition/references/02.add-preflight.md +132 -0
- package/dist/gen/skills/service-definition/references/03.add-project-scanner.md +82 -0
- package/dist/gen/skills/service-definition/references/04.wire-events.md +120 -0
- package/dist/gen/skills/service-definition/references/expected-outcome.md +3 -0
- package/dist/services/clint-project.js +21 -0
- package/dist/skills/sync.d.ts +40 -0
- package/dist/skills/sync.js +119 -0
- package/dist/spec/from-document.d.ts +4 -1
- package/dist/spec/from-document.js +18 -8
- package/dist/spec/types.d.ts +85 -6
- package/dist/spec/types.js +90 -23
- package/dist/triggers/publish-trigger.d.ts +10 -0
- package/dist/triggers/publish-trigger.js +169 -0
- package/dist/triggers/spec-change.d.ts +5 -34
- package/dist/triggers/spec-change.js +175 -99
- package/package.json +7 -7
- package/prompts/skills-ext/.gitkeep +0 -0
- package/prompts/skills-tpl/.gitkeep +0 -0
package/dist/framework.d.ts
CHANGED
|
@@ -14,7 +14,6 @@ export declare const configSchema: z.ZodObject<{
|
|
|
14
14
|
model: z.ZodDefault<z.ZodString>;
|
|
15
15
|
devServicePort: z.ZodDefault<z.ZodNumber>;
|
|
16
16
|
phVersion: z.ZodDefault<z.ZodString>;
|
|
17
|
-
projectDocumentId: z.ZodOptional<z.ZodString>;
|
|
18
17
|
}, z.core.$strip>;
|
|
19
18
|
export declare const secretsSchema: z.ZodObject<{
|
|
20
19
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
@@ -30,210 +29,47 @@ export declare const defineCommand: <TInput extends z.ZodType, TOutput = unknown
|
|
|
30
29
|
model: string;
|
|
31
30
|
devServicePort: number;
|
|
32
31
|
phVersion: string;
|
|
33
|
-
projectDocumentId?: string | undefined;
|
|
34
32
|
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>;
|
|
33
|
+
}, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>) => Promise<TOutput>;
|
|
67
34
|
}) => import("@powerhousedao/ph-clint").Command<TInput, TOutput, {
|
|
68
35
|
model: string;
|
|
69
36
|
devServicePort: number;
|
|
70
37
|
phVersion: string;
|
|
71
|
-
projectDocumentId?: string | undefined;
|
|
72
38
|
apiKey?: string | undefined;
|
|
73
39
|
}>, defineTrigger: <TState = Record<string, unknown>>(options: import("@powerhousedao/ph-clint").TriggerOptions<TState, {
|
|
74
40
|
model: string;
|
|
75
41
|
devServicePort: number;
|
|
76
42
|
phVersion: string;
|
|
77
|
-
projectDocumentId?: string | undefined;
|
|
78
43
|
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, {
|
|
44
|
+
}, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>) => import("@powerhousedao/ph-clint").Trigger<TState, {
|
|
111
45
|
model: string;
|
|
112
46
|
devServicePort: number;
|
|
113
47
|
phVersion: string;
|
|
114
|
-
projectDocumentId?: string | undefined;
|
|
115
48
|
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<{
|
|
49
|
+
}, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>, defineService: (options: import("@powerhousedao/ph-clint").ServiceDefinition<{
|
|
148
50
|
model: string;
|
|
149
51
|
devServicePort: number;
|
|
150
52
|
phVersion: string;
|
|
151
|
-
projectDocumentId?: string | undefined;
|
|
152
53
|
apiKey?: string | undefined;
|
|
153
54
|
}>) => import("@powerhousedao/ph-clint").ServiceDefinition<{
|
|
154
55
|
model: string;
|
|
155
56
|
devServicePort: number;
|
|
156
57
|
phVersion: string;
|
|
157
|
-
projectDocumentId?: string | undefined;
|
|
158
58
|
apiKey?: string | undefined;
|
|
159
59
|
}>, createDocumentChangeTrigger: <T extends string, TState extends {
|
|
160
60
|
pending: number;
|
|
161
61
|
} = {
|
|
162
62
|
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, {
|
|
63
|
+
}>(options: import("@powerhousedao/ph-clint").DocumentChangeTriggerOptions<import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>, T, {
|
|
195
64
|
model: string;
|
|
196
65
|
devServicePort: number;
|
|
197
66
|
phVersion: string;
|
|
198
|
-
projectDocumentId?: string | undefined;
|
|
199
67
|
apiKey?: string | undefined;
|
|
200
68
|
}, TState>) => import("@powerhousedao/ph-clint").Trigger<TState, {
|
|
201
69
|
model: string;
|
|
202
70
|
devServicePort: number;
|
|
203
71
|
phVersion: string;
|
|
204
|
-
projectDocumentId?: string | undefined;
|
|
205
72
|
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
|
-
}]>>;
|
|
73
|
+
}, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>;
|
|
238
74
|
export { registry } from './framework.gen.js';
|
|
239
75
|
export type { Registry } from './framework.gen.js';
|
package/dist/framework.gen.d.ts
CHANGED
|
@@ -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;
|
package/dist/framework.gen.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* THIS FILE IS GENERATED BY ph-clint-cli. DO NOT EDIT.
|
|
3
3
|
*
|
|
4
|
-
* Regenerated on every `ph-clint regen` and on every spec-change tick.
|
|
4
|
+
* Regenerated on every `ph-clint clint-project-regen` and on every spec-change tick.
|
|
5
5
|
* Put custom bindings in `framework.ts`, not here — edits to this file
|
|
6
6
|
* will be overwritten.
|
|
7
7
|
*/
|
package/dist/framework.js
CHANGED
|
@@ -25,10 +25,6 @@ export const configSchema = z.object({
|
|
|
25
25
|
.string()
|
|
26
26
|
.default('6.0.0-dev.170')
|
|
27
27
|
.describe('Pinned Powerhouse version used when emitting a new impl project'),
|
|
28
|
-
projectDocumentId: z
|
|
29
|
-
.string()
|
|
30
|
-
.optional()
|
|
31
|
-
.describe('ID of the powerhouse/ph-clint-project document that drives codegen (set on first regen; edit to switch projects)'),
|
|
32
28
|
});
|
|
33
29
|
export const secretsSchema = z.object({
|
|
34
30
|
apiKey: z.string().optional().describe('Anthropic API key'),
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
## API Reference: CLI Setup
|
|
2
|
+
|
|
3
|
+
### `defineCli<TSchema, TSecrets>(options): Cli`
|
|
4
|
+
|
|
5
|
+
Factory function that creates a CLI from a declarative options object. Two generic type parameters:
|
|
6
|
+
|
|
7
|
+
- `TSchema extends z.ZodType` — config schema type (defaults to `Record<string, unknown>`)
|
|
8
|
+
- `TSecrets extends z.ZodType` — secrets schema type (defaults to `Record<string, unknown>`)
|
|
9
|
+
|
|
10
|
+
### `CliOptions<TSchema, TSecrets>` Interface
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
interface CliOptions<TSchema, TSecrets> {
|
|
14
|
+
name: string; // CLI name (kebab-case, used for config files and env var prefix)
|
|
15
|
+
version: string; // Semantic version (shown in --version)
|
|
16
|
+
root?: string; // Absolute path to package root (resolves sibling packages)
|
|
17
|
+
description: Resolvable<string, Config>; // Static string or function of ({ config, workdir })
|
|
18
|
+
commands: Command<any, any, any>[]; // Array of command definitions
|
|
19
|
+
configSchema?: TSchema; // Zod schema for user-facing config
|
|
20
|
+
secretsSchema?: TSecrets; // Zod schema for sensitive config (API keys, tokens)
|
|
21
|
+
interactive?: InteractiveConfig<Config>; // REPL configuration
|
|
22
|
+
triggers?: Trigger<any, any, any>[]; // Routine loop triggers
|
|
23
|
+
routine?: RoutineConfig; // Routine loop timing & project scanner
|
|
24
|
+
services?: ServiceDefinition<Config>[]; // Background service definitions
|
|
25
|
+
events?: Record<string, (data: any, log: Logger) => void>; // Event handlers
|
|
26
|
+
workdir?: string; // Implementation-level workdir override (hides --workdir flag)
|
|
27
|
+
configDefaults?: Record<string, unknown>; // Layer 5 config defaults
|
|
28
|
+
prompts?: PromptsConfig; // Agent skills & profiles
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### `InteractiveConfig<TConfig>` Interface
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
interface InteractiveConfig<TConfig> {
|
|
36
|
+
welcome: Resolvable<string, TConfig>; // Welcome message (static or dynamic)
|
|
37
|
+
outputWindow?: number; // Trailing output lines in REPL (default: 6)
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### `Resolvable<T, TConfig>` Type
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
type Resolvable<T, TConfig> = T | ((ctx: { workdir: string; config: TConfig }) => T);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Allows static values OR dynamic computation based on resolved workdir and config.
|
|
48
|
+
|
|
49
|
+
### `Cli` Object Interface
|
|
50
|
+
|
|
51
|
+
Methods available on the object returned by `defineCli()`:
|
|
52
|
+
|
|
53
|
+
| Method | Signature | Description |
|
|
54
|
+
|--------|-----------|-------------|
|
|
55
|
+
| `run` | `(argv: string[], options?: RunOptions) => Promise<void>` | Main entry point — parse args, dispatch command or start REPL |
|
|
56
|
+
| `bootstrap` | `(opts?: BootstrapOptions) => Promise<BootstrapResult>` | Initialize runtime without dispatch — for programmatic access |
|
|
57
|
+
| `execute` | `(commandId, args, context?) => Promise<unknown>` | Execute a command directly (programmatic use) |
|
|
58
|
+
| `parseArgs` | `(commandId, argv) => Record<string, unknown>` | Parse CLI argv for a specific command |
|
|
59
|
+
| `getCommand` | `(id: string) => Command \| undefined` | Look up a registered command |
|
|
60
|
+
| `listCommands` | `() => Command[]` | List all registered commands |
|
|
61
|
+
| `generateHelp` | `() => string` | Generate CLI help text |
|
|
62
|
+
| `generateCommandHelp` | `(commandId: string) => string` | Generate help for a specific command |
|
|
63
|
+
| `generateCompletion` | `(shell: string) => string` | Generate shell completion script (bash/zsh/fish) |
|
|
64
|
+
| `configEnvVars` | `() => ConfigEnvVar[]` | List config env var mappings |
|
|
65
|
+
| `getMetadata` | `() => CliMetadata` | JSON-serializable CLI metadata |
|
|
66
|
+
| `configureAgent` | `(loader: AgentLoader<any>) => void` | Set the agent factory (lazy-loaded) |
|
|
67
|
+
| `configureReactor` | `(config: ReactorConfiguration) => void` | Set the reactor configuration (lazy-loaded) |
|
|
68
|
+
|
|
69
|
+
Properties:
|
|
70
|
+
|
|
71
|
+
| Property | Type | Description |
|
|
72
|
+
|----------|------|-------------|
|
|
73
|
+
| `name` | `string` | CLI name |
|
|
74
|
+
| `version` | `string` | CLI version |
|
|
75
|
+
| `description` | `string` | CLI description |
|
|
76
|
+
| `hasAgent` | `boolean` | True when `configureAgent()` has been called |
|
|
77
|
+
| `hasReactor` | `boolean` | True when `configureReactor()` has been called |
|
|
78
|
+
|
|
79
|
+
### `RunOptions` Interface
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
interface RunOptions {
|
|
83
|
+
exit?: (code: number) => void; // Override process.exit (for testing)
|
|
84
|
+
stdout?: (message: string) => void; // Capture stdout
|
|
85
|
+
stderr?: (message: string) => void; // Capture stderr
|
|
86
|
+
interactiveInput?: AsyncIterable<string>; // Headless REPL input (for testing)
|
|
87
|
+
resume?: string; // Resume agent conversation by thread ID
|
|
88
|
+
workdir?: string; // Override workdir (for testing)
|
|
89
|
+
configFile?: string; // --config flag value
|
|
90
|
+
logLevel?: LogLevel; // Override log verbosity (default: 'info')
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### `BootstrapOptions` & `BootstrapResult`
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
interface BootstrapOptions {
|
|
98
|
+
workdir?: string; // Explicit workdir (skips flag/cwd logic)
|
|
99
|
+
configFile?: string; // Config file override
|
|
100
|
+
logLevel?: LogLevel; // Log level (default: 'info')
|
|
101
|
+
stdout?: (text: string) => void;
|
|
102
|
+
stderr?: (text: string) => void;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
interface BootstrapResult {
|
|
106
|
+
workdir: string;
|
|
107
|
+
config: Record<string, unknown>;
|
|
108
|
+
context: CommandContext;
|
|
109
|
+
getAgent(): Promise<AgentProvider | undefined>;
|
|
110
|
+
get mastraAgent(): Promise<unknown | undefined>;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Built-in Commands (Auto-Injected)
|
|
115
|
+
|
|
116
|
+
| Command ID | Condition | Purpose |
|
|
117
|
+
|-----------|-----------|---------|
|
|
118
|
+
| `cli-docs` | Always | Show CLI help (also usable as agent tool) |
|
|
119
|
+
| `config` | When `configSchema` provided | View/modify configuration settings |
|
|
120
|
+
| `{service-id}-start` | Per service definition | Start a background service |
|
|
121
|
+
| `{service-id}-stop` | Per service definition | Stop a running service |
|
|
122
|
+
| `{service-id}-restart` | Per service definition | Restart a service |
|
|
123
|
+
| `{service-id}-ps` | Per service definition | Show service status |
|
|
124
|
+
| `{service-id}-logs` | Per service definition | Tail service logs |
|
|
125
|
+
| `{service-id}-manage` | Per service definition | Interactive management (REPL only) |
|
|
126
|
+
| `{service-id}-ls` | Per service + projectScanner | List discovered projects |
|
|
127
|
+
|
|
128
|
+
### `readPackageInfo(importMetaUrl)`
|
|
129
|
+
|
|
130
|
+
Utility to read name and version from the nearest `package.json`:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import { readPackageInfo } from '@powerhousedao/ph-clint';
|
|
134
|
+
const { name, version } = readPackageInfo(import.meta.url);
|
|
135
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cli-setup
|
|
3
|
+
description: "Cli Setup tasks"
|
|
4
|
+
metadata:
|
|
5
|
+
author: Powerhouse
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
=== BEGIN SKILL BRIEFING ===
|
|
10
|
+
|
|
11
|
+
IMPORTANT: Don't take any action yet. You will be guided through your tasks after the briefing(s). Just process and confirm your understanding.
|
|
12
|
+
|
|
13
|
+
# CLI Setup - Skill Preamble
|
|
14
|
+
|
|
15
|
+
With this skill, you can scaffold or extend a `defineCli()` configuration — the composition root that wires commands, config, services, triggers, and integrations into a single CLI runtime. A single `defineCli()` call produces a CLI that works in command mode (`mycli cmd --arg val`), interactive REPL mode (`/cmd --arg val`), and as an MCP server — all from the same code.
|
|
16
|
+
|
|
17
|
+
## Core Principles
|
|
18
|
+
|
|
19
|
+
### defineCli Is Declarative
|
|
20
|
+
|
|
21
|
+
You describe _what_ the CLI has — the framework wires it up. The order of options doesn't matter, but understanding what triggers what does:
|
|
22
|
+
|
|
23
|
+
- `configSchema` present → auto-injects a `config` command for viewing/modifying settings
|
|
24
|
+
- `secretsSchema` present → fields merge into configSchema internally, but are censored in output
|
|
25
|
+
- `services` present → auto-injects per-service management commands (`{id}-start`, `{id}-stop`, etc.)
|
|
26
|
+
- `interactive` present → enables the `-i` flag for REPL mode
|
|
27
|
+
- `triggers` present → enables routine loop
|
|
28
|
+
- `cli-docs` command is always auto-injected (CLI help for the agent)
|
|
29
|
+
|
|
30
|
+
### Resolvable Values
|
|
31
|
+
|
|
32
|
+
`description` and `interactive.welcome` accept either a static string or a function `({ config, workdir }) => string`. Use functions when the message depends on runtime state — e.g., showing "demo mode" vs "LLM mode" based on whether an API key is configured.
|
|
33
|
+
|
|
34
|
+
### The Cli Object
|
|
35
|
+
|
|
36
|
+
`defineCli()` returns a `Cli` object — the public API with methods for running, testing, introspection, and metadata. The standard entry point is `cli.run(process.argv)`. For programmatic access (e.g., codegen scripts), use `cli.bootstrap()` which resolves workdir, config, and context without entering the dispatch loop.
|
|
37
|
+
|
|
38
|
+
### Two Interaction Modes
|
|
39
|
+
|
|
40
|
+
1. **Command mode** (headless): Execute one subcommand, then exit. Triggered by `mycli cmd --flag val`.
|
|
41
|
+
2. **Interactive REPL mode**: Persistent session with `/command` syntax and bare text for the default subcommand (typically the agent). Triggered by `mycli -i` or when keep-alive features are active (routine loop, API server).
|
|
42
|
+
|
|
43
|
+
### 6-Layer Config Resolution
|
|
44
|
+
|
|
45
|
+
Config values are resolved in this priority order (highest wins):
|
|
46
|
+
1. `--config <file>` flag
|
|
47
|
+
2. Environment variables: `{CLI_NAME}_{UPPER_SNAKE_FIELD}`
|
|
48
|
+
3. Local config: `{workdir}/.ph/{cliName}.config.local.json`
|
|
49
|
+
4. User config: `~/.ph/{cliName}.config.user.json`
|
|
50
|
+
5. Implementation defaults: `configDefaults` in CliOptions
|
|
51
|
+
6. Zod schema `.default()` values
|
|
52
|
+
|
|
53
|
+
### Config vs Secrets
|
|
54
|
+
|
|
55
|
+
- `configSchema` — user-facing settings (model name, ports, feature flags). Shown in `config` command output.
|
|
56
|
+
- `secretsSchema` — sensitive values (API keys, tokens). Merged into configSchema internally but censored as `***` in output unless `--revealSecrets` is used.
|
|
57
|
+
|
|
58
|
+
Put API keys and tokens in `secretsSchema`, not `configSchema`.
|
|
59
|
+
|
|
60
|
+
### configDefaults vs Schema Defaults
|
|
61
|
+
|
|
62
|
+
- `.default(value)` in the Zod schema → layer 6, the fallback when nothing else is configured
|
|
63
|
+
- `configDefaults` in CliOptions → layer 5, implementation-level overrides that sit above schema defaults but below user/local config
|
|
64
|
+
|
|
65
|
+
Use schema `.default()` for universal sensible defaults. Use `configDefaults` for implementation-specific overrides that differ from the general-purpose default.
|
|
66
|
+
|
|
67
|
+
### Entry Point Convention
|
|
68
|
+
|
|
69
|
+
The CLI entry point is a TypeScript file with a Node.js shebang:
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
#!/usr/bin/env node
|
|
73
|
+
import { defineCli } from '@powerhousedao/ph-clint';
|
|
74
|
+
// ... imports ...
|
|
75
|
+
const cli = defineCli({ /* options */ });
|
|
76
|
+
cli.run(process.argv);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
The `package.json` needs a `"bin"` field pointing to the compiled output and `"type": "module"` for ESM.
|
|
80
|
+
|
|
81
|
+
## Common Pitfalls
|
|
82
|
+
|
|
83
|
+
- **Forgetting `version`** — Commander needs it for the `--version` flag; omitting it breaks help output
|
|
84
|
+
- **Putting secrets in `configSchema`** — they show up in `config` command output and metadata, exposing sensitive values
|
|
85
|
+
- **Not setting `interactive.welcome`** — REPL starts with no context, confusing the user
|
|
86
|
+
- **Using `configDefaults` for universal defaults** — use `.default()` in the schema instead; `configDefaults` is for implementation-level overrides only
|
|
87
|
+
- **Calling `configureAgent()` inside `defineCli()`** — it's a method on the returned `Cli` object, called after definition
|
|
88
|
+
- **Forgetting `"type": "module"` in package.json** — ESM imports fail at runtime
|
|
89
|
+
- **Not exporting the `cli` object** — other files (e.g., `mastra/index.ts`) may need it for `cli.bootstrap()`
|
|
90
|
+
|
|
91
|
+
## When to Use `createTypes()`
|
|
92
|
+
|
|
93
|
+
For projects with a config schema, use the typed factory to get automatic config typing in all commands:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { createTypes } from '@powerhousedao/ph-clint';
|
|
97
|
+
const { defineCommand, defineTrigger } = createTypes({ configSchema });
|
|
98
|
+
// context.config is now fully typed in every command
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Codegen-Managed Projects
|
|
102
|
+
|
|
103
|
+
In ph-clint-cli projects, `clint-project-init` generates the initial scaffold including `cli.ts` with `@clint:begin`/`@clint:end` marker regions. The codegen system:
|
|
104
|
+
|
|
105
|
+
- **Generates `cli.ts`** with marker regions for imports, commands, services, triggers, prompts, events, interactive, reactor, and mastra
|
|
106
|
+
- **Generates `framework.gen.ts`** (codegen-owned) with the document registry — regenerated when the spec's `documentTypes` change
|
|
107
|
+
- **Emits `framework.ts`** once (user-owned) with `configSchema`, `secretsSchema`, and `createTypes()` — never overwritten after creation
|
|
108
|
+
|
|
109
|
+
**The agent never hand-edits marker regions in `cli.ts`.** To add or change CLI features:
|
|
110
|
+
|
|
111
|
+
1. Update `project-spec.json` to declare the new structure
|
|
112
|
+
2. Run `clint-project-regen` to regenerate the marker regions
|
|
113
|
+
3. Run `clint-project-build` to verify
|
|
114
|
+
|
|
115
|
+
User-owned code outside markers (`configSchema`, `secretsSchema`, `CLI_NAME`) is preserved across regens. User-owned files (`framework.ts`, `src/commands/*.ts`, `src/services/*.ts`, `src/triggers/*.ts`) are never overwritten.
|
|
116
|
+
|
|
117
|
+
=== END OF SKILL BRIEFING ===
|
|
118
|
+
|
|
119
|
+
## Specific tasks
|
|
120
|
+
|
|
121
|
+
* **Assess Cli Needs** [references/00.assess-cli-needs.md](references/00.assess-cli-needs.md)
|
|
122
|
+
* **Define Config Schema** [references/01.define-config-schema.md](references/01.define-config-schema.md)
|
|
123
|
+
* **Wire Cli** [references/02.wire-cli.md](references/02.wire-cli.md)
|
|
124
|
+
* **Add Entrypoint** [references/03.add-entrypoint.md](references/03.add-entrypoint.md)
|
|
125
|
+
* **Expected Outcome** [references/expected-outcome.md](references/expected-outcome.md)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Phase 0: Assess CLI Needs
|
|
2
|
+
|
|
3
|
+
Before writing any code, determine which features the CLI requires.
|
|
4
|
+
|
|
5
|
+
## Steps
|
|
6
|
+
|
|
7
|
+
### 1. Name the CLI
|
|
8
|
+
|
|
9
|
+
Choose a kebab-case name. This name is used for:
|
|
10
|
+
- Config file paths: `{workdir}/.ph/{name}.config.local.json`
|
|
11
|
+
- Environment variable prefix: `{NAME}_*` (UPPER_SNAKE_CASE)
|
|
12
|
+
- Package `"bin"` field and executable name
|
|
13
|
+
|
|
14
|
+
### 2. Determine version sourcing
|
|
15
|
+
|
|
16
|
+
Choose one:
|
|
17
|
+
- **Hardcoded**: `version: '1.0.0'`
|
|
18
|
+
- **From package.json**: `const { version } = readPackageInfo(import.meta.url)`
|
|
19
|
+
|
|
20
|
+
### 3. Feature checklist
|
|
21
|
+
|
|
22
|
+
For each feature, determine if the CLI needs it:
|
|
23
|
+
|
|
24
|
+
- [ ] **Custom config?** → needs `configSchema` (Zod object)
|
|
25
|
+
- [ ] **Sensitive config (API keys, tokens)?** → needs `secretsSchema` (Zod object)
|
|
26
|
+
- [ ] **Interactive REPL?** → needs `interactive` with `welcome` message
|
|
27
|
+
- [ ] **Background services?** → needs `services` array of `defineService()` definitions
|
|
28
|
+
- [ ] **Automated triggers?** → needs `triggers` array + `routine` config
|
|
29
|
+
- [ ] **AI agent?** → needs `cli.configureAgent(loader)` after `defineCli()`
|
|
30
|
+
- [ ] **Skill templates?** → needs `prompts` config with `artifacts`, `agents`, `skills`
|
|
31
|
+
- [ ] **Powerhouse documents?** → needs `cli.configureReactor(config)` after `defineCli()`
|
|
32
|
+
- [ ] **Service lifecycle events?** → needs `events` handlers
|
|
33
|
+
- [ ] **Implementation-level workdir override?** → needs `workdir` option (hides `--workdir` flag)
|
|
34
|
+
|
|
35
|
+
### 4. List commands to register
|
|
36
|
+
|
|
37
|
+
Enumerate all commands that will be passed to the `commands` array. These should already be defined using `defineCommand()` (see the `command-definition` skill). Note which ones need agent-compatible `{ text, data }` returns.
|
|
38
|
+
|
|
39
|
+
### 5. Detect codegen vs manual project
|
|
40
|
+
|
|
41
|
+
For existing projects, check if `cli.ts` already has `@clint:begin` marker regions:
|
|
42
|
+
- **Codegen-managed**: Markers present — update `project-spec.json` and run `clint-project-regen`. Never hand-edit marker regions.
|
|
43
|
+
- **Manual**: No markers — edit `defineCli()` directly as a regular TypeScript file.
|
|
44
|
+
|
|
45
|
+
For new projects, prefer using `clint-project-init` to generate the scaffold with markers.
|
|
46
|
+
|
|
47
|
+
### 6. Determine config field names
|
|
48
|
+
|
|
49
|
+
For each config/secret field, verify the auto-generated env var name is sensible:
|
|
50
|
+
- Field `apiKey` on CLI `mycli` → env var `MYCLI_API_KEY`
|
|
51
|
+
- Field `connectPort` on CLI `vetra` → env var `VETRA_CONNECT_PORT`
|
|
52
|
+
|
|
53
|
+
If a name would be confusing, consider renaming the field.
|