@powerhousedao/ph-clint-cli 0.1.0-dev.23 → 0.1.0-dev.24

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 (35) hide show
  1. package/dist/cli.js +22 -3
  2. package/dist/codegen/builders/agent-ts.js +6 -6
  3. package/dist/codegen/builders/cli-package-json.js +1 -0
  4. package/dist/codegen/builders/cli-ts.js +25 -9
  5. package/dist/codegen/builders/demo-agent-ts.d.ts +8 -0
  6. package/dist/codegen/builders/demo-agent-ts.js +44 -0
  7. package/dist/codegen/builders/framework-ts.js +11 -6
  8. package/dist/codegen/builders/index.d.ts +2 -1
  9. package/dist/codegen/builders/index.js +8 -3
  10. package/dist/codegen/builders/mastra-index-ts.d.ts +2 -2
  11. package/dist/codegen/builders/mastra-index-ts.js +36 -14
  12. package/dist/gen/agent-profiles/PhClintDevAgent.md +13 -0
  13. package/dist/gen/skills/cli-setup/.cli-docs.md +135 -0
  14. package/dist/gen/skills/cli-setup/SKILL.md +125 -0
  15. package/dist/gen/skills/cli-setup/references/00.assess-cli-needs.md +53 -0
  16. package/dist/gen/skills/cli-setup/references/01.define-config-schema.md +78 -0
  17. package/dist/gen/skills/cli-setup/references/02.wire-cli.md +141 -0
  18. package/dist/gen/skills/cli-setup/references/03.add-entrypoint.md +128 -0
  19. package/dist/gen/skills/cli-setup/references/expected-outcome.md +3 -0
  20. package/dist/gen/skills/command-definition/.cli-docs.md +84 -0
  21. package/dist/gen/skills/command-definition/SKILL.md +99 -0
  22. package/dist/gen/skills/command-definition/references/00.assess-requirements.md +58 -0
  23. package/dist/gen/skills/command-definition/references/01.define-schema.md +72 -0
  24. package/dist/gen/skills/command-definition/references/02.implement-execute.md +118 -0
  25. package/dist/gen/skills/command-definition/references/03.add-prompting.md +54 -0
  26. package/dist/gen/skills/command-definition/references/expected-outcome.md +3 -0
  27. package/dist/gen/skills/service-definition/.cli-docs.md +214 -0
  28. package/dist/gen/skills/service-definition/SKILL.md +148 -0
  29. package/dist/gen/skills/service-definition/references/00.assess-service.md +69 -0
  30. package/dist/gen/skills/service-definition/references/01.define-service.md +166 -0
  31. package/dist/gen/skills/service-definition/references/02.add-preflight.md +132 -0
  32. package/dist/gen/skills/service-definition/references/03.add-project-scanner.md +82 -0
  33. package/dist/gen/skills/service-definition/references/04.wire-events.md +120 -0
  34. package/dist/gen/skills/service-definition/references/expected-outcome.md +3 -0
  35. package/package.json +5 -4
