@powerhousedao/ph-clint-cli 0.1.0-dev.6 → 0.1.0-dev.61

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 (101) hide show
  1. package/dist/cli.js +52 -10
  2. package/dist/codegen/actions.d.ts +1 -0
  3. package/dist/codegen/actions.js +1 -0
  4. package/dist/codegen/builders/agent-ts.d.ts +4 -4
  5. package/dist/codegen/builders/agent-ts.js +92 -2
  6. package/dist/codegen/builders/app-index-ts.d.ts +3 -10
  7. package/dist/codegen/builders/app-index-ts.js +30 -20
  8. package/dist/codegen/builders/cli-package-json.d.ts +1 -8
  9. package/dist/codegen/builders/cli-package-json.js +1 -96
  10. package/dist/codegen/builders/cli-ts.js +88 -37
  11. package/dist/codegen/builders/config-ts.d.ts +1 -1
  12. package/dist/codegen/builders/config-ts.js +2 -8
  13. package/dist/codegen/builders/demo-agent-ts.d.ts +8 -0
  14. package/dist/codegen/builders/demo-agent-ts.js +50 -0
  15. package/dist/codegen/builders/eslint-config-js.d.ts +1 -1
  16. package/dist/codegen/builders/eslint-config-js.js +7 -4
  17. package/dist/codegen/builders/framework-gen-ts.d.ts +11 -6
  18. package/dist/codegen/builders/framework-gen-ts.js +73 -21
  19. package/dist/codegen/builders/framework-ts.js +33 -7
  20. package/dist/codegen/builders/index.d.ts +1 -44
  21. package/dist/codegen/builders/index.js +1 -61
  22. package/dist/codegen/builders/manifest-json.d.ts +6 -0
  23. package/dist/codegen/builders/manifest-json.js +31 -0
  24. package/dist/codegen/builders/mastra-index-ts.d.ts +3 -0
  25. package/dist/codegen/builders/mastra-index-ts.js +47 -5
  26. package/dist/codegen/builders/publish-config-js.d.ts +8 -0
  27. package/dist/codegen/builders/publish-config-js.js +33 -0
  28. package/dist/codegen/builders/publish-config-ts.d.ts +4 -2
  29. package/dist/codegen/builders/publish-config-ts.js +25 -11
  30. package/dist/codegen/builders/readme-md.js +7 -6
  31. package/dist/codegen/builders/root-package-json.js +14 -11
  32. package/dist/codegen/builders/smoke-test-ts.d.ts +2 -0
  33. package/dist/codegen/builders/smoke-test-ts.js +15 -0
  34. package/dist/codegen/exec.d.ts +1 -20
  35. package/dist/codegen/exec.js +1 -41
  36. package/dist/codegen/generated.d.ts +1 -0
  37. package/dist/codegen/generated.js +1 -0
  38. package/dist/codegen/hashes.d.ts +1 -6
  39. package/dist/codegen/hashes.js +1 -60
  40. package/dist/codegen/index.d.ts +8 -36
  41. package/dist/codegen/index.js +6 -293
  42. package/dist/codegen/markers.d.ts +1 -36
  43. package/dist/codegen/markers.js +1 -86
  44. package/dist/codegen/scaffold.d.ts +1 -34
  45. package/dist/codegen/scaffold.js +1 -60
  46. package/dist/codegen/write.d.ts +1 -6
  47. package/dist/codegen/write.js +1 -32
  48. package/dist/commands/clint-project-build.d.ts +6 -1
  49. package/dist/commands/clint-project-build.js +11 -28
  50. package/dist/commands/clint-project-init.d.ts +40 -10
  51. package/dist/commands/clint-project-init.js +55 -47
  52. package/dist/commands/clint-project-publish.d.ts +7 -1
  53. package/dist/commands/clint-project-publish.js +6 -4
  54. package/dist/commands/clint-project-regen.d.ts +6 -1
  55. package/dist/commands/clint-project-regen.js +26 -2
  56. package/dist/commands/clint-skills-sync.d.ts +15 -0
  57. package/dist/commands/clint-skills-sync.js +56 -0
  58. package/dist/framework.d.ts +6 -170
  59. package/dist/framework.gen.d.ts +1 -32
  60. package/dist/framework.js +1 -5
  61. package/{prompts/agent-profiles/AgentBase.md → dist/gen/agent-profiles/PhClintDevAgent.md} +1 -1
  62. package/dist/gen/skills/cli-setup/.cli-docs.md +135 -0
  63. package/dist/gen/skills/cli-setup/SKILL.md +125 -0
  64. package/dist/gen/skills/cli-setup/references/00.assess-cli-needs.md +53 -0
  65. package/dist/gen/skills/cli-setup/references/01.define-config-schema.md +78 -0
  66. package/dist/gen/skills/cli-setup/references/02.wire-cli.md +141 -0
  67. package/dist/gen/skills/cli-setup/references/03.add-entrypoint.md +128 -0
  68. package/dist/gen/skills/cli-setup/references/expected-outcome.md +3 -0
  69. package/dist/gen/skills/command-definition/.cli-docs.md +84 -0
  70. package/dist/gen/skills/command-definition/SKILL.md +99 -0
  71. package/dist/gen/skills/command-definition/references/00.assess-requirements.md +58 -0
  72. package/dist/gen/skills/command-definition/references/01.define-schema.md +72 -0
  73. package/dist/gen/skills/command-definition/references/02.implement-execute.md +118 -0
  74. package/dist/gen/skills/command-definition/references/03.add-prompting.md +54 -0
  75. package/dist/gen/skills/command-definition/references/expected-outcome.md +3 -0
  76. package/dist/gen/skills/service-definition/.cli-docs.md +214 -0
  77. package/dist/gen/skills/service-definition/SKILL.md +148 -0
  78. package/dist/gen/skills/service-definition/references/00.assess-service.md +69 -0
  79. package/dist/gen/skills/service-definition/references/01.define-service.md +166 -0
  80. package/dist/gen/skills/service-definition/references/02.add-preflight.md +132 -0
  81. package/dist/gen/skills/service-definition/references/03.add-project-scanner.md +82 -0
  82. package/dist/gen/skills/service-definition/references/04.wire-events.md +120 -0
  83. package/dist/gen/skills/service-definition/references/expected-outcome.md +3 -0
  84. package/dist/services/clint-project.js +21 -0
  85. package/dist/skills/sync.d.ts +1 -0
  86. package/dist/skills/sync.js +1 -0
  87. package/dist/spec/ensure-document.d.ts +17 -0
  88. package/dist/spec/ensure-document.js +56 -0
  89. package/dist/spec/file.d.ts +1 -4
  90. package/dist/spec/file.js +1 -34
  91. package/dist/spec/from-document.d.ts +4 -1
  92. package/dist/spec/from-document.js +4 -16
  93. package/dist/spec/types.d.ts +1 -62
  94. package/dist/spec/types.js +1 -112
  95. package/dist/triggers/publish-trigger.d.ts +10 -0
  96. package/dist/triggers/publish-trigger.js +133 -0
  97. package/dist/triggers/spec-change.d.ts +5 -34
  98. package/dist/triggers/spec-change.js +137 -102
  99. package/package.json +12 -12
  100. package/prompts/skills-ext/.gitkeep +0 -0
  101. package/prompts/skills-tpl/.gitkeep +0 -0
