@dp-pcs/ogp 0.3.3 → 0.4.2

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 (95) hide show
  1. package/README.md +275 -49
  2. package/dist/cli/completion.d.ts +5 -0
  3. package/dist/cli/completion.d.ts.map +1 -0
  4. package/dist/cli/completion.js +148 -0
  5. package/dist/cli/completion.js.map +1 -0
  6. package/dist/cli/config.d.ts +3 -0
  7. package/dist/cli/config.d.ts.map +1 -0
  8. package/dist/cli/config.js +207 -0
  9. package/dist/cli/config.js.map +1 -0
  10. package/dist/cli/expose.d.ts.map +1 -1
  11. package/dist/cli/expose.js +20 -13
  12. package/dist/cli/expose.js.map +1 -1
  13. package/dist/cli/federation.d.ts.map +1 -1
  14. package/dist/cli/federation.js +182 -6
  15. package/dist/cli/federation.js.map +1 -1
  16. package/dist/cli/setup.d.ts +19 -0
  17. package/dist/cli/setup.d.ts.map +1 -1
  18. package/dist/cli/setup.js +507 -32
  19. package/dist/cli/setup.js.map +1 -1
  20. package/dist/cli.js +348 -32
  21. package/dist/cli.js.map +1 -1
  22. package/dist/daemon/agent-comms.d.ts.map +1 -1
  23. package/dist/daemon/agent-comms.js +14 -9
  24. package/dist/daemon/agent-comms.js.map +1 -1
  25. package/dist/daemon/intent-registry.d.ts.map +1 -1
  26. package/dist/daemon/intent-registry.js +7 -4
  27. package/dist/daemon/intent-registry.js.map +1 -1
  28. package/dist/daemon/keypair.d.ts.map +1 -1
  29. package/dist/daemon/keypair.js +34 -13
  30. package/dist/daemon/keypair.js.map +1 -1
  31. package/dist/daemon/message-handler.d.ts.map +1 -1
  32. package/dist/daemon/message-handler.js +7 -0
  33. package/dist/daemon/message-handler.js.map +1 -1
  34. package/dist/daemon/notify.d.ts +19 -0
  35. package/dist/daemon/notify.d.ts.map +1 -1
  36. package/dist/daemon/notify.js +329 -73
  37. package/dist/daemon/notify.js.map +1 -1
  38. package/dist/daemon/openclaw-bridge.d.ts +34 -0
  39. package/dist/daemon/openclaw-bridge.d.ts.map +1 -0
  40. package/dist/daemon/openclaw-bridge.js +261 -0
  41. package/dist/daemon/openclaw-bridge.js.map +1 -0
  42. package/dist/daemon/peers.d.ts +8 -0
  43. package/dist/daemon/peers.d.ts.map +1 -1
  44. package/dist/daemon/peers.js +48 -14
  45. package/dist/daemon/peers.js.map +1 -1
  46. package/dist/daemon/projects.d.ts.map +1 -1
  47. package/dist/daemon/projects.js +7 -4
  48. package/dist/daemon/projects.js.map +1 -1
  49. package/dist/daemon/server.d.ts +16 -0
  50. package/dist/daemon/server.d.ts.map +1 -1
  51. package/dist/daemon/server.js +147 -46
  52. package/dist/daemon/server.js.map +1 -1
  53. package/dist/shared/config.d.ts +52 -1
  54. package/dist/shared/config.d.ts.map +1 -1
  55. package/dist/shared/config.js +18 -11
  56. package/dist/shared/config.js.map +1 -1
  57. package/dist/shared/framework-detection.d.ts +31 -0
  58. package/dist/shared/framework-detection.d.ts.map +1 -0
  59. package/dist/shared/framework-detection.js +91 -0
  60. package/dist/shared/framework-detection.js.map +1 -0
  61. package/dist/shared/help.d.ts +5 -0
  62. package/dist/shared/help.d.ts.map +1 -0
  63. package/dist/shared/help.js +280 -0
  64. package/dist/shared/help.js.map +1 -0
  65. package/dist/shared/meta-config.d.ts +44 -0
  66. package/dist/shared/meta-config.d.ts.map +1 -0
  67. package/dist/shared/meta-config.js +89 -0
  68. package/dist/shared/meta-config.js.map +1 -0
  69. package/dist/shared/migration.d.ts +57 -0
  70. package/dist/shared/migration.d.ts.map +1 -0
  71. package/dist/shared/migration.js +255 -0
  72. package/dist/shared/migration.js.map +1 -0
  73. package/docs/CLI-REFERENCE.md +1360 -0
  74. package/docs/GETTING-STARTED.md +942 -0
  75. package/docs/MIGRATION.md +202 -0
  76. package/docs/MULTI-FRAMEWORK-DEMO.md +352 -0
  77. package/docs/MULTI-FRAMEWORK-DESIGN.md +378 -0
  78. package/docs/MULTI-FRAMEWORK-IMPL.md +197 -0
  79. package/docs/case-studies/CRASH_RESOLUTION_20260407.md +190 -0
  80. package/docs/case-studies/OpenClaw_Hermes_Status_Report_20260407.md +142 -0
  81. package/docs/case-studies/OpenClaw_Stability_Fix_Summary.md +209 -0
  82. package/docs/case-studies/README.md +40 -0
  83. package/docs/case-studies/crash_observations.md +250 -0
  84. package/docs/federation-flow.md +21 -31
  85. package/docs/hermes-implementation-checklist.md +4 -0
  86. package/docs/rendezvous.md +13 -14
  87. package/package.json +9 -3
  88. package/scripts/completion.bash +123 -0
  89. package/scripts/completion.zsh +372 -0
  90. package/scripts/test-migration-execute.js +74 -0
  91. package/scripts/test-migration.js +42 -0
  92. package/skills/ogp/SKILL.md +197 -64
  93. package/skills/ogp-agent-comms/SKILL.md +107 -41
  94. package/skills/ogp-expose/SKILL.md +84 -21
  95. package/skills/ogp-project/SKILL.md +66 -58
