feat(hooks): enhance prometheus-md-only with better patterns
Add more comprehensive markdown-only file patterns for Prometheus planning agent. Extend test coverage for new patterns. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
parent
72098213ee
commit
440e53ad9d
@ -30,3 +30,48 @@ Return your findings and recommendations. The actual implementation will be hand
|
||||
---
|
||||
|
||||
`
|
||||
|
||||
export const PROMETHEUS_WORKFLOW_REMINDER = `
|
||||
|
||||
---
|
||||
|
||||
${createSystemDirective(SystemDirectiveTypes.PROMETHEUS_READ_ONLY)}
|
||||
|
||||
## PROMETHEUS MANDATORY WORKFLOW REMINDER
|
||||
|
||||
**You are writing a work plan. STOP AND VERIFY you completed ALL steps:**
|
||||
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ PROMETHEUS WORKFLOW │
|
||||
├──────┬──────────────────────────────────────────────────────────────┤
|
||||
│ 1 │ INTERVIEW: Full consultation with user │
|
||||
│ │ - Gather ALL requirements │
|
||||
│ │ - Clarify ambiguities │
|
||||
│ │ - Record decisions to .sisyphus/drafts/ │
|
||||
├──────┼──────────────────────────────────────────────────────────────┤
|
||||
│ 2 │ METIS CONSULTATION: Pre-generation gap analysis │
|
||||
│ │ - delegate_task(agent="Metis (Plan Consultant)", ...) │
|
||||
│ │ - Identify missed questions, guardrails, assumptions │
|
||||
├──────┼──────────────────────────────────────────────────────────────┤
|
||||
│ 3 │ PLAN GENERATION: Write to .sisyphus/plans/*.md │
|
||||
│ │ <- YOU ARE HERE │
|
||||
├──────┼──────────────────────────────────────────────────────────────┤
|
||||
│ 4 │ MOMUS REVIEW (if high accuracy requested) │
|
||||
│ │ - delegate_task(agent="Momus (Plan Reviewer)", ...) │
|
||||
│ │ - Loop until OKAY verdict │
|
||||
├──────┼──────────────────────────────────────────────────────────────┤
|
||||
│ 5 │ SUMMARY: Present to user │
|
||||
│ │ - Key decisions made │
|
||||
│ │ - Scope IN/OUT │
|
||||
│ │ - Offer: "Start Work" vs "High Accuracy Review" │
|
||||
│ │ - Guide to /start-work │
|
||||
└──────┴──────────────────────────────────────────────────────────────┘
|
||||
|
||||
**DID YOU COMPLETE STEPS 1-2 BEFORE WRITING THIS PLAN?**
|
||||
**AFTER WRITING, WILL YOU DO STEPS 4-5?**
|
||||
|
||||
If you skipped steps, STOP NOW. Go back and complete them.
|
||||
|
||||
---
|
||||
|
||||
`
|
||||
|
||||
@ -82,6 +82,47 @@ describe("prometheus-md-only", () => {
|
||||
).resolves.toBeUndefined()
|
||||
})
|
||||
|
||||
test("should inject workflow reminder when Prometheus writes to .sisyphus/plans/", async () => {
|
||||
// #given
|
||||
const hook = createPrometheusMdOnlyHook(createMockPluginInput())
|
||||
const input = {
|
||||
tool: "Write",
|
||||
sessionID: TEST_SESSION_ID,
|
||||
callID: "call-1",
|
||||
}
|
||||
const output: { args: Record<string, unknown>; message?: string } = {
|
||||
args: { filePath: "/tmp/test/.sisyphus/plans/work-plan.md" },
|
||||
}
|
||||
|
||||
// #when
|
||||
await hook["tool.execute.before"](input, output)
|
||||
|
||||
// #then
|
||||
expect(output.message).toContain("PROMETHEUS MANDATORY WORKFLOW REMINDER")
|
||||
expect(output.message).toContain("INTERVIEW")
|
||||
expect(output.message).toContain("METIS CONSULTATION")
|
||||
expect(output.message).toContain("MOMUS REVIEW")
|
||||
})
|
||||
|
||||
test("should NOT inject workflow reminder for .sisyphus/drafts/", async () => {
|
||||
// #given
|
||||
const hook = createPrometheusMdOnlyHook(createMockPluginInput())
|
||||
const input = {
|
||||
tool: "Write",
|
||||
sessionID: TEST_SESSION_ID,
|
||||
callID: "call-1",
|
||||
}
|
||||
const output: { args: Record<string, unknown>; message?: string } = {
|
||||
args: { filePath: "/tmp/test/.sisyphus/drafts/notes.md" },
|
||||
}
|
||||
|
||||
// #when
|
||||
await hook["tool.execute.before"](input, output)
|
||||
|
||||
// #then
|
||||
expect(output.message).toBeUndefined()
|
||||
})
|
||||
|
||||
test("should block Prometheus from writing .md files outside .sisyphus/", async () => {
|
||||
// #given
|
||||
const hook = createPrometheusMdOnlyHook(createMockPluginInput())
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import type { PluginInput } from "@opencode-ai/plugin"
|
||||
import { existsSync, readdirSync } from "node:fs"
|
||||
import { join, resolve, relative, isAbsolute } from "node:path"
|
||||
import { HOOK_NAME, PROMETHEUS_AGENTS, ALLOWED_EXTENSIONS, ALLOWED_PATH_PREFIX, BLOCKED_TOOLS, PLANNING_CONSULT_WARNING } from "./constants"
|
||||
import { HOOK_NAME, PROMETHEUS_AGENTS, ALLOWED_EXTENSIONS, ALLOWED_PATH_PREFIX, BLOCKED_TOOLS, PLANNING_CONSULT_WARNING, PROMETHEUS_WORKFLOW_REMINDER } from "./constants"
|
||||
import { findNearestMessageWithFields, findFirstMessageWithAgent, MESSAGE_STORAGE } from "../../features/hook-message-injector"
|
||||
import { getSessionAgent } from "../../features/claude-code-session-state"
|
||||
import { log } from "../../shared/logger"
|
||||
@ -125,6 +125,17 @@ export function createPrometheusMdOnlyHook(ctx: PluginInput) {
|
||||
)
|
||||
}
|
||||
|
||||
const normalizedPath = filePath.toLowerCase().replace(/\\/g, "/")
|
||||
if (normalizedPath.includes(".sisyphus/plans/") || normalizedPath.includes(".sisyphus\\plans\\")) {
|
||||
log(`[${HOOK_NAME}] Injecting workflow reminder for plan write`, {
|
||||
sessionID: input.sessionID,
|
||||
tool: toolName,
|
||||
filePath,
|
||||
agent: agentName,
|
||||
})
|
||||
output.message = (output.message || "") + PROMETHEUS_WORKFLOW_REMINDER
|
||||
}
|
||||
|
||||
log(`[${HOOK_NAME}] Allowed: .sisyphus/*.md write permitted`, {
|
||||
sessionID: input.sessionID,
|
||||
tool: toolName,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user