briefops 1.0.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/CHANGELOG.md +36 -0
- package/CODE_OF_CONDUCT.md +13 -0
- package/CONTRIBUTING.md +53 -0
- package/LICENSE +21 -0
- package/README.md +801 -0
- package/SECURITY.md +59 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +54 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/approve.d.ts +2 -0
- package/dist/commands/approve.js +38 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/brief.d.ts +2 -0
- package/dist/commands/brief.js +81 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/codex.d.ts +2 -0
- package/dist/commands/codex.js +163 -0
- package/dist/commands/codex.js.map +1 -0
- package/dist/commands/compare.d.ts +2 -0
- package/dist/commands/compare.js +48 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/continue.d.ts +2 -0
- package/dist/commands/continue.js +66 -0
- package/dist/commands/continue.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +90 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/eval.d.ts +2 -0
- package/dist/commands/eval.js +89 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/export.d.ts +2 -0
- package/dist/commands/export.js +105 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/finish.d.ts +2 -0
- package/dist/commands/finish.js +71 -0
- package/dist/commands/finish.js.map +1 -0
- package/dist/commands/handoff.d.ts +2 -0
- package/dist/commands/handoff.js +77 -0
- package/dist/commands/handoff.js.map +1 -0
- package/dist/commands/inbox.d.ts +2 -0
- package/dist/commands/inbox.js +36 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +13 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +2 -0
- package/dist/commands/inspect.js +226 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/log.d.ts +2 -0
- package/dist/commands/log.js +96 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/memory.d.ts +2 -0
- package/dist/commands/memory.js +236 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/pack.d.ts +2 -0
- package/dist/commands/pack.js +42 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/prime.d.ts +4 -0
- package/dist/commands/prime.js +44 -0
- package/dist/commands/prime.js.map +1 -0
- package/dist/commands/project.d.ts +2 -0
- package/dist/commands/project.js +50 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/shared.d.ts +3 -0
- package/dist/commands/shared.js +24 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/skill.d.ts +2 -0
- package/dist/commands/skill.js +146 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/worker.d.ts +2 -0
- package/dist/commands/worker.js +128 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/core/adapter.d.ts +22 -0
- package/dist/core/adapter.js +167 -0
- package/dist/core/adapter.js.map +1 -0
- package/dist/core/approval.d.ts +26 -0
- package/dist/core/approval.js +86 -0
- package/dist/core/approval.js.map +1 -0
- package/dist/core/brief.d.ts +47 -0
- package/dist/core/brief.js +411 -0
- package/dist/core/brief.js.map +1 -0
- package/dist/core/codex.d.ts +53 -0
- package/dist/core/codex.js +286 -0
- package/dist/core/codex.js.map +1 -0
- package/dist/core/codexPlugin.d.ts +51 -0
- package/dist/core/codexPlugin.js +228 -0
- package/dist/core/codexPlugin.js.map +1 -0
- package/dist/core/compatibility.d.ts +2 -0
- package/dist/core/compatibility.js +16 -0
- package/dist/core/compatibility.js.map +1 -0
- package/dist/core/config.d.ts +19 -0
- package/dist/core/config.js +77 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextBudget.d.ts +12 -0
- package/dist/core/contextBudget.js +22 -0
- package/dist/core/contextBudget.js.map +1 -0
- package/dist/core/contextCompare.d.ts +27 -0
- package/dist/core/contextCompare.js +97 -0
- package/dist/core/contextCompare.js.map +1 -0
- package/dist/core/continuity.d.ts +25 -0
- package/dist/core/continuity.js +73 -0
- package/dist/core/continuity.js.map +1 -0
- package/dist/core/errors.d.ts +4 -0
- package/dist/core/errors.js +12 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/eval.d.ts +38 -0
- package/dist/core/eval.js +180 -0
- package/dist/core/eval.js.map +1 -0
- package/dist/core/exportPolicy.d.ts +7 -0
- package/dist/core/exportPolicy.js +17 -0
- package/dist/core/exportPolicy.js.map +1 -0
- package/dist/core/exportTargets.d.ts +25 -0
- package/dist/core/exportTargets.js +292 -0
- package/dist/core/exportTargets.js.map +1 -0
- package/dist/core/handoff.d.ts +48 -0
- package/dist/core/handoff.js +611 -0
- package/dist/core/handoff.js.map +1 -0
- package/dist/core/inbox.d.ts +15 -0
- package/dist/core/inbox.js +56 -0
- package/dist/core/inbox.js.map +1 -0
- package/dist/core/lock.d.ts +11 -0
- package/dist/core/lock.js +99 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/log.d.ts +38 -0
- package/dist/core/log.js +93 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/memory.d.ts +86 -0
- package/dist/core/memory.js +353 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/memoryHygiene.d.ts +25 -0
- package/dist/core/memoryHygiene.js +95 -0
- package/dist/core/memoryHygiene.js.map +1 -0
- package/dist/core/memoryProposal.d.ts +40 -0
- package/dist/core/memoryProposal.js +279 -0
- package/dist/core/memoryProposal.js.map +1 -0
- package/dist/core/output.d.ts +7 -0
- package/dist/core/output.js +18 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/patch.d.ts +37 -0
- package/dist/core/patch.js +220 -0
- package/dist/core/patch.js.map +1 -0
- package/dist/core/paths.d.ts +33 -0
- package/dist/core/paths.js +84 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/prime.d.ts +17 -0
- package/dist/core/prime.js +298 -0
- package/dist/core/prime.js.map +1 -0
- package/dist/core/privacyDoctor.d.ts +14 -0
- package/dist/core/privacyDoctor.js +59 -0
- package/dist/core/privacyDoctor.js.map +1 -0
- package/dist/core/project.d.ts +16 -0
- package/dist/core/project.js +73 -0
- package/dist/core/project.js.map +1 -0
- package/dist/core/securityDoctor.d.ts +14 -0
- package/dist/core/securityDoctor.js +96 -0
- package/dist/core/securityDoctor.js.map +1 -0
- package/dist/core/skill.d.ts +16 -0
- package/dist/core/skill.js +81 -0
- package/dist/core/skill.js.map +1 -0
- package/dist/core/storage.d.ts +20 -0
- package/dist/core/storage.js +112 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/core/tokens.d.ts +5 -0
- package/dist/core/tokens.js +24 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/core/worker.d.ts +51 -0
- package/dist/core/worker.js +312 -0
- package/dist/core/worker.js.map +1 -0
- package/dist/core/workflow.d.ts +61 -0
- package/dist/core/workflow.js +308 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/core/workspace.d.ts +7 -0
- package/dist/core/workspace.js +214 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/brief.d.ts +12 -0
- package/dist/schemas/brief.js +2 -0
- package/dist/schemas/brief.js.map +1 -0
- package/dist/schemas/eval.d.ts +96 -0
- package/dist/schemas/eval.js +30 -0
- package/dist/schemas/eval.js.map +1 -0
- package/dist/schemas/handoff.d.ts +33 -0
- package/dist/schemas/handoff.js +13 -0
- package/dist/schemas/handoff.js.map +1 -0
- package/dist/schemas/log.d.ts +51 -0
- package/dist/schemas/log.js +19 -0
- package/dist/schemas/log.js.map +1 -0
- package/dist/schemas/memory.d.ts +112 -0
- package/dist/schemas/memory.js +21 -0
- package/dist/schemas/memory.js.map +1 -0
- package/dist/schemas/memoryProposal.d.ts +181 -0
- package/dist/schemas/memoryProposal.js +46 -0
- package/dist/schemas/memoryProposal.js.map +1 -0
- package/dist/schemas/patch.d.ts +38 -0
- package/dist/schemas/patch.js +15 -0
- package/dist/schemas/patch.js.map +1 -0
- package/dist/schemas/project.d.ts +23 -0
- package/dist/schemas/project.js +8 -0
- package/dist/schemas/project.js.map +1 -0
- package/dist/schemas/skill.d.ts +26 -0
- package/dist/schemas/skill.js +9 -0
- package/dist/schemas/skill.js.map +1 -0
- package/dist/schemas/worker.d.ts +29 -0
- package/dist/schemas/worker.js +12 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/docs/codex-resume.md +13 -0
- package/docs/compatibility.md +49 -0
- package/docs/concept.md +13 -0
- package/docs/evals.md +18 -0
- package/docs/file-format.md +67 -0
- package/docs/handoff-briefs.md +9 -0
- package/docs/integrations/harnesses.md +74 -0
- package/docs/memory-lifecycle.md +23 -0
- package/docs/persistent-worker.md +15 -0
- package/docs/privacy-model.md +40 -0
- package/docs/quickstart.md +74 -0
- package/docs/release-checklist.md +68 -0
- package/docs/roadmap.md +33 -0
- package/docs/superpowers/plans/2026-06-08-briefops-oss-readiness.md +1272 -0
- package/docs/superpowers/plans/2026-06-08-codex-first-context-optimization.md +1176 -0
- package/docs/token-budget.md +63 -0
- package/examples/atlas-q/README.md +15 -0
- package/examples/codex-first-context/README.md +48 -0
- package/examples/codex-first-context/after-briefops-prime.md +40 -0
- package/examples/codex-first-context/before-manual-history-dump.md +18 -0
- package/examples/persistent-worker-demo/README.md +15 -0
- package/examples/persistent-worker-demo/after-codex-resume.md +17 -0
- package/examples/persistent-worker-demo/before-context-dump.md +5 -0
- package/examples/persistent-worker-demo/briefops-workspace/codex/prompts/resume_demo.md +29 -0
- package/examples/persistent-worker-demo/briefops-workspace/handoffs/handoff_demo.md +50 -0
- package/examples/persistent-worker-demo/briefops-workspace/logs/log_20260604_001.yaml +14 -0
- package/examples/persistent-worker-demo/briefops-workspace/logs/log_20260604_002.yaml +12 -0
- package/examples/persistent-worker-demo/briefops-workspace/memory/decisions.yaml +12 -0
- package/examples/persistent-worker-demo/briefops-workspace/memory/deprecated.yaml +1 -0
- package/examples/persistent-worker-demo/briefops-workspace/memory/facts.yaml +12 -0
- package/examples/persistent-worker-demo/briefops-workspace/memory/incidents.yaml +12 -0
- package/examples/persistent-worker-demo/briefops-workspace/memory/lessons.yaml +12 -0
- package/examples/persistent-worker-demo/briefops-workspace/memory-proposals/memprop_demo_001.memory-proposal.yaml +23 -0
- package/examples/persistent-worker-demo/briefops-workspace/projects/atlas-q.project.md +18 -0
- package/examples/persistent-worker-demo/briefops-workspace/skills/backtest-validation.skill.md +13 -0
- package/examples/persistent-worker-demo/briefops-workspace/skills/risk-review.skill.md +15 -0
- package/examples/persistent-worker-demo/briefops-workspace/workers/quant-reviewer.worker.yaml +12 -0
- package/examples/persistent-worker-demo/briefops-workspace/workers/summaries/quant-reviewer.summary.md +44 -0
- package/package.json +59 -0
- package/plugins/briefops-codex/.codex-plugin/plugin.json +39 -0
- package/plugins/briefops-codex/README.md +44 -0
- package/plugins/briefops-codex/skills/briefops-continue-worker/SKILL.md +22 -0
- package/plugins/briefops-codex/skills/briefops-finish-task/SKILL.md +22 -0
- package/plugins/briefops-codex/skills/briefops-prime-context/SKILL.md +24 -0
- package/plugins/briefops-codex/skills/briefops-review-memory/SKILL.md +27 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { BriefOpsError } from "./errors.js";
|
|
4
|
+
import { readWorkLog } from "./log.js";
|
|
5
|
+
import { withWorkspaceLock } from "./lock.js";
|
|
6
|
+
import { addMemoryIfMissingUnlocked } from "./memory.js";
|
|
7
|
+
import { formatDateStamp, normalizeName, slugForFilename, workspacePaths } from "./paths.js";
|
|
8
|
+
import { listFilesBySuffix, readTextFile, writeYamlFile } from "./storage.js";
|
|
9
|
+
import { requireWorkspace } from "./workspace.js";
|
|
10
|
+
import { memoryProposalSchema } from "../schemas/memoryProposal.js";
|
|
11
|
+
import YAML from "yaml";
|
|
12
|
+
export const NO_MEMORY_PROPOSAL_CANDIDATES_PREFIX = "No memory proposal candidates found in log:";
|
|
13
|
+
export function isNoMemoryProposalCandidatesError(error) {
|
|
14
|
+
return error instanceof BriefOpsError &&
|
|
15
|
+
error.message.startsWith(NO_MEMORY_PROPOSAL_CANDIDATES_PREFIX);
|
|
16
|
+
}
|
|
17
|
+
function proposalId(date = new Date()) {
|
|
18
|
+
return `memprop_${formatDateStamp(date)}_${randomBytes(3).toString("hex")}`;
|
|
19
|
+
}
|
|
20
|
+
const tagKeywords = [
|
|
21
|
+
"turnover",
|
|
22
|
+
"slippage",
|
|
23
|
+
"risk",
|
|
24
|
+
"rebalance",
|
|
25
|
+
"policy",
|
|
26
|
+
"test",
|
|
27
|
+
"release",
|
|
28
|
+
"billing",
|
|
29
|
+
"localization",
|
|
30
|
+
"security",
|
|
31
|
+
"performance",
|
|
32
|
+
"migration"
|
|
33
|
+
];
|
|
34
|
+
function tagsFromText(value) {
|
|
35
|
+
const lower = value.toLowerCase();
|
|
36
|
+
const tags = tagKeywords.filter((tag) => lower.includes(tag));
|
|
37
|
+
return [...new Set(tags)];
|
|
38
|
+
}
|
|
39
|
+
function extractPrefixedNotes(notes, prefix) {
|
|
40
|
+
return notes
|
|
41
|
+
.split(/\r?\n/)
|
|
42
|
+
.map((line) => line.trim())
|
|
43
|
+
.filter((line) => line.toLowerCase().startsWith(`${prefix}:`))
|
|
44
|
+
.map((line) => line.slice(prefix.length + 1).trim())
|
|
45
|
+
.filter(Boolean)
|
|
46
|
+
.map((content) => ({
|
|
47
|
+
category: prefix === "decision" ? "decisions" : "facts",
|
|
48
|
+
type: prefix,
|
|
49
|
+
status: "active",
|
|
50
|
+
content,
|
|
51
|
+
tags: tagsFromText(content),
|
|
52
|
+
visibility: "private",
|
|
53
|
+
exportable: false,
|
|
54
|
+
rationale: `Extracted from work log note prefix: ${prefix}.`
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
function isIncidentCandidate(result) {
|
|
58
|
+
return /\b(missing|missed|failed|blocked|unverified|risk|violation|regression|incident|error|bug|failure)\b/i.test(result);
|
|
59
|
+
}
|
|
60
|
+
function isNormativeNextStep(value) {
|
|
61
|
+
return /\b(must|always|never|require|requires|required|policy|verify|check)\b/i.test(value);
|
|
62
|
+
}
|
|
63
|
+
function entry(options) {
|
|
64
|
+
const category = {
|
|
65
|
+
fact: "facts",
|
|
66
|
+
decision: "decisions",
|
|
67
|
+
lesson: "lessons",
|
|
68
|
+
incident: "incidents",
|
|
69
|
+
deprecated: "deprecated"
|
|
70
|
+
}[options.type];
|
|
71
|
+
return {
|
|
72
|
+
category,
|
|
73
|
+
type: options.type,
|
|
74
|
+
status: "active",
|
|
75
|
+
content: options.content.trim(),
|
|
76
|
+
source: options.source,
|
|
77
|
+
tags: tagsFromText(options.content),
|
|
78
|
+
visibility: "private",
|
|
79
|
+
exportable: false,
|
|
80
|
+
rationale: options.rationale
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async function writeProposal(cwd, proposal) {
|
|
84
|
+
const filePath = path.join(workspacePaths(cwd).memoryProposals, `${proposal.id}-${slugForFilename(proposal.project ?? "global")}-${slugForFilename(proposal.worker ?? proposal.skill ?? "memory")}.memory-proposal.yaml`);
|
|
85
|
+
await writeYamlFile(filePath, proposal);
|
|
86
|
+
return filePath;
|
|
87
|
+
}
|
|
88
|
+
export async function proposeMemoryFromLog(options) {
|
|
89
|
+
const cwd = options.cwd ?? process.cwd();
|
|
90
|
+
return withWorkspaceLock({ cwd, name: "memory-proposal" }, async () => proposeMemoryFromLogUnlocked({
|
|
91
|
+
...options,
|
|
92
|
+
cwd
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
async function proposeMemoryFromLogUnlocked(options) {
|
|
96
|
+
const cwd = options.cwd ?? process.cwd();
|
|
97
|
+
await requireWorkspace(cwd);
|
|
98
|
+
const log = await readWorkLog(cwd, options.fromLog);
|
|
99
|
+
const createdAt = new Date().toISOString();
|
|
100
|
+
const proposals = [
|
|
101
|
+
...log.lessons.map((lesson) => entry({
|
|
102
|
+
type: "lesson",
|
|
103
|
+
content: lesson,
|
|
104
|
+
source: log.id,
|
|
105
|
+
rationale: "Extracted from work log lesson."
|
|
106
|
+
})),
|
|
107
|
+
...log.open_risks.map((risk) => entry({
|
|
108
|
+
type: "incident",
|
|
109
|
+
content: risk,
|
|
110
|
+
source: log.id,
|
|
111
|
+
rationale: "Extracted from work log open risk."
|
|
112
|
+
})),
|
|
113
|
+
...log.decisions.map((decision) => entry({
|
|
114
|
+
type: "decision",
|
|
115
|
+
content: decision,
|
|
116
|
+
source: log.id,
|
|
117
|
+
rationale: "Extracted from work log decision."
|
|
118
|
+
})),
|
|
119
|
+
...log.incidents.map((incident) => entry({
|
|
120
|
+
type: "incident",
|
|
121
|
+
content: incident,
|
|
122
|
+
source: log.id,
|
|
123
|
+
rationale: "Extracted from work log incident."
|
|
124
|
+
})),
|
|
125
|
+
...log.next_steps
|
|
126
|
+
.filter(isNormativeNextStep)
|
|
127
|
+
.map((step) => entry({
|
|
128
|
+
type: "decision",
|
|
129
|
+
content: step,
|
|
130
|
+
source: log.id,
|
|
131
|
+
rationale: "Extracted from normative work log next step."
|
|
132
|
+
})),
|
|
133
|
+
...extractPrefixedNotes(log.notes, "decision"),
|
|
134
|
+
...extractPrefixedNotes(log.notes, "fact")
|
|
135
|
+
];
|
|
136
|
+
if (isIncidentCandidate(log.result)) {
|
|
137
|
+
proposals.push(entry({
|
|
138
|
+
type: "incident",
|
|
139
|
+
content: log.result,
|
|
140
|
+
source: log.id,
|
|
141
|
+
rationale: "Extracted from work log result because it contains failure/risk language."
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
if (proposals.length === 0) {
|
|
145
|
+
throw new BriefOpsError(`${NO_MEMORY_PROPOSAL_CANDIDATES_PREFIX} ${log.id}`);
|
|
146
|
+
}
|
|
147
|
+
const proposal = memoryProposalSchema.parse({
|
|
148
|
+
id: proposalId(new Date(createdAt)),
|
|
149
|
+
created_at: createdAt,
|
|
150
|
+
from_log: log.id,
|
|
151
|
+
status: "proposed",
|
|
152
|
+
project: log.project,
|
|
153
|
+
skill: log.skill,
|
|
154
|
+
worker: log.worker,
|
|
155
|
+
items: proposals
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
path: await writeProposal(cwd, proposal),
|
|
159
|
+
proposal
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
export async function readMemoryProposal(cwd, id) {
|
|
163
|
+
await requireWorkspace(cwd);
|
|
164
|
+
const normalized = id.trim().toLowerCase();
|
|
165
|
+
try {
|
|
166
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).memoryProposals, ".memory-proposal.yaml");
|
|
167
|
+
const filePath = normalized === "latest"
|
|
168
|
+
? [...files].sort().at(-1)
|
|
169
|
+
: files.find((file) => path.basename(file).startsWith(normalizeName(id)));
|
|
170
|
+
if (!filePath) {
|
|
171
|
+
throw new BriefOpsError(`Memory proposal not found: ${id}`);
|
|
172
|
+
}
|
|
173
|
+
const parsed = YAML.parse(await readTextFile(filePath));
|
|
174
|
+
const result = memoryProposalSchema.safeParse(parsed);
|
|
175
|
+
if (!result.success) {
|
|
176
|
+
throw new BriefOpsError(`Invalid memory proposal ${filePath}: ${result.error.message}`);
|
|
177
|
+
}
|
|
178
|
+
return result.data;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
|
|
182
|
+
throw new BriefOpsError(`Memory proposal not found: ${id}`);
|
|
183
|
+
}
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export async function readLatestProposedMemoryProposal(cwd = process.cwd()) {
|
|
188
|
+
const proposals = await listMemoryProposals({
|
|
189
|
+
cwd,
|
|
190
|
+
status: "proposed"
|
|
191
|
+
});
|
|
192
|
+
const latest = proposals[0];
|
|
193
|
+
if (!latest) {
|
|
194
|
+
throw new BriefOpsError("No proposed memory proposals found.");
|
|
195
|
+
}
|
|
196
|
+
return latest;
|
|
197
|
+
}
|
|
198
|
+
export async function listMemoryProposals(filters = {}) {
|
|
199
|
+
const cwd = filters.cwd ?? process.cwd();
|
|
200
|
+
await requireWorkspace(cwd);
|
|
201
|
+
const project = filters.project ? normalizeName(filters.project) : undefined;
|
|
202
|
+
const skill = filters.skill ? normalizeName(filters.skill) : undefined;
|
|
203
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).memoryProposals, ".memory-proposal.yaml");
|
|
204
|
+
const proposals = await Promise.all(files.map(async (filePath) => {
|
|
205
|
+
const parsed = YAML.parse(await readTextFile(filePath));
|
|
206
|
+
const result = memoryProposalSchema.safeParse(parsed);
|
|
207
|
+
if (!result.success) {
|
|
208
|
+
throw new BriefOpsError(`Invalid memory proposal ${filePath}: ${result.error.message}`);
|
|
209
|
+
}
|
|
210
|
+
return result.data;
|
|
211
|
+
}));
|
|
212
|
+
return proposals
|
|
213
|
+
.filter((proposal) => (filters.status ? proposal.status === filters.status : true))
|
|
214
|
+
.filter((proposal) => (project ? proposal.project === project : true))
|
|
215
|
+
.filter((proposal) => (skill ? proposal.skill === skill : true))
|
|
216
|
+
.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
217
|
+
}
|
|
218
|
+
export async function applyMemoryProposal(options) {
|
|
219
|
+
const cwd = options.cwd ?? process.cwd();
|
|
220
|
+
return withWorkspaceLock({ cwd, name: "memory" }, async () => applyMemoryProposalUnlocked({
|
|
221
|
+
...options,
|
|
222
|
+
cwd
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
export async function applyMemoryProposalUnlocked(options) {
|
|
226
|
+
const cwd = options.cwd ?? process.cwd();
|
|
227
|
+
const proposal = options.id.trim().toLowerCase() === "latest"
|
|
228
|
+
? await readLatestProposedMemoryProposal(cwd)
|
|
229
|
+
: await readMemoryProposal(cwd, options.id);
|
|
230
|
+
if (proposal.status !== "proposed") {
|
|
231
|
+
throw new BriefOpsError(`Memory proposal is already ${proposal.status}: ${proposal.id}`);
|
|
232
|
+
}
|
|
233
|
+
let created = 0;
|
|
234
|
+
let skipped = 0;
|
|
235
|
+
for (const entry of proposal.items) {
|
|
236
|
+
const result = await addMemoryIfMissingUnlocked({
|
|
237
|
+
cwd,
|
|
238
|
+
type: entry.type,
|
|
239
|
+
project: proposal.project,
|
|
240
|
+
skill: proposal.skill,
|
|
241
|
+
content: entry.content,
|
|
242
|
+
status: entry.status,
|
|
243
|
+
tags: entry.tags,
|
|
244
|
+
source: entry.source ?? proposal.from_log,
|
|
245
|
+
visibility: entry.visibility,
|
|
246
|
+
exportable: entry.exportable
|
|
247
|
+
});
|
|
248
|
+
if (result.created) {
|
|
249
|
+
created += 1;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
skipped += 1;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const updated = {
|
|
256
|
+
...proposal,
|
|
257
|
+
status: "applied",
|
|
258
|
+
applied_at: new Date().toISOString()
|
|
259
|
+
};
|
|
260
|
+
await writeProposal(cwd, updated);
|
|
261
|
+
return { proposal: updated, created, skipped };
|
|
262
|
+
}
|
|
263
|
+
export async function rejectMemoryProposal(options) {
|
|
264
|
+
const cwd = options.cwd ?? process.cwd();
|
|
265
|
+
return withWorkspaceLock({ cwd, name: "memory" }, async () => {
|
|
266
|
+
const proposal = await readMemoryProposal(cwd, options.id);
|
|
267
|
+
if (proposal.status !== "proposed") {
|
|
268
|
+
throw new BriefOpsError(`Memory proposal is already ${proposal.status}: ${proposal.id}`);
|
|
269
|
+
}
|
|
270
|
+
const updated = {
|
|
271
|
+
...proposal,
|
|
272
|
+
status: "rejected",
|
|
273
|
+
rejected_at: new Date().toISOString()
|
|
274
|
+
};
|
|
275
|
+
await writeProposal(cwd, updated);
|
|
276
|
+
return updated;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=memoryProposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryProposal.js","sourceRoot":"","sources":["../../src/core/memoryProposal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { BriefOpsError } from "./errors.js";
|
|
3
|
+
import { pathExists, writeTextFile } from "./storage.js";
|
|
4
|
+
export async function writeGeneratedOutput(options) {
|
|
5
|
+
const targetPath = options.outputPath ?? options.defaultPath;
|
|
6
|
+
const isExplicit = Boolean(options.outputPath);
|
|
7
|
+
if (isExplicit && !options.force && await pathExists(targetPath)) {
|
|
8
|
+
throw new BriefOpsError(`Output file already exists: ${targetPath}. Re-run with --force to overwrite.`);
|
|
9
|
+
}
|
|
10
|
+
await writeTextFile(targetPath, options.content, {
|
|
11
|
+
force: !isExplicit || Boolean(options.force)
|
|
12
|
+
});
|
|
13
|
+
return targetPath;
|
|
14
|
+
}
|
|
15
|
+
export function resolveCliOutputPath(cwd, value) {
|
|
16
|
+
return value ? path.resolve(cwd, value) : undefined;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAK1C;IACC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/C,IAAI,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,aAAa,CACrB,+BAA+B,UAAU,qCAAqC,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE;QAC/C,KAAK,EAAE,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;KAC7C,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,KAAc;IAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type SkillPatch } from "../schemas/patch.js";
|
|
2
|
+
export type ProposeSkillPatchOptions = {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
skill: string;
|
|
5
|
+
fromLog?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const NO_SKILL_PATCH_CANDIDATES_PREFIX = "No skill patch candidates found in log:";
|
|
8
|
+
export declare function isNoSkillPatchCandidatesError(error: unknown): boolean;
|
|
9
|
+
export declare function renderSkillPatchDiff(patch: SkillPatch): string;
|
|
10
|
+
export declare function proposeSkillPatch(options: ProposeSkillPatchOptions): Promise<{
|
|
11
|
+
path: string;
|
|
12
|
+
patch: SkillPatch;
|
|
13
|
+
diff: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function readSkillPatch(cwd: string, id: string): Promise<SkillPatch>;
|
|
16
|
+
export declare function readLatestProposedSkillPatch(cwd?: string): Promise<SkillPatch>;
|
|
17
|
+
export declare function listSkillPatches(cwd?: string): Promise<SkillPatch[]>;
|
|
18
|
+
export declare function applySkillPatch(options: {
|
|
19
|
+
cwd?: string;
|
|
20
|
+
skill: string;
|
|
21
|
+
patch: string;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
patch: SkillPatch;
|
|
24
|
+
skillPath: string;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function applySkillPatchUnlocked(options: {
|
|
27
|
+
cwd?: string;
|
|
28
|
+
skill: string;
|
|
29
|
+
patch: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
patch: SkillPatch;
|
|
32
|
+
skillPath: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare function rejectSkillPatch(options: {
|
|
35
|
+
cwd?: string;
|
|
36
|
+
patch: string;
|
|
37
|
+
}): Promise<SkillPatch>;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { BriefOpsError } from "./errors.js";
|
|
4
|
+
import { withWorkspaceLock } from "./lock.js";
|
|
5
|
+
import { readWorkLog } from "./log.js";
|
|
6
|
+
import { normalizeName, skillFilePath, skillPatchFilePath, workspacePaths } from "./paths.js";
|
|
7
|
+
import { readSkill } from "./skill.js";
|
|
8
|
+
import { listFilesBySuffix, readTextFile, stringifyMarkdownWithFrontmatter, writeTextFile, writeYamlFile } from "./storage.js";
|
|
9
|
+
import { requireWorkspace } from "./workspace.js";
|
|
10
|
+
import { skillPatchSchema } from "../schemas/patch.js";
|
|
11
|
+
import YAML from "yaml";
|
|
12
|
+
export const NO_SKILL_PATCH_CANDIDATES_PREFIX = "No skill patch candidates found in log:";
|
|
13
|
+
export function isNoSkillPatchCandidatesError(error) {
|
|
14
|
+
return error instanceof BriefOpsError &&
|
|
15
|
+
error.message.startsWith(NO_SKILL_PATCH_CANDIDATES_PREFIX);
|
|
16
|
+
}
|
|
17
|
+
function patchId(date = new Date()) {
|
|
18
|
+
return `patch_${date.toISOString().replace(/[-:.TZ]/g, "").slice(0, 17)}_${randomBytes(3).toString("hex")}`;
|
|
19
|
+
}
|
|
20
|
+
function bumpPatchVersion(version) {
|
|
21
|
+
const match = version.match(/^(\d+)\.(\d+)\.(\d+)(.*)$/);
|
|
22
|
+
if (!match) {
|
|
23
|
+
return `${version}.1`;
|
|
24
|
+
}
|
|
25
|
+
return `${match[1]}.${match[2]}.${Number(match[3]) + 1}${match[4] ?? ""}`;
|
|
26
|
+
}
|
|
27
|
+
function normalizeAddition(lesson) {
|
|
28
|
+
const content = lesson.trim().replace(/^\-\s+/, "");
|
|
29
|
+
return `- ${content}`;
|
|
30
|
+
}
|
|
31
|
+
function insertAdditionsIntoSection(body, section, additions) {
|
|
32
|
+
const lines = body.split(/\r?\n/);
|
|
33
|
+
const headingPattern = new RegExp(`^##\\s+${section.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*$`, "i");
|
|
34
|
+
const start = lines.findIndex((line) => headingPattern.test(line.trim()));
|
|
35
|
+
const missing = additions.filter((addition) => {
|
|
36
|
+
const content = addition.replace(/^\-\s+/, "");
|
|
37
|
+
return !body.includes(addition) && !body.includes(content);
|
|
38
|
+
});
|
|
39
|
+
if (missing.length === 0) {
|
|
40
|
+
return body;
|
|
41
|
+
}
|
|
42
|
+
if (start === -1) {
|
|
43
|
+
return [body.trimEnd(), "", `## ${section}`, "", ...missing].join("\n");
|
|
44
|
+
}
|
|
45
|
+
const endOffset = lines.slice(start + 1).findIndex((line) => /^##\s+/.test(line.trim()));
|
|
46
|
+
const end = endOffset === -1 ? lines.length : start + 1 + endOffset;
|
|
47
|
+
const before = lines.slice(0, end);
|
|
48
|
+
const after = lines.slice(end);
|
|
49
|
+
const needsBlank = before[before.length - 1]?.trim() !== "";
|
|
50
|
+
const needsTrailingBlank = after.length > 0 && after[0]?.trim() !== "";
|
|
51
|
+
return [
|
|
52
|
+
...before,
|
|
53
|
+
...(needsBlank ? [""] : []),
|
|
54
|
+
...missing,
|
|
55
|
+
...(needsTrailingBlank ? [""] : []),
|
|
56
|
+
...after
|
|
57
|
+
].join("\n").trim();
|
|
58
|
+
}
|
|
59
|
+
function appendChangelog(body, patch) {
|
|
60
|
+
const entry = `- ${new Date().toISOString()}: applied ${patch.id} from ${patch.from_log}`;
|
|
61
|
+
if (/^##\s+Changelog\s*$/im.test(body)) {
|
|
62
|
+
return insertAdditionsIntoSection(body, "Changelog", [entry]);
|
|
63
|
+
}
|
|
64
|
+
return [body.trimEnd(), "", "## Changelog", "", entry].join("\n");
|
|
65
|
+
}
|
|
66
|
+
async function writeSkillPatch(cwd, patch) {
|
|
67
|
+
const filePath = skillPatchFilePath(cwd, patch.id);
|
|
68
|
+
await writeYamlFile(filePath, patch);
|
|
69
|
+
return filePath;
|
|
70
|
+
}
|
|
71
|
+
export function renderSkillPatchDiff(patch) {
|
|
72
|
+
return [
|
|
73
|
+
`Suggested patch for ${patch.skill}.skill.md`,
|
|
74
|
+
"",
|
|
75
|
+
`## ${patch.target_section}`,
|
|
76
|
+
"",
|
|
77
|
+
...patch.additions.map((addition) => `+ ${addition}`),
|
|
78
|
+
""
|
|
79
|
+
].join("\n");
|
|
80
|
+
}
|
|
81
|
+
export async function proposeSkillPatch(options) {
|
|
82
|
+
const cwd = options.cwd ?? process.cwd();
|
|
83
|
+
return withWorkspaceLock({ cwd, name: "skill-patch" }, async () => proposeSkillPatchUnlocked({
|
|
84
|
+
...options,
|
|
85
|
+
cwd
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
async function proposeSkillPatchUnlocked(options) {
|
|
89
|
+
const cwd = options.cwd ?? process.cwd();
|
|
90
|
+
await requireWorkspace(cwd);
|
|
91
|
+
const skill = normalizeName(options.skill);
|
|
92
|
+
await readSkill(cwd, skill);
|
|
93
|
+
const log = await readWorkLog(cwd, options.fromLog ?? "latest");
|
|
94
|
+
const lessons = log.lessons.map((lesson) => lesson.trim()).filter(Boolean);
|
|
95
|
+
if (log.skill && log.skill !== skill) {
|
|
96
|
+
throw new BriefOpsError(`Work log ${log.id} is linked to skill ${log.skill}, not ${skill}.`);
|
|
97
|
+
}
|
|
98
|
+
if (lessons.length === 0) {
|
|
99
|
+
throw new BriefOpsError(`${NO_SKILL_PATCH_CANDIDATES_PREFIX} ${log.id}`);
|
|
100
|
+
}
|
|
101
|
+
const createdAt = new Date();
|
|
102
|
+
const patch = skillPatchSchema.parse({
|
|
103
|
+
id: patchId(createdAt),
|
|
104
|
+
created_at: createdAt.toISOString(),
|
|
105
|
+
skill,
|
|
106
|
+
from_log: log.id,
|
|
107
|
+
status: "proposed",
|
|
108
|
+
target_section: "Check",
|
|
109
|
+
lessons,
|
|
110
|
+
additions: lessons.map(normalizeAddition)
|
|
111
|
+
});
|
|
112
|
+
const filePath = await writeSkillPatch(cwd, patch);
|
|
113
|
+
return {
|
|
114
|
+
path: filePath,
|
|
115
|
+
patch,
|
|
116
|
+
diff: renderSkillPatchDiff(patch)
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export async function readSkillPatch(cwd, id) {
|
|
120
|
+
await requireWorkspace(cwd);
|
|
121
|
+
const normalized = id.trim().toLowerCase();
|
|
122
|
+
try {
|
|
123
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).patches, ".patch.yaml");
|
|
124
|
+
const filePath = normalized === "latest"
|
|
125
|
+
? [...files].sort().at(-1)
|
|
126
|
+
: files.find((file) => path.basename(file).startsWith(normalizeName(id)));
|
|
127
|
+
if (!filePath) {
|
|
128
|
+
throw new BriefOpsError(`Skill patch not found: ${id}`);
|
|
129
|
+
}
|
|
130
|
+
const raw = await readTextFile(filePath);
|
|
131
|
+
const parsed = YAML.parse(raw);
|
|
132
|
+
const result = skillPatchSchema.safeParse(parsed);
|
|
133
|
+
if (!result.success) {
|
|
134
|
+
throw new BriefOpsError(`Invalid skill patch ${filePath}: ${result.error.message}`);
|
|
135
|
+
}
|
|
136
|
+
return result.data;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
|
|
140
|
+
throw new BriefOpsError(`Skill patch not found: ${id}`);
|
|
141
|
+
}
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function readLatestProposedSkillPatch(cwd = process.cwd()) {
|
|
146
|
+
const patches = (await listSkillPatches(cwd)).filter((patch) => patch.status === "proposed");
|
|
147
|
+
const latest = patches[0];
|
|
148
|
+
if (!latest) {
|
|
149
|
+
throw new BriefOpsError("No proposed skill patches found.");
|
|
150
|
+
}
|
|
151
|
+
return latest;
|
|
152
|
+
}
|
|
153
|
+
export async function listSkillPatches(cwd = process.cwd()) {
|
|
154
|
+
await requireWorkspace(cwd);
|
|
155
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).patches, ".patch.yaml");
|
|
156
|
+
const patches = await Promise.all(files.map(async (filePath) => {
|
|
157
|
+
const raw = await readTextFile(filePath);
|
|
158
|
+
const parsed = YAML.parse(raw);
|
|
159
|
+
const result = skillPatchSchema.safeParse(parsed);
|
|
160
|
+
if (!result.success) {
|
|
161
|
+
throw new BriefOpsError(`Invalid skill patch ${filePath}: ${result.error.message}`);
|
|
162
|
+
}
|
|
163
|
+
return result.data;
|
|
164
|
+
}));
|
|
165
|
+
return patches.sort((a, b) => b.created_at.localeCompare(a.created_at));
|
|
166
|
+
}
|
|
167
|
+
export async function applySkillPatch(options) {
|
|
168
|
+
const cwd = options.cwd ?? process.cwd();
|
|
169
|
+
return withWorkspaceLock({ cwd, name: "skill-patch" }, async () => applySkillPatchUnlocked({
|
|
170
|
+
...options,
|
|
171
|
+
cwd
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
export async function applySkillPatchUnlocked(options) {
|
|
175
|
+
const cwd = options.cwd ?? process.cwd();
|
|
176
|
+
const skillName = normalizeName(options.skill);
|
|
177
|
+
const patch = options.patch.trim().toLowerCase() === "latest"
|
|
178
|
+
? await readLatestProposedSkillPatch(cwd)
|
|
179
|
+
: await readSkillPatch(cwd, options.patch);
|
|
180
|
+
if (patch.skill !== skillName) {
|
|
181
|
+
throw new BriefOpsError(`Patch ${patch.id} targets ${patch.skill}, not ${skillName}.`);
|
|
182
|
+
}
|
|
183
|
+
if (patch.status !== "proposed") {
|
|
184
|
+
throw new BriefOpsError(`Patch ${patch.id} is already ${patch.status}.`);
|
|
185
|
+
}
|
|
186
|
+
const skill = await readSkill(cwd, skillName);
|
|
187
|
+
const patchedBody = appendChangelog(insertAdditionsIntoSection(skill.body, patch.target_section, patch.additions), patch);
|
|
188
|
+
const nextData = {
|
|
189
|
+
...skill.data,
|
|
190
|
+
version: bumpPatchVersion(skill.data.version)
|
|
191
|
+
};
|
|
192
|
+
const skillPath = skillFilePath(cwd, skillName);
|
|
193
|
+
await writeTextFile(skillPath, stringifyMarkdownWithFrontmatter(nextData, patchedBody), {
|
|
194
|
+
force: true
|
|
195
|
+
});
|
|
196
|
+
const appliedPatch = skillPatchSchema.parse({
|
|
197
|
+
...patch,
|
|
198
|
+
status: "applied",
|
|
199
|
+
applied_at: new Date().toISOString()
|
|
200
|
+
});
|
|
201
|
+
await writeSkillPatch(cwd, appliedPatch);
|
|
202
|
+
return { patch: appliedPatch, skillPath };
|
|
203
|
+
}
|
|
204
|
+
export async function rejectSkillPatch(options) {
|
|
205
|
+
const cwd = options.cwd ?? process.cwd();
|
|
206
|
+
return withWorkspaceLock({ cwd, name: "skill-patch" }, async () => {
|
|
207
|
+
const patch = await readSkillPatch(cwd, options.patch);
|
|
208
|
+
if (patch.status !== "proposed") {
|
|
209
|
+
throw new BriefOpsError(`Patch ${patch.id} is already ${patch.status}.`);
|
|
210
|
+
}
|
|
211
|
+
const rejectedPatch = skillPatchSchema.parse({
|
|
212
|
+
...patch,
|
|
213
|
+
status: "rejected",
|
|
214
|
+
rejected_at: new Date().toISOString()
|
|
215
|
+
});
|
|
216
|
+
await writeSkillPatch(cwd, rejectedPatch);
|
|
217
|
+
return rejectedPatch;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/core/patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const memoryCategories: readonly ["facts", "decisions", "lessons", "incidents", "deprecated"];
|
|
2
|
+
export type MemoryCategory = (typeof memoryCategories)[number];
|
|
3
|
+
export declare function normalizeName(name: string): string;
|
|
4
|
+
export declare function workspacePaths(cwd?: string): {
|
|
5
|
+
cwd: string;
|
|
6
|
+
root: string;
|
|
7
|
+
config: string;
|
|
8
|
+
skills: string;
|
|
9
|
+
projects: string;
|
|
10
|
+
memory: string;
|
|
11
|
+
memoryProposals: string;
|
|
12
|
+
workers: string;
|
|
13
|
+
workerSummaries: string;
|
|
14
|
+
logs: string;
|
|
15
|
+
handoffs: string;
|
|
16
|
+
briefs: string;
|
|
17
|
+
codex: string;
|
|
18
|
+
codexPrompts: string;
|
|
19
|
+
evals: string;
|
|
20
|
+
evalResults: string;
|
|
21
|
+
patches: string;
|
|
22
|
+
templates: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function skillFilePath(cwd: string, name: string): string;
|
|
25
|
+
export declare function projectFilePath(cwd: string, name: string): string;
|
|
26
|
+
export declare function memoryFilePath(cwd: string, category: MemoryCategory): string;
|
|
27
|
+
export declare function memoryProposalFilePath(cwd: string, id: string): string;
|
|
28
|
+
export declare function workerFilePath(cwd: string, name: string): string;
|
|
29
|
+
export declare function workerSummaryFilePath(cwd: string, name: string): string;
|
|
30
|
+
export declare function evalCaseFilePath(cwd: string, name: string): string;
|
|
31
|
+
export declare function skillPatchFilePath(cwd: string, id: string): string;
|
|
32
|
+
export declare function formatDateStamp(date?: Date): string;
|
|
33
|
+
export declare function slugForFilename(value: string): string;
|