@@ -0,0 +1,255 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { saveMetaConfig } from './meta-config.js';
5
+ /**
6
+ * Determine framework type from OGP config
7
+ */
8
+ function determineFrameworkType(config) {
9
+ // Explicit platform field takes precedence
10
+ if (config.platform === 'hermes') {
11
+ return 'hermes';
12
+ }
13
+ if (config.platform === 'openclaw') {
14
+ return 'openclaw';
15
+ }
16
+ // Heuristics: check for framework-specific fields
17
+ if (config.hermesWebhookUrl || config.hermesWebhookSecret) {
18
+ return 'hermes';
19
+ }
20
+ if (config.openclawUrl && config.openclawToken) {
21
+ return 'openclaw';
22
+ }
23
+ // Default to standalone if we can't determine
24
+ return 'standalone';
25
+ }
26
+ /**
27
+ * Check if a directory exists and contains a valid OGP config
28
+ */
29
+ function checkInstallation(dirPath) {
30
+ const expandedPath = dirPath.replace(/^~/, os.homedir());
31
+ const configPath = path.join(expandedPath, 'config.json');
32
+ if (!fs.existsSync(expandedPath) || !fs.existsSync(configPath)) {
33
+ return null;
34
+ }
35
+ try {
36
+ const data = fs.readFileSync(configPath, 'utf-8');
37
+ const config = JSON.parse(data);
38
+ const framework = determineFrameworkType(config);
39
+ return {
40
+ path: expandedPath,
41
+ framework,
42
+ config,
43
+ };
44
+ }
45
+ catch (error) {
46
+ // Invalid or corrupted config
47
+ return null;
48
+ }
49
+ }
50
+ /**
51
+ * Detect all existing OGP installations
52
+ * Returns a migration plan describing what needs to be done
53
+ */
54
+ export function detectExistingInstallations() {
55
+ const plan = {
56
+ needed: false,
57
+ existingInstalls: [],
58
+ actions: [],
59
+ };
60
+ // Check for meta config - if it exists, no migration needed
61
+ const metaConfigPath = path.join(os.homedir(), '.ogp-meta', 'config.json');
62
+ if (fs.existsSync(metaConfigPath)) {
63
+ return plan; // Already migrated
64
+ }
65
+ // Check for legacy installations
66
+ const ogpInstall = checkInstallation('~/.ogp');
67
+ const hermesInstall = checkInstallation('~/.ogp-hermes');
68
+ if (ogpInstall) {
69
+ plan.existingInstalls.push(ogpInstall);
70
+ }
71
+ if (hermesInstall) {
72
+ plan.existingInstalls.push(hermesInstall);
73
+ }
74
+ // No existing installations found
75
+ if (plan.existingInstalls.length === 0) {
76
+ return plan;
77
+ }
78
+ // Migration is needed
79
+ plan.needed = true;
80
+ // Build migration actions based on what we found
81
+ if (ogpInstall && hermesInstall) {
82
+ // Both exist - rename .ogp to .ogp-openclaw if it's an OpenClaw install
83
+ if (ogpInstall.framework === 'openclaw') {
84
+ plan.actions.push({
85
+ type: 'rename',
86
+ from: ogpInstall.path,
87
+ to: path.join(os.homedir(), '.ogp-openclaw'),
88
+ framework: 'openclaw',
89
+ description: 'Rename ~/.ogp to ~/.ogp-openclaw',
90
+ });
91
+ }
92
+ // .ogp-hermes stays as-is
93
+ plan.actions.push({
94
+ type: 'register',
95
+ framework: 'hermes',
96
+ description: 'Register Hermes installation at ~/.ogp-hermes',
97
+ });
98
+ plan.actions.push({
99
+ type: 'create-meta',
100
+ description: 'Create meta config with both frameworks',
101
+ });
102
+ }
103
+ else if (ogpInstall && !hermesInstall) {
104
+ // Only .ogp exists
105
+ if (ogpInstall.framework === 'openclaw') {
106
+ plan.actions.push({
107
+ type: 'rename',
108
+ from: ogpInstall.path,
109
+ to: path.join(os.homedir(), '.ogp-openclaw'),
110
+ framework: 'openclaw',
111
+ description: 'Rename ~/.ogp to ~/.ogp-openclaw',
112
+ });
113
+ }
114
+ else if (ogpInstall.framework === 'standalone') {
115
+ // Keep as ~/.ogp for standalone
116
+ plan.actions.push({
117
+ type: 'register',
118
+ framework: 'standalone',
119
+ description: 'Register standalone installation at ~/.ogp',
120
+ });
121
+ }
122
+ plan.actions.push({
123
+ type: 'create-meta',
124
+ description: 'Create meta config',
125
+ });
126
+ }
127
+ else if (!ogpInstall && hermesInstall) {
128
+ // Only .ogp-hermes exists
129
+ plan.actions.push({
130
+ type: 'register',
131
+ framework: 'hermes',
132
+ description: 'Register Hermes installation at ~/.ogp-hermes',
133
+ });
134
+ plan.actions.push({
135
+ type: 'create-meta',
136
+ description: 'Create meta config with Hermes framework',
137
+ });
138
+ }
139
+ return plan;
140
+ }
141
+ /**
142
+ * Execute the migration plan
143
+ * This will:
144
+ * - Rename directories as needed
145
+ * - Create the meta config
146
+ * - Register all frameworks
147
+ */
148
+ export async function executeMigration(plan) {
149
+ if (!plan.needed) {
150
+ return; // Nothing to do
151
+ }
152
+ const metaConfig = {
153
+ version: '1.0.0',
154
+ frameworks: [],
155
+ };
156
+ // Track renamed installations
157
+ const renamedPaths = new Map();
158
+ // Step 1: Execute rename actions
159
+ for (const action of plan.actions) {
160
+ if (action.type === 'rename' && action.from && action.to) {
161
+ if (fs.existsSync(action.to)) {
162
+ throw new Error(`Cannot rename ${action.from} to ${action.to}: target already exists`);
163
+ }
164
+ // Create backup of original location
165
+ const backupPath = `${action.from}.backup-${Date.now()}`;
166
+ fs.cpSync(action.from, backupPath, { recursive: true });
167
+ try {
168
+ fs.renameSync(action.from, action.to);
169
+ renamedPaths.set(action.from, action.to);
170
+ console.log(`✓ Renamed ${action.from} to ${action.to}`);
171
+ console.log(` Backup created at ${backupPath}`);
172
+ }
173
+ catch (error) {
174
+ // Restore from backup on error
175
+ if (fs.existsSync(backupPath)) {
176
+ fs.cpSync(backupPath, action.from, { recursive: true });
177
+ }
178
+ throw new Error(`Failed to rename ${action.from} to ${action.to}: ${error}`);
179
+ }
180
+ }
181
+ }
182
+ // Step 2: Register frameworks
183
+ for (const install of plan.existingInstalls) {
184
+ let configDir = install.path;
185
+ // If this path was renamed, use the new path
186
+ if (renamedPaths.has(install.path)) {
187
+ configDir = renamedPaths.get(install.path);
188
+ }
189
+ // Determine framework ID based on type and path
190
+ let frameworkId;
191
+ let frameworkName;
192
+ if (install.framework === 'openclaw') {
193
+ frameworkId = 'openclaw';
194
+ frameworkName = 'OpenClaw';
195
+ }
196
+ else if (install.framework === 'hermes') {
197
+ frameworkId = 'hermes';
198
+ frameworkName = 'Hermes';
199
+ }
200
+ else {
201
+ frameworkId = 'standalone';
202
+ frameworkName = 'Standalone OGP';
203
+ }
204
+ const framework = {
205
+ id: frameworkId,
206
+ name: frameworkName,
207
+ enabled: true,
208
+ configDir,
209
+ daemonPort: install.config.daemonPort,
210
+ gatewayUrl: install.config.gatewayUrl,
211
+ displayName: install.config.displayName,
212
+ platform: install.config.platform,
213
+ };
214
+ metaConfig.frameworks.push(framework);
215
+ console.log(`✓ Registered ${frameworkName} at ${configDir}`);
216
+ }
217
+ // Step 3: Set default framework
218
+ // Prefer openclaw, then hermes, then first available
219
+ const openclawFramework = metaConfig.frameworks.find(f => f.id === 'openclaw');
220
+ const hermesFramework = metaConfig.frameworks.find(f => f.id === 'hermes');
221
+ if (openclawFramework) {
222
+ metaConfig.default = 'openclaw';
223
+ }
224
+ else if (hermesFramework) {
225
+ metaConfig.default = 'hermes';
226
+ }
227
+ else if (metaConfig.frameworks.length > 0) {
228
+ metaConfig.default = metaConfig.frameworks[0].id;
229
+ }
230
+ // Step 4: Save meta config
231
+ saveMetaConfig(metaConfig);
232
+ console.log('✓ Created meta configuration');
233
+ console.log(` Default framework: ${metaConfig.default}`);
234
+ }
235
+ /**
236
+ * Check if migration is needed and return a summary
237
+ */
238
+ export function checkMigrationStatus() {
239
+ const plan = detectExistingInstallations();
240
+ if (!plan.needed) {
241
+ return {
242
+ migrationNeeded: false,
243
+ summary: 'No migration needed',
244
+ };
245
+ }
246
+ const installCount = plan.existingInstalls.length;
247
+ const installTypes = plan.existingInstalls.map(i => i.framework).join(', ');
248
+ const summary = `Found ${installCount} existing installation(s): ${installTypes}`;
249
+ return {
250
+ migrationNeeded: true,
251
+ summary,
252
+ plan,
253
+ };
254
+ }
255
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/shared/migration.ts"],"names":[],"mappings":"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"}