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,84 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { BriefOpsError } from "./errors.js";
|
|
3
|
+
export const memoryCategories = [
|
|
4
|
+
"facts",
|
|
5
|
+
"decisions",
|
|
6
|
+
"lessons",
|
|
7
|
+
"incidents",
|
|
8
|
+
"deprecated"
|
|
9
|
+
];
|
|
10
|
+
export function normalizeName(name) {
|
|
11
|
+
const normalized = name.trim().toLowerCase().replace(/\s+/g, "-");
|
|
12
|
+
if (!/^[a-z0-9][a-z0-9._-]*$/.test(normalized)) {
|
|
13
|
+
throw new BriefOpsError(`Invalid name: ${name}. Use letters, numbers, dots, underscores, or hyphens.`);
|
|
14
|
+
}
|
|
15
|
+
return normalized;
|
|
16
|
+
}
|
|
17
|
+
export function workspacePaths(cwd = process.cwd()) {
|
|
18
|
+
const root = path.join(cwd, ".briefops");
|
|
19
|
+
return {
|
|
20
|
+
cwd,
|
|
21
|
+
root,
|
|
22
|
+
config: path.join(root, "config.yaml"),
|
|
23
|
+
skills: path.join(root, "skills"),
|
|
24
|
+
projects: path.join(root, "projects"),
|
|
25
|
+
memory: path.join(root, "memory"),
|
|
26
|
+
memoryProposals: path.join(root, "memory-proposals"),
|
|
27
|
+
workers: path.join(root, "workers"),
|
|
28
|
+
workerSummaries: path.join(root, "workers", "summaries"),
|
|
29
|
+
logs: path.join(root, "logs"),
|
|
30
|
+
handoffs: path.join(root, "handoffs"),
|
|
31
|
+
briefs: path.join(root, "briefs"),
|
|
32
|
+
codex: path.join(root, "codex"),
|
|
33
|
+
codexPrompts: path.join(root, "codex", "prompts"),
|
|
34
|
+
evals: path.join(root, "evals"),
|
|
35
|
+
evalResults: path.join(root, "evals", "results"),
|
|
36
|
+
patches: path.join(root, "patches"),
|
|
37
|
+
templates: path.join(root, "templates")
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function skillFilePath(cwd, name) {
|
|
41
|
+
return path.join(workspacePaths(cwd).skills, `${normalizeName(name)}.skill.md`);
|
|
42
|
+
}
|
|
43
|
+
export function projectFilePath(cwd, name) {
|
|
44
|
+
return path.join(workspacePaths(cwd).projects, `${normalizeName(name)}.project.md`);
|
|
45
|
+
}
|
|
46
|
+
export function memoryFilePath(cwd, category) {
|
|
47
|
+
return path.join(workspacePaths(cwd).memory, `${category}.yaml`);
|
|
48
|
+
}
|
|
49
|
+
export function memoryProposalFilePath(cwd, id) {
|
|
50
|
+
return path.join(workspacePaths(cwd).memoryProposals, `${normalizeName(id)}.memory-proposal.yaml`);
|
|
51
|
+
}
|
|
52
|
+
export function workerFilePath(cwd, name) {
|
|
53
|
+
return path.join(workspacePaths(cwd).workers, `${normalizeName(name)}.worker.yaml`);
|
|
54
|
+
}
|
|
55
|
+
export function workerSummaryFilePath(cwd, name) {
|
|
56
|
+
return path.join(workspacePaths(cwd).workerSummaries, `${normalizeName(name)}.summary.md`);
|
|
57
|
+
}
|
|
58
|
+
export function evalCaseFilePath(cwd, name) {
|
|
59
|
+
return path.join(workspacePaths(cwd).evals, `${normalizeName(name)}.eval.yaml`);
|
|
60
|
+
}
|
|
61
|
+
export function skillPatchFilePath(cwd, id) {
|
|
62
|
+
return path.join(workspacePaths(cwd).patches, `${normalizeName(id)}.patch.yaml`);
|
|
63
|
+
}
|
|
64
|
+
export function formatDateStamp(date = new Date()) {
|
|
65
|
+
const pad = (value, size = 2) => String(value).padStart(size, "0");
|
|
66
|
+
return [
|
|
67
|
+
date.getUTCFullYear(),
|
|
68
|
+
pad(date.getUTCMonth() + 1),
|
|
69
|
+
pad(date.getUTCDate()),
|
|
70
|
+
"_",
|
|
71
|
+
pad(date.getUTCHours()),
|
|
72
|
+
pad(date.getUTCMinutes()),
|
|
73
|
+
pad(date.getUTCSeconds()),
|
|
74
|
+
"_",
|
|
75
|
+
pad(date.getUTCMilliseconds(), 3)
|
|
76
|
+
].join("");
|
|
77
|
+
}
|
|
78
|
+
export function slugForFilename(value) {
|
|
79
|
+
return normalizeName(value)
|
|
80
|
+
.replace(/[._]+/g, "-")
|
|
81
|
+
.replace(/-+/g, "-")
|
|
82
|
+
.slice(0, 80);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ExportPolicy } from "./exportPolicy.js";
|
|
2
|
+
export type PrimeContextOptions = {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
worker?: string;
|
|
5
|
+
project?: string;
|
|
6
|
+
task?: string;
|
|
7
|
+
maxTokens?: number;
|
|
8
|
+
format?: "markdown" | "codex";
|
|
9
|
+
exportPolicy?: ExportPolicy;
|
|
10
|
+
};
|
|
11
|
+
export type PrimeContextResult = {
|
|
12
|
+
status: "ready" | "attention-required" | "setup-required";
|
|
13
|
+
content: string;
|
|
14
|
+
tokens: number;
|
|
15
|
+
warnings: string[];
|
|
16
|
+
};
|
|
17
|
+
export declare function primeContext(options?: PrimeContextOptions): Promise<PrimeContextResult>;
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { readBriefOpsConfig } from "./config.js";
|
|
2
|
+
import { inspectContinuityHealth } from "./continuity.js";
|
|
3
|
+
import { filterMemoryForExport, normalizeExportPolicy, sharedOnlyOmissionNote } from "./exportPolicy.js";
|
|
4
|
+
import { getInboxSummary } from "./inbox.js";
|
|
5
|
+
import { listWorkLogs } from "./log.js";
|
|
6
|
+
import { formatMemoryItem, selectContinuityContext } from "./memory.js";
|
|
7
|
+
import { normalizeName, workspacePaths } from "./paths.js";
|
|
8
|
+
import { estimateTokens, truncateToTokenBudget } from "./tokens.js";
|
|
9
|
+
import { listWorkers, readWorker } from "./worker.js";
|
|
10
|
+
import { pathExists } from "./storage.js";
|
|
11
|
+
function quote(value) {
|
|
12
|
+
return `"${value.replace(/(["\\$`])/g, "\\$1")}"`;
|
|
13
|
+
}
|
|
14
|
+
function unique(values) {
|
|
15
|
+
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
16
|
+
}
|
|
17
|
+
function renderList(values, empty, limit) {
|
|
18
|
+
const items = unique(values).slice(0, limit);
|
|
19
|
+
return items.length > 0 ? items.map((item) => `- ${item}`).join("\n") : empty;
|
|
20
|
+
}
|
|
21
|
+
function setupRequiredContent(maxTokens) {
|
|
22
|
+
const content = truncateToTokenBudget([
|
|
23
|
+
"# BriefOps Prime Context",
|
|
24
|
+
"",
|
|
25
|
+
"Status: setup-required",
|
|
26
|
+
"",
|
|
27
|
+
"No `.briefops` workspace was found here.",
|
|
28
|
+
"",
|
|
29
|
+
"Run:",
|
|
30
|
+
"",
|
|
31
|
+
"```bash",
|
|
32
|
+
"briefops init",
|
|
33
|
+
"briefops codex install",
|
|
34
|
+
"briefops codex plugin install",
|
|
35
|
+
"briefops skill create <skill>",
|
|
36
|
+
"briefops project create <project>",
|
|
37
|
+
"briefops worker create <worker> --project <project> --skills \"<skill>\"",
|
|
38
|
+
"briefops worker use <worker>",
|
|
39
|
+
"```",
|
|
40
|
+
""
|
|
41
|
+
].join("\n"), maxTokens).text;
|
|
42
|
+
return {
|
|
43
|
+
status: "setup-required",
|
|
44
|
+
content,
|
|
45
|
+
tokens: estimateTokens(content),
|
|
46
|
+
warnings: ["BriefOps workspace not found."]
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function attentionRequiredContent(options) {
|
|
50
|
+
const workerList = options.workers.length > 0
|
|
51
|
+
? options.workers.map((worker) => `- ${worker}`).join("\n")
|
|
52
|
+
: "- No active workers found.";
|
|
53
|
+
const content = truncateToTokenBudget([
|
|
54
|
+
"# BriefOps Prime Context",
|
|
55
|
+
"",
|
|
56
|
+
"Status: attention-required",
|
|
57
|
+
"",
|
|
58
|
+
"## Current Task",
|
|
59
|
+
"",
|
|
60
|
+
options.task,
|
|
61
|
+
"",
|
|
62
|
+
"## Reason",
|
|
63
|
+
"",
|
|
64
|
+
options.reason,
|
|
65
|
+
"",
|
|
66
|
+
"## Available Workers",
|
|
67
|
+
"",
|
|
68
|
+
workerList,
|
|
69
|
+
"",
|
|
70
|
+
"## Recommended Commands",
|
|
71
|
+
"",
|
|
72
|
+
"```bash",
|
|
73
|
+
"briefops worker list",
|
|
74
|
+
"briefops worker use <worker>",
|
|
75
|
+
"```",
|
|
76
|
+
"",
|
|
77
|
+
"## Token Budget",
|
|
78
|
+
"",
|
|
79
|
+
`- Maximum: ${options.maxTokens}`,
|
|
80
|
+
""
|
|
81
|
+
].join("\n"), options.maxTokens).text;
|
|
82
|
+
return {
|
|
83
|
+
status: "attention-required",
|
|
84
|
+
content,
|
|
85
|
+
tokens: estimateTokens(content),
|
|
86
|
+
warnings: [options.reason]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function resolvePrimeWorker(options) {
|
|
90
|
+
if (options.worker) {
|
|
91
|
+
return { worker: normalizeName(options.worker) };
|
|
92
|
+
}
|
|
93
|
+
const config = await readBriefOpsConfig(options.cwd);
|
|
94
|
+
if (config.defaults.worker) {
|
|
95
|
+
return { worker: config.defaults.worker };
|
|
96
|
+
}
|
|
97
|
+
const workers = await listWorkers({
|
|
98
|
+
cwd: options.cwd,
|
|
99
|
+
status: "active"
|
|
100
|
+
});
|
|
101
|
+
if (workers.length === 1) {
|
|
102
|
+
return { worker: workers[0].name };
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
attention: attentionRequiredContent({
|
|
106
|
+
task: "No current task provided.",
|
|
107
|
+
maxTokens: 800,
|
|
108
|
+
workers: workers.map((worker) => worker.name),
|
|
109
|
+
reason: "Select a default worker before priming context."
|
|
110
|
+
})
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export async function primeContext(options = {}) {
|
|
114
|
+
const cwd = options.cwd ?? process.cwd();
|
|
115
|
+
const maxTokens = options.maxTokens ?? 800;
|
|
116
|
+
const task = options.task?.trim() || "No current task provided.";
|
|
117
|
+
const format = options.format ?? "markdown";
|
|
118
|
+
const exportPolicy = normalizeExportPolicy(options.exportPolicy);
|
|
119
|
+
if (!(await pathExists(workspacePaths(cwd).root))) {
|
|
120
|
+
return setupRequiredContent(maxTokens);
|
|
121
|
+
}
|
|
122
|
+
const resolved = await resolvePrimeWorker({
|
|
123
|
+
cwd,
|
|
124
|
+
worker: options.worker
|
|
125
|
+
});
|
|
126
|
+
if (resolved.attention) {
|
|
127
|
+
return attentionRequiredContent({
|
|
128
|
+
task,
|
|
129
|
+
maxTokens,
|
|
130
|
+
workers: (await listWorkers({ cwd, status: "active" })).map((worker) => worker.name),
|
|
131
|
+
reason: "Select a default worker before priming context."
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const workerName = resolved.worker;
|
|
135
|
+
const worker = await readWorker(cwd, workerName);
|
|
136
|
+
const project = options.project ? normalizeName(options.project) : worker.project;
|
|
137
|
+
if (!project) {
|
|
138
|
+
return attentionRequiredContent({
|
|
139
|
+
task,
|
|
140
|
+
maxTokens,
|
|
141
|
+
workers: [workerName],
|
|
142
|
+
reason: `Worker ${workerName} has no default project. Recreate it with --project or pass --project.`
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const health = await inspectContinuityHealth({
|
|
146
|
+
cwd,
|
|
147
|
+
project,
|
|
148
|
+
worker: workerName
|
|
149
|
+
});
|
|
150
|
+
const inbox = await getInboxSummary({
|
|
151
|
+
cwd,
|
|
152
|
+
project,
|
|
153
|
+
worker: workerName
|
|
154
|
+
});
|
|
155
|
+
const memory = await selectContinuityContext({
|
|
156
|
+
cwd,
|
|
157
|
+
project,
|
|
158
|
+
skills: worker.default_skills,
|
|
159
|
+
worker: workerName,
|
|
160
|
+
task,
|
|
161
|
+
maxTokens: Math.max(120, Math.floor(maxTokens * 0.28)),
|
|
162
|
+
quotas: {
|
|
163
|
+
facts: 2,
|
|
164
|
+
decisions: 3,
|
|
165
|
+
lessons: 3,
|
|
166
|
+
incidents: 2,
|
|
167
|
+
deprecated: 0
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
const memoryItems = filterMemoryForExport(memory.items, exportPolicy);
|
|
171
|
+
const memoryText = memoryItems.length > 0
|
|
172
|
+
? memoryItems.map(formatMemoryItem).join("\n")
|
|
173
|
+
: "No active matching memory selected.";
|
|
174
|
+
const logs = await listWorkLogs({
|
|
175
|
+
cwd,
|
|
176
|
+
project,
|
|
177
|
+
worker: workerName,
|
|
178
|
+
limit: 8
|
|
179
|
+
});
|
|
180
|
+
const openRisks = exportPolicy === "shared-only" ? [] : logs.flatMap((log) => log.open_risks);
|
|
181
|
+
const nextSteps = exportPolicy === "shared-only" ? [] : logs.flatMap((log) => log.next_steps);
|
|
182
|
+
const pendingReview = exportPolicy === "shared-only"
|
|
183
|
+
? [
|
|
184
|
+
sharedOnlyOmissionNote,
|
|
185
|
+
"Local pending review counts are omitted by shared-only policy.",
|
|
186
|
+
format === "codex"
|
|
187
|
+
? "Codex format is active; follow the operating note below before broad repo/history inspection."
|
|
188
|
+
: undefined
|
|
189
|
+
].filter((item) => Boolean(item))
|
|
190
|
+
: [
|
|
191
|
+
inbox.pendingMemoryProposals > 0
|
|
192
|
+
? `${inbox.pendingMemoryProposals} pending memory proposal(s).`
|
|
193
|
+
: undefined,
|
|
194
|
+
inbox.pendingSkillPatches > 0 ? `${inbox.pendingSkillPatches} pending skill patch(es).` : undefined,
|
|
195
|
+
"This context may include private local BriefOps memory. Review before sharing outside this machine.",
|
|
196
|
+
format === "codex"
|
|
197
|
+
? "Codex format is active; follow the operating note below before broad repo/history inspection."
|
|
198
|
+
: undefined
|
|
199
|
+
].filter((item) => Boolean(item));
|
|
200
|
+
const warnings = [
|
|
201
|
+
health.readiness === "WARN" ? "Continuity health is WARN." : undefined,
|
|
202
|
+
inbox.pendingMemoryProposals > 0 ? "Pending memory proposals should be reviewed." : undefined,
|
|
203
|
+
exportPolicy === "local-private" ? "Prime context may include private local memory." : undefined
|
|
204
|
+
].filter((warning) => Boolean(warning));
|
|
205
|
+
const codexOperatingNote = format === "codex"
|
|
206
|
+
? [
|
|
207
|
+
"## Codex Operating Note",
|
|
208
|
+
"",
|
|
209
|
+
"Use this as a routing brief before broad repo/history inspection.",
|
|
210
|
+
"",
|
|
211
|
+
"Do:",
|
|
212
|
+
"- Restate the current task.",
|
|
213
|
+
"- Use the selected worker/project context.",
|
|
214
|
+
"- Inspect only the files needed for the task.",
|
|
215
|
+
"- Review pending memory proposals with the user before applying.",
|
|
216
|
+
`- Use \`briefops continue --worker ${workerName} --task ${quote(task)} --pack\` when a fresh-thread resume is needed.`,
|
|
217
|
+
"",
|
|
218
|
+
"Do not:",
|
|
219
|
+
"- Dump the entire `.briefops` workspace.",
|
|
220
|
+
"- Apply memory or skill patches without user approval.",
|
|
221
|
+
"- Treat this prime context as a substitute for relevant code inspection.",
|
|
222
|
+
""
|
|
223
|
+
]
|
|
224
|
+
: [];
|
|
225
|
+
const content = [
|
|
226
|
+
"# BriefOps Prime Context",
|
|
227
|
+
"",
|
|
228
|
+
`Status: ready`,
|
|
229
|
+
"",
|
|
230
|
+
"## Token Budget",
|
|
231
|
+
"",
|
|
232
|
+
`- Maximum: ${maxTokens}`,
|
|
233
|
+
`- Export policy: ${exportPolicy}`,
|
|
234
|
+
"",
|
|
235
|
+
"## Current Task",
|
|
236
|
+
"",
|
|
237
|
+
task,
|
|
238
|
+
"",
|
|
239
|
+
"## Worker",
|
|
240
|
+
"",
|
|
241
|
+
`- Worker: ${workerName}`,
|
|
242
|
+
`- Project: ${project}`,
|
|
243
|
+
`- Skills: ${worker.default_skills.length > 0 ? worker.default_skills.join(", ") : "none"}`,
|
|
244
|
+
"",
|
|
245
|
+
...codexOperatingNote,
|
|
246
|
+
"## Continuity Status",
|
|
247
|
+
"",
|
|
248
|
+
`- Readiness: ${health.readiness}`,
|
|
249
|
+
exportPolicy === "shared-only"
|
|
250
|
+
? "- Work logs: omitted by shared-only policy"
|
|
251
|
+
: `- Work logs: ${health.history.workLogs}`,
|
|
252
|
+
exportPolicy === "shared-only"
|
|
253
|
+
? "- Active memory: shared/exportable selected only"
|
|
254
|
+
: `- Active memory: ${Object.entries(health.memory).map(([key, value]) => `${key}=${value}`).join(", ")}`,
|
|
255
|
+
exportPolicy === "shared-only"
|
|
256
|
+
? `- Shared/exportable memory selected: ${memoryItems.length}`
|
|
257
|
+
: undefined,
|
|
258
|
+
"",
|
|
259
|
+
"## Highest-Value Memory",
|
|
260
|
+
"",
|
|
261
|
+
memoryText,
|
|
262
|
+
"",
|
|
263
|
+
"## Open Risks And Next Steps",
|
|
264
|
+
"",
|
|
265
|
+
"Open risks:",
|
|
266
|
+
exportPolicy === "shared-only"
|
|
267
|
+
? `- ${sharedOnlyOmissionNote}`
|
|
268
|
+
: renderList(openRisks, "- No open risks found.", 4),
|
|
269
|
+
"",
|
|
270
|
+
"Next steps:",
|
|
271
|
+
exportPolicy === "shared-only"
|
|
272
|
+
? `- ${sharedOnlyOmissionNote}`
|
|
273
|
+
: renderList(nextSteps, "- No next steps found.", 4),
|
|
274
|
+
"",
|
|
275
|
+
"## Pending User Review",
|
|
276
|
+
"",
|
|
277
|
+
pendingReview.length > 0
|
|
278
|
+
? pendingReview.map((item) => `- ${item}`).join("\n")
|
|
279
|
+
: "- No pending user review found.",
|
|
280
|
+
"",
|
|
281
|
+
"## Recommended Commands",
|
|
282
|
+
"",
|
|
283
|
+
"```bash",
|
|
284
|
+
`briefops prime --format ${format} --task ${quote(task)} --max-tokens ${maxTokens}`,
|
|
285
|
+
inbox.pendingMemoryProposals > 0 ? "briefops memory proposal-show latest" : undefined,
|
|
286
|
+
`briefops continue --worker ${workerName} --task ${quote(task)} --pack`,
|
|
287
|
+
"```",
|
|
288
|
+
""
|
|
289
|
+
].filter((line) => line !== undefined).join("\n");
|
|
290
|
+
const trimmed = truncateToTokenBudget(content, maxTokens).text;
|
|
291
|
+
return {
|
|
292
|
+
status: "ready",
|
|
293
|
+
content: trimmed,
|
|
294
|
+
tokens: estimateTokens(trimmed),
|
|
295
|
+
warnings
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=prime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prime.js","sourceRoot":"","sources":["../../src/core/prime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PrivacyDoctorStatus = "ok" | "warn" | "fail";
|
|
2
|
+
export type PrivacyDoctorCheck = {
|
|
3
|
+
name: string;
|
|
4
|
+
status: PrivacyDoctorStatus;
|
|
5
|
+
detail: string;
|
|
6
|
+
};
|
|
7
|
+
export type PrivacyDoctorResult = {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
checks: PrivacyDoctorCheck[];
|
|
10
|
+
};
|
|
11
|
+
export declare function fixBriefOpsGitignore(cwd?: string): Promise<string>;
|
|
12
|
+
export declare function runPrivacyDoctor(options?: {
|
|
13
|
+
cwd?: string;
|
|
14
|
+
}): Promise<PrivacyDoctorResult>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { listMemory } from "./memory.js";
|
|
3
|
+
import { pathExists, readTextFile, writeTextFile } from "./storage.js";
|
|
4
|
+
import { requireWorkspace } from "./workspace.js";
|
|
5
|
+
function check(name, status, detail) {
|
|
6
|
+
return { name, status, detail };
|
|
7
|
+
}
|
|
8
|
+
const secretPatterns = [
|
|
9
|
+
/\bsk-[A-Za-z0-9_-]{16,}\b/,
|
|
10
|
+
/\bghp_[A-Za-z0-9_]{20,}\b/,
|
|
11
|
+
/\bgithub_pat_[A-Za-z0-9_]{20,}\b/,
|
|
12
|
+
/\bAKIA[0-9A-Z]{16}\b/,
|
|
13
|
+
/\b(password|passwd|secret|token|api[_-]?key)\s*[:=]\s*\S+/i
|
|
14
|
+
];
|
|
15
|
+
async function gitignoreStatus(cwd) {
|
|
16
|
+
const gitignorePath = path.join(cwd, ".gitignore");
|
|
17
|
+
if (!(await pathExists(gitignorePath))) {
|
|
18
|
+
return check("Gitignore", "warn", ".gitignore not found; add `.briefops/` before public use.");
|
|
19
|
+
}
|
|
20
|
+
const raw = await readTextFile(gitignorePath);
|
|
21
|
+
const ignoresBriefOps = raw
|
|
22
|
+
.split(/\r?\n/)
|
|
23
|
+
.map((line) => line.trim())
|
|
24
|
+
.some((line) => line === ".briefops" || line === ".briefops/" || line === "/.briefops/");
|
|
25
|
+
return ignoresBriefOps
|
|
26
|
+
? check("Gitignore", "ok", ".briefops is ignored.")
|
|
27
|
+
: check("Gitignore", "warn", ".briefops is not ignored.");
|
|
28
|
+
}
|
|
29
|
+
export async function fixBriefOpsGitignore(cwd = process.cwd()) {
|
|
30
|
+
const gitignorePath = path.join(cwd, ".gitignore");
|
|
31
|
+
const existing = await pathExists(gitignorePath) ? await readTextFile(gitignorePath) : "";
|
|
32
|
+
const lines = existing.split(/\r?\n/).map((line) => line.trim());
|
|
33
|
+
if (!lines.includes(".briefops/") && !lines.includes(".briefops") && !lines.includes("/.briefops/")) {
|
|
34
|
+
const next = `${existing.trimEnd()}${existing.trim() ? "\n" : ""}.briefops/\n`;
|
|
35
|
+
await writeTextFile(gitignorePath, next, { force: true });
|
|
36
|
+
}
|
|
37
|
+
return gitignorePath;
|
|
38
|
+
}
|
|
39
|
+
export async function runPrivacyDoctor(options = {}) {
|
|
40
|
+
const cwd = options.cwd ?? process.cwd();
|
|
41
|
+
await requireWorkspace(cwd);
|
|
42
|
+
const memory = await listMemory({ cwd });
|
|
43
|
+
const privateExportable = memory.filter((item) => item.visibility === "private" && item.exportable);
|
|
44
|
+
const secretLike = memory.filter((item) => secretPatterns.some((pattern) => pattern.test(item.content)));
|
|
45
|
+
const checks = [
|
|
46
|
+
await gitignoreStatus(cwd),
|
|
47
|
+
privateExportable.length > 0
|
|
48
|
+
? check("Private exportable memory", "warn", `${privateExportable.length} private item(s) are exportable.`)
|
|
49
|
+
: check("Private exportable memory", "ok", "No private exportable memory."),
|
|
50
|
+
secretLike.length > 0
|
|
51
|
+
? check("Secret-like local memory", "warn", `${secretLike.length} memory item(s) look like secrets.`)
|
|
52
|
+
: check("Secret-like local memory", "ok", "No secret-like memory found.")
|
|
53
|
+
];
|
|
54
|
+
return {
|
|
55
|
+
ok: checks.every((item) => item.status !== "fail"),
|
|
56
|
+
checks
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=privacyDoctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacyDoctor.js","sourceRoot":"","sources":["../../src/core/privacyDoctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ProjectDocument } from "../schemas/project.js";
|
|
2
|
+
export type CreateProjectOptions = {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
tags?: string[];
|
|
7
|
+
maxTokens?: number;
|
|
8
|
+
force?: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function createProject(options: CreateProjectOptions): Promise<{
|
|
11
|
+
path: string;
|
|
12
|
+
name: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function readProject(cwd: string, name: string): Promise<ProjectDocument>;
|
|
15
|
+
export declare function showProject(cwd: string, name: string): Promise<string>;
|
|
16
|
+
export declare function listProjects(cwd?: string): Promise<ProjectDocument[]>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { BriefOpsError } from "./errors.js";
|
|
2
|
+
import { normalizeName, projectFilePath, workspacePaths } from "./paths.js";
|
|
3
|
+
import { listFilesBySuffix, parseMarkdownWithFrontmatter, readTextFile, stringifyMarkdownWithFrontmatter, writeTextFile } from "./storage.js";
|
|
4
|
+
import { requireWorkspace } from "./workspace.js";
|
|
5
|
+
import { projectFrontmatterSchema } from "../schemas/project.js";
|
|
6
|
+
export async function createProject(options) {
|
|
7
|
+
const cwd = options.cwd ?? process.cwd();
|
|
8
|
+
await requireWorkspace(cwd);
|
|
9
|
+
const name = normalizeName(options.name);
|
|
10
|
+
const filePath = projectFilePath(cwd, name);
|
|
11
|
+
const data = projectFrontmatterSchema.parse({
|
|
12
|
+
name,
|
|
13
|
+
description: options.description ?? "",
|
|
14
|
+
max_tokens: options.maxTokens ?? 500,
|
|
15
|
+
tags: options.tags ?? []
|
|
16
|
+
});
|
|
17
|
+
const body = [
|
|
18
|
+
`# Project: ${name}`,
|
|
19
|
+
"",
|
|
20
|
+
"## Active Facts",
|
|
21
|
+
"",
|
|
22
|
+
options.description ? `- ${options.description}` : "- Add durable project facts here.",
|
|
23
|
+
"",
|
|
24
|
+
"## Active Constraints",
|
|
25
|
+
"",
|
|
26
|
+
"- Add constraints the agent must respect.",
|
|
27
|
+
"",
|
|
28
|
+
"## Read If Needed",
|
|
29
|
+
"",
|
|
30
|
+
"- Add source files or docs to inspect when relevant."
|
|
31
|
+
].join("\n");
|
|
32
|
+
await writeTextFile(filePath, stringifyMarkdownWithFrontmatter(data, body), {
|
|
33
|
+
force: options.force
|
|
34
|
+
});
|
|
35
|
+
return { path: filePath, name };
|
|
36
|
+
}
|
|
37
|
+
export async function readProject(cwd, name) {
|
|
38
|
+
await requireWorkspace(cwd);
|
|
39
|
+
const normalized = normalizeName(name);
|
|
40
|
+
const filePath = projectFilePath(cwd, normalized);
|
|
41
|
+
try {
|
|
42
|
+
const raw = await readTextFile(filePath);
|
|
43
|
+
return parseMarkdownWithFrontmatter(raw, projectFrontmatterSchema, filePath);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
|
|
47
|
+
throw new BriefOpsError(`Project not found: ${normalized}`);
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function showProject(cwd, name) {
|
|
53
|
+
await requireWorkspace(cwd);
|
|
54
|
+
const normalized = normalizeName(name);
|
|
55
|
+
try {
|
|
56
|
+
return await readTextFile(projectFilePath(cwd, normalized));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof BriefOpsError && error.message.startsWith("File not found")) {
|
|
60
|
+
throw new BriefOpsError(`Project not found: ${normalized}`);
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function listProjects(cwd = process.cwd()) {
|
|
66
|
+
await requireWorkspace(cwd);
|
|
67
|
+
const files = await listFilesBySuffix(workspacePaths(cwd).projects, ".project.md");
|
|
68
|
+
return Promise.all(files.map(async (filePath) => {
|
|
69
|
+
const raw = await readTextFile(filePath);
|
|
70
|
+
return parseMarkdownWithFrontmatter(raw, projectFrontmatterSchema, filePath);
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/core/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type SecurityDoctorStatus = "ok" | "warn" | "fail";
|
|
2
|
+
export type SecurityDoctorCheck = {
|
|
3
|
+
name: string;
|
|
4
|
+
status: SecurityDoctorStatus;
|
|
5
|
+
detail: string;
|
|
6
|
+
};
|
|
7
|
+
export type SecurityDoctorResult = {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
checks: SecurityDoctorCheck[];
|
|
10
|
+
};
|
|
11
|
+
export declare function runSecurityDoctor(options?: {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
staleMs?: number;
|
|
14
|
+
}): Promise<SecurityDoctorResult>;
|