openplanr 1.16.1 → 1.17.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/README.md +5 -2
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +2 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/operate.d.ts.map +1 -1
- package/dist/cli/commands/operate.js +185 -6
- package/dist/cli/commands/operate.js.map +1 -1
- package/dist/cli/commands/runtime.d.ts.map +1 -1
- package/dist/cli/commands/runtime.js +22 -4
- package/dist/cli/commands/runtime.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +18 -0
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/services/claude-plugin-service.d.ts +47 -0
- package/dist/services/claude-plugin-service.d.ts.map +1 -0
- package/dist/services/claude-plugin-service.js +259 -0
- package/dist/services/claude-plugin-service.js.map +1 -0
- package/dist/services/operate/advisors.d.ts +46 -1
- package/dist/services/operate/advisors.d.ts.map +1 -1
- package/dist/services/operate/advisors.js +124 -13
- package/dist/services/operate/advisors.js.map +1 -1
- package/dist/services/operate/artifacts.d.ts +27 -1
- package/dist/services/operate/artifacts.d.ts.map +1 -1
- package/dist/services/operate/artifacts.js +103 -1
- package/dist/services/operate/artifacts.js.map +1 -1
- package/dist/services/operate/cadence.d.ts +50 -0
- package/dist/services/operate/cadence.d.ts.map +1 -0
- package/dist/services/operate/cadence.js +56 -0
- package/dist/services/operate/cadence.js.map +1 -0
- package/dist/services/operate/citation-resolution.d.ts +101 -0
- package/dist/services/operate/citation-resolution.d.ts.map +1 -0
- package/dist/services/operate/citation-resolution.js +308 -0
- package/dist/services/operate/citation-resolution.js.map +1 -0
- package/dist/services/operate/config.d.ts +67 -1
- package/dist/services/operate/config.d.ts.map +1 -1
- package/dist/services/operate/config.js +158 -9
- package/dist/services/operate/config.js.map +1 -1
- package/dist/services/operate/decision-brief.d.ts +148 -0
- package/dist/services/operate/decision-brief.d.ts.map +1 -0
- package/dist/services/operate/decision-brief.js +194 -0
- package/dist/services/operate/decision-brief.js.map +1 -0
- package/dist/services/operate/doctor.d.ts.map +1 -1
- package/dist/services/operate/doctor.js +151 -3
- package/dist/services/operate/doctor.js.map +1 -1
- package/dist/services/operate/engine.d.ts +66 -2
- package/dist/services/operate/engine.d.ts.map +1 -1
- package/dist/services/operate/engine.js +219 -7
- package/dist/services/operate/engine.js.map +1 -1
- package/dist/services/operate/event-store.d.ts +35 -1
- package/dist/services/operate/event-store.d.ts.map +1 -1
- package/dist/services/operate/event-store.js +142 -29
- package/dist/services/operate/event-store.js.map +1 -1
- package/dist/services/operate/evidence-cache.d.ts +25 -1
- package/dist/services/operate/evidence-cache.d.ts.map +1 -1
- package/dist/services/operate/evidence-cache.js +62 -1
- package/dist/services/operate/evidence-cache.js.map +1 -1
- package/dist/services/operate/evidence.d.ts +20 -1
- package/dist/services/operate/evidence.d.ts.map +1 -1
- package/dist/services/operate/evidence.js +119 -0
- package/dist/services/operate/evidence.js.map +1 -1
- package/dist/services/operate/index.d.ts.map +1 -1
- package/dist/services/operate/index.js +72 -5
- package/dist/services/operate/index.js.map +1 -1
- package/dist/services/operate/interaction/action-service.d.ts +17 -0
- package/dist/services/operate/interaction/action-service.d.ts.map +1 -1
- package/dist/services/operate/interaction/action-service.js +19 -0
- package/dist/services/operate/interaction/action-service.js.map +1 -1
- package/dist/services/operate/journal.d.ts.map +1 -1
- package/dist/services/operate/journal.js +11 -5
- package/dist/services/operate/journal.js.map +1 -1
- package/dist/services/operate/maintenance.d.ts.map +1 -1
- package/dist/services/operate/maintenance.js +9 -2
- package/dist/services/operate/maintenance.js.map +1 -1
- package/dist/services/operate/migration.d.ts +68 -0
- package/dist/services/operate/migration.d.ts.map +1 -0
- package/dist/services/operate/migration.js +235 -0
- package/dist/services/operate/migration.js.map +1 -0
- package/dist/services/operate/mission-dispatch.d.ts +193 -0
- package/dist/services/operate/mission-dispatch.d.ts.map +1 -0
- package/dist/services/operate/mission-dispatch.js +444 -0
- package/dist/services/operate/mission-dispatch.js.map +1 -0
- package/dist/services/operate/projection-persistence.d.ts +6 -0
- package/dist/services/operate/projection-persistence.d.ts.map +1 -1
- package/dist/services/operate/projection-persistence.js +87 -11
- package/dist/services/operate/projection-persistence.js.map +1 -1
- package/dist/services/operate/projection.d.ts +26 -1
- package/dist/services/operate/projection.d.ts.map +1 -1
- package/dist/services/operate/projection.js +62 -0
- package/dist/services/operate/projection.js.map +1 -1
- package/dist/services/operate/protocol.d.ts +46 -2
- package/dist/services/operate/protocol.d.ts.map +1 -1
- package/dist/services/operate/protocol.js +57 -5
- package/dist/services/operate/protocol.js.map +1 -1
- package/dist/services/operate/read-only-providers.d.ts +37 -0
- package/dist/services/operate/read-only-providers.d.ts.map +1 -1
- package/dist/services/operate/read-only-providers.js +130 -0
- package/dist/services/operate/read-only-providers.js.map +1 -1
- package/dist/services/operate/reports.d.ts +13 -0
- package/dist/services/operate/reports.d.ts.map +1 -1
- package/dist/services/operate/reports.js +217 -1
- package/dist/services/operate/reports.js.map +1 -1
- package/dist/services/operate/routes.d.ts.map +1 -1
- package/dist/services/operate/routes.js +79 -5
- package/dist/services/operate/routes.js.map +1 -1
- package/dist/services/operate/types.d.ts +120 -4
- package/dist/services/operate/types.d.ts.map +1 -1
- package/dist/services/operate/types.js +13 -0
- package/dist/services/operate/types.js.map +1 -1
- package/dist/services/operate/workspace.d.ts +7 -0
- package/dist/services/operate/workspace.d.ts.map +1 -1
- package/dist/services/operate/workspace.js +14 -5
- package/dist/services/operate/workspace.js.map +1 -1
- package/dist/services/runtime-manager-service.d.ts +15 -0
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +151 -36
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const OPENPLANR_CLAUDE_MARKETPLACE = "openplanr";
|
|
2
|
+
export declare const OPENPLANR_CLAUDE_MARKETPLACE_SOURCE = "openplanr/marketplace";
|
|
3
|
+
export declare const OPENPLANR_SKILLS_VERSION = "1.18.2";
|
|
4
|
+
export type ClaudePluginOperationKind = 'add-marketplace' | 'refresh-marketplace' | 'install' | 'update' | 'enable';
|
|
5
|
+
export interface ClaudePluginOperation {
|
|
6
|
+
runtime: 'claude-code';
|
|
7
|
+
kind: ClaudePluginOperationKind;
|
|
8
|
+
id: string;
|
|
9
|
+
scope: 'user';
|
|
10
|
+
currentVersion?: string;
|
|
11
|
+
targetVersion?: string;
|
|
12
|
+
description: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ClaudePluginState {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
expectedVersion: string;
|
|
18
|
+
installedVersion?: string;
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
installed: boolean;
|
|
21
|
+
identityValid: boolean;
|
|
22
|
+
installPath?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ClaudePluginInspection {
|
|
25
|
+
available: boolean;
|
|
26
|
+
marketplaceConfigured: boolean;
|
|
27
|
+
ready: boolean;
|
|
28
|
+
operations: ClaudePluginOperation[];
|
|
29
|
+
plugins: ClaudePluginState[];
|
|
30
|
+
legacyPluginIds: string[];
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ClaudePluginApplyResult {
|
|
34
|
+
operations: ClaudePluginOperation[];
|
|
35
|
+
restartRequired: boolean;
|
|
36
|
+
inspection: ClaudePluginInspection;
|
|
37
|
+
}
|
|
38
|
+
export interface ClaudeCommandResult {
|
|
39
|
+
status: number | null;
|
|
40
|
+
stdout: string;
|
|
41
|
+
stderr: string;
|
|
42
|
+
error?: Error;
|
|
43
|
+
}
|
|
44
|
+
export type ClaudeCommandRunner = (args: string[]) => ClaudeCommandResult;
|
|
45
|
+
export declare function inspectClaudePluginIntegration(pipelineVersion: string, runner?: ClaudeCommandRunner): ClaudePluginInspection;
|
|
46
|
+
export declare function applyClaudePluginIntegration(pipelineVersion: string, inspection: ClaudePluginInspection, runner?: ClaudeCommandRunner): ClaudePluginApplyResult;
|
|
47
|
+
//# sourceMappingURL=claude-plugin-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-plugin-service.d.ts","sourceRoot":"","sources":["../../src/services/claude-plugin-service.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B,cAAc,CAAC;AACxD,eAAO,MAAM,mCAAmC,0BAA0B,CAAC;AAC3E,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD,MAAM,MAAM,yBAAyB,GACjC,iBAAiB,GACjB,qBAAqB,GACrB,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,yBAAyB,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,sBAAsB,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,mBAAmB,CAAC;AAoK1E,wBAAgB,8BAA8B,CAC5C,eAAe,EAAE,MAAM,EACvB,MAAM,GAAE,mBAAmC,GAC1C,sBAAsB,CAwFxB;AAcD,wBAAgB,4BAA4B,CAC1C,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,sBAAsB,EAClC,MAAM,GAAE,mBAAmC,GAC1C,uBAAuB,CAkEzB"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
export const OPENPLANR_CLAUDE_MARKETPLACE = 'openplanr';
|
|
5
|
+
export const OPENPLANR_CLAUDE_MARKETPLACE_SOURCE = 'openplanr/marketplace';
|
|
6
|
+
export const OPENPLANR_SKILLS_VERSION = '1.18.2';
|
|
7
|
+
function defaultRunner(args) {
|
|
8
|
+
const result = spawnSync('claude', args, {
|
|
9
|
+
encoding: 'utf8',
|
|
10
|
+
windowsHide: true,
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
status: result.status,
|
|
14
|
+
stdout: result.stdout ?? '',
|
|
15
|
+
stderr: result.stderr ?? '',
|
|
16
|
+
...(result.error ? { error: result.error } : {}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function parseJson(result) {
|
|
20
|
+
if (result.error || result.status !== 0) {
|
|
21
|
+
const detail = result.error?.message || result.stderr.trim() || `exit ${result.status}`;
|
|
22
|
+
throw new Error(detail);
|
|
23
|
+
}
|
|
24
|
+
return JSON.parse(result.stdout);
|
|
25
|
+
}
|
|
26
|
+
function installedPlugins(value) {
|
|
27
|
+
return Array.isArray(value) ? value : (value.installed ?? []);
|
|
28
|
+
}
|
|
29
|
+
function stableVersionParts(version) {
|
|
30
|
+
if (!/^\d+\.\d+\.\d+$/.test(version))
|
|
31
|
+
return null;
|
|
32
|
+
return version.split('.').map(Number);
|
|
33
|
+
}
|
|
34
|
+
function newestCompatibleTarget(minimum, advertised) {
|
|
35
|
+
if (!advertised)
|
|
36
|
+
return minimum;
|
|
37
|
+
const minimumParts = stableVersionParts(minimum);
|
|
38
|
+
const advertisedParts = stableVersionParts(advertised);
|
|
39
|
+
if (!minimumParts || !advertisedParts)
|
|
40
|
+
return minimum;
|
|
41
|
+
if (advertisedParts[0] !== minimumParts[0] ||
|
|
42
|
+
(minimumParts[0] === 0 && advertisedParts[1] !== minimumParts[1])) {
|
|
43
|
+
return minimum;
|
|
44
|
+
}
|
|
45
|
+
for (let index = 0; index < minimumParts.length; index += 1) {
|
|
46
|
+
if (advertisedParts[index] > minimumParts[index])
|
|
47
|
+
return advertised;
|
|
48
|
+
if (advertisedParts[index] < minimumParts[index])
|
|
49
|
+
return minimum;
|
|
50
|
+
}
|
|
51
|
+
return advertised;
|
|
52
|
+
}
|
|
53
|
+
function marketplaceTargets(marketplace) {
|
|
54
|
+
if (!marketplace?.installLocation)
|
|
55
|
+
return new Map();
|
|
56
|
+
const manifestPath = path.join(marketplace.installLocation, '.claude-plugin', 'marketplace.json');
|
|
57
|
+
if (!existsSync(manifestPath))
|
|
58
|
+
return new Map();
|
|
59
|
+
try {
|
|
60
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
61
|
+
return new Map((manifest.plugins ?? [])
|
|
62
|
+
.filter((plugin) => Boolean(plugin.name && plugin.version))
|
|
63
|
+
.map((plugin) => [plugin.name, plugin.version]));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return new Map();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function validManifest(installPath, expectedName, expectedVersion) {
|
|
70
|
+
if (!installPath)
|
|
71
|
+
return false;
|
|
72
|
+
const manifestPath = path.join(installPath, '.claude-plugin', 'plugin.json');
|
|
73
|
+
if (!existsSync(manifestPath))
|
|
74
|
+
return false;
|
|
75
|
+
try {
|
|
76
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
77
|
+
return manifest.name === expectedName && manifest.version === expectedVersion;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function pluginState(installed, name, expectedVersion) {
|
|
84
|
+
const id = `${name}@${OPENPLANR_CLAUDE_MARKETPLACE}`;
|
|
85
|
+
const selected = installed.find((plugin) => plugin.id === id && plugin.scope === 'user');
|
|
86
|
+
const installedVersion = selected?.version;
|
|
87
|
+
return {
|
|
88
|
+
id,
|
|
89
|
+
name,
|
|
90
|
+
expectedVersion,
|
|
91
|
+
...(installedVersion ? { installedVersion } : {}),
|
|
92
|
+
enabled: selected?.enabled === true,
|
|
93
|
+
installed: Boolean(selected),
|
|
94
|
+
identityValid: validManifest(selected?.installPath, name, expectedVersion),
|
|
95
|
+
...(selected?.installPath ? { installPath: selected.installPath } : {}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function pluginOperations(plugin) {
|
|
99
|
+
if (!plugin.installed) {
|
|
100
|
+
return [
|
|
101
|
+
{
|
|
102
|
+
runtime: 'claude-code',
|
|
103
|
+
kind: 'install',
|
|
104
|
+
id: plugin.id,
|
|
105
|
+
scope: 'user',
|
|
106
|
+
targetVersion: plugin.expectedVersion,
|
|
107
|
+
description: `Install ${plugin.id} ${plugin.expectedVersion}`,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
const operations = [];
|
|
112
|
+
if (plugin.installedVersion !== plugin.expectedVersion || !plugin.identityValid) {
|
|
113
|
+
operations.push({
|
|
114
|
+
runtime: 'claude-code',
|
|
115
|
+
kind: 'update',
|
|
116
|
+
id: plugin.id,
|
|
117
|
+
scope: 'user',
|
|
118
|
+
currentVersion: plugin.installedVersion,
|
|
119
|
+
targetVersion: plugin.expectedVersion,
|
|
120
|
+
description: !plugin.identityValid
|
|
121
|
+
? `Refresh ${plugin.id} to restore its stable plugin identity`
|
|
122
|
+
: `Update ${plugin.id} from ${plugin.installedVersion} to ${plugin.expectedVersion}`,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (!plugin.enabled) {
|
|
126
|
+
operations.push({
|
|
127
|
+
runtime: 'claude-code',
|
|
128
|
+
kind: 'enable',
|
|
129
|
+
id: plugin.id,
|
|
130
|
+
scope: 'user',
|
|
131
|
+
currentVersion: plugin.installedVersion,
|
|
132
|
+
targetVersion: plugin.expectedVersion,
|
|
133
|
+
description: `Enable ${plugin.id}`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return operations;
|
|
137
|
+
}
|
|
138
|
+
export function inspectClaudePluginIntegration(pipelineVersion, runner = defaultRunner) {
|
|
139
|
+
const versionCheck = runner(['--version']);
|
|
140
|
+
if (versionCheck.error || versionCheck.status !== 0) {
|
|
141
|
+
return {
|
|
142
|
+
available: false,
|
|
143
|
+
marketplaceConfigured: false,
|
|
144
|
+
ready: false,
|
|
145
|
+
operations: [],
|
|
146
|
+
plugins: [],
|
|
147
|
+
legacyPluginIds: [],
|
|
148
|
+
error: versionCheck.error?.message || versionCheck.stderr.trim() || 'Claude Code unavailable',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const marketplaces = parseJson(runner(['plugin', 'marketplace', 'list', '--json']));
|
|
153
|
+
const listed = parseJson(runner(['plugin', 'list', '--json']));
|
|
154
|
+
const installed = installedPlugins(listed);
|
|
155
|
+
const officialMarketplace = marketplaces.find((marketplace) => marketplace.name === OPENPLANR_CLAUDE_MARKETPLACE &&
|
|
156
|
+
marketplace.repo === OPENPLANR_CLAUDE_MARKETPLACE_SOURCE);
|
|
157
|
+
const marketplaceConfigured = Boolean(officialMarketplace);
|
|
158
|
+
const targets = marketplaceTargets(officialMarketplace);
|
|
159
|
+
const plugins = [
|
|
160
|
+
pluginState(installed, 'openplanr', newestCompatibleTarget(OPENPLANR_SKILLS_VERSION, targets.get('openplanr'))),
|
|
161
|
+
pluginState(installed, 'planr-pipeline', newestCompatibleTarget(pipelineVersion, targets.get('planr-pipeline'))),
|
|
162
|
+
];
|
|
163
|
+
const operations = [
|
|
164
|
+
{
|
|
165
|
+
runtime: 'claude-code',
|
|
166
|
+
kind: marketplaceConfigured ? 'refresh-marketplace' : 'add-marketplace',
|
|
167
|
+
id: OPENPLANR_CLAUDE_MARKETPLACE,
|
|
168
|
+
scope: 'user',
|
|
169
|
+
description: marketplaceConfigured
|
|
170
|
+
? 'Refresh the official OpenPlanr Claude marketplace'
|
|
171
|
+
: 'Add the official OpenPlanr Claude marketplace',
|
|
172
|
+
},
|
|
173
|
+
...plugins.flatMap(pluginOperations),
|
|
174
|
+
];
|
|
175
|
+
const legacyPluginIds = installed
|
|
176
|
+
.filter((plugin) => plugin.scope === 'user' &&
|
|
177
|
+
plugin.id?.startsWith('openplanr@') &&
|
|
178
|
+
plugin.id !== `openplanr@${OPENPLANR_CLAUDE_MARKETPLACE}`)
|
|
179
|
+
.map((plugin) => plugin.id);
|
|
180
|
+
return {
|
|
181
|
+
available: true,
|
|
182
|
+
marketplaceConfigured,
|
|
183
|
+
ready: marketplaceConfigured &&
|
|
184
|
+
plugins.every((plugin) => plugin.installed &&
|
|
185
|
+
plugin.enabled &&
|
|
186
|
+
plugin.identityValid &&
|
|
187
|
+
plugin.installedVersion === plugin.expectedVersion),
|
|
188
|
+
operations,
|
|
189
|
+
plugins,
|
|
190
|
+
legacyPluginIds,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
catch (cause) {
|
|
194
|
+
return {
|
|
195
|
+
available: true,
|
|
196
|
+
marketplaceConfigured: false,
|
|
197
|
+
ready: false,
|
|
198
|
+
operations: [],
|
|
199
|
+
plugins: [],
|
|
200
|
+
legacyPluginIds: [],
|
|
201
|
+
error: cause instanceof Error ? cause.message : String(cause),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function runOrThrow(runner, args, operation) {
|
|
206
|
+
const result = runner(args);
|
|
207
|
+
if (result.error || result.status !== 0) {
|
|
208
|
+
const detail = result.error?.message || result.stderr.trim() || `exit ${result.status}`;
|
|
209
|
+
throw new Error(`${operation.description}: ${detail}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export function applyClaudePluginIntegration(pipelineVersion, inspection, runner = defaultRunner) {
|
|
213
|
+
if (!inspection.available || inspection.error) {
|
|
214
|
+
throw new Error(inspection.error ?? 'Claude Code is unavailable');
|
|
215
|
+
}
|
|
216
|
+
const performed = [];
|
|
217
|
+
const marketplaceOperation = inspection.operations.find((operation) => ['add-marketplace', 'refresh-marketplace'].includes(operation.kind));
|
|
218
|
+
if (marketplaceOperation) {
|
|
219
|
+
if (marketplaceOperation.kind === 'add-marketplace') {
|
|
220
|
+
runOrThrow(runner, ['plugin', 'marketplace', 'add', OPENPLANR_CLAUDE_MARKETPLACE_SOURCE, '--scope', 'user'], marketplaceOperation);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
runOrThrow(runner, ['plugin', 'marketplace', 'update', OPENPLANR_CLAUDE_MARKETPLACE], marketplaceOperation);
|
|
224
|
+
}
|
|
225
|
+
performed.push(marketplaceOperation);
|
|
226
|
+
}
|
|
227
|
+
const refreshedInspection = inspectClaudePluginIntegration(pipelineVersion, runner);
|
|
228
|
+
if (refreshedInspection.error)
|
|
229
|
+
throw new Error(refreshedInspection.error);
|
|
230
|
+
for (const operation of refreshedInspection.operations.filter((item) => !['add-marketplace', 'refresh-marketplace'].includes(item.kind))) {
|
|
231
|
+
if (operation.kind === 'install') {
|
|
232
|
+
runOrThrow(runner, ['plugin', 'install', operation.id, '--scope', 'user'], operation);
|
|
233
|
+
}
|
|
234
|
+
else if (operation.kind === 'update') {
|
|
235
|
+
runOrThrow(runner, ['plugin', 'update', operation.id, '--scope', 'user'], operation);
|
|
236
|
+
}
|
|
237
|
+
else if (operation.kind === 'enable') {
|
|
238
|
+
runOrThrow(runner, ['plugin', 'enable', operation.id, '--scope', 'user'], operation);
|
|
239
|
+
}
|
|
240
|
+
performed.push(operation);
|
|
241
|
+
}
|
|
242
|
+
const finalInspection = inspectClaudePluginIntegration(pipelineVersion, runner);
|
|
243
|
+
if (!finalInspection.ready) {
|
|
244
|
+
const drift = finalInspection.plugins
|
|
245
|
+
.filter((plugin) => !plugin.installed ||
|
|
246
|
+
!plugin.enabled ||
|
|
247
|
+
!plugin.identityValid ||
|
|
248
|
+
plugin.installedVersion !== plugin.expectedVersion)
|
|
249
|
+
.map((plugin) => `${plugin.id}=${plugin.installedVersion ?? 'missing'} (expected ${plugin.expectedVersion})`)
|
|
250
|
+
.join(', ');
|
|
251
|
+
throw new Error(finalInspection.error || `Claude plugin verification failed${drift ? `: ${drift}` : ''}`);
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
operations: performed,
|
|
255
|
+
restartRequired: performed.some((operation) => ['install', 'update', 'enable'].includes(operation.kind)),
|
|
256
|
+
inspection: finalInspection,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=claude-plugin-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-plugin-service.js","sourceRoot":"","sources":["../../src/services/claude-plugin-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { AIMessage } from '../../ai/types.js';
|
|
3
3
|
import type { OpenPlanrConfig } from '../../models/types.js';
|
|
4
|
-
import { type
|
|
4
|
+
import { type OperatingDispatchIsolation, type OperatingDispatchMode } from './mission-dispatch.js';
|
|
5
|
+
import { type OperatingAdvisorBrief, type OperatingCharter, type OperatingDataGap, type OperatingEvidence, type OperatingEvidenceIndexItem, type OperatingEvidenceReadiness, type OperatingMissionPacket, type OperatingMissionPacketState, type OperatingProviderManifest, type OperatingRoleId, type OperatingRoleResult, type OperatingState } from './types.js';
|
|
5
6
|
declare const advisorOutputSchema: z.ZodObject<{
|
|
6
7
|
outcome: z.ZodEnum<{
|
|
7
8
|
quiet: "quiet";
|
|
@@ -120,6 +121,36 @@ export declare function createOperatingAdvisorPack(input: {
|
|
|
120
121
|
evidence: OperatingEvidence;
|
|
121
122
|
context: AdvisorOperatingContext;
|
|
122
123
|
}): Promise<OperatingAdvisorPack>;
|
|
124
|
+
/**
|
|
125
|
+
* Derive a role's mission-mode input budget from the pipeline's published pack
|
|
126
|
+
* budget. Mission packets carry only an evidence INDEX (no bodies), so their
|
|
127
|
+
* budget is a single-digit-KiB fraction of the role's v1.2 pack budget, clamped
|
|
128
|
+
* to `[1, 9]` KiB. This DERIVES a new value; it never mutates the frozen v1.2
|
|
129
|
+
* `maxInputBytes` that pack mode still enforces.
|
|
130
|
+
*/
|
|
131
|
+
export declare function deriveOperatingMissionBudget(packMaxInputBytes: number): number;
|
|
132
|
+
/**
|
|
133
|
+
* The per-role mission input budget registry, derived once from the pipeline's
|
|
134
|
+
* role registry. Every value is single-digit KiB.
|
|
135
|
+
*/
|
|
136
|
+
export declare function deriveOperatingMissionBudgets(): Promise<Record<string, number>>;
|
|
137
|
+
export interface OperatingMissionPacketInput extends OperatingMissionPacketState {
|
|
138
|
+
roleId: OperatingRoleId;
|
|
139
|
+
evidenceIndex: OperatingEvidenceIndexItem[];
|
|
140
|
+
maxEvidenceItems?: number;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Build a digest-bound Protocol v1.3 mission packet (FR1) by calling the
|
|
144
|
+
* pipeline's `createOperatingMissionPacket` with the live non-evidence payload
|
|
145
|
+
* and the index-only (body-free) evidence. The packet is measured against the
|
|
146
|
+
* role's DERIVED single-digit-KiB mission budget; when it would exceed that
|
|
147
|
+
* budget the assembler fails closed with `E_OPERATE_MISSION_PACKET_BUDGET`
|
|
148
|
+
* naming the role, before any dispatch call is made — the packet is never
|
|
149
|
+
* truncated to fit. This is a separate construction path from
|
|
150
|
+
* `createOperatingAdvisorPack`; pack-mode role-filtered body content is
|
|
151
|
+
* unaffected.
|
|
152
|
+
*/
|
|
153
|
+
export declare function buildOperatingMissionPacket(input: OperatingMissionPacketInput): Promise<OperatingMissionPacket>;
|
|
123
154
|
export interface AdvisorAdapter {
|
|
124
155
|
id: string;
|
|
125
156
|
mode: 'structured' | 'native-isolated';
|
|
@@ -160,6 +191,12 @@ export interface AdvisorDispatchResult {
|
|
|
160
191
|
adapterId: string;
|
|
161
192
|
capability: 'analysis-standard' | 'analysis-high';
|
|
162
193
|
dispatch: 'parallel' | 'sequential';
|
|
194
|
+
/** Configured dispatch mode: registry default overridden by dispatchModeOverrides. */
|
|
195
|
+
dispatchMode: OperatingDispatchMode;
|
|
196
|
+
/** Effective isolation after the FR2/FR4 reconciliation (E-002/E-004). */
|
|
197
|
+
isolation: OperatingDispatchIsolation;
|
|
198
|
+
/** Audit note explaining the isolation decision (e.g. codex/cursor fail-closed). */
|
|
199
|
+
reconciliation: string;
|
|
163
200
|
}>;
|
|
164
201
|
skipped: Array<{
|
|
165
202
|
roleId: OperatingRoleId;
|
|
@@ -196,6 +233,14 @@ export declare function dispatchOperatingAdvisors(input: {
|
|
|
196
233
|
adapter: AdvisorAdapter;
|
|
197
234
|
depth: 'standard' | 'deep' | 'review-only';
|
|
198
235
|
runtime?: string;
|
|
236
|
+
/**
|
|
237
|
+
* Per-project dispatch-mode overrides (FR4 / E-004). A role listed here uses
|
|
238
|
+
* the given mode instead of the v1.3 registry default; unlisted roles keep the
|
|
239
|
+
* registry default (`mission`). An operator rolls a single lens back to the
|
|
240
|
+
* v1.2 pack path with `{ <roleId>: 'pack' }` without waiting for a registry
|
|
241
|
+
* release. When omitted, every role follows the derived registry default.
|
|
242
|
+
*/
|
|
243
|
+
dispatchModeOverrides?: Readonly<Record<string, OperatingDispatchMode>>;
|
|
199
244
|
}): Promise<AdvisorDispatchResult>;
|
|
200
245
|
/**
|
|
201
246
|
* Standard-cycle advisor failures are governed data gaps, not ephemeral
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisors.d.ts","sourceRoot":"","sources":["../../../src/services/operate/advisors.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"advisors.d.ts","sourceRoot":"","sources":["../../../src/services/operate/advisors.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,10 @@ import { OPENPLANR_VERSION } from '../../utils/package-version.js';
|
|
|
7
7
|
import { generateJSON, getAIProvider, isAIConfigured } from '../ai-service.js';
|
|
8
8
|
import { loadConfig } from '../config-service.js';
|
|
9
9
|
import { canonicalDigest, canonicalize } from './canonical.js';
|
|
10
|
-
import {
|
|
10
|
+
import { operatingRegistryDispatchMode, operatingRuntimeEnforcesBoundedReadOnly, resolveOperatingDispatchMode, runMissionDispatchFanOut, } from './mission-dispatch.js';
|
|
11
|
+
import { assertOperatingArtifact, loadOperatingMissionApi, loadOperatingProtocol, } from './protocol.js';
|
|
11
12
|
import { prepareAdvisorEvidenceText, sanitizeGeneratedPlainText } from './redaction.js';
|
|
12
|
-
import { OPERATE_PROTOCOL_VERSION, OPERATE_SCHEMA_VERSION, OperateError, } from './types.js';
|
|
13
|
+
import { OPERATE_MISSION_PROTOCOL_VERSION, OPERATE_PROTOCOL_VERSION, OPERATE_SCHEMA_VERSION, OperateError, } from './types.js';
|
|
13
14
|
const proposalSchema = z
|
|
14
15
|
.object({
|
|
15
16
|
proposalKey: z.string().regex(/^[A-Za-z0-9._-]+$/),
|
|
@@ -301,6 +302,82 @@ export async function createOperatingAdvisorPack(input) {
|
|
|
301
302
|
inputDigest,
|
|
302
303
|
};
|
|
303
304
|
}
|
|
305
|
+
/**
|
|
306
|
+
* Derive a role's mission-mode input budget from the pipeline's published pack
|
|
307
|
+
* budget. Mission packets carry only an evidence INDEX (no bodies), so their
|
|
308
|
+
* budget is a single-digit-KiB fraction of the role's v1.2 pack budget, clamped
|
|
309
|
+
* to `[1, 9]` KiB. This DERIVES a new value; it never mutates the frozen v1.2
|
|
310
|
+
* `maxInputBytes` that pack mode still enforces.
|
|
311
|
+
*/
|
|
312
|
+
export function deriveOperatingMissionBudget(packMaxInputBytes) {
|
|
313
|
+
const kib = Math.min(9, Math.max(1, Math.round(packMaxInputBytes / (32 * 1024))));
|
|
314
|
+
return kib * 1024;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* The per-role mission input budget registry, derived once from the pipeline's
|
|
318
|
+
* role registry. Every value is single-digit KiB.
|
|
319
|
+
*/
|
|
320
|
+
export async function deriveOperatingMissionBudgets() {
|
|
321
|
+
const roles = (await loadOperatingProtocol()).listOperatingRoles();
|
|
322
|
+
return Object.fromEntries(roles.map((role) => {
|
|
323
|
+
const budgets = role.budgets;
|
|
324
|
+
const packMax = typeof budgets?.maxInputBytes === 'number' ? budgets.maxInputBytes : 262_144;
|
|
325
|
+
return [role.id, deriveOperatingMissionBudget(packMax)];
|
|
326
|
+
}));
|
|
327
|
+
}
|
|
328
|
+
function isMissionBudgetError(error) {
|
|
329
|
+
const code = error?.code;
|
|
330
|
+
if (code === 'E_OPERATE_MISSION_PACKET_BUDGET')
|
|
331
|
+
return true;
|
|
332
|
+
return error instanceof Error && error.message.includes('E_OPERATE_MISSION_PACKET_BUDGET');
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Build a digest-bound Protocol v1.3 mission packet (FR1) by calling the
|
|
336
|
+
* pipeline's `createOperatingMissionPacket` with the live non-evidence payload
|
|
337
|
+
* and the index-only (body-free) evidence. The packet is measured against the
|
|
338
|
+
* role's DERIVED single-digit-KiB mission budget; when it would exceed that
|
|
339
|
+
* budget the assembler fails closed with `E_OPERATE_MISSION_PACKET_BUDGET`
|
|
340
|
+
* naming the role, before any dispatch call is made — the packet is never
|
|
341
|
+
* truncated to fit. This is a separate construction path from
|
|
342
|
+
* `createOperatingAdvisorPack`; pack-mode role-filtered body content is
|
|
343
|
+
* unaffected.
|
|
344
|
+
*/
|
|
345
|
+
export async function buildOperatingMissionPacket(input) {
|
|
346
|
+
const mission = await loadOperatingMissionApi();
|
|
347
|
+
const protocol = await loadOperatingProtocol();
|
|
348
|
+
const role = protocol.listOperatingRoles().find((candidate) => candidate.id === input.roleId);
|
|
349
|
+
if (!role) {
|
|
350
|
+
throw new OperateError('E_OPERATE_ADVISOR_FAILED', `Mission packet requested for unknown role ${input.roleId}.`);
|
|
351
|
+
}
|
|
352
|
+
const packBudget = role.budgets?.maxInputBytes;
|
|
353
|
+
const derivedBudget = deriveOperatingMissionBudget(typeof packBudget === 'number' ? packBudget : 262_144);
|
|
354
|
+
let packet;
|
|
355
|
+
try {
|
|
356
|
+
packet = mission.createOperatingMissionPacket(input.roleId, input.evidenceIndex, {
|
|
357
|
+
protocolVersion: OPERATE_MISSION_PROTOCOL_VERSION,
|
|
358
|
+
cycleId: input.cycleId,
|
|
359
|
+
pinnedRevision: input.pinnedRevision,
|
|
360
|
+
charter: input.charter,
|
|
361
|
+
priorCycleSummary: input.priorCycleSummary,
|
|
362
|
+
planningStatus: input.planningStatus,
|
|
363
|
+
declaredRoots: input.declaredRoots,
|
|
364
|
+
maxEvidenceItems: input.maxEvidenceItems,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
if (isMissionBudgetError(error)) {
|
|
369
|
+
throw new OperateError('E_OPERATE_MISSION_PACKET_BUDGET', `Mission packet for role ${input.roleId} exceeds its mission input budget; ` +
|
|
370
|
+
'the evidence index is not truncated to fit.', { roleId: input.roleId });
|
|
371
|
+
}
|
|
372
|
+
throw new OperateError('E_OPERATE_ADVISOR_FAILED', `Mission packet construction failed for role ${input.roleId}: ${error instanceof Error ? error.message : String(error)}`, { roleId: input.roleId });
|
|
373
|
+
}
|
|
374
|
+
const actualBytes = Buffer.byteLength(canonicalize(packet), 'utf8');
|
|
375
|
+
if (actualBytes > derivedBudget) {
|
|
376
|
+
throw new OperateError('E_OPERATE_MISSION_PACKET_BUDGET', `Mission packet for role ${input.roleId} is ${actualBytes} bytes, exceeding its ` +
|
|
377
|
+
`derived ${derivedBudget}-byte mission budget; the evidence index is not truncated to fit.`, { roleId: input.roleId, actualBytes, maxInputBytes: derivedBudget });
|
|
378
|
+
}
|
|
379
|
+
return packet;
|
|
380
|
+
}
|
|
304
381
|
export function operatingAdvisorMessages(input) {
|
|
305
382
|
return [
|
|
306
383
|
{
|
|
@@ -510,6 +587,25 @@ export async function dispatchOperatingAdvisors(input) {
|
|
|
510
587
|
const roleRegistry = (await loadOperatingProtocol()).listOperatingRoles();
|
|
511
588
|
const protocol = await loadOperatingProtocol();
|
|
512
589
|
const capabilityByRole = new Map(roleRegistry.map((role) => [role.id, role.capabilityTier ?? 'analysis-high']));
|
|
590
|
+
// Canonical registry order so results and provenance are byte-identical across
|
|
591
|
+
// parallel/sequential dispatch and across the order roles arrive in (FR4).
|
|
592
|
+
const roleOrder = new Map(roleRegistry.map((role, index) => [role.id, index]));
|
|
593
|
+
const registryDefaultMode = new Map(roleRegistry.map((role) => [role.id, operatingRegistryDispatchMode(role)]));
|
|
594
|
+
// The runtime's ability to enforce the bounded read-only boundary is resolved
|
|
595
|
+
// once per dispatch and fails closed: a runtime whose isolation cannot be
|
|
596
|
+
// verified never receives a native lens (FR2).
|
|
597
|
+
const runtimeEnforcesBoundedReadOnly = await operatingRuntimeEnforcesBoundedReadOnly(input.runtime);
|
|
598
|
+
// A structured adapter can never host a native lens; only a native-isolated
|
|
599
|
+
// adapter (whose isolation `assertAdvisorIsolation` has already proven to be
|
|
600
|
+
// enforced) is native-capable.
|
|
601
|
+
const adapterNativeCapable = input.adapter.mode === 'native-isolated';
|
|
602
|
+
const resolveMode = (roleId) => resolveOperatingDispatchMode({
|
|
603
|
+
roleId,
|
|
604
|
+
registryDefault: registryDefaultMode.get(roleId) ?? 'mission',
|
|
605
|
+
override: input.dispatchModeOverrides?.[roleId],
|
|
606
|
+
runtimeEnforcesBoundedReadOnly,
|
|
607
|
+
adapterNativeCapable,
|
|
608
|
+
});
|
|
513
609
|
const skipped = [];
|
|
514
610
|
const runnable = [];
|
|
515
611
|
for (const role of input.readiness.roles) {
|
|
@@ -599,25 +695,40 @@ export async function dispatchOperatingAdvisors(input) {
|
|
|
599
695
|
protocol.validateOperatingRoleResultDigest(result);
|
|
600
696
|
return { ok: true, result, modelCalls: roleModelCalls };
|
|
601
697
|
}
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
698
|
+
// Fan the per-role dispatch out in parallel where the adapter reports it,
|
|
699
|
+
// sequentially otherwise. The orchestrator returns results in `runnable` order
|
|
700
|
+
// regardless of dispatch style, and results are sorted into canonical registry
|
|
701
|
+
// order below so the reduced events are byte-identical across parallel and
|
|
702
|
+
// sequential dispatch and across dispatch order (FR4/E-004).
|
|
703
|
+
const dispatched = await runMissionDispatchFanOut({
|
|
704
|
+
items: runnable,
|
|
705
|
+
parallel: Boolean(input.adapter.parallelDispatch),
|
|
706
|
+
run: (role) => dispatchRole(role),
|
|
707
|
+
});
|
|
605
708
|
const results = dispatched
|
|
606
709
|
.filter((entry) => entry.ok)
|
|
607
|
-
.map((entry) => entry.result)
|
|
710
|
+
.map((entry) => entry.result)
|
|
711
|
+
.sort((left, right) => (roleOrder.get(left.roleId) ?? Number.MAX_SAFE_INTEGER) -
|
|
712
|
+
(roleOrder.get(right.roleId) ?? Number.MAX_SAFE_INTEGER));
|
|
608
713
|
const failed = dispatched
|
|
609
714
|
.filter((entry) => !entry.ok)
|
|
610
715
|
.map(({ roleId, message }) => ({ roleId, message }));
|
|
611
716
|
const modelCalls = dispatched.reduce((total, entry) => total + entry.modelCalls, 0);
|
|
612
717
|
return {
|
|
613
718
|
results,
|
|
614
|
-
provenance: results.map((result) =>
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
719
|
+
provenance: results.map((result) => {
|
|
720
|
+
const resolution = resolveMode(result.roleId);
|
|
721
|
+
return {
|
|
722
|
+
roleId: result.roleId,
|
|
723
|
+
runtime: input.runtime ?? input.adapter.id,
|
|
724
|
+
adapterId: input.adapter.id,
|
|
725
|
+
capability: input.adapter.capability,
|
|
726
|
+
dispatch: input.adapter.parallelDispatch ? 'parallel' : 'sequential',
|
|
727
|
+
dispatchMode: resolution.mode,
|
|
728
|
+
isolation: resolution.isolation,
|
|
729
|
+
reconciliation: resolution.reconciliation,
|
|
730
|
+
};
|
|
731
|
+
}),
|
|
621
732
|
skipped,
|
|
622
733
|
failed,
|
|
623
734
|
blocked: failed.some((entry) => entry.roleId === 'chair') ||
|