@@ -7,10 +7,12 @@
7
7
  * migration fires first.
8
8
  */
9
9
  import path from 'node:path';
10
- import { defineCommand } from '@powerhousedao/ph-clint';
10
+ import { defineCommand } from '../framework.js';
11
11
  import { z } from 'zod';
12
12
  import { readProjectSpec } from '../spec/file.js';
13
13
  import { generateProject } from '../codegen/index.js';
14
+ import { runPostGenActions } from '@powerhousedao/ph-clint-dev/codegen/actions';
15
+ import { ensureSpecDocument } from '../spec/ensure-document.js';
14
16
  const inputSchema = z.object({
15
17
  dir: z
16
18
  .string()
@@ -25,7 +27,7 @@ export const regen = defineCommand({
25
27
  id: 'clint-project-regen',
26
28
  description: 'Regenerate project files from the persisted spec',
27
29
  inputSchema,
28
- execute: async (input, { workdir, stdout, log }) => {
30
+ execute: async (input, { workdir, stdout, log, runProcess, reactor: getReactor, folders }) => {
29
31
  const targetDir = path.resolve(workdir, input.dir ?? '.');
30
32
  const spec = await readProjectSpec(targetDir);
31
33
  if (!spec) {
@@ -52,7 +54,29 @@ export const regen = defineCommand({
52
54
  else
53
55
  stdout('warning: ' + w + '\n');
54
56
  }
57
+ // Ensure spec document exists in drive (recover if deleted)
58
+ if (getReactor && folders) {
59
+ try {
60
+ const reactor = await getReactor();
61
+ if (reactor) {
62
+ const { docId, created } = await ensureSpecDocument({
63
+ spec, targetDir, reactor, folders,
64
+ });
65
+ if (created) {
66
+ lines.push(`Created spec document ${docId} in Clint Folders/specs/${spec.name}`);
67
+ }
68
+ }
69
+ }
70
+ catch (err) {
71
+ log?.warn(`Could not ensure spec document: ${err instanceof Error ? err.message : String(err)}`);
72
+ }
73
+ }
55
74
  stdout(lines.join('\n') + '\n');
75
+ // Run post-generation actions (install, build, skills-sync).
76
+ await runPostGenActions(result.pendingActions, {
77
+ log: (msg) => stdout(msg + '\n'),
78
+ runProcess,
79
+ });
56
80
  return {
57
81
  text: lines.join('\n'),
58
82
  data: {
@@ -0,0 +1,15 @@
1
+ import { z } from 'zod';
2
+ export declare const skillsSync: import("@powerhousedao/ph-clint").Command<z.ZodObject<{
3
+ dir: z.ZodOptional<z.ZodString>;
4
+ }, z.core.$strip>, {
5
+ text: string;
6
+ data?: undefined;
7
+ } | {
8
+ text: string;
9
+ data: import("@powerhousedao/ph-clint-dev/skills/sync").SyncResult;
10
+ }, {
11
+ model: string;
12
+ devServicePort: number;
13
+ phVersion: string;
14
+ apiKey?: string | undefined;
15
+ }, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>;
@@ -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 '../framework.js';
8
+ import { z } from 'zod';
9
+ import { readProjectSpec } from '../spec/file.js';
10
+ import { syncExternalSkills } from '@powerhousedao/ph-clint-dev/skills/sync';
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
+ });
@@ -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
- }>, defineTrigger: <TState = Record<string, unknown>>(options: import("@powerhousedao/ph-clint").TriggerOptions<TState, {
39
+ }, import("@powerhousedao/ph-clint").InferRegistry<readonly [import("document-model").DocumentModelModule<import("@powerhousedao/ph-clint-app").PhClintProjectPHState>]>>, 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';
@@ -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.js CHANGED
@@ -23,12 +23,8 @@ export const configSchema = z.object({
23
23
  .describe('Port reserved for the impl project (Service B) `pnpm dev`'),
24
24
  phVersion: z
25
25
  .string()
26
- .default('6.0.0-dev.170')
26
+ .default('latest')
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'),
@@ -1,6 +1,6 @@
1
1
  # Agent Base System Prompt
2
2
 
3
- You are {{agentName}}, an agent available through the {{cliName}} CLI.
3
+ You are PhClintDevAgent, an agent available through the CLI.
4
4
 
5
5
  ## Capabilities
6
6
 
@@ -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
+ ```