@dp-pcs/ogp 0.2.0 → 0.2.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.
- package/dist/cli/intent-registry.d.ts +9 -0
- package/dist/cli/intent-registry.d.ts.map +1 -0
- package/dist/cli/intent-registry.js +101 -0
- package/dist/cli/intent-registry.js.map +1 -0
- package/dist/cli/project.d.ts +59 -0
- package/dist/cli/project.d.ts.map +1 -0
- package/dist/cli/project.js +379 -0
- package/dist/cli/project.js.map +1 -0
- package/dist/cli.js +149 -3
- package/dist/cli.js.map +1 -1
- package/dist/daemon/intent-registry.d.ts +2 -0
- package/dist/daemon/intent-registry.d.ts.map +1 -1
- package/dist/daemon/intent-registry.js +66 -1
- package/dist/daemon/intent-registry.js.map +1 -1
- package/dist/daemon/message-handler.d.ts +1 -0
- package/dist/daemon/message-handler.d.ts.map +1 -1
- package/dist/daemon/message-handler.js +428 -2
- package/dist/daemon/message-handler.js.map +1 -1
- package/dist/daemon/projects.d.ts +81 -0
- package/dist/daemon/projects.d.ts.map +1 -0
- package/dist/daemon/projects.js +296 -0
- package/dist/daemon/projects.js.map +1 -0
- package/dist/daemon/server.d.ts +3 -2
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +91 -20
- package/dist/daemon/server.js.map +1 -1
- package/package.json +1 -1
- package/scripts/install-skills.js +77 -10
- package/skills/ogp/SKILL.md +13 -3
- package/skills/ogp-agent-comms/SKILL.md +1 -1
- package/skills/ogp-expose/SKILL.md +30 -4
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface RegisterOptions {
|
|
2
|
+
script?: string;
|
|
3
|
+
description: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function registerNewIntent(name: string, options: RegisterOptions): void;
|
|
6
|
+
export declare function listRegisteredIntents(): void;
|
|
7
|
+
export declare function removeIntent(name: string): void;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=intent-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-registry.d.ts","sourceRoot":"","sources":["../../src/cli/intent-registry.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CA4D9E;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAwB5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA0B/C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { registerIntent, removeIntent as removeIntentFromRegistry, listIntents, getIntent } from '../daemon/intent-registry.js';
|
|
4
|
+
export function registerNewIntent(name, options) {
|
|
5
|
+
// Validation
|
|
6
|
+
if (!name || name.trim() === '') {
|
|
7
|
+
console.error('Error: Intent name is required');
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
if (!options.description || options.description.trim() === '') {
|
|
11
|
+
console.error('Error: Description is required');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
if (options.script && !fs.existsSync(options.script)) {
|
|
15
|
+
console.error(`Error: Script file not found: ${options.script}`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
if (options.script && !fs.statSync(options.script).isFile()) {
|
|
19
|
+
console.error(`Error: Script path must be a file: ${options.script}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
// Make script path absolute if provided
|
|
23
|
+
const scriptPath = options.script ? path.resolve(options.script) : undefined;
|
|
24
|
+
// Check if script is executable (if provided)
|
|
25
|
+
if (scriptPath) {
|
|
26
|
+
try {
|
|
27
|
+
fs.accessSync(scriptPath, fs.constants.X_OK);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
console.error(`Error: Script is not executable: ${scriptPath}`);
|
|
31
|
+
console.error('Run: chmod +x ' + scriptPath);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Check if intent already exists
|
|
36
|
+
const existing = getIntent(name);
|
|
37
|
+
if (existing) {
|
|
38
|
+
console.log(`Intent "${name}" already exists. Updating...`);
|
|
39
|
+
}
|
|
40
|
+
const intent = {
|
|
41
|
+
name,
|
|
42
|
+
description: options.description,
|
|
43
|
+
handler: scriptPath
|
|
44
|
+
};
|
|
45
|
+
registerIntent(intent);
|
|
46
|
+
if (existing) {
|
|
47
|
+
console.log(`✓ Intent updated: ${name}`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(`✓ Intent registered: ${name}`);
|
|
51
|
+
}
|
|
52
|
+
console.log(` Description: ${options.description}`);
|
|
53
|
+
if (scriptPath) {
|
|
54
|
+
console.log(` Script: ${scriptPath}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function listRegisteredIntents() {
|
|
58
|
+
const intents = listIntents();
|
|
59
|
+
if (intents.length === 0) {
|
|
60
|
+
console.log('No intents registered.');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
console.log('\nREGISTERED INTENTS:\n');
|
|
64
|
+
intents.forEach(intent => {
|
|
65
|
+
console.log(` ${intent.name}`);
|
|
66
|
+
console.log(` Description: ${intent.description}`);
|
|
67
|
+
if (intent.handler) {
|
|
68
|
+
console.log(` Handler: ${intent.handler}`);
|
|
69
|
+
}
|
|
70
|
+
if (intent.schema) {
|
|
71
|
+
console.log(` Schema: ${JSON.stringify(intent.schema, null, 6).split('\n').map(line => ' ' + line).join('\n').trim()}`);
|
|
72
|
+
}
|
|
73
|
+
console.log('');
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export function removeIntent(name) {
|
|
77
|
+
if (!name || name.trim() === '') {
|
|
78
|
+
console.error('Error: Intent name is required');
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
const intent = getIntent(name);
|
|
82
|
+
if (!intent) {
|
|
83
|
+
console.error(`Error: Intent "${name}" not found`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
// Prevent removing default intents
|
|
87
|
+
const defaultIntents = ['message', 'task-request', 'status-update', 'agent-comms'];
|
|
88
|
+
if (defaultIntents.includes(name)) {
|
|
89
|
+
console.error(`Error: Cannot remove built-in intent: ${name}`);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
const success = removeIntentFromRegistry(name);
|
|
93
|
+
if (success) {
|
|
94
|
+
console.log(`✓ Intent removed: ${name}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.error(`Error: Failed to remove intent: ${name}`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=intent-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-registry.js","sourceRoot":"","sources":["../../src/cli/intent-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
interface ProjectJoinOptions {
|
|
2
|
+
description?: string;
|
|
3
|
+
create?: boolean;
|
|
4
|
+
}
|
|
5
|
+
interface ProjectContributeOptions {
|
|
6
|
+
metadata?: string;
|
|
7
|
+
}
|
|
8
|
+
interface ProjectQueryOptions {
|
|
9
|
+
topic?: string;
|
|
10
|
+
author?: string;
|
|
11
|
+
limit?: number;
|
|
12
|
+
search?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a new project locally
|
|
16
|
+
*/
|
|
17
|
+
export declare function projectCreate(projectId: string, projectName: string, options?: {
|
|
18
|
+
description?: string;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Join an existing project (local or request federation)
|
|
22
|
+
*/
|
|
23
|
+
export declare function projectJoin(projectId: string, projectName?: string, options?: ProjectJoinOptions): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* List all projects
|
|
26
|
+
*/
|
|
27
|
+
export declare function projectList(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Contribute to a project topic
|
|
30
|
+
*/
|
|
31
|
+
export declare function projectContribute(projectId: string, topic: string, summary: string, options?: ProjectContributeOptions): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Query project contributions
|
|
34
|
+
*/
|
|
35
|
+
export declare function projectQuery(projectId: string, options?: ProjectQueryOptions): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Get project status overview
|
|
38
|
+
*/
|
|
39
|
+
export declare function projectStatus(projectId: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Request to join a project from a peer
|
|
42
|
+
*/
|
|
43
|
+
export declare function projectRequestJoin(peerId: string, projectId: string, projectName: string, options?: {
|
|
44
|
+
description?: string;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Send a project contribution to peers
|
|
48
|
+
*/
|
|
49
|
+
export declare function projectSendContribution(peerId: string, projectId: string, topic: string, summary: string, options?: ProjectContributeOptions): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Query a peer's project contributions
|
|
52
|
+
*/
|
|
53
|
+
export declare function projectQueryPeer(peerId: string, projectId: string, options?: Omit<ProjectQueryOptions, 'search'>): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Request project status from a peer
|
|
56
|
+
*/
|
|
57
|
+
export declare function projectStatusPeer(peerId: string, projectId: string): Promise<void>;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"AAmBA,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,mBAAmB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBjD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CA2Df;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCpE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAM,GAChD,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA6Bf"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { createProject, addProject, getProject, listProjects, joinProject, isProjectMember, contributeToProject, getTopicContributions, getAuthorContributions, searchContributions, getProjectStatus, ensureProjectTopic } from '../daemon/projects.js';
|
|
2
|
+
import { loadConfig } from '../shared/config.js';
|
|
3
|
+
import { getPeer } from '../daemon/peers.js';
|
|
4
|
+
import { federationSend } from './federation.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a new project locally
|
|
7
|
+
*/
|
|
8
|
+
export async function projectCreate(projectId, projectName, options = {}) {
|
|
9
|
+
// Check if project already exists
|
|
10
|
+
const existing = getProject(projectId);
|
|
11
|
+
if (existing) {
|
|
12
|
+
console.error(`Error: Project '${projectId}' already exists`);
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
// Create the project
|
|
16
|
+
const project = createProject(projectId, projectName, options.description);
|
|
17
|
+
// Add current user as first member
|
|
18
|
+
const config = loadConfig();
|
|
19
|
+
if (config?.email) {
|
|
20
|
+
project.members.push(config.email);
|
|
21
|
+
}
|
|
22
|
+
addProject(project);
|
|
23
|
+
console.log(`✓ Created project: ${projectName} (${projectId})`);
|
|
24
|
+
if (options.description) {
|
|
25
|
+
console.log(` Description: ${options.description}`);
|
|
26
|
+
}
|
|
27
|
+
console.log(` Members: ${project.members.join(', ')}`);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Join an existing project (local or request federation)
|
|
31
|
+
*/
|
|
32
|
+
export async function projectJoin(projectId, projectName, options = {}) {
|
|
33
|
+
const config = loadConfig();
|
|
34
|
+
if (!config) {
|
|
35
|
+
console.error('Error: Not configured. Run "ogp setup" first.');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Check if project exists locally
|
|
39
|
+
let project = getProject(projectId);
|
|
40
|
+
if (!project && options.create) {
|
|
41
|
+
// Create project locally if --create flag is used
|
|
42
|
+
if (!projectName) {
|
|
43
|
+
console.error('Error: --create requires a project name');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
project = createProject(projectId, projectName, options.description);
|
|
47
|
+
project.members.push(config.email);
|
|
48
|
+
addProject(project);
|
|
49
|
+
console.log(`✓ Created and joined project: ${projectName} (${projectId})`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!project) {
|
|
53
|
+
console.error(`Error: Project '${projectId}' not found locally.`);
|
|
54
|
+
console.log('Use --create to create a new project, or request to join from a peer.');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
// Check if already a member
|
|
58
|
+
if (isProjectMember(projectId, config.email)) {
|
|
59
|
+
console.log(`You are already a member of project '${project.name}'`);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Join the project
|
|
63
|
+
const success = joinProject(projectId, config.email);
|
|
64
|
+
if (success) {
|
|
65
|
+
console.log(`✓ Joined project: ${project.name} (${projectId})`);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
console.error('Error: Failed to join project');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* List all projects
|
|
74
|
+
*/
|
|
75
|
+
export async function projectList() {
|
|
76
|
+
const projects = listProjects();
|
|
77
|
+
if (projects.length === 0) {
|
|
78
|
+
console.log('No projects found');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.log(`Found ${projects.length} project(s):\n`);
|
|
82
|
+
for (const project of projects) {
|
|
83
|
+
console.log(`${project.name} (${project.id})`);
|
|
84
|
+
if (project.description) {
|
|
85
|
+
console.log(` Description: ${project.description}`);
|
|
86
|
+
}
|
|
87
|
+
console.log(` Members: ${project.members.length}`);
|
|
88
|
+
console.log(` Topics: ${project.topics.length}`);
|
|
89
|
+
console.log(` Created: ${new Date(project.createdAt).toLocaleString()}`);
|
|
90
|
+
console.log(` Updated: ${new Date(project.updatedAt).toLocaleString()}`);
|
|
91
|
+
console.log();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Contribute to a project topic
|
|
96
|
+
*/
|
|
97
|
+
export async function projectContribute(projectId, topic, summary, options = {}) {
|
|
98
|
+
const config = loadConfig();
|
|
99
|
+
if (!config) {
|
|
100
|
+
console.error('Error: Not configured. Run "ogp setup" first.');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
const project = getProject(projectId);
|
|
104
|
+
if (!project) {
|
|
105
|
+
console.error(`Error: Project '${projectId}' not found`);
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
if (!isProjectMember(projectId, config.email)) {
|
|
109
|
+
console.error(`Error: You are not a member of project '${project.name}'`);
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
// Parse metadata if provided
|
|
113
|
+
let metadata;
|
|
114
|
+
if (options.metadata) {
|
|
115
|
+
try {
|
|
116
|
+
metadata = JSON.parse(options.metadata);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error('Error: Invalid JSON in --metadata');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Ensure the topic exists
|
|
124
|
+
ensureProjectTopic(projectId, topic);
|
|
125
|
+
// Add the contribution
|
|
126
|
+
const contributionId = contributeToProject(projectId, topic, config.email, summary, metadata);
|
|
127
|
+
if (contributionId) {
|
|
128
|
+
console.log(`✓ Contributed to project '${project.name}' topic '${topic}'`);
|
|
129
|
+
console.log(` Summary: ${summary}`);
|
|
130
|
+
if (metadata) {
|
|
131
|
+
console.log(` Metadata: ${JSON.stringify(metadata, null, 2)}`);
|
|
132
|
+
}
|
|
133
|
+
console.log(` Contribution ID: ${contributionId}`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.error('Error: Failed to add contribution');
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Query project contributions
|
|
142
|
+
*/
|
|
143
|
+
export async function projectQuery(projectId, options = {}) {
|
|
144
|
+
const project = getProject(projectId);
|
|
145
|
+
if (!project) {
|
|
146
|
+
console.error(`Error: Project '${projectId}' not found`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
const limit = options.limit || 20;
|
|
150
|
+
let contributions;
|
|
151
|
+
if (options.search) {
|
|
152
|
+
// Search by text
|
|
153
|
+
contributions = searchContributions(projectId, options.search, limit);
|
|
154
|
+
console.log(`Search results for "${options.search}" in project '${project.name}':`);
|
|
155
|
+
}
|
|
156
|
+
else if (options.topic) {
|
|
157
|
+
// Query by topic
|
|
158
|
+
contributions = getTopicContributions(projectId, options.topic, limit);
|
|
159
|
+
console.log(`Contributions to topic '${options.topic}' in project '${project.name}':`);
|
|
160
|
+
}
|
|
161
|
+
else if (options.author) {
|
|
162
|
+
// Query by author
|
|
163
|
+
contributions = getAuthorContributions(projectId, options.author, limit);
|
|
164
|
+
console.log(`Contributions by '${options.author}' in project '${project.name}':`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Get all recent contributions - handle both data formats
|
|
168
|
+
contributions = [];
|
|
169
|
+
// Check if this project uses the new nested format (topics as objects)
|
|
170
|
+
if (project.topics.length > 0 && typeof project.topics[0] === 'object') {
|
|
171
|
+
// New nested format: topics are objects with contributions
|
|
172
|
+
for (const topic of project.topics) {
|
|
173
|
+
contributions.push(...topic.contributions);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Old flat format: contributions are in flat array
|
|
178
|
+
contributions = project.contributions || [];
|
|
179
|
+
}
|
|
180
|
+
contributions.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
181
|
+
contributions = contributions.slice(0, limit);
|
|
182
|
+
console.log(`Recent contributions in project '${project.name}':`);
|
|
183
|
+
}
|
|
184
|
+
if (contributions.length === 0) {
|
|
185
|
+
console.log('No contributions found');
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
console.log();
|
|
189
|
+
for (const contrib of contributions) {
|
|
190
|
+
console.log(`[${new Date(contrib.timestamp).toLocaleString()}] ${contrib.authorId}`);
|
|
191
|
+
console.log(` Topic: ${contrib.topic}`);
|
|
192
|
+
console.log(` Summary: ${contrib.summary}`);
|
|
193
|
+
if (contrib.metadata) {
|
|
194
|
+
console.log(` Metadata: ${JSON.stringify(contrib.metadata, null, 2)}`);
|
|
195
|
+
}
|
|
196
|
+
console.log();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get project status overview
|
|
201
|
+
*/
|
|
202
|
+
export async function projectStatus(projectId) {
|
|
203
|
+
const statusData = getProjectStatus(projectId);
|
|
204
|
+
if (!statusData) {
|
|
205
|
+
console.error(`Error: Project '${projectId}' not found`);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
const { project, topics } = statusData;
|
|
209
|
+
console.log(`Project: ${project.name} (${project.id})`);
|
|
210
|
+
if (project.description) {
|
|
211
|
+
console.log(`Description: ${project.description}`);
|
|
212
|
+
}
|
|
213
|
+
console.log(`Members: ${project.members.join(', ')}`);
|
|
214
|
+
console.log(`Created: ${new Date(project.createdAt).toLocaleString()}`);
|
|
215
|
+
console.log(`Updated: ${new Date(project.updatedAt).toLocaleString()}`);
|
|
216
|
+
console.log();
|
|
217
|
+
if (topics.length === 0) {
|
|
218
|
+
console.log('No topics found in this project');
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
console.log(`Topics (${topics.length}):`);
|
|
222
|
+
console.log();
|
|
223
|
+
for (const topic of topics) {
|
|
224
|
+
console.log(`${topic.name}`);
|
|
225
|
+
if (topic.description) {
|
|
226
|
+
console.log(` Description: ${topic.description}`);
|
|
227
|
+
}
|
|
228
|
+
console.log(` Contributions: ${topic.contributionCount}`);
|
|
229
|
+
console.log(` Contributors: ${topic.contributors.join(', ')}`);
|
|
230
|
+
if (topic.lastContribution) {
|
|
231
|
+
console.log(` Last activity: ${new Date(topic.lastContribution.timestamp).toLocaleString()}`);
|
|
232
|
+
console.log(` by ${topic.lastContribution.authorId}: ${topic.lastContribution.summary}`);
|
|
233
|
+
}
|
|
234
|
+
console.log();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Request to join a project from a peer
|
|
239
|
+
*/
|
|
240
|
+
export async function projectRequestJoin(peerId, projectId, projectName, options = {}) {
|
|
241
|
+
const config = loadConfig();
|
|
242
|
+
if (!config) {
|
|
243
|
+
console.error('Error: Not configured. Run "ogp setup" first.');
|
|
244
|
+
process.exit(1);
|
|
245
|
+
}
|
|
246
|
+
const peer = getPeer(peerId);
|
|
247
|
+
if (!peer) {
|
|
248
|
+
console.error(`Error: Peer '${peerId}' not found`);
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
if (peer.status !== 'approved') {
|
|
252
|
+
console.error(`Error: Peer '${peerId}' is not approved for federation`);
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
const payload = {
|
|
256
|
+
projectId,
|
|
257
|
+
projectName,
|
|
258
|
+
...(options.description && { projectDescription: options.description })
|
|
259
|
+
};
|
|
260
|
+
console.log(`Requesting to join project '${projectName}' from peer '${peerId}'...`);
|
|
261
|
+
try {
|
|
262
|
+
await federationSend(peerId, 'project.join', JSON.stringify(payload));
|
|
263
|
+
console.log(`✓ Join request sent to peer '${peerId}'`);
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
console.error('Error sending join request:', err);
|
|
267
|
+
process.exit(1);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Send a project contribution to peers
|
|
272
|
+
*/
|
|
273
|
+
export async function projectSendContribution(peerId, projectId, topic, summary, options = {}) {
|
|
274
|
+
const config = loadConfig();
|
|
275
|
+
if (!config) {
|
|
276
|
+
console.error('Error: Not configured. Run "ogp setup" first.');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
const peer = getPeer(peerId);
|
|
280
|
+
if (!peer) {
|
|
281
|
+
console.error(`Error: Peer '${peerId}' not found`);
|
|
282
|
+
process.exit(1);
|
|
283
|
+
}
|
|
284
|
+
if (peer.status !== 'approved') {
|
|
285
|
+
console.error(`Error: Peer '${peerId}' is not approved for federation`);
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
// Parse metadata if provided
|
|
289
|
+
let metadata;
|
|
290
|
+
if (options.metadata) {
|
|
291
|
+
try {
|
|
292
|
+
metadata = JSON.parse(options.metadata);
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
console.error('Error: Invalid JSON in --metadata');
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const payload = {
|
|
300
|
+
projectId,
|
|
301
|
+
topic,
|
|
302
|
+
summary,
|
|
303
|
+
...(metadata && { metadata })
|
|
304
|
+
};
|
|
305
|
+
console.log(`Sending contribution to project '${projectId}' topic '${topic}' to peer '${peerId}'...`);
|
|
306
|
+
try {
|
|
307
|
+
await federationSend(peerId, 'project.contribute', JSON.stringify(payload));
|
|
308
|
+
console.log(`✓ Contribution sent to peer '${peerId}'`);
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
console.error('Error sending contribution:', err);
|
|
312
|
+
process.exit(1);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Query a peer's project contributions
|
|
317
|
+
*/
|
|
318
|
+
export async function projectQueryPeer(peerId, projectId, options = {}) {
|
|
319
|
+
const config = loadConfig();
|
|
320
|
+
if (!config) {
|
|
321
|
+
console.error('Error: Not configured. Run "ogp setup" first.');
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
const peer = getPeer(peerId);
|
|
325
|
+
if (!peer) {
|
|
326
|
+
console.error(`Error: Peer '${peerId}' not found`);
|
|
327
|
+
process.exit(1);
|
|
328
|
+
}
|
|
329
|
+
if (peer.status !== 'approved') {
|
|
330
|
+
console.error(`Error: Peer '${peerId}' is not approved for federation`);
|
|
331
|
+
process.exit(1);
|
|
332
|
+
}
|
|
333
|
+
const payload = { projectId };
|
|
334
|
+
if (options.topic)
|
|
335
|
+
payload.topic = options.topic;
|
|
336
|
+
if (options.author)
|
|
337
|
+
payload.authorId = options.author;
|
|
338
|
+
if (options.limit)
|
|
339
|
+
payload.limit = options.limit;
|
|
340
|
+
console.log(`Querying project '${projectId}' from peer '${peerId}'...`);
|
|
341
|
+
try {
|
|
342
|
+
await federationSend(peerId, 'project.query', JSON.stringify(payload));
|
|
343
|
+
console.log(`✓ Query sent to peer '${peerId}' - check for async response`);
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
console.error('Error sending query:', err);
|
|
347
|
+
process.exit(1);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Request project status from a peer
|
|
352
|
+
*/
|
|
353
|
+
export async function projectStatusPeer(peerId, projectId) {
|
|
354
|
+
const config = loadConfig();
|
|
355
|
+
if (!config) {
|
|
356
|
+
console.error('Error: Not configured. Run "ogp setup" first.');
|
|
357
|
+
process.exit(1);
|
|
358
|
+
}
|
|
359
|
+
const peer = getPeer(peerId);
|
|
360
|
+
if (!peer) {
|
|
361
|
+
console.error(`Error: Peer '${peerId}' not found`);
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
if (peer.status !== 'approved') {
|
|
365
|
+
console.error(`Error: Peer '${peerId}' is not approved for federation`);
|
|
366
|
+
process.exit(1);
|
|
367
|
+
}
|
|
368
|
+
const payload = { projectId };
|
|
369
|
+
console.log(`Requesting status for project '${projectId}' from peer '${peerId}'...`);
|
|
370
|
+
try {
|
|
371
|
+
await federationSend(peerId, 'project.status', JSON.stringify(payload));
|
|
372
|
+
console.log(`✓ Status request sent to peer '${peerId}' - check for async response`);
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
console.error('Error sending status request:', err);
|
|
376
|
+
process.exit(1);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"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"}
|