pantheon-opencode 1.5.1 → 1.6.0-beta.1
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/.pantheon/code-mode/README.md +4 -2
- package/.pantheon/code-mode/checkpoint_session.py +138 -102
- package/.pantheon/code-mode/compress-inline.py +102 -57
- package/.pantheon/code-mode/manifest.json +2 -8
- package/CHANGELOG.md +22 -0
- package/README.md +86 -52
- package/README.pt-BR.md +63 -43
- package/commands/pantheon-optimize.md +2 -2
- package/package.json +13 -1
- package/plugin.json +1 -1
- package/pyproject.toml +8 -15
- package/scripts/build-agents-md.mjs +2 -2
- package/scripts/check-plugin-v2-coverage.mjs +213 -0
- package/scripts/ci-validate-yaml.py +7 -5
- package/scripts/code_mode_server.py +116 -24
- package/scripts/doctor.mjs +85 -28
- package/scripts/install/cli-ui.mjs +1 -1
- package/scripts/install/config-migration.mjs +2 -2
- package/scripts/install/health-check.mjs +6 -19
- package/scripts/install/interactive.mjs +6 -6
- package/scripts/install/migrate.mjs +1 -1
- package/scripts/install/state.mjs +27 -2
- package/scripts/mcp_persistence_server.py +390 -76
- package/scripts/memory_mcp_server.py +370 -196
- package/scripts/postinstall.mjs +0 -7
- package/scripts/probe-context-rehydrate.mjs +28 -11
- package/scripts/prune.mjs +2 -2
- package/scripts/sync-tui.mjs +11 -5
- package/scripts/test-opencode-v2-sandbox.sh +1759 -0
- package/scripts/validate-routing.mjs +40 -0
- package/skills-lock.json +9 -10
- package/src/agents/mnemosyne.md +15 -16
- package/src/agents/zeus.md +1 -2
- package/src/mcp/code_mode_server.py +116 -24
- package/src/mcp/mcp_codemap_module.py +559 -129
- package/src/mcp/mcp_persistence_server.py +390 -76
- package/src/mcp/memory_mcp_server.py +371 -248
- package/src/mcp/pantheon_vision_server.py +136 -24
- package/src/mcp/requirements-mcp.txt +5 -3
- package/src/mcp/requirements-vision.txt +2 -0
- package/src/pantheon/model-command.ts +18 -7
- package/src/pantheon/todo-enforcer.ts +1 -1
- package/src/pantheon/vision.ts +1 -1
- package/src/plugin-v2.ts +134 -104
- package/src/plugins/tui/dist/tui.js +1 -1
- package/src/plugins/tui/package-lock.json +20 -20
- package/src/plugins/tui/package.json +12 -12
- package/src/routing.yml +0 -1
- package/src/skills/README.md +31 -36
- package/src/skills/auto-continue/SKILL.md +25 -75
- package/.pantheon/code-mode/eval-llm-judge.py +0 -255
- package/.pantheon/code-mode/eval-monte-carlo.py +0 -368
- package/.pantheon/code-mode/eval-run.py +0 -197
- package/.pantheon/code-mode/eval-static.py +0 -321
- package/.pantheon/code-mode/session-end-save.py +0 -186
- package/.pantheon/code-mode/session-end-save.sh +0 -18
- package/scripts/recover-zenodo-deposition.mjs +0 -146
- package/scripts/test-opencode-v1-v2-sandbox.sh +0 -862
- package/scripts/validate-zenodo-release.mjs +0 -154
- package/scripts/zenodo-artifact.mjs +0 -21
- package/scripts/zenodo-release-state.mjs +0 -53
- package/src/skills/orchestration-workflow/SKILL.md +0 -311
package/src/plugin-v2.ts
CHANGED
|
@@ -4,27 +4,38 @@
|
|
|
4
4
|
* Registers:
|
|
5
5
|
* - 6 orchestration tools via V2 tool.transform (with V1 bridge fallback)
|
|
6
6
|
* - 4 event subscriptions (session.created, idle, error, compacted)
|
|
7
|
-
* - Session hooks (prompt, context) and tool hooks (execute.before/after)
|
|
7
|
+
* - Session hooks (prompt, context, compaction) and tool hooks (execute.before/after)
|
|
8
8
|
* - Permission hooks for custom authorization
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
* ctx.
|
|
12
|
-
* ctx.tool.
|
|
10
|
+
* The transitional SDK types used here expose these domains:
|
|
11
|
+
* ctx.agent / ctx.command / ctx.model / ctx.reference / ctx.skill /
|
|
12
|
+
* ctx.tool / ctx.event / ctx.permission / ctx.session
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* A separate OpenCode 2.0.18 host runtime probe confirmed ctx.integration and
|
|
15
|
+
* ctx.skill have callable `.transform` methods; only ctx.catalog was absent.
|
|
16
|
+
* The probe's callback effects were
|
|
17
|
+
* not observed for any domain. This runtime probe is not an SDK compatibility
|
|
18
|
+
* claim. Pantheon's Phase 1/config transform
|
|
19
|
+
* registrations cover agent, command, and reference; `ctx.tool.transform` is
|
|
20
|
+
* attempted separately in Phase 2. Integration and skill transform callbacks
|
|
21
|
+
* are not registered by Pantheon, so their effects remain unproven. The
|
|
22
|
+
* narrower `SkillEditor.source()` helper is absent from the inspected SDK
|
|
23
|
+
* editor shape, so directory-source registration remains unsupported; that
|
|
24
|
+
* does not imply that `ctx.skill` or its transform is absent.
|
|
25
|
+
*
|
|
26
|
+
* V2_UNSUPPORTED_FEATURES distinguishes adapter limitations from observed
|
|
27
|
+
* host-absent APIs; setup handles optional registrations on a best-effort basis.
|
|
16
28
|
*
|
|
17
29
|
* @module plugin-v2
|
|
18
30
|
*/
|
|
19
31
|
|
|
32
|
+
import { appendFileSync } from 'node:fs'
|
|
20
33
|
import { fileURLToPath } from 'node:url'
|
|
21
34
|
import type {
|
|
22
35
|
AgentDraft,
|
|
23
|
-
CatalogDraft,
|
|
24
36
|
CommandDraft,
|
|
25
37
|
PluginContext,
|
|
26
38
|
ReferenceDraft,
|
|
27
|
-
SkillDraft,
|
|
28
39
|
} from '@opencode-ai/plugin/v2/promise'
|
|
29
40
|
import { define } from '@opencode-ai/plugin/v2/promise'
|
|
30
41
|
import {
|
|
@@ -36,34 +47,53 @@ import {
|
|
|
36
47
|
// ─── Unsupported Features Registry ───────────────────────────────────────
|
|
37
48
|
|
|
38
49
|
/**
|
|
39
|
-
* Features not
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* additional features are appended during setup if their API is missing.
|
|
50
|
+
* Features not implemented by the current Pantheon V2 adapter or absent from
|
|
51
|
+
* the observed host. A listed feature is not necessarily a host-absent API.
|
|
52
|
+
* Additional features are appended during setup when a required API is missing.
|
|
43
53
|
*/
|
|
44
|
-
export const V2_UNSUPPORTED_FEATURES: string[] = [
|
|
54
|
+
export const V2_UNSUPPORTED_FEATURES: string[] = [
|
|
55
|
+
'legacy-hooks',
|
|
56
|
+
// `catalog` alone was absent in the OpenCode 2.0.18 runtime probe.
|
|
57
|
+
'catalog-transform',
|
|
58
|
+
// The host exposes callable transforms for integration and skill, but
|
|
59
|
+
// Pantheon does not register/use them and no host callback effects were
|
|
60
|
+
// observed. These entries describe adapter support, not host availability.
|
|
61
|
+
'integration-transform',
|
|
62
|
+
// The inspected SkillEditor shape has no `source()` helper for adding a
|
|
63
|
+
// directory source. This is narrower than (and distinct from) ctx.skill's
|
|
64
|
+
// host availability or callable transform.
|
|
65
|
+
'skill-transform',
|
|
66
|
+
]
|
|
45
67
|
|
|
46
68
|
// ─── Constants ───────────────────────────────────────────────────────────
|
|
47
69
|
|
|
48
70
|
const POLICY_MARKER = '<!-- pantheon-v2-policy -->'
|
|
49
71
|
const POLICY = `${POLICY_MARKER}\nFollow Pantheon routing policy: delegate implementation work to the named specialist and do not claim work was performed without verification.`
|
|
50
72
|
|
|
73
|
+
/** 2.0.16 `system` on a session hook payload is `Array<SystemPart>`. */
|
|
74
|
+
interface SystemPart {
|
|
75
|
+
type: 'text'
|
|
76
|
+
text: string
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function isTextPart(entry: unknown): entry is SystemPart {
|
|
80
|
+
return (
|
|
81
|
+
typeof entry === 'object' &&
|
|
82
|
+
entry !== null &&
|
|
83
|
+
typeof (entry as { text?: unknown }).text === 'string'
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
|
|
51
87
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* Never throws
|
|
88
|
+
* Extract text from a `system` entry. The host's own coercion accepts a bare
|
|
89
|
+
* string, but the canonical 2.0.16 shape is `{ type: 'text', text }`; the
|
|
90
|
+
* string branch is retained so the handler still works against a host that
|
|
91
|
+
* sends primitives. Never throws.
|
|
56
92
|
*/
|
|
57
93
|
function systemEntryText(entry: unknown): string | null {
|
|
58
94
|
try {
|
|
59
95
|
if (typeof entry === 'string') return entry
|
|
60
|
-
if (
|
|
61
|
-
typeof entry === 'object' &&
|
|
62
|
-
entry !== null &&
|
|
63
|
-
typeof (entry as { text?: unknown }).text === 'string'
|
|
64
|
-
) {
|
|
65
|
-
return (entry as { text: string }).text
|
|
66
|
-
}
|
|
96
|
+
if (isTextPart(entry)) return entry.text
|
|
67
97
|
return null
|
|
68
98
|
} catch {
|
|
69
99
|
return null
|
|
@@ -81,19 +111,30 @@ function hasPolicyMarker(arr: unknown[]): boolean {
|
|
|
81
111
|
}
|
|
82
112
|
}
|
|
83
113
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
114
|
+
/**
|
|
115
|
+
* Normalize a `system` value to the 2.0.16 `Array<SystemPart>` shape.
|
|
116
|
+
*
|
|
117
|
+
* `SessionContext.system` is `Array<SystemPart>` where a part is
|
|
118
|
+
* `{ type: 'text', text }`. A raw string (the whole value, or an element) is
|
|
119
|
+
* not that shape, so it is upgraded: element strings become parts, and a bare
|
|
120
|
+
* string value becomes a one-element part array. Non-array, non-string values
|
|
121
|
+
* are returned unchanged.
|
|
122
|
+
*
|
|
123
|
+
* Returns the normalized array, or `null` when `system` is neither a string
|
|
124
|
+
* nor an array (nothing to normalize).
|
|
125
|
+
*/
|
|
126
|
+
function normalizeSystemToParts(system: unknown): unknown[] | null {
|
|
127
|
+
if (typeof system === 'string') {
|
|
128
|
+
return [{ type: 'text', text: system } satisfies SystemPart]
|
|
92
129
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
130
|
+
if (!Array.isArray(system)) return null
|
|
131
|
+
for (let i = 0; i < system.length; i++) {
|
|
132
|
+
const entry = system[i]
|
|
133
|
+
if (typeof entry === 'string') {
|
|
134
|
+
system[i] = { type: 'text', text: entry } satisfies SystemPart
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return system
|
|
97
138
|
}
|
|
98
139
|
|
|
99
140
|
/**
|
|
@@ -191,16 +232,6 @@ function transformAgents(draft: AgentDraft): void {
|
|
|
191
232
|
}
|
|
192
233
|
}
|
|
193
234
|
|
|
194
|
-
function transformCatalog(draft: CatalogDraft, options: PluginContext['options']): void {
|
|
195
|
-
const configured = options.default_model
|
|
196
|
-
if (typeof configured !== 'string') return
|
|
197
|
-
const separator = configured.indexOf('/')
|
|
198
|
-
if (separator <= 0 || separator === configured.length - 1) return
|
|
199
|
-
const providerID = configured.slice(0, separator)
|
|
200
|
-
const modelID = configured.slice(separator + 1)
|
|
201
|
-
if (draft.model.get(providerID, modelID)) draft.model.default.set(providerID, modelID)
|
|
202
|
-
}
|
|
203
|
-
|
|
204
235
|
function transformCommands(draft: CommandDraft): void {
|
|
205
236
|
// Beta 19192 guard (issue #92): draft may not have `list`, or list()
|
|
206
237
|
// may return a non-iterable. Never throw — mark unsupported and return.
|
|
@@ -237,41 +268,6 @@ function transformCommands(draft: CommandDraft): void {
|
|
|
237
268
|
}
|
|
238
269
|
}
|
|
239
270
|
|
|
240
|
-
function transformSkills(draft: SkillDraft): void {
|
|
241
|
-
// Beta 19192 guard (issue #92): draft may not have `list`, or list()
|
|
242
|
-
// may return a non-iterable. Never throw — mark unsupported and return.
|
|
243
|
-
let sources: Array<{ type: string; path: string }>
|
|
244
|
-
try {
|
|
245
|
-
const maybeList = (draft as unknown as { list?: unknown }).list
|
|
246
|
-
if (typeof maybeList !== 'function') {
|
|
247
|
-
markUnsupported('skill-transform-list')
|
|
248
|
-
return
|
|
249
|
-
}
|
|
250
|
-
const result = (maybeList as (this: unknown) => unknown).call(draft)
|
|
251
|
-
if (
|
|
252
|
-
result == null ||
|
|
253
|
-
typeof (result as { [Symbol.iterator]?: unknown })[Symbol.iterator] !== 'function'
|
|
254
|
-
) {
|
|
255
|
-
markUnsupported('skill-transform-list')
|
|
256
|
-
return
|
|
257
|
-
}
|
|
258
|
-
sources = Array.isArray(result)
|
|
259
|
-
? (result as Array<{ type: string; path: string }>)
|
|
260
|
-
: Array.from(result as Iterable<{ type: string; path: string }>)
|
|
261
|
-
} catch {
|
|
262
|
-
markUnsupported('skill-transform-list')
|
|
263
|
-
return
|
|
264
|
-
}
|
|
265
|
-
try {
|
|
266
|
-
const path = fileURLToPath(new URL('./skills', import.meta.url))
|
|
267
|
-
if (!sources.some((source) => source.type === 'directory' && source.path === path)) {
|
|
268
|
-
draft.source({ type: 'directory', path })
|
|
269
|
-
}
|
|
270
|
-
} catch {
|
|
271
|
-
markUnsupported('skill-transform')
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
271
|
function transformReferences(draft: ReferenceDraft): void {
|
|
276
272
|
draft.add('pantheon-agents', {
|
|
277
273
|
type: 'local',
|
|
@@ -453,21 +449,32 @@ async function registerV2SessionHooks(context: PluginContext): Promise<boolean>
|
|
|
453
449
|
// "context" hook — inject routing policy + compaction state
|
|
454
450
|
await sessionCtx.hook('context', (event: unknown) => {
|
|
455
451
|
try {
|
|
456
|
-
//
|
|
457
|
-
//
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
if (!hasPolicyMarker(rawSystem)) {
|
|
467
|
-
rawSystem.push(toSystemEntry(POLICY, usesObjectShape(rawSystem)))
|
|
452
|
+
// Opt-in lifetime proof for the host-backed hook canary (MODE=real).
|
|
453
|
+
// Inert unless PANTHEON_HOOK_CANARY_LIFETIME_PROOF is set.
|
|
454
|
+
if (process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF) {
|
|
455
|
+
try {
|
|
456
|
+
appendFileSync(
|
|
457
|
+
process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF,
|
|
458
|
+
'plugin-v2:session.hook:context\n',
|
|
459
|
+
)
|
|
460
|
+
} catch {
|
|
461
|
+
// Best-effort instrumentation.
|
|
468
462
|
}
|
|
469
463
|
}
|
|
470
|
-
//
|
|
464
|
+
// 2.0.16 payload is `{ system: Array<SystemPart> }`. Normalize any
|
|
465
|
+
// string entries to `{ type: 'text', text }` parts and append the
|
|
466
|
+
// policy as a part. Junk entries are ignored; a non-array,
|
|
467
|
+
// non-string system is left untouched. Never throws (fail-open).
|
|
468
|
+
const ctx = event as { system?: unknown } | null | undefined
|
|
469
|
+
if (ctx == null) return
|
|
470
|
+
const normalized = normalizeSystemToParts(ctx.system)
|
|
471
|
+
if (normalized == null) return
|
|
472
|
+
// A bare string is replaced by its part array; an array is mutated in
|
|
473
|
+
// place (the host may read the original reference).
|
|
474
|
+
if (typeof ctx.system === 'string') ctx.system = normalized
|
|
475
|
+
if (!hasPolicyMarker(normalized)) {
|
|
476
|
+
normalized.push({ type: 'text', text: POLICY } satisfies SystemPart)
|
|
477
|
+
}
|
|
471
478
|
} catch {
|
|
472
479
|
// Fail-open: never throw to the host.
|
|
473
480
|
}
|
|
@@ -699,17 +706,19 @@ export const plugin = define({
|
|
|
699
706
|
|
|
700
707
|
async setup(context: PluginContext): Promise<void> {
|
|
701
708
|
// ─── Phase 1: V2 Transforms (isolated per-domain, best-effort) ────
|
|
702
|
-
// Each
|
|
703
|
-
//
|
|
704
|
-
// reject setup()
|
|
709
|
+
// Each transform registration is individually wrapped and settled via Promise.allSettled:
|
|
710
|
+
// a rejection marks only that transform unsupported
|
|
711
|
+
// and does not reject setup() or prevent later hook registrations.
|
|
705
712
|
// See issue #92.
|
|
713
|
+
//
|
|
714
|
+
// Pantheon's Phase 1/config transform registrations cover agent, command,
|
|
715
|
+
// and reference; ctx.tool.transform is attempted separately in Phase 2.
|
|
716
|
+
// The 2.0.18 runtime probe found ctx.integration and ctx.skill with
|
|
717
|
+
// callable transforms, but no callback effects were observed; neither is
|
|
718
|
+
// registered here. Only ctx.catalog was absent in that probe.
|
|
719
|
+
// The hook canary tests hook firing only, not transform callback effects.
|
|
706
720
|
const phase1Transforms: Array<{ feature: string; register: () => Promise<unknown> }> = [
|
|
707
721
|
{ feature: 'agent-transform', register: () => context.agent.transform(transformAgents) },
|
|
708
|
-
{
|
|
709
|
-
feature: 'catalog-transform',
|
|
710
|
-
register: () =>
|
|
711
|
-
context.catalog.transform((draft) => transformCatalog(draft, context.options)),
|
|
712
|
-
},
|
|
713
722
|
{
|
|
714
723
|
feature: 'command-transform',
|
|
715
724
|
register: () => context.command.transform(transformCommands),
|
|
@@ -718,7 +727,6 @@ export const plugin = define({
|
|
|
718
727
|
feature: 'reference-transform',
|
|
719
728
|
register: () => context.reference.transform(transformReferences),
|
|
720
729
|
},
|
|
721
|
-
{ feature: 'skill-transform', register: () => context.skill.transform(transformSkills) },
|
|
722
730
|
]
|
|
723
731
|
const phase1Results = await Promise.allSettled(
|
|
724
732
|
phase1Transforms.map((t) => Promise.resolve().then(() => t.register())),
|
|
@@ -771,9 +779,31 @@ export const plugin = define({
|
|
|
771
779
|
| undefined
|
|
772
780
|
if (compactionCtx?.hook) {
|
|
773
781
|
try {
|
|
774
|
-
|
|
782
|
+
// 2.0.16 `SessionHooks` key is `compaction` (the migration doc maps
|
|
783
|
+
// `experimental.session.compacting` → `ctx.session.hook("compaction")`).
|
|
784
|
+
// `compacting` is not a valid key: the registry accepts any string and
|
|
785
|
+
// silently drops unknown names, so the old name was a permanent no-op.
|
|
786
|
+
// Proven by the canary's negative control.
|
|
787
|
+
await compactionCtx.hook('compaction', (_event: unknown) => {
|
|
775
788
|
// Compaction context build — injects active goals, pending todos,
|
|
776
789
|
// and in-flight delegations. Wired through V1 infrastructure.
|
|
790
|
+
//
|
|
791
|
+
// Opt-in lifetime proof for the host-backed hook canary
|
|
792
|
+
// (tests/pantheon/plugin-v2-hook-canary.test.mjs, MODE=real). It is
|
|
793
|
+
// inert unless PANTHEON_HOOK_CANARY_LIFETIME_PROOF is set, so
|
|
794
|
+
// production behaviour is unchanged. This exists because a rename to
|
|
795
|
+
// `compacting` was a silent no-op for an unknown length of time: the
|
|
796
|
+
// canary can now observe that THIS registration fired.
|
|
797
|
+
if (process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF) {
|
|
798
|
+
try {
|
|
799
|
+
appendFileSync(
|
|
800
|
+
process.env.PANTHEON_HOOK_CANARY_LIFETIME_PROOF,
|
|
801
|
+
'plugin-v2:session.hook:compaction\n',
|
|
802
|
+
)
|
|
803
|
+
} catch {
|
|
804
|
+
// Proof is best-effort: never let instrumentation break the host.
|
|
805
|
+
}
|
|
806
|
+
}
|
|
777
807
|
})
|
|
778
808
|
} catch {
|
|
779
809
|
markUnsupported('compaction-hook')
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pantheon-tui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0-beta.1",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pantheon-tui",
|
|
9
|
-
"version": "1.
|
|
9
|
+
"version": "1.6.0-beta.1",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@opencode-ai/plugin": "
|
|
13
|
-
"@opentui/core": "
|
|
14
|
-
"@opentui/solid": "
|
|
15
|
-
"solid-js": "
|
|
12
|
+
"@opencode-ai/plugin": "1.18.30",
|
|
13
|
+
"@opentui/core": "0.5.10",
|
|
14
|
+
"@opentui/solid": "0.5.10",
|
|
15
|
+
"solid-js": "1.9.12"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"rolldown-plugin-solid": "
|
|
19
|
-
"tsdown": "
|
|
18
|
+
"rolldown-plugin-solid": "0.2.1",
|
|
19
|
+
"tsdown": "0.22.14"
|
|
20
20
|
},
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@opencode-ai/plugin": "
|
|
26
|
-
"@opencode-ai/sdk": "
|
|
27
|
-
"@opentui/core": "
|
|
28
|
-
"@opentui/solid": "
|
|
29
|
-
"solid-js": "
|
|
25
|
+
"@opencode-ai/plugin": "1.18.30",
|
|
26
|
+
"@opencode-ai/sdk": "1.18.30",
|
|
27
|
+
"@opentui/core": "0.5.10",
|
|
28
|
+
"@opentui/solid": "0.5.10",
|
|
29
|
+
"solid-js": "1.9.12"
|
|
30
30
|
}
|
|
31
31
|
},
|
|
32
32
|
"node_modules/@ai-sdk/provider": {
|
|
@@ -626,13 +626,13 @@
|
|
|
626
626
|
}
|
|
627
627
|
},
|
|
628
628
|
"node_modules/@opencode-ai/plugin": {
|
|
629
|
-
"version": "1.18.
|
|
630
|
-
"resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.
|
|
631
|
-
"integrity": "sha512-
|
|
629
|
+
"version": "1.18.30",
|
|
630
|
+
"resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.18.30.tgz",
|
|
631
|
+
"integrity": "sha512-bXWcA2VD478PXXke1qAYANTq58fCcbgY0GAUqZIFZqPpo48FoG8RH37nNZ78eHtz+ddiKIhFTBZJRaHF3IgFqw==",
|
|
632
632
|
"license": "MIT",
|
|
633
633
|
"dependencies": {
|
|
634
634
|
"@ai-sdk/provider": "3.0.8",
|
|
635
|
-
"@opencode-ai/sdk": "1.18.
|
|
635
|
+
"@opencode-ai/sdk": "1.18.30",
|
|
636
636
|
"effect": "4.0.0-beta.83",
|
|
637
637
|
"zod": "4.1.8"
|
|
638
638
|
},
|
|
@@ -654,9 +654,9 @@
|
|
|
654
654
|
}
|
|
655
655
|
},
|
|
656
656
|
"node_modules/@opencode-ai/sdk": {
|
|
657
|
-
"version": "1.18.
|
|
658
|
-
"resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.
|
|
659
|
-
"integrity": "sha512-
|
|
657
|
+
"version": "1.18.30",
|
|
658
|
+
"resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.18.30.tgz",
|
|
659
|
+
"integrity": "sha512-uviJ+PZLc/D1szt33WGzzt/rqJ+IaNmRGBb+UcOXrcQANl8XXKJrp4CNQQ2UAnUJ3Ek+VqcamIwjtKHUW/OjOQ==",
|
|
660
660
|
"license": "MIT",
|
|
661
661
|
"dependencies": {
|
|
662
662
|
"cross-spawn": "7.0.6"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pantheon-tui",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.6.0-beta.1",
|
|
5
5
|
"description": "Pantheon TUI plugin — sidebar (version, preset, sessions, real-time delegations) + AI subscription usage gauges incl. OpenCode Go/Zen dollar limits (vendored, MIT)",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"engines": {
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
"typecheck": "tsc --noEmit"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
|
-
"@opencode-ai/plugin": "
|
|
24
|
-
"@opencode-ai/sdk": "
|
|
25
|
-
"@opentui/core": "
|
|
26
|
-
"@opentui/solid": "
|
|
27
|
-
"solid-js": "
|
|
23
|
+
"@opencode-ai/plugin": "1.18.30",
|
|
24
|
+
"@opencode-ai/sdk": "1.18.30",
|
|
25
|
+
"@opentui/core": "0.5.10",
|
|
26
|
+
"@opentui/solid": "0.5.10",
|
|
27
|
+
"solid-js": "1.9.12"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"rolldown-plugin-solid": "
|
|
31
|
-
"tsdown": "
|
|
30
|
+
"rolldown-plugin-solid": "0.2.1",
|
|
31
|
+
"tsdown": "0.22.14"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@opencode-ai/plugin": "
|
|
35
|
-
"@opentui/core": "
|
|
36
|
-
"@opentui/solid": "
|
|
37
|
-
"solid-js": "
|
|
34
|
+
"@opencode-ai/plugin": "1.18.30",
|
|
35
|
+
"@opentui/core": "0.5.10",
|
|
36
|
+
"@opentui/solid": "0.5.10",
|
|
37
|
+
"solid-js": "1.9.12"
|
|
38
38
|
}
|
|
39
39
|
}
|
package/src/routing.yml
CHANGED
package/src/skills/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Skills are reference modules loaded on demand by agents. Each skill provides domain-specific knowledge — architecture patterns, security checklists, optimization strategies, and implementation guides. Agents load skills when their task matches the skill's description, keeping context focused and token-efficient.
|
|
6
6
|
|
|
7
|
-
There are **
|
|
7
|
+
There are **20 skills** divided into **5 domains**.
|
|
8
8
|
|
|
9
9
|
## Skills by Domain
|
|
10
10
|
|
|
@@ -30,75 +30,71 @@ There are **21 skills** divided into **5 domains**.
|
|
|
30
30
|
- Memory bank rules, structure, and optimization — complete guide to Pantheon memory management.
|
|
31
31
|
- Used by: Mnemosyne, Athena
|
|
32
32
|
|
|
33
|
-
6. **
|
|
34
|
-
- Practical step-by-step walkthrough for orchestrating features end-to-end using the multi-agent system, from planning through deployment.
|
|
35
|
-
- Used by: Zeus
|
|
36
|
-
|
|
37
|
-
7. **session-goal** — `session-goal/SKILL.md`
|
|
33
|
+
6. **session-goal** — `session-goal/SKILL.md`
|
|
38
34
|
- Pin session objectives to prevent scope creep across long multi-agent sessions.
|
|
39
35
|
- Used by: Zeus, Mnemosyne
|
|
40
36
|
|
|
41
37
|
### Domain 2: Development Tools
|
|
42
38
|
|
|
43
|
-
|
|
39
|
+
7. **clonedeps** — `clonedeps/SKILL.md`
|
|
44
40
|
- Clones dependency source locally so agents can inspect library internals, understand behavior, and debug integration issues.
|
|
45
41
|
- Used by: Hermes, Hephaestus
|
|
46
42
|
|
|
47
|
-
|
|
43
|
+
8. **git-workflow-and-versioning** — `git-workflow-and-versioning/SKILL.md`
|
|
48
44
|
- Atomic commits, conventional commits, trunk-based development workflow.
|
|
49
45
|
- Used by: Hermes, Prometheus, Iris
|
|
50
46
|
|
|
51
|
-
|
|
47
|
+
9. **incremental-implementation** — `incremental-implementation/SKILL.md`
|
|
52
48
|
- Implement in thin vertical slices — one commit per task, testable, rollback-safe.
|
|
53
49
|
- Used by: Zeus, Hermes, Aphrodite, Demeter, Prometheus, Talos
|
|
54
50
|
|
|
55
|
-
|
|
51
|
+
10. **loop-engineering** — `loop-engineering/SKILL.md`
|
|
56
52
|
- Iterative refinement pattern for complex problems — solve, review, improve, repeat in controlled cycles.
|
|
57
53
|
- Used by: All agents
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
11. **reflect** — `reflect/SKILL.md`
|
|
60
56
|
- Turns repeated workflow friction into reusable skills, agents, or configuration improvements.
|
|
61
57
|
- Used by: All agents
|
|
62
58
|
|
|
63
|
-
|
|
59
|
+
12. **simplify** — `simplify/SKILL.md`
|
|
64
60
|
- Behavior-preserving code simplification for readability, maintainability, and reduced complexity.
|
|
65
61
|
- Used by: All agents
|
|
66
62
|
|
|
67
|
-
|
|
63
|
+
13. **worktrees** — `worktrees/SKILL.md`
|
|
68
64
|
- Git worktrees as safe, isolated coding lanes for risky or parallel work without affecting the main workspace.
|
|
69
65
|
- Used by: All agents
|
|
70
66
|
|
|
71
67
|
### Domain 3: Quality & Security
|
|
72
68
|
|
|
73
|
-
|
|
69
|
+
14. **code-review-checklist** — `code-review-checklist/SKILL.md`
|
|
74
70
|
- Systematic code review with quality gates, security audit, and parallel checks for structured feedback.
|
|
75
71
|
- Used by: Themis
|
|
76
72
|
|
|
77
|
-
|
|
73
|
+
15. **security-hardening** — `security-hardening/SKILL.md`
|
|
78
74
|
- Security gate — OWASP, SAST, secrets detection, MCP hardening, dependency audit.
|
|
79
75
|
- Used by: Themis, Nyx
|
|
80
76
|
|
|
81
|
-
|
|
77
|
+
16. **tdd-with-agents** — `tdd-with-agents/SKILL.md`
|
|
82
78
|
- TDD enforcement with RED→GREEN→REFACTOR cycle and advanced testing patterns across all layers.
|
|
83
79
|
- Used by: Hermes, Aphrodite, Demeter, Themis, Hephaestus
|
|
84
80
|
|
|
85
81
|
### Domain 4: Planning
|
|
86
82
|
|
|
87
|
-
|
|
83
|
+
17. **codemap** — `codemap/SKILL.md`
|
|
88
84
|
- Generates hierarchical repository maps so agents understand codebase structure without re-reading every file.
|
|
89
85
|
- Used by: Apollo, Zeus
|
|
90
86
|
|
|
91
|
-
|
|
87
|
+
18. **spec-driven-development** — `spec-driven-development/SKILL.md`
|
|
92
88
|
- Define requirements via spec-first before any code — PRD, edge cases, acceptance criteria.
|
|
93
89
|
- Used by: Athena
|
|
94
90
|
|
|
95
|
-
|
|
91
|
+
19. **verification-planning** — `verification-planning/SKILL.md`
|
|
96
92
|
- Plans an evidence path before non-trivial changes, ensuring changes are testable and verifiable.
|
|
97
93
|
- Used by: Athena, Zeus
|
|
98
94
|
|
|
99
95
|
### Domain 5: Frontend Development
|
|
100
96
|
|
|
101
|
-
|
|
97
|
+
20. **visual-review-pipeline** — `visual-review-pipeline/SKILL.md`
|
|
102
98
|
- Automated visual review pipeline — Playwright screenshots, self-analysis, fix loop, escalation.
|
|
103
99
|
- Used by: Aphrodite
|
|
104
100
|
|
|
@@ -130,22 +126,21 @@ The `SKILL.md` file contains YAML frontmatter with `name`, `description`, and pl
|
|
|
130
126
|
| 3 | auto-continue | Orchestration & Workflow | Zeus, Apollo, Hephaestus, Nyx, Gaia |
|
|
131
127
|
| 4 | context-compression | Orchestration & Workflow | Zeus, Mnemosyne, Themis |
|
|
132
128
|
| 5 | memory-bank | Orchestration & Workflow | Mnemosyne, Athena |
|
|
133
|
-
| 6 |
|
|
134
|
-
| 7 |
|
|
135
|
-
| 8 |
|
|
136
|
-
| 9 |
|
|
137
|
-
| 10 |
|
|
138
|
-
| 11 |
|
|
139
|
-
| 12 |
|
|
140
|
-
| 13 |
|
|
141
|
-
| 14 |
|
|
142
|
-
| 15 |
|
|
143
|
-
| 16 |
|
|
144
|
-
| 17 |
|
|
145
|
-
| 18 |
|
|
146
|
-
| 19 |
|
|
147
|
-
| 20 |
|
|
148
|
-
| 21 | visual-review-pipeline | Frontend Development | Aphrodite |
|
|
129
|
+
| 6 | session-goal | Orchestration & Workflow | Zeus, Mnemosyne |
|
|
130
|
+
| 7 | clonedeps | Development Tools | Hermes, Hephaestus |
|
|
131
|
+
| 8 | git-workflow-and-versioning | Development Tools | Hermes, Prometheus, Iris |
|
|
132
|
+
| 9 | incremental-implementation | Development Tools | Zeus, Hermes, Aphrodite, Demeter, Prometheus, Talos |
|
|
133
|
+
| 10 | loop-engineering | Development Tools | All agents |
|
|
134
|
+
| 11 | reflect | Development Tools | All agents |
|
|
135
|
+
| 12 | simplify | Development Tools | All agents |
|
|
136
|
+
| 13 | worktrees | Development Tools | All agents |
|
|
137
|
+
| 14 | code-review-checklist | Quality & Security | Themis |
|
|
138
|
+
| 15 | security-hardening | Quality & Security | Themis, Nyx |
|
|
139
|
+
| 16 | tdd-with-agents | Quality & Security | Hermes, Aphrodite, Demeter, Themis, Hephaestus |
|
|
140
|
+
| 17 | codemap | Planning | Apollo, Zeus |
|
|
141
|
+
| 18 | spec-driven-development | Planning | Athena |
|
|
142
|
+
| 19 | verification-planning | Planning | Athena, Zeus |
|
|
143
|
+
| 20 | visual-review-pipeline | Frontend Development | Aphrodite |
|
|
149
144
|
|
|
150
145
|
---
|
|
151
146
|
|