@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.
- package/dist/cli.js +22 -3
- package/dist/codegen/builders/agent-ts.js +6 -6
- package/dist/codegen/builders/cli-package-json.js +1 -0
- package/dist/codegen/builders/cli-ts.js +25 -9
- 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-ts.js +11 -6
- package/dist/codegen/builders/index.d.ts +2 -1
- package/dist/codegen/builders/index.js +8 -3
- package/dist/codegen/builders/mastra-index-ts.d.ts +2 -2
- package/dist/codegen/builders/mastra-index-ts.js +36 -14
- package/dist/gen/agent-profiles/PhClintDevAgent.md +13 -0
- 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/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.
|
|
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.
|
|
32
|
-
"@powerhousedao/ph-clint-app": "^0.1.0-dev.
|
|
33
|
-
"@powerhousedao/ph-clint-dev": "^0.1.0-dev.
|
|
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",
|