deuk-agent-flow 5.0.2 → 5.0.4
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.ko.md +18 -0
- package/CHANGELOG.md +25 -0
- package/bundled/deuk-agent-flow.vsix +0 -0
- package/core-rules/AGENTS.md +5 -5
- package/package.json +20 -2
- package/scripts/bundle-vscode-vsix.ts +1 -1
- package/scripts/cli-context-commands.ts +35 -0
- package/scripts/cli-init-claude.ts +179 -0
- package/scripts/cli-init-core.ts +89 -0
- package/scripts/cli-init-instructions.ts +489 -0
- package/scripts/cli-init-migrate.ts +504 -0
- package/scripts/cli-init-workspace.ts +63 -0
- package/scripts/cli-locales.ts +85 -0
- package/scripts/cli-skill-commands.ts +3 -1
- package/scripts/cli-ticket-commands.ts +58 -0
- package/scripts/cli-ticket-docmeta.ts +103 -0
- package/scripts/cli-ticket-document.ts +153 -0
- package/scripts/cli-ticket-evidence.ts +312 -0
- package/scripts/cli-ticket-home.ts +449 -0
- package/scripts/cli-ticket-scan.ts +102 -0
- package/scripts/cli-ticket-surface.ts +56 -0
- package/scripts/oss-prepack.js +32 -0
- package/scripts/out/scripts/bundle-vscode-vsix.js +68 -0
- package/scripts/out/scripts/bundle-vscode-vsix.js.map +1 -0
- package/scripts/out/scripts/cli-args.js +374 -0
- package/scripts/out/scripts/cli-args.js.map +1 -0
- package/scripts/out/scripts/cli-context-commands.js +31 -0
- package/scripts/out/scripts/cli-context-commands.js.map +1 -0
- package/scripts/out/scripts/cli-init-claude.js +176 -0
- package/scripts/out/scripts/cli-init-claude.js.map +1 -0
- package/scripts/out/scripts/cli-init-commands.js +87 -0
- package/scripts/out/scripts/cli-init-commands.js.map +1 -0
- package/scripts/out/scripts/cli-init-core.js +89 -0
- package/scripts/out/scripts/cli-init-core.js.map +1 -0
- package/scripts/out/scripts/cli-init-instructions.js +460 -0
- package/scripts/out/scripts/cli-init-instructions.js.map +1 -0
- package/scripts/out/scripts/cli-init-logic.js +41 -0
- package/scripts/out/scripts/cli-init-logic.js.map +1 -0
- package/scripts/out/scripts/cli-init-migrate.js +497 -0
- package/scripts/out/scripts/cli-init-migrate.js.map +1 -0
- package/scripts/out/scripts/cli-init-workspace.js +57 -0
- package/scripts/out/scripts/cli-init-workspace.js.map +1 -0
- package/scripts/out/scripts/cli-locales.js +83 -0
- package/scripts/out/scripts/cli-locales.js.map +1 -0
- package/scripts/out/scripts/cli-prompts.js +101 -0
- package/scripts/out/scripts/cli-prompts.js.map +1 -0
- package/scripts/out/scripts/cli-rule-compiler.js +121 -0
- package/scripts/out/scripts/cli-rule-compiler.js.map +1 -0
- package/scripts/out/scripts/cli-skill-commands.js +708 -0
- package/scripts/out/scripts/cli-skill-commands.js.map +1 -0
- package/scripts/out/scripts/cli-telemetry-commands.js +604 -0
- package/scripts/out/scripts/cli-telemetry-commands.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-command-shared.js +2 -0
- package/scripts/out/scripts/cli-ticket-command-shared.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-commands.js +3530 -0
- package/scripts/out/scripts/cli-ticket-commands.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-docmeta.js +90 -0
- package/scripts/out/scripts/cli-ticket-docmeta.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-document.js +121 -0
- package/scripts/out/scripts/cli-ticket-document.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-evidence.js +286 -0
- package/scripts/out/scripts/cli-ticket-evidence.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-home.js +440 -0
- package/scripts/out/scripts/cli-ticket-home.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-index.js +272 -0
- package/scripts/out/scripts/cli-ticket-index.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-migration.js +261 -0
- package/scripts/out/scripts/cli-ticket-migration.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-parser.js +90 -0
- package/scripts/out/scripts/cli-ticket-parser.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-scan.js +93 -0
- package/scripts/out/scripts/cli-ticket-scan.js.map +1 -0
- package/scripts/out/scripts/cli-ticket-surface.js +53 -0
- package/scripts/out/scripts/cli-ticket-surface.js.map +1 -0
- package/scripts/out/scripts/cli-usage-commands.js +310 -0
- package/scripts/out/scripts/cli-usage-commands.js.map +1 -0
- package/scripts/out/scripts/cli-utils.js +1544 -0
- package/scripts/out/scripts/cli-utils.js.map +1 -0
- package/scripts/out/scripts/cli.js +696 -0
- package/scripts/out/scripts/cli.js.map +1 -0
- package/scripts/out/scripts/lint-md.js +238 -0
- package/scripts/out/scripts/lint-md.js.map +1 -0
- package/scripts/out/scripts/lint-rules.js +193 -0
- package/scripts/out/scripts/lint-rules.js.map +1 -0
- package/scripts/out/scripts/merge-logic.js +38 -0
- package/scripts/out/scripts/merge-logic.js.map +1 -0
- package/scripts/out/scripts/plan-parser.js +52 -0
- package/scripts/out/scripts/plan-parser.js.map +1 -0
- package/scripts/out/scripts/ticket-machine.js +94 -0
- package/scripts/out/scripts/ticket-machine.js.map +1 -0
- package/scripts/out/scripts/ticket-workflow.js +498 -0
- package/scripts/out/scripts/ticket-workflow.js.map +1 -0
- package/scripts/ticket-machine.ts +99 -0
- package/scripts/ticket-workflow.ts +544 -0
- package/templates/skills/role-closer/SKILL.md +27 -0
- package/templates/skills/role-implementer/SKILL.md +30 -0
- package/templates/skills/role-planner/SKILL.md +29 -0
- package/templates/skills/role-qa-verifier/SKILL.md +30 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { parseFrontMatter, discoverAllWorkspaces, detectConsumerTicketDir, computeTicketPath, makePath } from "./cli-utils.js";
|
|
3
|
+
import { readTicketIndexJson, writeTicketIndexJson } from "./cli-ticket-index.js";
|
|
4
|
+
import { splitTicketDocMetaSection } from "./cli-ticket-docmeta.js";
|
|
5
|
+
import { writeTicketDocument } from "./cli-ticket-document.js";
|
|
6
|
+
export { collectTicketMarkdownFiles } from "./cli-ticket-scan.js";
|
|
7
|
+
export function discoverAllTicketDirs(baseCwd, out = []) {
|
|
8
|
+
return discoverAllWorkspaces(baseCwd, undefined, new Set(out));
|
|
9
|
+
}
|
|
10
|
+
export function rebuildTicketIndexFromTopicFilesIfNeeded(cwd, opts = {}) {
|
|
11
|
+
// readTicketIndexJson already derives entries from the .md files (single source
|
|
12
|
+
// of truth) and merges in the thin pointer state (activeTicketId/nextTicketSequence).
|
|
13
|
+
const indexJson = readTicketIndexJson(cwd);
|
|
14
|
+
const ticketDir = detectConsumerTicketDir(cwd);
|
|
15
|
+
if (!ticketDir)
|
|
16
|
+
return indexJson;
|
|
17
|
+
// Persist the thin pointer file so activeTicketId/nextTicketSequence are kept in
|
|
18
|
+
// sync on disk. writeTicketIndexJson stores ONLY the pointer state, never entries.
|
|
19
|
+
writeTicketIndexJson(cwd, indexJson, indexJson._corrupt ? { ...opts, force: true } : opts);
|
|
20
|
+
if (opts.rebuild)
|
|
21
|
+
console.log(`[REBUILD] Ticket pointer synced; ${indexJson.entries.length} entries derived from .md.`);
|
|
22
|
+
return indexJson;
|
|
23
|
+
}
|
|
24
|
+
export function appendTicketEntry(cwd, entry, opts = {}) {
|
|
25
|
+
const indexJson = readTicketIndexJson(cwd);
|
|
26
|
+
entry.status = entry.status || "open";
|
|
27
|
+
// We no longer store 'path' snapshots in INDEX.json
|
|
28
|
+
const { path, ...cleanEntry } = entry;
|
|
29
|
+
const next = {
|
|
30
|
+
version: indexJson.version || 1,
|
|
31
|
+
updatedAt: new Date().toISOString(),
|
|
32
|
+
activeTicketId: indexJson.activeTicketId,
|
|
33
|
+
entries: [cleanEntry, ...indexJson.entries]
|
|
34
|
+
};
|
|
35
|
+
writeTicketIndexJson(cwd, next, opts);
|
|
36
|
+
}
|
|
37
|
+
export function updateTicketEntryStatus(cwd, opts = {}) {
|
|
38
|
+
const indexJson = rebuildTicketIndexFromTopicFilesIfNeeded(cwd, opts);
|
|
39
|
+
let foundIndex = -1;
|
|
40
|
+
const targetId = opts.ticketId ? String(opts.ticketId).toLowerCase() : null;
|
|
41
|
+
if (opts.latest) {
|
|
42
|
+
foundIndex = 0;
|
|
43
|
+
}
|
|
44
|
+
else if (targetId) {
|
|
45
|
+
foundIndex = indexJson.entries.findIndex(e => String(e.id || "").toLowerCase().includes(targetId));
|
|
46
|
+
}
|
|
47
|
+
if (foundIndex === -1) {
|
|
48
|
+
throw new Error("No matching ticket found to update status");
|
|
49
|
+
}
|
|
50
|
+
const entry = indexJson.entries[foundIndex];
|
|
51
|
+
const newStatus = opts.status || "closed";
|
|
52
|
+
entry.status = newStatus;
|
|
53
|
+
if (newStatus === "open" || newStatus === "active") {
|
|
54
|
+
delete entry.archiveYearMonth;
|
|
55
|
+
delete entry.archiveDay;
|
|
56
|
+
}
|
|
57
|
+
if (newStatus === "closed" || newStatus === "completed" || newStatus === "cancelled" || newStatus === "wontfix") {
|
|
58
|
+
entry.phase = 4;
|
|
59
|
+
}
|
|
60
|
+
entry.updatedAt = new Date().toISOString();
|
|
61
|
+
// Sync status back to .md frontmatter to prevent rebuild reversion.
|
|
62
|
+
// #736: cwd is the WORKSPACE root; tickets live in the HOME store (detectConsumerTicketDir).
|
|
63
|
+
// makePath(workspaceRoot, relativePath) misses the file → use the ticket dir as base.
|
|
64
|
+
const entryPath = entry.path || computeTicketPath(entry);
|
|
65
|
+
const ticketDir = detectConsumerTicketDir(cwd) || cwd;
|
|
66
|
+
const absPath = makePath(ticketDir, entryPath);
|
|
67
|
+
if (existsSync(absPath)) {
|
|
68
|
+
try {
|
|
69
|
+
const body = readFileSync(absPath, "utf8");
|
|
70
|
+
const parsed = parseFrontMatter(body);
|
|
71
|
+
if (parsed.parseError)
|
|
72
|
+
throw new Error(parsed.parseError);
|
|
73
|
+
if (parsed.meta.status !== newStatus) {
|
|
74
|
+
parsed.meta.status = newStatus;
|
|
75
|
+
if (newStatus === "closed" || newStatus === "completed" || newStatus === "cancelled" || newStatus === "wontfix") {
|
|
76
|
+
parsed.meta.phase = 4;
|
|
77
|
+
}
|
|
78
|
+
const ticketDocMeta = splitTicketDocMetaSection(parsed.content || "");
|
|
79
|
+
writeTicketDocument(absPath, { meta: parsed.meta, content: ticketDocMeta.body, docmeta: ticketDocMeta.docmeta });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.warn(`[WARNING] Failed to sync status to ${entryPath}: ${err.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const next = { version: indexJson.version, updatedAt: new Date().toISOString(), entries: indexJson.entries };
|
|
87
|
+
writeTicketIndexJson(cwd, next, opts);
|
|
88
|
+
return entry;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=cli-ticket-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-ticket-parser.js","sourceRoot":"","sources":["../../cli-ticket-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,QAAQ,EACnF,MAAM,gBAAgB,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAElE,MAAM,UAAU,qBAAqB,CAAC,OAAO,EAAE,GAAG,GAAG,EAAE;IACrD,OAAO,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,wCAAwC,CAAC,GAAG,EAAE,OAAgB,EAAE;IAC9E,gFAAgF;IAChF,sFAAsF;IACtF,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,iFAAiF;IACjF,mFAAmF;IACnF,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3F,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,oCAAoC,SAAS,CAAC,OAAO,CAAC,MAAM,4BAA4B,CAAC,CAAC;IACxH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,OAAgB,EAAE;IAC9D,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC3C,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IACtC,oDAAoD;IACpD,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC;QAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,cAAc,EAAE,SAAS,CAAC,cAAc;QACxC,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;KAC5C,CAAC;IACF,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAG,EAAE,OAAgB,EAAE;IAC7D,MAAM,SAAS,GAAG,wCAAwC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtE,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAE5E,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAC3C,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC1C,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC,gBAAgB,CAAC;QAC9B,OAAO,KAAK,CAAC,UAAU,CAAC;IAC1B,CAAC;IACD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAChH,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,oEAAoE;IACpE,6FAA6F;IAC7F,sFAAsF;IACtF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,uBAAuB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBAC/B,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;oBAChH,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACxB,CAAC;gBACD,MAAM,aAAa,GAAG,yBAAyB,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;gBACtE,mBAAmB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACnH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,sCAAsC,SAAS,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7G,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Read-only ticket scanning: derive ticket entries from the .md files that are
|
|
2
|
+
// the single source of truth. This module performs NO writes and depends only on
|
|
3
|
+
// cli-utils + ticket-workflow, so it can be imported by both cli-ticket-index.mjs
|
|
4
|
+
// and cli-ticket-parser.mjs without creating an import cycle.
|
|
5
|
+
import { existsSync, readdirSync, readFileSync, statSync } from "fs";
|
|
6
|
+
import { basename, dirname } from "path";
|
|
7
|
+
import { DEUK_ROOT_DIR, TICKET_LIST_FILENAME, toPosixPath, toRepoRelativePath, detectProjectFromBody, normalizeTicketGroup, parseFrontMatter, detectConsumerTicketDir, ARCHIVE_YEAR_MONTH_RE, ARCHIVE_DAY_RE, makePath } from "./cli-utils.js";
|
|
8
|
+
import { inferTicketWorkflowStatus } from "./ticket-workflow.js";
|
|
9
|
+
export function collectTicketMarkdownFiles(dir, out = []) {
|
|
10
|
+
if (!existsSync(dir))
|
|
11
|
+
return out;
|
|
12
|
+
for (const ent of readdirSync(dir, { withFileTypes: true })) {
|
|
13
|
+
const abs = makePath(dir, ent.name);
|
|
14
|
+
if (ent.name === "node_modules" || ent.name === ".git")
|
|
15
|
+
continue;
|
|
16
|
+
if (ent.isDirectory())
|
|
17
|
+
collectTicketMarkdownFiles(abs, out);
|
|
18
|
+
else if (ent.isFile() && /\.md$/i.test(ent.name)) {
|
|
19
|
+
const base = ent.name;
|
|
20
|
+
if (base === "LATEST.md" || base === TICKET_LIST_FILENAME || base === "ACTIVE_TICKET.md" || base === "project-memory.md" || base === "PROJECT_RULE.md")
|
|
21
|
+
continue;
|
|
22
|
+
out.push(abs);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
function parseTicketStorage(rel, isArchived, abs) {
|
|
28
|
+
if (!isArchived) {
|
|
29
|
+
return { group: basename(dirname(abs)) };
|
|
30
|
+
}
|
|
31
|
+
const parts = rel.split("/");
|
|
32
|
+
const archiveIdx = parts.indexOf("archive");
|
|
33
|
+
const group = parts[archiveIdx + 1] || basename(dirname(abs));
|
|
34
|
+
const maybeYearMonth = parts[archiveIdx + 2];
|
|
35
|
+
const maybeDay = parts[archiveIdx + 3];
|
|
36
|
+
if (ARCHIVE_YEAR_MONTH_RE.test(String(maybeYearMonth || "")) && ARCHIVE_DAY_RE.test(String(maybeDay || ""))) {
|
|
37
|
+
return { group: normalizeTicketGroup(group), archiveYearMonth: maybeYearMonth, archiveDay: maybeDay };
|
|
38
|
+
}
|
|
39
|
+
if (ARCHIVE_YEAR_MONTH_RE.test(String(maybeYearMonth || ""))) {
|
|
40
|
+
return { group: normalizeTicketGroup(group), archiveYearMonth: maybeYearMonth };
|
|
41
|
+
}
|
|
42
|
+
return { group: normalizeTicketGroup(group) };
|
|
43
|
+
}
|
|
44
|
+
// Build a single ticket entry from its .md file. Read-only: always parses the
|
|
45
|
+
// file (no mtime-cache reuse) — the active ticket count is bounded (MAX_OPEN_TICKETS),
|
|
46
|
+
// so a full parse of the live set is negligible.
|
|
47
|
+
export function buildTicketEntry(abs, cwd) {
|
|
48
|
+
const rel = toPosixPath(toRepoRelativePath(cwd, abs));
|
|
49
|
+
const filename = basename(abs);
|
|
50
|
+
const idFromFilename = filename.replace(/\.md$/i, "");
|
|
51
|
+
const isAlreadyInArchive = rel.includes("/archive/");
|
|
52
|
+
const storage = parseTicketStorage(rel, isAlreadyInArchive, abs);
|
|
53
|
+
const group = storage.group;
|
|
54
|
+
const mtimeIso = statSync(abs).mtime.toISOString();
|
|
55
|
+
let meta = {}, content = "";
|
|
56
|
+
try {
|
|
57
|
+
const body = readFileSync(abs, "utf8");
|
|
58
|
+
const parsed = parseFrontMatter(body);
|
|
59
|
+
meta = parsed.meta;
|
|
60
|
+
content = parsed.content;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.warn(`[WARNING] Failed to parse ${rel}: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
const title = meta.title || idFromFilename;
|
|
66
|
+
const project = meta.project || detectProjectFromBody(content);
|
|
67
|
+
const phase = Number(meta.phase || 1);
|
|
68
|
+
const status = inferTicketWorkflowStatus(meta, isAlreadyInArchive);
|
|
69
|
+
return {
|
|
70
|
+
id: meta.id || idFromFilename,
|
|
71
|
+
title,
|
|
72
|
+
group,
|
|
73
|
+
fileName: filename,
|
|
74
|
+
project,
|
|
75
|
+
mainTicket: meta.mainTicket,
|
|
76
|
+
submodule: meta.submodule || (rel.startsWith(DEUK_ROOT_DIR) ? "" : rel.split("/")[0]),
|
|
77
|
+
createdAt: meta.createdAt || mtimeIso,
|
|
78
|
+
updatedAt: mtimeIso,
|
|
79
|
+
source: "ticket-sync",
|
|
80
|
+
phase,
|
|
81
|
+
status,
|
|
82
|
+
archiveYearMonth: storage.archiveYearMonth,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Derive the full ticket entry list from .md files under the official ticket dir.
|
|
86
|
+
export function collectTicketEntriesFromTopicFiles(cwd) {
|
|
87
|
+
const ticketDir = detectConsumerTicketDir(cwd);
|
|
88
|
+
if (!ticketDir)
|
|
89
|
+
return [];
|
|
90
|
+
const files = collectTicketMarkdownFiles(ticketDir);
|
|
91
|
+
return files.map(abs => buildTicketEntry(abs, cwd));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=cli-ticket-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-ticket-scan.js","sourceRoot":"","sources":["../../cli-ticket-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function renderTicketWorkflowGateFailure({ ticketId = "<ticket-id>", workspace = "", docmeta = {}, reasons = [] } = {}) {
|
|
2
|
+
const missing = [...new Set([...(reasons || []), ...(docmeta.validation?.errors || [])])];
|
|
3
|
+
const phase1Reasons = docmeta.slot_source_map?.phase1Plan?.errors || [];
|
|
4
|
+
const lines = [
|
|
5
|
+
`[APPROVAL GATE BLOCKED] Ticket ${ticketId} cannot enter execution yet.`,
|
|
6
|
+
"This is a single-pass gate: satisfy every missing slot below, then run the one command shown.",
|
|
7
|
+
"",
|
|
8
|
+
"Missing slots:"
|
|
9
|
+
];
|
|
10
|
+
const slotLabels = {
|
|
11
|
+
phase1Plan: "Phase 1 ticket body is complete",
|
|
12
|
+
userApproval: "User approved the reviewed ticket and Phase 2 transition",
|
|
13
|
+
executionEvidence: "Execution evidence is present",
|
|
14
|
+
verificationEvidence: "Verification evidence is present",
|
|
15
|
+
debuggingDecision: "Debugging decision is present",
|
|
16
|
+
completionEvidence: "Completion evidence is present",
|
|
17
|
+
reopenDecision: "Reopen decision is present"
|
|
18
|
+
};
|
|
19
|
+
for (const slot of Object.keys(docmeta.slots || {})) {
|
|
20
|
+
if (docmeta.slots[slot])
|
|
21
|
+
continue;
|
|
22
|
+
lines.push(`- ${slot}: ${slotLabels[slot] || "required evidence is missing"}`);
|
|
23
|
+
}
|
|
24
|
+
if (phase1Reasons.length > 0) {
|
|
25
|
+
lines.push("");
|
|
26
|
+
lines.push(`Phase 1 body gaps: ${phase1Reasons.join(", ")}`);
|
|
27
|
+
}
|
|
28
|
+
if (missing.length > 0) {
|
|
29
|
+
lines.push(`Reason codes: ${missing.join(", ")}`);
|
|
30
|
+
}
|
|
31
|
+
lines.push("");
|
|
32
|
+
// #633: workspace comes ONLY from --workspace (registry); cwd is never used. Pre-announce
|
|
33
|
+
// so the agent always passes --workspace — omitting it errors out.
|
|
34
|
+
lines.push("NOTE: workspace is resolved ONLY from --workspace (registry); cwd is never used.");
|
|
35
|
+
lines.push("Omitting --workspace will error out, so always pass it on every ticket command.");
|
|
36
|
+
lines.push("");
|
|
37
|
+
lines.push("Run ONLY after the user types approval in chat (승인/approved/yes/진행해):");
|
|
38
|
+
lines.push("```bash");
|
|
39
|
+
lines.push(`deuk-agent-flow ticket move --id ${ticketId} --workspace ${workspace || "<workspace-id>"} --phase 2 --approval approved --non-interactive`);
|
|
40
|
+
lines.push("```");
|
|
41
|
+
lines.push("");
|
|
42
|
+
// #641: give the agent the legitimate exit so a blocked gate never tempts it into
|
|
43
|
+
// forging approval or forcing a phase jump. discard only works on unapproved Phase 1 tickets.
|
|
44
|
+
lines.push("Do NOT self-approve (running --approval approved without the user's chat approval),");
|
|
45
|
+
lines.push("and do NOT force a phase jump. If this unapproved Phase 1 ticket should be abandoned, discard it:");
|
|
46
|
+
lines.push("```bash");
|
|
47
|
+
lines.push(`deuk-agent-flow ticket discard --id ${ticketId} --workspace ${workspace || "<workspace-id>"} --non-interactive`);
|
|
48
|
+
lines.push("```");
|
|
49
|
+
lines.push("");
|
|
50
|
+
lines.push(`DocMeta validation: ${docmeta.validation?.status || "UNKNOWN"}`);
|
|
51
|
+
return lines.join("\n");
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=cli-ticket-surface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-ticket-surface.js","sourceRoot":"","sources":["../../cli-ticket-surface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
2
|
+
import { DEUK_ROOT_DIR, makePath } from "./cli-utils.js";
|
|
3
|
+
const USAGE_FILENAME = `${DEUK_ROOT_DIR}/usage.json`;
|
|
4
|
+
const USAGE_VERSION = 1;
|
|
5
|
+
const VALID_TASK_GRADES = new Set(["S", "A", "B", "C"]);
|
|
6
|
+
const DEFAULT_PLATFORM = "codex";
|
|
7
|
+
const PLATFORM_ALIASES = {
|
|
8
|
+
codex: "codex",
|
|
9
|
+
copilot: "copilot",
|
|
10
|
+
ghcopilot: "copilot",
|
|
11
|
+
"github-copilot": "copilot",
|
|
12
|
+
claude: "claude",
|
|
13
|
+
claudecode: "claude",
|
|
14
|
+
cursor: "cursor"
|
|
15
|
+
};
|
|
16
|
+
const PLATFORM_DEFAULT_CLIENT = {
|
|
17
|
+
codex: "Codex",
|
|
18
|
+
copilot: "Copilot",
|
|
19
|
+
claude: "ClaudeCode",
|
|
20
|
+
cursor: "Cursor"
|
|
21
|
+
};
|
|
22
|
+
export async function runUsage(action, opts) {
|
|
23
|
+
if (action === "set") {
|
|
24
|
+
return runUsageSet(opts);
|
|
25
|
+
}
|
|
26
|
+
if (action === "status") {
|
|
27
|
+
return runUsageStatus(opts);
|
|
28
|
+
}
|
|
29
|
+
if (action === "advise") {
|
|
30
|
+
return runUsageAdvise(opts);
|
|
31
|
+
}
|
|
32
|
+
console.error("Unknown usage action: " + action);
|
|
33
|
+
console.log("Usage: npx deuk-agent-flow usage <set|status|advise> [options]");
|
|
34
|
+
}
|
|
35
|
+
export function loadUsageState(cwd) {
|
|
36
|
+
const absPath = makePath(cwd, USAGE_FILENAME);
|
|
37
|
+
if (!existsSync(absPath))
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
const data = JSON.parse(readFileSync(absPath, "utf8"));
|
|
41
|
+
if (data.version !== USAGE_VERSION)
|
|
42
|
+
return null;
|
|
43
|
+
return normalizeUsageState(data);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function writeUsageState(cwd, state) {
|
|
50
|
+
const absPath = makePath(cwd, USAGE_FILENAME);
|
|
51
|
+
const dir = makePath(cwd, DEUK_ROOT_DIR);
|
|
52
|
+
if (!existsSync(dir))
|
|
53
|
+
mkdirSync(dir, { recursive: true });
|
|
54
|
+
writeFileSync(absPath, JSON.stringify({
|
|
55
|
+
version: USAGE_VERSION,
|
|
56
|
+
platform: state.platform,
|
|
57
|
+
client: state.client,
|
|
58
|
+
agentId: state.agentId,
|
|
59
|
+
weeklyRemainingPct: state.weeklyRemainingPct,
|
|
60
|
+
fiveHourRemainingPct: state.fiveHourRemainingPct,
|
|
61
|
+
weeklyResetAt: state.weeklyResetAt,
|
|
62
|
+
fiveHourResetAt: state.fiveHourResetAt,
|
|
63
|
+
updatedAt: state.updatedAt
|
|
64
|
+
}, null, 2), "utf8");
|
|
65
|
+
}
|
|
66
|
+
function normalizeUsageState(raw = {}) {
|
|
67
|
+
const platform = normalizePlatform(raw.platform || DEFAULT_PLATFORM);
|
|
68
|
+
const normalizedClient = String(raw.client || "").trim();
|
|
69
|
+
return {
|
|
70
|
+
platform,
|
|
71
|
+
client: normalizedClient || resolveClientForPlatform(platform),
|
|
72
|
+
agentId: String(raw.agentId || ""),
|
|
73
|
+
weeklyRemainingPct: clampPercent(raw.weeklyRemainingPct),
|
|
74
|
+
fiveHourRemainingPct: clampPercent(raw.fiveHourRemainingPct),
|
|
75
|
+
weeklyResetAt: String(raw.weeklyResetAt || ""),
|
|
76
|
+
fiveHourResetAt: String(raw.fiveHourResetAt || ""),
|
|
77
|
+
updatedAt: String(raw.updatedAt || "")
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function clampPercent(value) {
|
|
81
|
+
if (value === null || value === undefined || Number.isNaN(Number(value)))
|
|
82
|
+
return null;
|
|
83
|
+
return Math.min(100, Math.max(0, Number(value)));
|
|
84
|
+
}
|
|
85
|
+
function resolveTaskGrade(input = "") {
|
|
86
|
+
const grade = String(input || "").trim().toUpperCase();
|
|
87
|
+
if (!VALID_TASK_GRADES.has(grade))
|
|
88
|
+
return "";
|
|
89
|
+
return grade;
|
|
90
|
+
}
|
|
91
|
+
function normalizePlatform(input = "") {
|
|
92
|
+
const key = String(input || "").trim().toLowerCase();
|
|
93
|
+
if (!key)
|
|
94
|
+
return DEFAULT_PLATFORM;
|
|
95
|
+
return PLATFORM_ALIASES[key] || key;
|
|
96
|
+
}
|
|
97
|
+
function resolveClientForPlatform(platform) {
|
|
98
|
+
return PLATFORM_DEFAULT_CLIENT[platform] || "Codex";
|
|
99
|
+
}
|
|
100
|
+
function buildBudgetAdvice(state, taskGrade) {
|
|
101
|
+
const weekly = state.weeklyRemainingPct;
|
|
102
|
+
const fiveHour = state.fiveHourRemainingPct;
|
|
103
|
+
const tight = weekly !== null && weekly <= 20 || fiveHour !== null && fiveHour <= 15;
|
|
104
|
+
const critical = weekly !== null && weekly <= 10 || fiveHour !== null && fiveHour <= 8;
|
|
105
|
+
if (!taskGrade) {
|
|
106
|
+
return {
|
|
107
|
+
budget: critical ? "phase1-only" : tight ? "split-large-tasks" : "normal",
|
|
108
|
+
gate: critical ? "no broad work" : tight ? "keep scope narrow" : "ok",
|
|
109
|
+
next: critical ? "ticket status" : "usage advise --task-grade A"
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (critical) {
|
|
113
|
+
return {
|
|
114
|
+
budget: `${taskGrade} blocked`,
|
|
115
|
+
gate: "phase1-only",
|
|
116
|
+
next: "summarize and stop"
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (tight) {
|
|
120
|
+
if (taskGrade === "S" || taskGrade === "A") {
|
|
121
|
+
return {
|
|
122
|
+
budget: `${taskGrade} split`,
|
|
123
|
+
gate: "no broad refactor",
|
|
124
|
+
next: "split ticket"
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
budget: `${taskGrade} ok`,
|
|
129
|
+
gate: "keep local",
|
|
130
|
+
next: "avoid broad search"
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
if (taskGrade === "S") {
|
|
134
|
+
return {
|
|
135
|
+
budget: "S ok with ticket",
|
|
136
|
+
gate: "verify before execute",
|
|
137
|
+
next: "keep one active task"
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (taskGrade === "A") {
|
|
141
|
+
return {
|
|
142
|
+
budget: "A ok",
|
|
143
|
+
gate: "normal",
|
|
144
|
+
next: "execute"
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (taskGrade === "B") {
|
|
148
|
+
return {
|
|
149
|
+
budget: "B ok",
|
|
150
|
+
gate: "normal",
|
|
151
|
+
next: "keep concise"
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
budget: "C ok",
|
|
156
|
+
gate: "normal",
|
|
157
|
+
next: "stay compact"
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function buildConversationAdvice(state, opts = {}, budgetAdvice = {}) {
|
|
161
|
+
const turnCount = Number(opts.turnCount || 0);
|
|
162
|
+
const linkedTicketCount = Number(opts.linkedTicketCount || 0);
|
|
163
|
+
const crossWorkspace = Boolean(opts.crossWorkspace);
|
|
164
|
+
const weekly = state.weeklyRemainingPct;
|
|
165
|
+
const fiveHour = state.fiveHourRemainingPct;
|
|
166
|
+
const lowFiveHour = fiveHour !== null && fiveHour <= 15;
|
|
167
|
+
const criticalFiveHour = fiveHour !== null && fiveHour <= 8;
|
|
168
|
+
const lowWeekly = weekly !== null && weekly <= 20;
|
|
169
|
+
const highTurns = turnCount >= 25;
|
|
170
|
+
const veryHighTurns = turnCount >= 40;
|
|
171
|
+
const manyLinkedTickets = linkedTicketCount >= 3;
|
|
172
|
+
if (criticalFiveHour || (lowFiveHour && veryHighTurns) || (lowFiveHour && crossWorkspace && highTurns)) {
|
|
173
|
+
return {
|
|
174
|
+
conversationAction: "handoff-and-new-chat",
|
|
175
|
+
conversationGate: "handoff now",
|
|
176
|
+
conversationNext: "handoff and start new chat"
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
if ((crossWorkspace && highTurns) || manyLinkedTickets || (lowWeekly && highTurns)) {
|
|
180
|
+
return {
|
|
181
|
+
conversationAction: "split-chat",
|
|
182
|
+
conversationGate: "split context",
|
|
183
|
+
conversationNext: "split ticket or new chat"
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (budgetAdvice.gate === "phase1-only") {
|
|
187
|
+
return {
|
|
188
|
+
conversationAction: "stop-in-current-chat",
|
|
189
|
+
conversationGate: "phase1-only",
|
|
190
|
+
conversationNext: "summarize and stop"
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
conversationAction: "keep-current-chat",
|
|
195
|
+
conversationGate: "keep current chat",
|
|
196
|
+
conversationNext: "continue"
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
async function runUsageSet(opts) {
|
|
200
|
+
const current = loadUsageState(opts.cwd) || normalizeUsageState();
|
|
201
|
+
const hasPlatformOverride = Boolean(String(opts.platform || "").trim());
|
|
202
|
+
const nextPlatform = normalizePlatform(opts.platform || current.platform || DEFAULT_PLATFORM);
|
|
203
|
+
const incomingClient = String(opts.client || "").trim();
|
|
204
|
+
const resolvedClient = incomingClient
|
|
205
|
+
|| (hasPlatformOverride
|
|
206
|
+
? resolveClientForPlatform(nextPlatform)
|
|
207
|
+
: (current.client || resolveClientForPlatform(nextPlatform)));
|
|
208
|
+
const next = normalizeUsageState({
|
|
209
|
+
...current,
|
|
210
|
+
platform: nextPlatform,
|
|
211
|
+
client: resolvedClient,
|
|
212
|
+
agentId: opts.agentId || current.agentId,
|
|
213
|
+
weeklyRemainingPct: opts.weeklyRemaining !== null ? opts.weeklyRemaining : current.weeklyRemainingPct,
|
|
214
|
+
fiveHourRemainingPct: opts.fiveHourRemaining !== null ? opts.fiveHourRemaining : current.fiveHourRemainingPct,
|
|
215
|
+
weeklyResetAt: opts.weeklyReset || current.weeklyResetAt,
|
|
216
|
+
fiveHourResetAt: opts.fiveHourReset || current.fiveHourResetAt,
|
|
217
|
+
updatedAt: new Date().toISOString()
|
|
218
|
+
});
|
|
219
|
+
writeUsageState(opts.cwd, next);
|
|
220
|
+
if (opts.json) {
|
|
221
|
+
console.log(JSON.stringify(next, null, 2));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
console.log(`usage: ${next.client} weekly ${formatPct(next.weeklyRemainingPct)}, 5h ${formatPct(next.fiveHourRemainingPct)}`);
|
|
225
|
+
if (next.agentId)
|
|
226
|
+
console.log(`agent: ${next.agentId}`);
|
|
227
|
+
if (next.weeklyResetAt)
|
|
228
|
+
console.log(`reset: weekly ${next.weeklyResetAt}`);
|
|
229
|
+
if (next.fiveHourResetAt)
|
|
230
|
+
console.log(`reset: 5h ${next.fiveHourResetAt}`);
|
|
231
|
+
}
|
|
232
|
+
async function runUsageStatus(opts) {
|
|
233
|
+
const state = loadUsageState(opts.cwd);
|
|
234
|
+
if (!state) {
|
|
235
|
+
const message = "usage not set";
|
|
236
|
+
if (opts.json) {
|
|
237
|
+
console.log(JSON.stringify({ status: message }, null, 2));
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
console.log(message);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (opts.json) {
|
|
244
|
+
console.log(JSON.stringify(state, null, 2));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
console.log(`usage: ${state.client} weekly ${formatPct(state.weeklyRemainingPct)}, 5h ${formatPct(state.fiveHourRemainingPct)}`);
|
|
248
|
+
if (state.agentId)
|
|
249
|
+
console.log(`agent: ${state.agentId}`);
|
|
250
|
+
if (state.weeklyResetAt)
|
|
251
|
+
console.log(`reset: weekly ${state.weeklyResetAt}`);
|
|
252
|
+
if (state.fiveHourResetAt)
|
|
253
|
+
console.log(`reset: 5h ${state.fiveHourResetAt}`);
|
|
254
|
+
}
|
|
255
|
+
async function runUsageAdvise(opts) {
|
|
256
|
+
const state = loadUsageState(opts.cwd);
|
|
257
|
+
if (!state) {
|
|
258
|
+
const message = "usage not set";
|
|
259
|
+
if (opts.json) {
|
|
260
|
+
console.log(JSON.stringify({ status: message }, null, 2));
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
console.log(message);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const taskGrade = resolveTaskGrade(opts.taskGrade);
|
|
267
|
+
const advice = buildBudgetAdvice(state, taskGrade);
|
|
268
|
+
const conversation = buildConversationAdvice(state, opts, advice);
|
|
269
|
+
const payload = {
|
|
270
|
+
...state,
|
|
271
|
+
taskGrade: taskGrade || null,
|
|
272
|
+
taskLabel: opts.taskLabel || "",
|
|
273
|
+
turnCount: Number(opts.turnCount || 0),
|
|
274
|
+
linkedTicketCount: Number(opts.linkedTicketCount || 0),
|
|
275
|
+
crossWorkspace: Boolean(opts.crossWorkspace),
|
|
276
|
+
...advice,
|
|
277
|
+
...conversation
|
|
278
|
+
};
|
|
279
|
+
if (opts.json) {
|
|
280
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
console.log(`usage: ${state.client} weekly ${formatPct(state.weeklyRemainingPct)}, 5h ${formatPct(state.fiveHourRemainingPct)}`);
|
|
284
|
+
if (state.agentId)
|
|
285
|
+
console.log(`agent: ${state.agentId}`);
|
|
286
|
+
console.log(`budget: ${advice.budget}`);
|
|
287
|
+
console.log(`${advice.gate === "ok" ? "next" : "gate"}: ${advice.gate === "ok" ? advice.next : advice.gate}`);
|
|
288
|
+
if (advice.gate !== "ok")
|
|
289
|
+
console.log(`next: ${advice.next}`);
|
|
290
|
+
if (conversation.conversationAction !== "keep-current-chat") {
|
|
291
|
+
console.log(`chat: ${conversation.conversationNext}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function formatPct(value) {
|
|
295
|
+
return value === null ? "n/a" : `${value}%`;
|
|
296
|
+
}
|
|
297
|
+
export function getUsageReminderLine(cwd, opts = {}) {
|
|
298
|
+
const state = loadUsageState(cwd);
|
|
299
|
+
if (!state)
|
|
300
|
+
return "";
|
|
301
|
+
const taskGrade = resolveTaskGrade(opts.taskGrade || "");
|
|
302
|
+
const advice = buildBudgetAdvice(state, taskGrade);
|
|
303
|
+
const conversation = buildConversationAdvice(state, opts, advice);
|
|
304
|
+
const gateText = advice.gate === "ok" ? advice.next : advice.gate;
|
|
305
|
+
const chatText = conversation.conversationAction === "keep-current-chat"
|
|
306
|
+
? "keep current chat"
|
|
307
|
+
: conversation.conversationNext;
|
|
308
|
+
return `usage reminder: ${state.client} weekly ${formatPct(state.weeklyRemainingPct)}, 5h ${formatPct(state.fiveHourRemainingPct)} | budget ${advice.budget} | gate ${gateText} | chat ${chatText}`;
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=cli-usage-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-usage-commands.js","sourceRoot":"","sources":["../../cli-usage-commands.ts"],"names":[],"mappings":"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"}
|