@@ -0,0 +1,120 @@
1
+ # Phase 4: Wire Service Lifecycle Events
2
+
3
+ Handle service state transitions for logging, notifications, and dependent actions.
4
+
5
+ ## Steps
6
+
7
+ ### 1. Add event handlers in defineCli
8
+
9
+ Service events are wired via the `events` property in `defineCli()`:
10
+
11
+ ```typescript
12
+ import { defineCli } from '@powerhousedao/ph-clint';
13
+
14
+ const cli = defineCli({
15
+ // ...
16
+ services: [myService],
17
+ events: {
18
+ 'service:pattern-matched': (event, log) => {
19
+ log.info(`${event.name}: matched "${event.patternName}" (${event.remaining} remaining)`);
20
+ },
21
+ 'service:ready': (event, log) => {
22
+ log.info(`${event.name} is ready`);
23
+ if (event.endpoints) {
24
+ for (const [name, url] of Object.entries(event.endpoints)) {
25
+ log.info(` ${name}: ${url}`);
26
+ }
27
+ }
28
+ },
29
+ 'service:failed': (event, log) => {
30
+ log.error(`${event.name} failed: ${event.error}`);
31
+ },
32
+ 'service:restarting': (event, log) => {
33
+ log.warn(`${event.name} restarting (attempt ${event.attempt}/${event.maxRetries})`);
34
+ },
35
+ 'service:stopped': (event, log) => {
36
+ log.info(`${event.name} stopped`);
37
+ },
38
+ },
39
+ });
40
+ ```
41
+
42
+ ### 2. Understand event payloads
43
+
44
+ Each event handler receives `(event, log)`:
45
+ - `event` — typed payload with `id`, `instanceId`, `name`, and event-specific fields
46
+ - `log` — structured Logger with `debug`, `info`, `warn`, `error` methods
47
+
48
+ **`service:pattern-matched`** — fired progressively as each readiness pattern matches:
49
+ - `event.patternName` — which pattern matched
50
+ - `event.endpoints` — captured endpoints so far
51
+ - `event.endpointTypes` — endpoint types so far
52
+ - `event.remaining` — number of patterns still unmatched
53
+
54
+ **`service:ready`** — fired when ALL patterns have matched:
55
+ - `event.endpoints` — all captured endpoints
56
+ - `event.endpointTypes` — all endpoint types
57
+
58
+ **`service:failed`** — fired on readiness timeout or process crash:
59
+ - `event.error` — error message (includes log tail for diagnosis)
60
+
61
+ **`service:restarting`** — fired when auto-restart triggers:
62
+ - `event.attempt` — current attempt number
63
+ - `event.maxRetries` — maximum attempts configured
64
+
65
+ **`service:stopped`** — fired after explicit stop completes
66
+
67
+ ### 3. Common event patterns
68
+
69
+ **Log endpoints on ready**:
70
+ ```typescript
71
+ 'service:ready': (event, log) => {
72
+ const urls = Object.entries(event.endpoints ?? {})
73
+ .map(([name, url]) => ` ${name}: ${url}`)
74
+ .join('\n');
75
+ log.info(`${event.name} ready\n${urls}`);
76
+ },
77
+ ```
78
+
79
+ **Trigger dependent service startup**:
80
+ ```typescript
81
+ 'service:ready': async (event, log) => {
82
+ if (event.id === 'backend') {
83
+ log.info('Backend ready, starting frontend...');
84
+ // Frontend can now connect to the backend URL
85
+ }
86
+ },
87
+ ```
88
+
89
+ **Progress feedback during startup**:
90
+ ```typescript
91
+ 'service:pattern-matched': (event, log) => {
92
+ if (event.remaining > 0) {
93
+ log.info(`${event.name}: ${event.patternName} ready, waiting for ${event.remaining} more...`);
94
+ }
95
+ },
96
+ ```
97
+
98
+ ### 4. Register the service in defineCli
99
+
100
+ **In a codegen-managed project** (cli.ts has `@clint:begin` markers):
101
+
102
+ Do NOT manually edit `cli.ts` marker regions. Instead:
103
+
104
+ 1. Add the service to `project-spec.json`
105
+ 2. Run `clint-project-regen` — this regenerates the `@clint:begin services`, `@clint:begin imports`, and `@clint:begin events` marker regions
106
+ 3. Run `clint-project-build` to verify TypeScript compiles
107
+
108
+ **In a manually-managed project** (no markers):
109
+
110
+ ```typescript
111
+ import { myService } from './services/my-service.js';
112
+
113
+ const cli = defineCli({
114
+ services: [myService],
115
+ events: { /* ... */ },
116
+ // ...
117
+ });
118
+ ```
119
+
120
+ This auto-injects the management commands: `{id}-start`, `{id}-stop`, `{id}-restart`, `{id}-ps`, `{id}-logs`, `{id}-manage`, and `{id}-ls` (if projectScanner is defined).
@@ -0,0 +1,3 @@
1
+ ## Expected Outcome
2
+
3
+ Service is defined with readiness detection, preflight checks, and lifecycle config. It is registered in `defineCli`, auto-generates management commands (`{id}-start`, `{id}-stop`, etc.), and transitions through starting/ready/failed states correctly. Endpoints are captured and typed. Preflight checks fail fast with clear messages and hints.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/ph-clint-cli",
3
- "version": "0.1.0-dev.23",
3
+ "version": "0.1.0-dev.24",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -18,6 +18,7 @@
18
18
  "dev": "tsx src/main.ts",
19
19
  "start": "node dist/main.js",
20
20
  "test": "NODE_OPTIONS='--experimental-vm-modules' jest --detectOpenHandles",
21
+ "test:e2e": "NODE_OPTIONS='--experimental-vm-modules' jest --detectOpenHandles --testPathPatterns 'tests/(e2e|codegen-e2e)/' --testPathIgnorePatterns '/node_modules/'",
21
22
  "lint": "eslint src",
22
23
  "mastra:dev": "mastra dev",
23
24
  "mastra:build": "mastra build",
@@ -28,9 +29,9 @@
28
29
  "@mastra/core": "^1.22.0",
29
30
  "@mastra/libsql": "^1.7.4",
30
31
  "@mastra/memory": "^1.13.1",
31
- "@powerhousedao/ph-clint": "^0.1.0-dev.23",
32
- "@powerhousedao/ph-clint-app": "^0.1.0-dev.23",
33
- "@powerhousedao/ph-clint-dev": "^0.1.0-dev.23",
32
+ "@powerhousedao/ph-clint": "^0.1.0-dev.24",
33
+ "@powerhousedao/ph-clint-app": "^0.1.0-dev.24",
34
+ "@powerhousedao/ph-clint-dev": "^0.1.0-dev.24",
34
35
  "@powerhousedao/reactor": "6.0.0-dev.170",
35
36
  "@powerhousedao/reactor-api": "6.0.0-dev.170",
36
37
  "@powerhousedao/shared": "6.0.0-dev.170",