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,90 @@
|
|
|
1
|
+
import { cleanStaleLocks } from "../core/lock.js";
|
|
2
|
+
import { memoryCategories, workspacePaths } from "../core/paths.js";
|
|
3
|
+
import { fixBriefOpsGitignore, runPrivacyDoctor } from "../core/privacyDoctor.js";
|
|
4
|
+
import { runSecurityDoctor } from "../core/securityDoctor.js";
|
|
5
|
+
import { pathExists } from "../core/storage.js";
|
|
6
|
+
import { printTable } from "./shared.js";
|
|
7
|
+
export function registerDoctorCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command("doctor")
|
|
10
|
+
.description("Check the local BriefOps workspace structure.")
|
|
11
|
+
.option("--security", "Run security, export, and local conflict checks.")
|
|
12
|
+
.option("--fix-stale-locks", "Remove stale BriefOps workspace locks before reporting security checks.")
|
|
13
|
+
.option("--privacy", "Run privacy checks for local memory and share safety.")
|
|
14
|
+
.option("--fix-gitignore", "Add `.briefops/` to .gitignore when running --privacy.")
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
if (options.privacy) {
|
|
17
|
+
if (options.fixGitignore) {
|
|
18
|
+
const path = await fixBriefOpsGitignore();
|
|
19
|
+
console.log(`Updated gitignore: ${path}`);
|
|
20
|
+
console.log("");
|
|
21
|
+
}
|
|
22
|
+
const result = await runPrivacyDoctor();
|
|
23
|
+
printTable([
|
|
24
|
+
["Check", "Status", "Detail"],
|
|
25
|
+
...result.checks.map((check) => [check.name, check.status, check.detail])
|
|
26
|
+
]);
|
|
27
|
+
if (!result.ok) {
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (options.security) {
|
|
33
|
+
if (options.fixStaleLocks) {
|
|
34
|
+
const removed = await cleanStaleLocks();
|
|
35
|
+
if (removed.length > 0) {
|
|
36
|
+
console.log("Removed stale lock files:");
|
|
37
|
+
for (const filePath of removed) {
|
|
38
|
+
console.log(`- ${filePath}`);
|
|
39
|
+
}
|
|
40
|
+
console.log("");
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log("No stale lock files removed.");
|
|
44
|
+
console.log("");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const result = await runSecurityDoctor();
|
|
48
|
+
printTable([
|
|
49
|
+
["Check", "Status", "Detail"],
|
|
50
|
+
...result.checks.map((check) => [check.name, check.status, check.detail])
|
|
51
|
+
]);
|
|
52
|
+
if (!result.ok) {
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const paths = workspacePaths(process.cwd());
|
|
58
|
+
const checks = [
|
|
59
|
+
["Workspace", paths.root],
|
|
60
|
+
["Config", paths.config],
|
|
61
|
+
["Skills", paths.skills],
|
|
62
|
+
["Projects", paths.projects],
|
|
63
|
+
["Memory", paths.memory],
|
|
64
|
+
...memoryCategories.map((category) => [
|
|
65
|
+
`Memory/${category}`,
|
|
66
|
+
`${paths.memory}/${category}.yaml`
|
|
67
|
+
]),
|
|
68
|
+
["Workers", paths.workers],
|
|
69
|
+
["Logs", paths.logs],
|
|
70
|
+
["Briefs", paths.briefs],
|
|
71
|
+
["Codex", paths.codex],
|
|
72
|
+
["Codex Prompts", paths.codexPrompts],
|
|
73
|
+
["Evals", paths.evals],
|
|
74
|
+
["Eval Results", paths.evalResults],
|
|
75
|
+
["Patches", paths.patches],
|
|
76
|
+
["Templates", paths.templates]
|
|
77
|
+
];
|
|
78
|
+
const rows = await Promise.all(checks.map(async ([label, filePath]) => [
|
|
79
|
+
label,
|
|
80
|
+
(await pathExists(filePath)) ? "ok" : "missing",
|
|
81
|
+
filePath
|
|
82
|
+
]));
|
|
83
|
+
const missing = rows.filter((row) => row[1] === "missing");
|
|
84
|
+
printTable([["Check", "Status", "Path"], ...rows]);
|
|
85
|
+
if (missing.length > 0) {
|
|
86
|
+
process.exitCode = 1;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createEvalCase, listEvalCases, runEval, showEval } from "../core/eval.js";
|
|
2
|
+
import { collectRepeated, parsePositiveInt, printTable } from "./shared.js";
|
|
3
|
+
export function registerEvalCommands(program) {
|
|
4
|
+
const evalCommand = program.command("eval").description("Manage checklist-based eval cases.");
|
|
5
|
+
evalCommand
|
|
6
|
+
.command("create <name>")
|
|
7
|
+
.description("Create a checklist eval case.")
|
|
8
|
+
.option("--skill <skill>", "Skill name.")
|
|
9
|
+
.option("--project <project>", "Project name.")
|
|
10
|
+
.option("--worker <worker>", "Worker profile name.")
|
|
11
|
+
.option("--description <description>", "Case description.")
|
|
12
|
+
.option("--input <input>", "Task input for brief generation.")
|
|
13
|
+
.option("--expected <text>", "Expected phrase/check. Can be repeated.", collectRepeated, [])
|
|
14
|
+
.option("--pass-threshold <count>", "Minimum expected checks required to pass.", parsePositiveInt)
|
|
15
|
+
.option("--force", "Overwrite an existing eval case.")
|
|
16
|
+
.action(async (name, options) => {
|
|
17
|
+
const result = await createEvalCase({
|
|
18
|
+
name,
|
|
19
|
+
skill: options.skill,
|
|
20
|
+
project: options.project,
|
|
21
|
+
worker: options.worker,
|
|
22
|
+
description: options.description,
|
|
23
|
+
input: options.input,
|
|
24
|
+
expected: options.expected,
|
|
25
|
+
passThreshold: options.passThreshold,
|
|
26
|
+
force: Boolean(options.force)
|
|
27
|
+
});
|
|
28
|
+
console.log(`Created eval case: ${result.evalCase.id}`);
|
|
29
|
+
console.log(result.path);
|
|
30
|
+
});
|
|
31
|
+
evalCommand
|
|
32
|
+
.command("list")
|
|
33
|
+
.description("List eval cases.")
|
|
34
|
+
.action(async () => {
|
|
35
|
+
const cases = await listEvalCases(process.cwd());
|
|
36
|
+
if (cases.length === 0) {
|
|
37
|
+
console.log("No eval cases found.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
printTable([
|
|
41
|
+
["ID", "Skill", "Project", "Worker", "Expected"],
|
|
42
|
+
...cases.map((item) => [
|
|
43
|
+
item.id,
|
|
44
|
+
item.skill ?? "",
|
|
45
|
+
item.project ?? "",
|
|
46
|
+
item.worker ?? "",
|
|
47
|
+
String(item.expected.length)
|
|
48
|
+
])
|
|
49
|
+
]);
|
|
50
|
+
});
|
|
51
|
+
evalCommand
|
|
52
|
+
.command("run")
|
|
53
|
+
.description("Run matching checklist eval cases.")
|
|
54
|
+
.option("--skill <skill>", "Filter/run with skill.")
|
|
55
|
+
.option("--project <project>", "Filter/run with project.")
|
|
56
|
+
.option("--worker <worker>", "Filter/run with worker.")
|
|
57
|
+
.option("--budget <tokens>", "Brief token budget.", parsePositiveInt, 2000)
|
|
58
|
+
.option("--adapter <adapter>", "generic|codex|claude-code", "generic")
|
|
59
|
+
.action(async (options) => {
|
|
60
|
+
const summary = await runEval({
|
|
61
|
+
skill: options.skill,
|
|
62
|
+
project: options.project,
|
|
63
|
+
worker: options.worker,
|
|
64
|
+
budget: options.budget,
|
|
65
|
+
adapter: options.adapter
|
|
66
|
+
});
|
|
67
|
+
console.log(`${summary.cases.length} cases run`);
|
|
68
|
+
console.log(`${summary.passed} passed`);
|
|
69
|
+
console.log(`${summary.failed} failed`);
|
|
70
|
+
console.log("");
|
|
71
|
+
printTable([
|
|
72
|
+
["Case", "Result", "Score", "Missing"],
|
|
73
|
+
...summary.cases.map((item) => [
|
|
74
|
+
item.case.id,
|
|
75
|
+
item.result.passed ? "pass" : "fail",
|
|
76
|
+
`${item.result.score}/${item.case.expected.length}`,
|
|
77
|
+
item.result.missing.join(",")
|
|
78
|
+
])
|
|
79
|
+
]);
|
|
80
|
+
console.error(`Saved eval result: ${summary.resultPath}`);
|
|
81
|
+
});
|
|
82
|
+
evalCommand
|
|
83
|
+
.command("show <id>")
|
|
84
|
+
.description("Show an eval case or saved result.")
|
|
85
|
+
.action(async (id) => {
|
|
86
|
+
console.log(await showEval(process.cwd(), id));
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/commands/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { renderHarnessExport } from "../core/exportTargets.js";
|
|
3
|
+
import { normalizeExportPolicy } from "../core/exportPolicy.js";
|
|
4
|
+
import { BriefOpsError } from "../core/errors.js";
|
|
5
|
+
import { pathExists, writeTextFile } from "../core/storage.js";
|
|
6
|
+
function renderTarget(target, options) {
|
|
7
|
+
return renderHarnessExport({
|
|
8
|
+
target,
|
|
9
|
+
worker: options.worker,
|
|
10
|
+
project: options.project,
|
|
11
|
+
exportPolicy: normalizeExportPolicy(options.exportPolicy ?? "shared-only"),
|
|
12
|
+
outputPath: options.output
|
|
13
|
+
? path.resolve(process.cwd(), options.output)
|
|
14
|
+
: undefined,
|
|
15
|
+
force: Boolean(options.force),
|
|
16
|
+
dryRun: Boolean(options.dryRun),
|
|
17
|
+
stdout: Boolean(options.stdout)
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function writeResult(result, options) {
|
|
21
|
+
if (options.stdout) {
|
|
22
|
+
for (const file of result.files) {
|
|
23
|
+
console.log(`--- ${path.relative(process.cwd(), file.path)} ---`);
|
|
24
|
+
console.log(file.content.trimEnd());
|
|
25
|
+
console.log("");
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (options.dryRun) {
|
|
30
|
+
for (const file of result.files) {
|
|
31
|
+
console.log(`Would write: ${file.path} (${file.tokens} tokens)`);
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const existing = [];
|
|
36
|
+
for (const file of result.files) {
|
|
37
|
+
if (!options.force && await pathExists(file.path)) {
|
|
38
|
+
existing.push(file.path);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (existing.length > 0) {
|
|
42
|
+
throw new BriefOpsError(`Output file already exists: ${existing.join(", ")}. Use --force to overwrite.`);
|
|
43
|
+
}
|
|
44
|
+
for (const file of result.files) {
|
|
45
|
+
await writeTextFile(file.path, file.content, { force: Boolean(options.force) });
|
|
46
|
+
file.written = true;
|
|
47
|
+
console.log(`Wrote: ${file.path} (${file.tokens} tokens)`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function runExport(target, options) {
|
|
51
|
+
if (options.output && target === "cursor-rules") {
|
|
52
|
+
throw new BriefOpsError("--output is only supported for single-file exports.");
|
|
53
|
+
}
|
|
54
|
+
const result = renderTarget(target, options);
|
|
55
|
+
await writeResult(result, options);
|
|
56
|
+
if (result.warnings.length > 0) {
|
|
57
|
+
console.error("Warnings:");
|
|
58
|
+
for (const warning of result.warnings) {
|
|
59
|
+
console.error(`- ${warning}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function addCommonOptions(command, includeOutput = true) {
|
|
64
|
+
command
|
|
65
|
+
.option("--worker <worker>", "Worker profile name.")
|
|
66
|
+
.option("--project <project>", "Project name.")
|
|
67
|
+
.option("--export-policy <policy>", "local-private|shared-only", "shared-only")
|
|
68
|
+
.option("--force", "Overwrite existing generated files.")
|
|
69
|
+
.option("--dry-run", "Print target paths without writing files.")
|
|
70
|
+
.option("--stdout", "Print generated content instead of writing files.");
|
|
71
|
+
if (includeOutput) {
|
|
72
|
+
command.option("--output <path>", "Write the export to a specific path.");
|
|
73
|
+
}
|
|
74
|
+
return command;
|
|
75
|
+
}
|
|
76
|
+
export function registerExportCommands(program) {
|
|
77
|
+
const exportCommand = program
|
|
78
|
+
.command("export")
|
|
79
|
+
.description("Generate local AI harness router files without dumping BriefOps memory.");
|
|
80
|
+
addCommonOptions(exportCommand.command("agents-md").description("Generate AGENTS.md."))
|
|
81
|
+
.action(async (options) => runExport("agents-md", options));
|
|
82
|
+
addCommonOptions(exportCommand.command("claude-md").description("Generate CLAUDE.md."))
|
|
83
|
+
.action(async (options) => runExport("claude-md", options));
|
|
84
|
+
addCommonOptions(exportCommand.command("cursor-rules").description("Generate Cursor .mdc rule routers."), false).action(async (options) => runExport("cursor-rules", options));
|
|
85
|
+
addCommonOptions(exportCommand.command("all").description("Generate AGENTS.md, CLAUDE.md, and Cursor rules."), false)
|
|
86
|
+
.action(async (options) => {
|
|
87
|
+
const results = [
|
|
88
|
+
renderTarget("agents-md", options),
|
|
89
|
+
renderTarget("claude-md", options),
|
|
90
|
+
renderTarget("cursor-rules", options)
|
|
91
|
+
];
|
|
92
|
+
const merged = {
|
|
93
|
+
files: results.flatMap((result) => result.files),
|
|
94
|
+
warnings: results.flatMap((result) => result.warnings)
|
|
95
|
+
};
|
|
96
|
+
await writeResult(merged, options);
|
|
97
|
+
if (merged.warnings.length > 0) {
|
|
98
|
+
console.error("Warnings:");
|
|
99
|
+
for (const warning of merged.warnings) {
|
|
100
|
+
console.error(`- ${warning}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,mBAAmB,EAGpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAY/D,SAAS,YAAY,CAAC,MAAoB,EAAE,OAA6B;IACvE,OAAO,mBAAmB,CAAC;QACzB,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,qBAAqB,CAAC,OAAO,CAAC,YAAY,IAAI,aAAa,CAAC;QAC1E,UAAU,EAAE,OAAO,CAAC,MAAM;YACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC;YAC7C,CAAC,CAAC,SAAS;QACb,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;KAChC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAA2B,EAAE,OAA6B;IACnF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;QACnE,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CACrB,+BAA+B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAChF,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,MAAoB,EAAE,OAA6B;IAC1E,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAChD,MAAM,IAAI,aAAa,CAAC,qDAAqD,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB,EAAE,aAAa,GAAG,IAAI;IAC9D,OAAO;SACJ,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;SAC9C,MAAM,CAAC,0BAA0B,EAAE,2BAA2B,EAAE,aAAa,CAAC;SAC9E,MAAM,CAAC,SAAS,EAAE,qCAAqC,CAAC;SACxD,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;SAChE,MAAM,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;IAC3E,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,aAAa,GAAG,OAAO;SAC1B,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yEAAyE,CAAC,CAAC;IAE1F,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;SACpF,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpF,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;SACpF,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAEpF,gBAAgB,CACd,aAAa,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,EACvF,KAAK,CACN,CAAC,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtF,gBAAgB,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,kDAAkD,CAAC,EAAE,KAAK,CAAC;SAClH,MAAM,CAAC,KAAK,EAAE,OAA6B,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG;YACd,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC;YAClC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC;YAClC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC;SACtC,CAAC;QACF,MAAM,MAAM,GAAwB;YAClC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;YAChD,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;SACvD,CAAC;QACF,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { finishWork } from "../core/workflow.js";
|
|
2
|
+
import { collectRepeated } from "./shared.js";
|
|
3
|
+
export function registerFinishCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("finish")
|
|
6
|
+
.description("Finish a task: log work, propose memory, and print the next continue command.")
|
|
7
|
+
.option("--project <project>", "Project name.")
|
|
8
|
+
.option("--skill <skill>", "Skill name.")
|
|
9
|
+
.option("--worker <worker>", "Worker profile name.")
|
|
10
|
+
.requiredOption("--task <task>", "Completed task description.")
|
|
11
|
+
.requiredOption("--result <result>", "Work result.")
|
|
12
|
+
.option("--lesson <lesson>", "Lesson learned. Can be repeated.", collectRepeated, [])
|
|
13
|
+
.option("--open-risk <text>", "Unresolved risk. Can be repeated.", collectRepeated, [])
|
|
14
|
+
.option("--next-step <text>", "Suggested next step. Can be repeated.", collectRepeated, [])
|
|
15
|
+
.option("--decision <text>", "Decision made. Can be repeated.", collectRepeated, [])
|
|
16
|
+
.option("--incident <text>", "Incident or failure pattern. Can be repeated.", collectRepeated, [])
|
|
17
|
+
.option("--files <files>", "Comma-separated files changed.")
|
|
18
|
+
.option("--commands <commands>", "Comma-separated commands run.")
|
|
19
|
+
.option("--notes <notes>", "Additional notes.")
|
|
20
|
+
.option("--importance <importance>", "trivial|normal|durable|incident", "normal")
|
|
21
|
+
.option("--no-memory-proposal", "Skip memory proposal generation.")
|
|
22
|
+
.option("--propose-skill-patch", "Also propose a skill patch from log lessons.")
|
|
23
|
+
.option("--refresh-worker", "Refresh the worker summary after logging.")
|
|
24
|
+
.option("--continue-task <task>", "Task text to use in the printed continue command.")
|
|
25
|
+
.action(async (options) => {
|
|
26
|
+
const result = await finishWork({
|
|
27
|
+
project: options.project,
|
|
28
|
+
skill: options.skill,
|
|
29
|
+
worker: options.worker,
|
|
30
|
+
task: options.task,
|
|
31
|
+
result: options.result,
|
|
32
|
+
lessons: options.lesson,
|
|
33
|
+
openRisks: options.openRisk,
|
|
34
|
+
nextSteps: options.nextStep,
|
|
35
|
+
decisions: options.decision,
|
|
36
|
+
incidents: options.incident,
|
|
37
|
+
files: options.files,
|
|
38
|
+
commands: options.commands,
|
|
39
|
+
notes: options.notes,
|
|
40
|
+
importance: options.importance,
|
|
41
|
+
noMemoryProposal: Boolean(options.noMemoryProposal),
|
|
42
|
+
proposeSkillPatch: Boolean(options.proposeSkillPatch),
|
|
43
|
+
refreshWorker: Boolean(options.refreshWorker),
|
|
44
|
+
continueTask: options.continueTask
|
|
45
|
+
});
|
|
46
|
+
console.log(`Added work log: ${result.logId}`);
|
|
47
|
+
console.log(result.logPath);
|
|
48
|
+
if (result.memoryProposalId && result.memoryProposalPath) {
|
|
49
|
+
console.log(`Created memory proposal: ${result.memoryProposalId}`);
|
|
50
|
+
console.log(result.memoryProposalPath);
|
|
51
|
+
}
|
|
52
|
+
if (result.skillPatchId && result.skillPatchPath) {
|
|
53
|
+
console.log(`Created skill patch: ${result.skillPatchId}`);
|
|
54
|
+
console.log(result.skillPatchPath);
|
|
55
|
+
}
|
|
56
|
+
if (result.workerSummaryPath) {
|
|
57
|
+
console.log(`Refreshed worker summary: ${result.workerSummaryPath}`);
|
|
58
|
+
}
|
|
59
|
+
if (result.warnings.length > 0) {
|
|
60
|
+
console.log("");
|
|
61
|
+
console.log("Warnings:");
|
|
62
|
+
for (const warning of result.warnings) {
|
|
63
|
+
console.log(`- ${warning}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
console.log("");
|
|
67
|
+
console.log("Next command:");
|
|
68
|
+
console.log(result.nextCommand);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=finish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finish.js","sourceRoot":"","sources":["../../src/commands/finish.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { generateHandoff, inspectSavedHandoff, listSavedHandoffs, showSavedHandoff } from "../core/handoff.js";
|
|
3
|
+
import { normalizeExportPolicy } from "../core/exportPolicy.js";
|
|
4
|
+
import { parsePositiveInt, printTable } from "./shared.js";
|
|
5
|
+
export function registerHandoffCommands(program) {
|
|
6
|
+
const handoff = program
|
|
7
|
+
.command("handoff")
|
|
8
|
+
.description("Generate continuity handoff briefs for fresh AI coding threads.");
|
|
9
|
+
handoff
|
|
10
|
+
.command("generate")
|
|
11
|
+
.description("Compile project, worker, memory, and recent work into a handoff.")
|
|
12
|
+
.option("--project <project>", "Project name.")
|
|
13
|
+
.option("--worker <worker>", "Worker profile name.")
|
|
14
|
+
.option("--task <task>", "Optional next task.")
|
|
15
|
+
.option("--budget <tokens>", "Overall token budget.", parsePositiveInt, 2500)
|
|
16
|
+
.option("--export-policy <policy>", "local-private|shared-only", "local-private")
|
|
17
|
+
.option("--save", "Save to .briefops/handoffs.")
|
|
18
|
+
.option("--output <path>", "Write the handoff to a specific path.")
|
|
19
|
+
.option("--force", "Overwrite an existing explicit output file.")
|
|
20
|
+
.action(async (options) => {
|
|
21
|
+
const result = await generateHandoff({
|
|
22
|
+
project: options.project,
|
|
23
|
+
worker: options.worker,
|
|
24
|
+
task: options.task,
|
|
25
|
+
budget: options.budget,
|
|
26
|
+
exportPolicy: normalizeExportPolicy(options.exportPolicy),
|
|
27
|
+
save: Boolean(options.save) || Boolean(options.output),
|
|
28
|
+
outputPath: options.output
|
|
29
|
+
? path.resolve(process.cwd(), options.output)
|
|
30
|
+
: undefined,
|
|
31
|
+
force: Boolean(options.force)
|
|
32
|
+
});
|
|
33
|
+
console.log(result.content);
|
|
34
|
+
if (result.savedPath) {
|
|
35
|
+
console.error(`Saved handoff: ${result.savedPath}`);
|
|
36
|
+
}
|
|
37
|
+
console.error(`Estimated tokens: ${result.tokens}`);
|
|
38
|
+
});
|
|
39
|
+
handoff
|
|
40
|
+
.command("list")
|
|
41
|
+
.description("List saved handoffs.")
|
|
42
|
+
.action(async () => {
|
|
43
|
+
const handoffs = await listSavedHandoffs(process.cwd());
|
|
44
|
+
if (handoffs.length === 0) {
|
|
45
|
+
console.log("No saved handoffs found.");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
printTable([
|
|
49
|
+
["ID", "Tokens", "Path"],
|
|
50
|
+
...handoffs.map((item) => [item.id, String(item.tokens), item.path])
|
|
51
|
+
]);
|
|
52
|
+
});
|
|
53
|
+
handoff
|
|
54
|
+
.command("show <id>")
|
|
55
|
+
.description("Show a saved handoff by id or latest.")
|
|
56
|
+
.action(async (id) => {
|
|
57
|
+
console.log(await showSavedHandoff(process.cwd(), id));
|
|
58
|
+
});
|
|
59
|
+
handoff
|
|
60
|
+
.command("inspect <id>")
|
|
61
|
+
.description("Inspect a saved handoff by id or latest.")
|
|
62
|
+
.action(async (id) => {
|
|
63
|
+
const result = await inspectSavedHandoff(process.cwd(), id);
|
|
64
|
+
printTable([
|
|
65
|
+
["Field", "Value"],
|
|
66
|
+
["ID", result.metadata.id],
|
|
67
|
+
["Path", result.path],
|
|
68
|
+
["Project", result.metadata.project ?? ""],
|
|
69
|
+
["Worker", result.metadata.worker ?? ""],
|
|
70
|
+
["Characters", String(result.characters)],
|
|
71
|
+
["Estimated Tokens", String(result.metadata.total_tokens)],
|
|
72
|
+
["Budget", String(result.metadata.budget)],
|
|
73
|
+
["Warnings", result.metadata.warnings.join("; ")]
|
|
74
|
+
]);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getInboxSummary } from "../core/inbox.js";
|
|
2
|
+
export function registerInboxCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command("inbox")
|
|
5
|
+
.description("Summarize the local BriefOps operational queue.")
|
|
6
|
+
.option("--project <project>", "Filter by project.")
|
|
7
|
+
.option("--worker <worker>", "Filter by worker.")
|
|
8
|
+
.option("--skill <skill>", "Filter by skill.")
|
|
9
|
+
.action(async (options) => {
|
|
10
|
+
const summary = await getInboxSummary({
|
|
11
|
+
project: options.project,
|
|
12
|
+
worker: options.worker,
|
|
13
|
+
skill: options.skill
|
|
14
|
+
});
|
|
15
|
+
console.log("BriefOps Inbox");
|
|
16
|
+
console.log("");
|
|
17
|
+
console.log("Pending:");
|
|
18
|
+
console.log(`- memory proposals: ${summary.pendingMemoryProposals}`);
|
|
19
|
+
console.log(`- skill patches: ${summary.pendingSkillPatches}`);
|
|
20
|
+
console.log("");
|
|
21
|
+
console.log("Open Risks:");
|
|
22
|
+
console.log(`- ${summary.openRisks} unresolved risk item(s) found in recent logs`);
|
|
23
|
+
if (summary.staleMemory > 0 || summary.deprecatedMemory > 0) {
|
|
24
|
+
console.log("");
|
|
25
|
+
console.log("Memory Maintenance:");
|
|
26
|
+
console.log(`- stale memory: ${summary.staleMemory}`);
|
|
27
|
+
console.log(`- deprecated memory: ${summary.deprecatedMemory}`);
|
|
28
|
+
}
|
|
29
|
+
console.log("");
|
|
30
|
+
console.log("Recommended:");
|
|
31
|
+
for (const command of summary.recommendedCommands) {
|
|
32
|
+
console.log(`- ${command}`);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/commands/inbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;SACnD,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAA6B;YAC9C,MAAM,EAAE,OAAO,CAAC,MAA4B;YAC5C,KAAK,EAAE,OAAO,CAAC,KAA2B;SAC3C,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,SAAS,+CAA+C,CAAC,CAAC;QACnF,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { initWorkspace } from "../core/workspace.js";
|
|
2
|
+
export function registerInitCommand(program) {
|
|
3
|
+
program
|
|
4
|
+
.command("init")
|
|
5
|
+
.description("Create a local .briefops workspace.")
|
|
6
|
+
.action(async () => {
|
|
7
|
+
const result = await initWorkspace(process.cwd());
|
|
8
|
+
console.log(`BriefOps workspace ready: ${result.root}`);
|
|
9
|
+
console.log(`Created: ${result.created.length}`);
|
|
10
|
+
console.log(`Existing: ${result.existing.length}`);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
|