@groundnuty/macf 0.2.0-rc.0
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/.build-info.json +4 -0
- package/dist/cli/build-info.d.ts +38 -0
- package/dist/cli/build-info.d.ts.map +1 -0
- package/dist/cli/build-info.js +119 -0
- package/dist/cli/build-info.js.map +1 -0
- package/dist/cli/claude-sh.d.ts +42 -0
- package/dist/cli/claude-sh.d.ts.map +1 -0
- package/dist/cli/claude-sh.js +247 -0
- package/dist/cli/claude-sh.js.map +1 -0
- package/dist/cli/commands/cd.d.ts +6 -0
- package/dist/cli/commands/cd.d.ts.map +1 -0
- package/dist/cli/commands/cd.js +17 -0
- package/dist/cli/commands/cd.js.map +1 -0
- package/dist/cli/commands/certs.d.ts +33 -0
- package/dist/cli/commands/certs.d.ts.map +1 -0
- package/dist/cli/commands/certs.js +233 -0
- package/dist/cli/commands/certs.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +91 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +235 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +37 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +279 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +5 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +21 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/migrate-ca-key.d.ts +36 -0
- package/dist/cli/commands/migrate-ca-key.d.ts.map +1 -0
- package/dist/cli/commands/migrate-ca-key.js +92 -0
- package/dist/cli/commands/migrate-ca-key.js.map +1 -0
- package/dist/cli/commands/peers.d.ts +8 -0
- package/dist/cli/commands/peers.d.ts.map +1 -0
- package/dist/cli/commands/peers.js +45 -0
- package/dist/cli/commands/peers.js.map +1 -0
- package/dist/cli/commands/repo-init.d.ts +43 -0
- package/dist/cli/commands/repo-init.d.ts.map +1 -0
- package/dist/cli/commands/repo-init.js +304 -0
- package/dist/cli/commands/repo-init.js.map +1 -0
- package/dist/cli/commands/rules-refresh.d.ts +14 -0
- package/dist/cli/commands/rules-refresh.d.ts.map +1 -0
- package/dist/cli/commands/rules-refresh.js +67 -0
- package/dist/cli/commands/rules-refresh.js.map +1 -0
- package/dist/cli/commands/self-update.d.ts +14 -0
- package/dist/cli/commands/self-update.d.ts.map +1 -0
- package/dist/cli/commands/self-update.js +112 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/status.d.ts +9 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +90 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/update.d.ts +25 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +316 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/config.d.ts +103 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +224 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +245 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/plugin-fetcher.d.ts +20 -0
- package/dist/cli/plugin-fetcher.d.ts.map +1 -0
- package/dist/cli/plugin-fetcher.js +83 -0
- package/dist/cli/plugin-fetcher.js.map +1 -0
- package/dist/cli/prompt.d.ts +17 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +109 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/registry-helper.d.ts +11 -0
- package/dist/cli/registry-helper.d.ts.map +1 -0
- package/dist/cli/registry-helper.js +18 -0
- package/dist/cli/registry-helper.js.map +1 -0
- package/dist/cli/rules.d.ts +39 -0
- package/dist/cli/rules.d.ts.map +1 -0
- package/dist/cli/rules.js +112 -0
- package/dist/cli/rules.js.map +1 -0
- package/dist/cli/settings-writer.d.ts +97 -0
- package/dist/cli/settings-writer.d.ts.map +1 -0
- package/dist/cli/settings-writer.js +270 -0
- package/dist/cli/settings-writer.js.map +1 -0
- package/dist/cli/version-resolver.d.ts +73 -0
- package/dist/cli/version-resolver.d.ts.map +1 -0
- package/dist/cli/version-resolver.js +238 -0
- package/dist/cli/version-resolver.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/bin/macf-plugin-cli.d.ts +13 -0
- package/dist/plugin/bin/macf-plugin-cli.d.ts.map +1 -0
- package/dist/plugin/bin/macf-plugin-cli.js +127 -0
- package/dist/plugin/bin/macf-plugin-cli.js.map +1 -0
- package/dist/plugin/lib/format.d.ts +40 -0
- package/dist/plugin/lib/format.d.ts.map +1 -0
- package/dist/plugin/lib/format.js +137 -0
- package/dist/plugin/lib/format.js.map +1 -0
- package/dist/plugin/lib/health.d.ts +2 -0
- package/dist/plugin/lib/health.d.ts.map +1 -0
- package/dist/plugin/lib/health.js +6 -0
- package/dist/plugin/lib/health.js.map +1 -0
- package/dist/plugin/lib/index.d.ts +7 -0
- package/dist/plugin/lib/index.d.ts.map +1 -0
- package/dist/plugin/lib/index.js +5 -0
- package/dist/plugin/lib/index.js.map +1 -0
- package/dist/plugin/lib/registry.d.ts +18 -0
- package/dist/plugin/lib/registry.d.ts.map +1 -0
- package/dist/plugin/lib/registry.js +17 -0
- package/dist/plugin/lib/registry.js.map +1 -0
- package/dist/plugin/lib/work.d.ts +13 -0
- package/dist/plugin/lib/work.d.ts.map +1 -0
- package/dist/plugin/lib/work.js +27 -0
- package/dist/plugin/lib/work.js.map +1 -0
- package/package.json +43 -0
- package/plugin/rules/coordination.md +224 -0
- package/scripts/check-gh-token.sh +102 -0
- package/scripts/macf-gh-token.sh +130 -0
- package/scripts/macf-whoami.sh +51 -0
- package/scripts/tmux-send-to-claude.sh +51 -0
- package/scripts/write-build-info.mjs +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kEAAkE;AAClE,kEAAkE;AAClE,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAElC,sEAAsE;AACtE,OAAO,EACL,eAAe,EACf,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,KAAK,EACL,UAAU,EACV,SAAS,EACT,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAGzB,kEAAkE;AAClE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE9F,sEAAsE;AACtE,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MACF Plugin CLI — internal binary invoked by skills.
|
|
4
|
+
* NOT the `macf` npm CLI (P4). This runs INSIDE Claude Code sessions.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node macf-plugin-cli.js status
|
|
8
|
+
* node macf-plugin-cli.js peers
|
|
9
|
+
* node macf-plugin-cli.js ping <agent-name>
|
|
10
|
+
* node macf-plugin-cli.js issues
|
|
11
|
+
*/
|
|
12
|
+
import 'reflect-metadata';
|
|
13
|
+
//# sourceMappingURL=macf-plugin-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macf-plugin-cli.d.ts","sourceRoot":"","sources":["../../../src/plugin/bin/macf-plugin-cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MACF Plugin CLI — internal binary invoked by skills.
|
|
4
|
+
* NOT the `macf` npm CLI (P4). This runs INSIDE Claude Code sessions.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* node macf-plugin-cli.js status
|
|
8
|
+
* node macf-plugin-cli.js peers
|
|
9
|
+
* node macf-plugin-cli.js ping <agent-name>
|
|
10
|
+
* node macf-plugin-cli.js issues
|
|
11
|
+
*/
|
|
12
|
+
import 'reflect-metadata';
|
|
13
|
+
import { readFileSync } from 'node:fs';
|
|
14
|
+
import { formatDashboard, formatPeerTable, formatHealthDetail, formatIssues } from '../lib/format.js';
|
|
15
|
+
import { getOwnRegistration, listPeers } from '../lib/registry.js';
|
|
16
|
+
import { pingAgent } from '../lib/health.js';
|
|
17
|
+
import { checkIssues } from '../lib/work.js';
|
|
18
|
+
import { createRegistryFromConfig } from '@groundnuty/macf-core';
|
|
19
|
+
import { generateToken } from '@groundnuty/macf-core';
|
|
20
|
+
import { toVariableSegment } from '@groundnuty/macf-core';
|
|
21
|
+
const command = process.argv[2];
|
|
22
|
+
function getRegistryConfig() {
|
|
23
|
+
const repoEnv = process.env['MACF_REGISTRY_REPO'];
|
|
24
|
+
if (repoEnv) {
|
|
25
|
+
const parts = repoEnv.split('/');
|
|
26
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
27
|
+
return { type: 'repo', owner: parts[0], repo: parts[1] };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const orgEnv = process.env['MACF_REGISTRY_ORG'];
|
|
31
|
+
if (orgEnv)
|
|
32
|
+
return { type: 'org', org: orgEnv };
|
|
33
|
+
const userEnv = process.env['MACF_REGISTRY_USER'];
|
|
34
|
+
if (userEnv)
|
|
35
|
+
return { type: 'profile', user: userEnv };
|
|
36
|
+
// Default fallback
|
|
37
|
+
return { type: 'repo', owner: 'groundnuty', repo: 'macf' };
|
|
38
|
+
}
|
|
39
|
+
async function main() {
|
|
40
|
+
const agentName = process.env['MACF_AGENT_NAME'] ?? 'unknown';
|
|
41
|
+
const project = process.env['MACF_PROJECT'] ?? 'MACF';
|
|
42
|
+
const registryConfig = getRegistryConfig();
|
|
43
|
+
switch (command) {
|
|
44
|
+
case 'status': {
|
|
45
|
+
const token = await generateToken();
|
|
46
|
+
const registry = createRegistryFromConfig(registryConfig, project, token);
|
|
47
|
+
// Fetch own registration from the registry so the dashboard header
|
|
48
|
+
// reflects whether THIS agent is actually registered (see #84 —
|
|
49
|
+
// previously always "not registered" due to hardcoded null).
|
|
50
|
+
const [ownRegistration, peers] = await Promise.all([
|
|
51
|
+
getOwnRegistration(agentName, registry),
|
|
52
|
+
listPeers(registry),
|
|
53
|
+
]);
|
|
54
|
+
// Live-health self-ping tracked under #85 (macf-ping is a stub;
|
|
55
|
+
// wiring it up will let the dashboard show uptime/current_issue too).
|
|
56
|
+
console.log(formatDashboard(agentName, ownRegistration, null, peers.map(p => ({ name: p.name, health: null }))));
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case 'peers': {
|
|
60
|
+
const token = await generateToken();
|
|
61
|
+
const registry = createRegistryFromConfig(registryConfig, project, token);
|
|
62
|
+
const peers = await listPeers(registry);
|
|
63
|
+
console.log(formatPeerTable(peers.map(p => ({ ...p, health: null }))));
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case 'ping': {
|
|
67
|
+
// #85: invoke the canonical pingAgent over mTLS and format detailed
|
|
68
|
+
// health. Previously this was a placeholder that just printed a TODO.
|
|
69
|
+
const targetName = process.argv[3];
|
|
70
|
+
if (!targetName) {
|
|
71
|
+
console.error('Usage: macf-plugin-cli ping <agent-name>');
|
|
72
|
+
process.exitCode = 1;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const caCertPath = process.env['MACF_CA_CERT'];
|
|
76
|
+
const agentCertPath = process.env['MACF_AGENT_CERT'];
|
|
77
|
+
const agentKeyPath = process.env['MACF_AGENT_KEY'];
|
|
78
|
+
if (!caCertPath || !agentCertPath || !agentKeyPath) {
|
|
79
|
+
console.error('Error: MACF_CA_CERT / MACF_AGENT_CERT / MACF_AGENT_KEY must be set.\n' +
|
|
80
|
+
' These are set by claude.sh after `macf init`. Run /macf-ping from a macf workspace.');
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const token = await generateToken();
|
|
85
|
+
const registry = createRegistryFromConfig(registryConfig, project, token);
|
|
86
|
+
// Look up the target in the registry. Names in the registry are
|
|
87
|
+
// sanitized (uppercase, underscores), so match in that space.
|
|
88
|
+
const peers = await listPeers(registry);
|
|
89
|
+
const targetSanitized = toVariableSegment(targetName);
|
|
90
|
+
const target = peers.find(p => p.name === targetSanitized);
|
|
91
|
+
if (!target) {
|
|
92
|
+
console.error(`Error: agent '${targetName}' not found in registry`);
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const caCertPem = readFileSync(caCertPath, 'utf-8');
|
|
97
|
+
const health = await pingAgent({
|
|
98
|
+
host: target.info.host,
|
|
99
|
+
port: target.info.port,
|
|
100
|
+
caCertPem,
|
|
101
|
+
certPath: agentCertPath,
|
|
102
|
+
keyPath: agentKeyPath,
|
|
103
|
+
});
|
|
104
|
+
console.log(formatHealthDetail(targetName, target.info, health));
|
|
105
|
+
if (!health)
|
|
106
|
+
process.exitCode = 1;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case 'issues': {
|
|
110
|
+
const token = await generateToken();
|
|
111
|
+
const repo = process.env['MACF_REGISTRY_REPO'] ?? 'groundnuty/macf';
|
|
112
|
+
const label = process.env['MACF_AGENT_LABEL'] ?? 'code-agent';
|
|
113
|
+
const issues = await checkIssues({ repo, label, token });
|
|
114
|
+
console.log(formatIssues(issues));
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
default:
|
|
118
|
+
console.error(`Unknown command: ${command}`);
|
|
119
|
+
console.error('Available: status, peers, ping <name>, issues');
|
|
120
|
+
process.exitCode = 1;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
main().catch((err) => {
|
|
124
|
+
console.error(`Error: ${err.message}`);
|
|
125
|
+
process.exitCode = 1;
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=macf-plugin-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macf-plugin-cli.js","sourceRoot":"","sources":["../../../src/plugin/bin/macf-plugin-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { HealthResponse } from '@groundnuty/macf-core';
|
|
2
|
+
import type { OwnRegistration, PeerEntry } from './registry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Format a status dashboard for a single agent.
|
|
5
|
+
*
|
|
6
|
+
* Three header states, based on what we know about the caller's own
|
|
7
|
+
* agent (see #84 — previously this was always "Status: not registered"):
|
|
8
|
+
*
|
|
9
|
+
* - `ownHealth` set (via self-ping): full live details
|
|
10
|
+
* - `ownRegistration` set but no health: registration info from the
|
|
11
|
+
* registry (host:port, type, instance_id, started_at) — enough
|
|
12
|
+
* to confirm the agent IS registered even without mTLS self-ping
|
|
13
|
+
* - Neither: "not registered"
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatDashboard(agentName: string, ownRegistration: OwnRegistration | null, ownHealth: HealthResponse | null, peers: ReadonlyArray<{
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly health: HealthResponse | null;
|
|
18
|
+
}>): string;
|
|
19
|
+
/**
|
|
20
|
+
* Format a table of peers.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatPeerTable(peers: ReadonlyArray<{
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly info: PeerEntry['info'];
|
|
25
|
+
readonly health: HealthResponse | null;
|
|
26
|
+
}>): string;
|
|
27
|
+
/**
|
|
28
|
+
* Format a detailed view of a single agent's health (for `/macf-ping`).
|
|
29
|
+
* Covers the live-health case (cert present, ping succeeded) and the
|
|
30
|
+
* offline case (registration known, ping failed). See #85.
|
|
31
|
+
*/
|
|
32
|
+
export declare function formatHealthDetail(name: string, info: PeerEntry['info'], health: HealthResponse | null): string;
|
|
33
|
+
/**
|
|
34
|
+
* Format pending issues for display.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatIssues(issues: ReadonlyArray<{
|
|
37
|
+
readonly number: number;
|
|
38
|
+
readonly title: string;
|
|
39
|
+
}>): string;
|
|
40
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/plugin/lib/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAUhE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,eAAe,GAAG,IAAI,EACvC,SAAS,EAAE,cAAc,GAAG,IAAI,EAChC,KAAK,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CAAC,GACtF,MAAM,CAgDR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CAAC,GACxH,MAAM,CAqBR;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,cAAc,GAAG,IAAI,GAC5B,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GACzE,MAAM,CAUR"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
function formatUptime(seconds) {
|
|
2
|
+
if (seconds < 60)
|
|
3
|
+
return `${seconds}s`;
|
|
4
|
+
if (seconds < 3600)
|
|
5
|
+
return `${Math.floor(seconds / 60)}m`;
|
|
6
|
+
const h = Math.floor(seconds / 3600);
|
|
7
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
8
|
+
return m > 0 ? `${h}h${m}m` : `${h}h`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Format a status dashboard for a single agent.
|
|
12
|
+
*
|
|
13
|
+
* Three header states, based on what we know about the caller's own
|
|
14
|
+
* agent (see #84 — previously this was always "Status: not registered"):
|
|
15
|
+
*
|
|
16
|
+
* - `ownHealth` set (via self-ping): full live details
|
|
17
|
+
* - `ownRegistration` set but no health: registration info from the
|
|
18
|
+
* registry (host:port, type, instance_id, started_at) — enough
|
|
19
|
+
* to confirm the agent IS registered even without mTLS self-ping
|
|
20
|
+
* - Neither: "not registered"
|
|
21
|
+
*/
|
|
22
|
+
export function formatDashboard(agentName, ownRegistration, ownHealth, peers) {
|
|
23
|
+
const lines = [];
|
|
24
|
+
lines.push(`=== ${agentName} ===`);
|
|
25
|
+
lines.push('');
|
|
26
|
+
if (ownHealth) {
|
|
27
|
+
// Live self-ping succeeded — show full health details.
|
|
28
|
+
lines.push(`Status: ${ownHealth.status}`);
|
|
29
|
+
lines.push(`Type: ${ownHealth.type}`);
|
|
30
|
+
lines.push(`Uptime: ${formatUptime(ownHealth.uptime_seconds)}`);
|
|
31
|
+
lines.push(`Version: ${ownHealth.version}`);
|
|
32
|
+
if (ownHealth.current_issue) {
|
|
33
|
+
lines.push(`Working: issue #${ownHealth.current_issue}`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
lines.push(`Working: idle`);
|
|
37
|
+
}
|
|
38
|
+
if (ownHealth.last_notification) {
|
|
39
|
+
lines.push(`Last ping: ${ownHealth.last_notification}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (ownRegistration) {
|
|
43
|
+
// Registry entry present but no live health (either couldn't ping
|
|
44
|
+
// or pinging wasn't attempted). Show registration info as minimum
|
|
45
|
+
// useful signal.
|
|
46
|
+
lines.push(`Status: registered (no live health)`);
|
|
47
|
+
lines.push(`Type: ${ownRegistration.info.type}`);
|
|
48
|
+
lines.push(`Endpoint: ${ownRegistration.info.host}:${ownRegistration.info.port}`);
|
|
49
|
+
lines.push(`Instance: ${ownRegistration.info.instance_id}`);
|
|
50
|
+
lines.push(`Started: ${ownRegistration.info.started}`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
lines.push('Status: not registered');
|
|
54
|
+
}
|
|
55
|
+
if (peers.length > 0) {
|
|
56
|
+
lines.push('');
|
|
57
|
+
lines.push('Peers:');
|
|
58
|
+
for (const peer of peers) {
|
|
59
|
+
if (peer.name === agentName)
|
|
60
|
+
continue;
|
|
61
|
+
if (peer.health) {
|
|
62
|
+
const issue = peer.health.current_issue ? `#${peer.health.current_issue}` : 'idle';
|
|
63
|
+
lines.push(` ${peer.name.padEnd(20)} online ${formatUptime(peer.health.uptime_seconds).padEnd(8)} ${issue}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
lines.push(` ${peer.name.padEnd(20)} offline`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Format a table of peers.
|
|
74
|
+
*/
|
|
75
|
+
export function formatPeerTable(peers) {
|
|
76
|
+
const lines = [];
|
|
77
|
+
lines.push(`${'NAME'.padEnd(22)} ${'HOST:PORT'.padEnd(28)} ${'STATUS'.padEnd(10)} ${'UPTIME'.padEnd(8)} CURRENT`);
|
|
78
|
+
lines.push(`${'─'.repeat(22)} ${'─'.repeat(28)} ${'─'.repeat(10)} ${'─'.repeat(8)} ${'─'.repeat(12)}`);
|
|
79
|
+
for (const peer of peers) {
|
|
80
|
+
const endpoint = `${peer.info.host}:${peer.info.port}`;
|
|
81
|
+
if (peer.health) {
|
|
82
|
+
const issue = peer.health.current_issue ? `#${peer.health.current_issue}` : 'idle';
|
|
83
|
+
lines.push(`${peer.name.padEnd(22)} ${endpoint.padEnd(28)} ${'online'.padEnd(10)} ${formatUptime(peer.health.uptime_seconds).padEnd(8)} ${issue}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
lines.push(`${peer.name.padEnd(22)} ${endpoint.padEnd(28)} ${'offline'.padEnd(10)} ${'—'.padEnd(8)} —`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return lines.join('\n');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Format a detailed view of a single agent's health (for `/macf-ping`).
|
|
93
|
+
* Covers the live-health case (cert present, ping succeeded) and the
|
|
94
|
+
* offline case (registration known, ping failed). See #85.
|
|
95
|
+
*/
|
|
96
|
+
export function formatHealthDetail(name, info, health) {
|
|
97
|
+
const lines = [];
|
|
98
|
+
lines.push(`=== ${name} ===`);
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push(`Endpoint: ${info.host}:${info.port}`);
|
|
101
|
+
lines.push(`Type: ${info.type}`);
|
|
102
|
+
lines.push(`Instance: ${info.instance_id}`);
|
|
103
|
+
lines.push(`Started: ${info.started}`);
|
|
104
|
+
lines.push('');
|
|
105
|
+
if (health) {
|
|
106
|
+
lines.push(`Status: ${health.status}`);
|
|
107
|
+
lines.push(`Uptime: ${formatUptime(health.uptime_seconds)}`);
|
|
108
|
+
lines.push(`Version: ${health.version}`);
|
|
109
|
+
if (health.current_issue) {
|
|
110
|
+
lines.push(`Working: issue #${health.current_issue}`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
lines.push(`Working: idle`);
|
|
114
|
+
}
|
|
115
|
+
if (health.last_notification) {
|
|
116
|
+
lines.push(`Last ping: ${health.last_notification}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
lines.push('Status: offline (no response to /health ping)');
|
|
121
|
+
}
|
|
122
|
+
return lines.join('\n');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Format pending issues for display.
|
|
126
|
+
*/
|
|
127
|
+
export function formatIssues(issues) {
|
|
128
|
+
if (issues.length === 0) {
|
|
129
|
+
return 'No pending issues.';
|
|
130
|
+
}
|
|
131
|
+
const lines = [`${issues.length} pending issue(s):\n`];
|
|
132
|
+
for (const issue of issues) {
|
|
133
|
+
lines.push(` #${issue.number}: ${issue.title}`);
|
|
134
|
+
}
|
|
135
|
+
return lines.join('\n');
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/plugin/lib/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/plugin/lib/health.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// `pingAgent` is the plugin-facing name for the shared mTLS health
|
|
2
|
+
// ping. Implementation lives in `src/mtls-health-ping.ts` since it's
|
|
3
|
+
// shared with `src/cli/commands/status.ts` — see ultrareview finding
|
|
4
|
+
// A3 for the dedup rationale.
|
|
5
|
+
export { pingAgentHealth as pingAgent } from '@groundnuty/macf-core';
|
|
6
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/plugin/lib/health.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,qEAAqE;AACrE,qEAAqE;AACrE,8BAA8B;AAC9B,OAAO,EAAE,eAAe,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { getOwnRegistration, listPeers } from './registry.js';
|
|
2
|
+
export type { OwnRegistration, PeerEntry } from './registry.js';
|
|
3
|
+
export { pingAgent } from './health.js';
|
|
4
|
+
export { checkIssues } from './work.js';
|
|
5
|
+
export type { PendingIssue } from './work.js';
|
|
6
|
+
export { formatDashboard, formatPeerTable, formatIssues } from './format.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/plugin/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugin/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentInfo, Registry } from '@groundnuty/macf-core';
|
|
2
|
+
export interface OwnRegistration {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly info: AgentInfo;
|
|
5
|
+
}
|
|
6
|
+
export interface PeerEntry {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly info: AgentInfo;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get this agent's own registration from the registry.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getOwnRegistration(agentName: string, registry: Registry): Promise<OwnRegistration | null>;
|
|
14
|
+
/**
|
|
15
|
+
* List all registered peers (including self).
|
|
16
|
+
*/
|
|
17
|
+
export declare function listPeers(registry: Registry, prefix?: string): Promise<readonly PeerEntry[]>;
|
|
18
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/plugin/lib/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAIjC;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,QAAQ,EAClB,MAAM,GAAE,MAAW,GAClB,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAG/B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get this agent's own registration from the registry.
|
|
3
|
+
*/
|
|
4
|
+
export async function getOwnRegistration(agentName, registry) {
|
|
5
|
+
const info = await registry.get(agentName);
|
|
6
|
+
if (!info)
|
|
7
|
+
return null;
|
|
8
|
+
return { name: agentName, info };
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* List all registered peers (including self).
|
|
12
|
+
*/
|
|
13
|
+
export async function listPeers(registry, prefix = '') {
|
|
14
|
+
const entries = await registry.list(prefix);
|
|
15
|
+
return entries.map(e => ({ name: e.name, info: e.info }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/plugin/lib/registry.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,QAAkB;IAElB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAkB,EAClB,SAAiB,EAAE;IAEnB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface PendingIssue {
|
|
2
|
+
readonly number: number;
|
|
3
|
+
readonly title: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Check for pending GitHub issues assigned to this agent.
|
|
7
|
+
*/
|
|
8
|
+
export declare function checkIssues(config: {
|
|
9
|
+
readonly repo: string;
|
|
10
|
+
readonly label: string;
|
|
11
|
+
readonly token: string;
|
|
12
|
+
}): Promise<readonly PendingIssue[]>;
|
|
13
|
+
//# sourceMappingURL=work.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work.d.ts","sourceRoot":"","sources":["../../../src/plugin/lib/work.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAsBnC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Check for pending GitHub issues assigned to this agent.
|
|
6
|
+
*/
|
|
7
|
+
export async function checkIssues(config) {
|
|
8
|
+
const { repo, label, token } = config;
|
|
9
|
+
try {
|
|
10
|
+
const { stdout } = await execFileAsync('gh', [
|
|
11
|
+
'issue', 'list',
|
|
12
|
+
'--repo', repo,
|
|
13
|
+
'--label', label,
|
|
14
|
+
'--state', 'open',
|
|
15
|
+
'--json', 'number,title',
|
|
16
|
+
], {
|
|
17
|
+
encoding: 'utf-8',
|
|
18
|
+
env: { ...process.env, GH_TOKEN: token },
|
|
19
|
+
});
|
|
20
|
+
return JSON.parse(stdout);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
process.stderr.write(`Warning: failed to check issues: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../../src/plugin/lib/work.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAO1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAIjC;IACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE;YAC3C,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,cAAc;SACzB,EAAE;YACD,QAAQ,EAAE,OAAO;YACjB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE;SACzC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACzF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@groundnuty/macf",
|
|
3
|
+
"version": "0.2.0-rc.0",
|
|
4
|
+
"description": "Multi-Agent Coordination Framework CLI — coordinate Claude Code agents via GitHub. Installs as `macf` binary; use `macf init` to set up an agent workspace, `macf update` to refresh rules + version pins.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"macf": "dist/cli/index.js",
|
|
10
|
+
"macf-plugin-cli": "dist/plugin/bin/macf-plugin-cli.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist/",
|
|
14
|
+
"plugin/rules/",
|
|
15
|
+
"scripts/"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/groundnuty/macf.git",
|
|
20
|
+
"directory": "packages/macf"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/groundnuty/macf#readme",
|
|
23
|
+
"bugs": "https://github.com/groundnuty/macf/issues",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -b",
|
|
30
|
+
"postbuild": "node scripts/write-build-info.mjs",
|
|
31
|
+
"typecheck": "tsc -b",
|
|
32
|
+
"check": "tsc -b && eslint src/ && vitest run",
|
|
33
|
+
"lint": "eslint src/",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@groundnuty/macf-core": "0.2.0-rc.0",
|
|
39
|
+
"commander": "^14.0.3",
|
|
40
|
+
"reflect-metadata": "^0.2.2",
|
|
41
|
+
"zod": "^4.0.0"
|
|
42
|
+
}
|
|
43
|
+
}
|