@doingdev/opencode-claude-manager-plugin 0.1.21 → 0.1.25
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 +129 -40
- package/dist/claude/claude-agent-sdk-adapter.d.ts +27 -0
- package/dist/claude/claude-agent-sdk-adapter.js +520 -0
- package/dist/claude/claude-session.service.d.ts +15 -0
- package/dist/claude/claude-session.service.js +23 -0
- package/dist/claude/session-live-tailer.d.ts +51 -0
- package/dist/claude/session-live-tailer.js +269 -0
- package/dist/claude/tool-approval-manager.d.ts +27 -0
- package/dist/claude/tool-approval-manager.js +238 -0
- package/dist/index.d.ts +4 -5
- package/dist/index.js +4 -5
- package/dist/manager/context-tracker.d.ts +33 -0
- package/dist/manager/context-tracker.js +108 -0
- package/dist/manager/git-operations.d.ts +12 -0
- package/dist/manager/git-operations.js +76 -0
- package/dist/manager/persistent-manager.d.ts +74 -0
- package/dist/manager/persistent-manager.js +167 -0
- package/dist/manager/session-controller.d.ts +45 -0
- package/dist/manager/session-controller.js +147 -0
- package/dist/metadata/claude-metadata.service.d.ts +12 -0
- package/dist/metadata/claude-metadata.service.js +38 -0
- package/dist/metadata/repo-claude-config-reader.d.ts +7 -0
- package/dist/metadata/repo-claude-config-reader.js +154 -0
- package/dist/plugin/claude-manager.plugin.d.ts +2 -0
- package/dist/plugin/claude-manager.plugin.js +627 -0
- package/dist/plugin/orchestrator.plugin.d.ts +0 -12
- package/dist/plugin/orchestrator.plugin.js +12 -4
- package/dist/plugin/service-factory.d.ts +12 -0
- package/dist/plugin/service-factory.js +41 -0
- package/dist/prompts/registry.d.ts +2 -8
- package/dist/prompts/registry.js +159 -30
- package/dist/providers/claude-code-wrapper.d.ts +13 -0
- package/dist/providers/claude-code-wrapper.js +13 -0
- package/dist/state/file-run-state-store.d.ts +14 -0
- package/dist/state/file-run-state-store.js +87 -0
- package/dist/state/transcript-store.d.ts +15 -0
- package/dist/state/transcript-store.js +44 -0
- package/dist/types/contracts.d.ts +215 -0
- package/dist/types/contracts.js +1 -0
- package/dist/util/fs-helpers.d.ts +2 -0
- package/dist/util/fs-helpers.js +12 -0
- package/dist/util/transcript-append.d.ts +7 -0
- package/dist/util/transcript-append.js +29 -0
- package/package.json +6 -3
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
export interface ManagerPromptRegistry {
|
|
2
|
+
managerSystemPrompt: string;
|
|
3
|
+
claudeCodeSessionPrompt: string;
|
|
4
|
+
modePrefixes: {
|
|
5
|
+
plan: string;
|
|
6
|
+
free: string;
|
|
7
|
+
};
|
|
8
|
+
contextWarnings: {
|
|
9
|
+
moderate: string;
|
|
10
|
+
high: string;
|
|
11
|
+
critical: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export type ClaudeSettingSource = 'user' | 'project' | 'local';
|
|
15
|
+
export type SessionMode = 'plan' | 'free';
|
|
16
|
+
export interface ClaudeCommandMetadata {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
argumentHint?: string;
|
|
20
|
+
source: 'sdk' | 'skill' | 'command';
|
|
21
|
+
path?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ClaudeSkillMetadata {
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
path: string;
|
|
27
|
+
source: 'skill' | 'command';
|
|
28
|
+
}
|
|
29
|
+
export interface ClaudeHookMetadata {
|
|
30
|
+
name: string;
|
|
31
|
+
matcher?: string;
|
|
32
|
+
sourcePath: string;
|
|
33
|
+
commandCount: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ClaudeAgentMetadata {
|
|
36
|
+
name: string;
|
|
37
|
+
description: string;
|
|
38
|
+
model?: string;
|
|
39
|
+
source: 'sdk' | 'filesystem';
|
|
40
|
+
}
|
|
41
|
+
export interface ClaudeMetadataSnapshot {
|
|
42
|
+
collectedAt: string;
|
|
43
|
+
cwd: string;
|
|
44
|
+
commands: ClaudeCommandMetadata[];
|
|
45
|
+
skills: ClaudeSkillMetadata[];
|
|
46
|
+
hooks: ClaudeHookMetadata[];
|
|
47
|
+
agents: ClaudeAgentMetadata[];
|
|
48
|
+
claudeMdPath?: string;
|
|
49
|
+
settingsPaths: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface ClaudeSessionEvent {
|
|
52
|
+
type: 'init' | 'assistant' | 'partial' | 'user' | 'tool_call' | 'tool_progress' | 'tool_summary' | 'status' | 'system' | 'result' | 'error';
|
|
53
|
+
sessionId?: string;
|
|
54
|
+
text: string;
|
|
55
|
+
turns?: number;
|
|
56
|
+
totalCostUsd?: number;
|
|
57
|
+
/** Present on live SDK-normalized events; omitted when compact-persisted to save space. */
|
|
58
|
+
rawType?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface RunClaudeSessionInput {
|
|
61
|
+
cwd: string;
|
|
62
|
+
prompt: string;
|
|
63
|
+
systemPrompt?: string;
|
|
64
|
+
model?: string;
|
|
65
|
+
effort?: 'low' | 'medium' | 'high' | 'max';
|
|
66
|
+
mode?: SessionMode;
|
|
67
|
+
permissionMode?: 'default' | 'acceptEdits' | 'plan' | 'dontAsk';
|
|
68
|
+
/** Merged with `Skill` by the SDK adapter unless `Skill` appears in `disallowedTools`. */
|
|
69
|
+
allowedTools?: string[];
|
|
70
|
+
disallowedTools?: string[];
|
|
71
|
+
continueSession?: boolean;
|
|
72
|
+
resumeSessionId?: string;
|
|
73
|
+
forkSession?: boolean;
|
|
74
|
+
persistSession?: boolean;
|
|
75
|
+
includePartialMessages?: boolean;
|
|
76
|
+
settingSources?: ClaudeSettingSource[];
|
|
77
|
+
maxTurns?: number;
|
|
78
|
+
abortSignal?: AbortSignal;
|
|
79
|
+
}
|
|
80
|
+
export interface ClaudeSessionRunResult {
|
|
81
|
+
sessionId?: string;
|
|
82
|
+
events: ClaudeSessionEvent[];
|
|
83
|
+
finalText: string;
|
|
84
|
+
turns?: number;
|
|
85
|
+
totalCostUsd?: number;
|
|
86
|
+
inputTokens?: number;
|
|
87
|
+
outputTokens?: number;
|
|
88
|
+
contextWindowSize?: number;
|
|
89
|
+
}
|
|
90
|
+
export interface ClaudeSessionSummary {
|
|
91
|
+
sessionId: string;
|
|
92
|
+
summary: string;
|
|
93
|
+
cwd?: string;
|
|
94
|
+
gitBranch?: string;
|
|
95
|
+
createdAt?: number;
|
|
96
|
+
lastModified: number;
|
|
97
|
+
}
|
|
98
|
+
export interface ClaudeSessionTranscriptMessage {
|
|
99
|
+
role: 'user' | 'assistant';
|
|
100
|
+
sessionId: string;
|
|
101
|
+
messageId: string;
|
|
102
|
+
text: string;
|
|
103
|
+
}
|
|
104
|
+
export interface ClaudeCapabilitySnapshot {
|
|
105
|
+
commands: ClaudeCommandMetadata[];
|
|
106
|
+
agents: ClaudeAgentMetadata[];
|
|
107
|
+
models: string[];
|
|
108
|
+
}
|
|
109
|
+
export type ContextWarningLevel = 'ok' | 'moderate' | 'high' | 'critical';
|
|
110
|
+
export interface SessionContextSnapshot {
|
|
111
|
+
sessionId: string | null;
|
|
112
|
+
totalTurns: number;
|
|
113
|
+
totalCostUsd: number;
|
|
114
|
+
latestInputTokens: number | null;
|
|
115
|
+
latestOutputTokens: number | null;
|
|
116
|
+
contextWindowSize: number | null;
|
|
117
|
+
estimatedContextPercent: number | null;
|
|
118
|
+
warningLevel: ContextWarningLevel;
|
|
119
|
+
compactionCount: number;
|
|
120
|
+
}
|
|
121
|
+
export interface GitDiffResult {
|
|
122
|
+
hasDiff: boolean;
|
|
123
|
+
diffText: string;
|
|
124
|
+
stats: {
|
|
125
|
+
filesChanged: number;
|
|
126
|
+
insertions: number;
|
|
127
|
+
deletions: number;
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export interface GitOperationResult {
|
|
131
|
+
success: boolean;
|
|
132
|
+
output: string;
|
|
133
|
+
error?: string;
|
|
134
|
+
}
|
|
135
|
+
export interface ActiveSessionState {
|
|
136
|
+
sessionId: string;
|
|
137
|
+
cwd: string;
|
|
138
|
+
startedAt: string;
|
|
139
|
+
totalTurns: number;
|
|
140
|
+
totalCostUsd: number;
|
|
141
|
+
estimatedContextPercent: number | null;
|
|
142
|
+
contextWindowSize: number | null;
|
|
143
|
+
latestInputTokens: number | null;
|
|
144
|
+
}
|
|
145
|
+
export type PersistentRunStatus = 'running' | 'completed' | 'failed';
|
|
146
|
+
export interface PersistentRunMessageRecord {
|
|
147
|
+
timestamp: string;
|
|
148
|
+
direction: 'sent' | 'received';
|
|
149
|
+
text: string;
|
|
150
|
+
turns?: number;
|
|
151
|
+
totalCostUsd?: number;
|
|
152
|
+
inputTokens?: number;
|
|
153
|
+
outputTokens?: number;
|
|
154
|
+
}
|
|
155
|
+
export interface PersistentRunActionRecord {
|
|
156
|
+
timestamp: string;
|
|
157
|
+
type: 'git_diff' | 'git_commit' | 'git_reset' | 'compact' | 'clear';
|
|
158
|
+
result: string;
|
|
159
|
+
}
|
|
160
|
+
export interface PersistentRunRecord {
|
|
161
|
+
id: string;
|
|
162
|
+
cwd: string;
|
|
163
|
+
task: string;
|
|
164
|
+
status: PersistentRunStatus;
|
|
165
|
+
createdAt: string;
|
|
166
|
+
updatedAt: string;
|
|
167
|
+
sessionId: string | null;
|
|
168
|
+
sessionHistory: string[];
|
|
169
|
+
messages: PersistentRunMessageRecord[];
|
|
170
|
+
actions: PersistentRunActionRecord[];
|
|
171
|
+
commits: string[];
|
|
172
|
+
context: SessionContextSnapshot;
|
|
173
|
+
finalSummary?: string;
|
|
174
|
+
}
|
|
175
|
+
export interface PersistentRunResult {
|
|
176
|
+
run: PersistentRunRecord;
|
|
177
|
+
}
|
|
178
|
+
export interface LiveTailEvent {
|
|
179
|
+
type: 'line' | 'error' | 'end';
|
|
180
|
+
sessionId: string;
|
|
181
|
+
data?: unknown;
|
|
182
|
+
rawLine?: string;
|
|
183
|
+
error?: string;
|
|
184
|
+
}
|
|
185
|
+
export interface ToolOutputPreview {
|
|
186
|
+
toolUseId: string;
|
|
187
|
+
content: string;
|
|
188
|
+
isError: boolean;
|
|
189
|
+
}
|
|
190
|
+
export interface ToolApprovalRule {
|
|
191
|
+
id: string;
|
|
192
|
+
description?: string;
|
|
193
|
+
/** Tool name — exact match or glob with * wildcard */
|
|
194
|
+
toolPattern: string;
|
|
195
|
+
/** Optional substring match against JSON-serialized tool input */
|
|
196
|
+
inputPattern?: string;
|
|
197
|
+
action: 'allow' | 'deny';
|
|
198
|
+
denyMessage?: string;
|
|
199
|
+
}
|
|
200
|
+
export interface ToolApprovalPolicy {
|
|
201
|
+
rules: ToolApprovalRule[];
|
|
202
|
+
defaultAction: 'allow' | 'deny';
|
|
203
|
+
defaultDenyMessage?: string;
|
|
204
|
+
enabled: boolean;
|
|
205
|
+
}
|
|
206
|
+
export interface ToolApprovalDecision {
|
|
207
|
+
timestamp: string;
|
|
208
|
+
toolName: string;
|
|
209
|
+
inputPreview: string;
|
|
210
|
+
title?: string;
|
|
211
|
+
matchedRuleId: string;
|
|
212
|
+
action: 'allow' | 'deny';
|
|
213
|
+
denyMessage?: string;
|
|
214
|
+
agentId?: string;
|
|
215
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
export async function writeJsonAtomically(filePath, data) {
|
|
4
|
+
const tempPath = `${filePath}.${randomUUID()}.tmp`;
|
|
5
|
+
await fs.writeFile(tempPath, `${JSON.stringify(data, null, 2)}\n`, 'utf8');
|
|
6
|
+
await fs.rename(tempPath, filePath);
|
|
7
|
+
}
|
|
8
|
+
export function isFileNotFoundError(error) {
|
|
9
|
+
return (error instanceof Error &&
|
|
10
|
+
'code' in error &&
|
|
11
|
+
error.code === 'ENOENT');
|
|
12
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ClaudeSessionEvent } from '../types/contracts.js';
|
|
2
|
+
export declare function stripTrailingPartials(events: ClaudeSessionEvent[]): ClaudeSessionEvent[];
|
|
3
|
+
/**
|
|
4
|
+
* Append transcript events for run-state persistence: at most one trailing
|
|
5
|
+
* `partial`, dropped whenever a non-partial event is appended.
|
|
6
|
+
*/
|
|
7
|
+
export declare function appendTranscriptEvents(events: ClaudeSessionEvent[], incoming: ClaudeSessionEvent[]): ClaudeSessionEvent[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export function stripTrailingPartials(events) {
|
|
2
|
+
let end = events.length;
|
|
3
|
+
while (end > 0 && events[end - 1].type === 'partial') {
|
|
4
|
+
end -= 1;
|
|
5
|
+
}
|
|
6
|
+
return end === events.length ? events : events.slice(0, end);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Append transcript events for run-state persistence: at most one trailing
|
|
10
|
+
* `partial`, dropped whenever a non-partial event is appended.
|
|
11
|
+
*/
|
|
12
|
+
export function appendTranscriptEvents(events, incoming) {
|
|
13
|
+
let next = events;
|
|
14
|
+
for (const event of incoming) {
|
|
15
|
+
if (event.type === 'partial') {
|
|
16
|
+
if (next.length > 0 && next[next.length - 1].type === 'partial') {
|
|
17
|
+
next = [...next.slice(0, -1), event];
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
next = [...next, event];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
next = stripTrailingPartials(next);
|
|
25
|
+
next = [...next, event];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return next;
|
|
29
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@doingdev/opencode-claude-manager-plugin",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.1.25",
|
|
4
|
+
"description": "OpenCode plugin that orchestrates Claude Code sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"opencode",
|
|
7
7
|
"plugin",
|
|
@@ -29,7 +29,10 @@
|
|
|
29
29
|
"node": ">=22.0.0"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@
|
|
32
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.81",
|
|
33
|
+
"@opencode-ai/plugin": "^1.2.27",
|
|
34
|
+
"json5": "^2.2.3",
|
|
35
|
+
"zod": "^4.1.8"
|
|
33
36
|
},
|
|
34
37
|
"devDependencies": {
|
|
35
38
|
"@eslint/js": "^9.22.0",
|