@pedrocivita/tocket 2.4.0 → 2.6.3

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.
Files changed (120) hide show
  1. package/README.md +229 -18
  2. package/dist/commands/agents-md.cmd.d.ts +2 -0
  3. package/dist/commands/agents-md.cmd.js +166 -0
  4. package/dist/commands/agents-md.cmd.js.map +1 -0
  5. package/dist/commands/dashboard.js +2 -0
  6. package/dist/commands/dashboard.js.map +1 -1
  7. package/dist/commands/decide.cmd.d.ts +2 -0
  8. package/dist/commands/decide.cmd.js +70 -0
  9. package/dist/commands/decide.cmd.js.map +1 -0
  10. package/dist/commands/diff.cmd.d.ts +15 -0
  11. package/dist/commands/diff.cmd.js +106 -0
  12. package/dist/commands/diff.cmd.js.map +1 -0
  13. package/dist/commands/doctor.cmd.d.ts +13 -0
  14. package/dist/commands/doctor.cmd.js +159 -11
  15. package/dist/commands/doctor.cmd.js.map +1 -1
  16. package/dist/commands/eject.cmd.d.ts +1 -1
  17. package/dist/commands/eject.cmd.js +3 -1
  18. package/dist/commands/eject.cmd.js.map +1 -1
  19. package/dist/commands/generate.cmd.js +7 -1
  20. package/dist/commands/generate.cmd.js.map +1 -1
  21. package/dist/commands/handoff.cmd.d.ts +14 -0
  22. package/dist/commands/handoff.cmd.js +131 -0
  23. package/dist/commands/handoff.cmd.js.map +1 -0
  24. package/dist/commands/init.cmd.js +64 -11
  25. package/dist/commands/init.cmd.js.map +1 -1
  26. package/dist/commands/scaffold.cmd.d.ts +2 -0
  27. package/dist/commands/scaffold.cmd.js +118 -0
  28. package/dist/commands/scaffold.cmd.js.map +1 -0
  29. package/dist/commands/suite.cmd.d.ts +2 -0
  30. package/dist/commands/suite.cmd.js +386 -0
  31. package/dist/commands/suite.cmd.js.map +1 -0
  32. package/dist/commands/validate.cmd.js +1 -0
  33. package/dist/commands/validate.cmd.js.map +1 -1
  34. package/dist/commands/work.cmd.d.ts +2 -0
  35. package/dist/commands/work.cmd.js +48 -0
  36. package/dist/commands/work.cmd.js.map +1 -0
  37. package/dist/eval/decide-eval.d.ts +28 -0
  38. package/dist/eval/decide-eval.js +34 -0
  39. package/dist/eval/decide-eval.js.map +1 -0
  40. package/dist/eval/triage-eval.d.ts +46 -0
  41. package/dist/eval/triage-eval.js +174 -0
  42. package/dist/eval/triage-eval.js.map +1 -0
  43. package/dist/index.js +15 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/mcp/index.d.ts +2 -0
  46. package/dist/mcp/index.js +7 -0
  47. package/dist/mcp/index.js.map +1 -0
  48. package/dist/mcp/server.d.ts +4 -0
  49. package/dist/mcp/server.js +360 -0
  50. package/dist/mcp/server.js.map +1 -0
  51. package/dist/templates/memory-bank.d.ts +11 -0
  52. package/dist/templates/memory-bank.js +456 -329
  53. package/dist/templates/memory-bank.js.map +1 -1
  54. package/dist/tests/agents.test.js +59 -1
  55. package/dist/tests/agents.test.js.map +1 -1
  56. package/dist/tests/decide.test.d.ts +1 -0
  57. package/dist/tests/decide.test.js +483 -0
  58. package/dist/tests/decide.test.js.map +1 -0
  59. package/dist/tests/diff.test.d.ts +1 -0
  60. package/dist/tests/diff.test.js +119 -0
  61. package/dist/tests/diff.test.js.map +1 -0
  62. package/dist/tests/doctor.test.js +73 -1
  63. package/dist/tests/doctor.test.js.map +1 -1
  64. package/dist/tests/eject.test.js +3 -0
  65. package/dist/tests/eject.test.js.map +1 -1
  66. package/dist/tests/git.test.js +32 -1
  67. package/dist/tests/git.test.js.map +1 -1
  68. package/dist/tests/handoff.test.d.ts +1 -0
  69. package/dist/tests/handoff.test.js +97 -0
  70. package/dist/tests/handoff.test.js.map +1 -0
  71. package/dist/tests/helpers.d.ts +4 -0
  72. package/dist/tests/helpers.js +9 -0
  73. package/dist/tests/helpers.js.map +1 -0
  74. package/dist/tests/helpers.test.d.ts +1 -0
  75. package/dist/tests/helpers.test.js +16 -0
  76. package/dist/tests/helpers.test.js.map +1 -0
  77. package/dist/tests/init.test.js +53 -2
  78. package/dist/tests/init.test.js.map +1 -1
  79. package/dist/tests/loop.test.d.ts +1 -0
  80. package/dist/tests/loop.test.js +153 -0
  81. package/dist/tests/loop.test.js.map +1 -0
  82. package/dist/tests/memory-bank.test.js +53 -1
  83. package/dist/tests/memory-bank.test.js.map +1 -1
  84. package/dist/tests/suite.test.d.ts +1 -0
  85. package/dist/tests/suite.test.js +199 -0
  86. package/dist/tests/suite.test.js.map +1 -0
  87. package/dist/tests/triage.test.d.ts +1 -0
  88. package/dist/tests/triage.test.js +152 -0
  89. package/dist/tests/triage.test.js.map +1 -0
  90. package/dist/tests/work.test.d.ts +1 -0
  91. package/dist/tests/work.test.js +276 -0
  92. package/dist/tests/work.test.js.map +1 -0
  93. package/dist/tests/xml.test.d.ts +1 -0
  94. package/dist/tests/xml.test.js +139 -0
  95. package/dist/tests/xml.test.js.map +1 -0
  96. package/dist/utils/agents.d.ts +23 -0
  97. package/dist/utils/agents.js +82 -0
  98. package/dist/utils/agents.js.map +1 -1
  99. package/dist/utils/appmaps.d.ts +65 -0
  100. package/dist/utils/appmaps.js +280 -0
  101. package/dist/utils/appmaps.js.map +1 -0
  102. package/dist/utils/decide.d.ts +178 -0
  103. package/dist/utils/decide.js +623 -0
  104. package/dist/utils/decide.js.map +1 -0
  105. package/dist/utils/git.d.ts +2 -0
  106. package/dist/utils/git.js +35 -1
  107. package/dist/utils/git.js.map +1 -1
  108. package/dist/utils/jev.d.ts +83 -0
  109. package/dist/utils/jev.js +190 -0
  110. package/dist/utils/jev.js.map +1 -0
  111. package/dist/utils/triage.d.ts +87 -0
  112. package/dist/utils/triage.js +241 -0
  113. package/dist/utils/triage.js.map +1 -0
  114. package/dist/utils/work.d.ts +72 -0
  115. package/dist/utils/work.js +225 -0
  116. package/dist/utils/work.js.map +1 -0
  117. package/dist/utils/xml.d.ts +22 -0
  118. package/dist/utils/xml.js +54 -0
  119. package/dist/utils/xml.js.map +1 -0
  120. package/package.json +53 -50
@@ -0,0 +1,139 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { parsePayloadXml } from "../utils/xml.js";
4
+ const sampleXml = `<payload version="2.0">
5
+ <meta>
6
+ <intent>Add input validation</intent>
7
+ <scope>src/commands/sync.cmd.ts</scope>
8
+ <skills>core,lsp</skills>
9
+ <priority>medium</priority>
10
+ </meta>
11
+
12
+ <context>
13
+ <summary>Adding validation to sync command</summary>
14
+ </context>
15
+
16
+ <tasks>
17
+ <task id="1" type="edit">
18
+ <target>src/commands/sync.cmd.ts</target>
19
+ <action>Add input validation</action>
20
+ <spec>Validate summary is non-empty</spec>
21
+ <done>Summary validation works</done>
22
+ </task>
23
+ <task id="2" type="create">
24
+ <target>src/utils/validation.ts</target>
25
+ <action>Create validation utility</action>
26
+ <spec>Reusable validators</spec>
27
+ <done>Utility is importable</done>
28
+ </task>
29
+ </tasks>
30
+
31
+ <validate>
32
+ <check>npm test passes</check>
33
+ <check>sync command rejects empty summary</check>
34
+ </validate>
35
+ </payload>`;
36
+ describe("parsePayloadXml", () => {
37
+ it("extracts version", () => {
38
+ const result = parsePayloadXml(sampleXml);
39
+ assert.equal(result.version, "2.0");
40
+ });
41
+ it("extracts meta fields", () => {
42
+ const result = parsePayloadXml(sampleXml);
43
+ assert.equal(result.meta.intent, "Add input validation");
44
+ assert.equal(result.meta.scope, "src/commands/sync.cmd.ts");
45
+ assert.equal(result.meta.skills, "core,lsp");
46
+ assert.equal(result.meta.priority, "medium");
47
+ });
48
+ it("extracts tasks with correct ids and types", () => {
49
+ const result = parsePayloadXml(sampleXml);
50
+ assert.equal(result.tasks.length, 2);
51
+ assert.equal(result.tasks[0].id, "1");
52
+ assert.equal(result.tasks[0].type, "edit");
53
+ assert.equal(result.tasks[1].id, "2");
54
+ assert.equal(result.tasks[1].type, "create");
55
+ });
56
+ it("extracts task targets", () => {
57
+ const result = parsePayloadXml(sampleXml);
58
+ assert.equal(result.tasks[0].target, "src/commands/sync.cmd.ts");
59
+ assert.equal(result.tasks[1].target, "src/utils/validation.ts");
60
+ });
61
+ it("extracts task actions", () => {
62
+ const result = parsePayloadXml(sampleXml);
63
+ assert.equal(result.tasks[0].action, "Add input validation");
64
+ assert.equal(result.tasks[1].action, "Create validation utility");
65
+ });
66
+ it("extracts done criteria", () => {
67
+ const result = parsePayloadXml(sampleXml);
68
+ assert.equal(result.tasks[0].done, "Summary validation works");
69
+ assert.equal(result.tasks[1].done, "Utility is importable");
70
+ });
71
+ it("extracts validation checks", () => {
72
+ const result = parsePayloadXml(sampleXml);
73
+ assert.equal(result.checks.length, 2);
74
+ assert.equal(result.checks[0], "npm test passes");
75
+ assert.equal(result.checks[1], "sync command rejects empty summary");
76
+ });
77
+ it("strips placeholder comments from values", () => {
78
+ const xml = `<payload version="2.0">
79
+ <meta>
80
+ <intent>Test</intent>
81
+ <scope>src/</scope>
82
+ <skills></skills>
83
+ <priority>low</priority>
84
+ </meta>
85
+ <tasks>
86
+ <task id="1" type="create | edit | delete">
87
+ <target><!-- file/path --></target>
88
+ <action>Do something</action>
89
+ <spec><!-- Detailed specification --></spec>
90
+ <done><!-- Definition of done --></done>
91
+ </task>
92
+ </tasks>
93
+ <validate>
94
+ <check><!-- How to verify success --></check>
95
+ </validate>
96
+ </payload>`;
97
+ const result = parsePayloadXml(xml);
98
+ assert.equal(result.tasks[0].target, "");
99
+ assert.equal(result.tasks[0].done, "");
100
+ assert.equal(result.checks.length, 0);
101
+ });
102
+ it("handles payload without skills tag", () => {
103
+ const xml = `<payload version="2.0">
104
+ <meta>
105
+ <intent>Test</intent>
106
+ <scope>src/</scope>
107
+ <priority>low</priority>
108
+ </meta>
109
+ <tasks></tasks>
110
+ <validate></validate>
111
+ </payload>`;
112
+ const result = parsePayloadXml(xml);
113
+ assert.equal(result.meta.skills, "");
114
+ assert.equal(result.tasks.length, 0);
115
+ assert.equal(result.checks.length, 0);
116
+ });
117
+ it("handles task with skill attribute", () => {
118
+ const xml = `<payload version="2.0">
119
+ <meta>
120
+ <intent>Test</intent>
121
+ <scope>src/</scope>
122
+ <priority>low</priority>
123
+ </meta>
124
+ <tasks>
125
+ <task id="1" type="edit" skill="core">
126
+ <target>src/foo.ts</target>
127
+ <action>Edit foo</action>
128
+ <spec>Details</spec>
129
+ <done>Foo edited</done>
130
+ </task>
131
+ </tasks>
132
+ <validate></validate>
133
+ </payload>`;
134
+ const result = parsePayloadXml(xml);
135
+ assert.equal(result.tasks.length, 1);
136
+ assert.equal(result.tasks[0].target, "src/foo.ts");
137
+ });
138
+ });
139
+ //# sourceMappingURL=xml.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.test.js","sourceRoot":"","sources":["../../src/tests/xml.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,31 @@
1
1
  export declare const DEFAULT_EXECUTOR = "Claude Code";
2
2
  export declare const DEFAULT_ARCHITECT = "Gemini";
3
+ export declare const EXECUTOR_CHOICES: readonly ["Claude Code", "Cursor", "Windsurf", "Copilot"];
4
+ export declare const ARCHITECT_CHOICES: readonly ["Gemini"];
3
5
  export declare const EXECUTOR_FILE_MAP: Record<string, string>;
4
6
  export declare const ARCHITECT_FILE_MAP: Record<string, string>;
5
7
  export declare function getExecutorFileName(agentName?: string): string;
6
8
  export declare function getArchitectFileName(agentName?: string): string;
7
9
  export declare function getExecutorDisplayName(agentName?: string): string;
8
10
  export declare function getArchitectDisplayName(agentName?: string): string;
11
+ export type AgentDetectSource = "flag" | "config" | "file" | "env" | "default";
12
+ export interface DetectedAgents {
13
+ executor?: string;
14
+ architect?: string;
15
+ executorSource: "file" | "env" | "none";
16
+ architectSource: "file" | "env" | "none";
17
+ }
18
+ /** Detect preferred agents from existing instruction files or env (Cursor / Claude). */
19
+ export declare function detectPreferredAgents(cwd: string, env?: NodeJS.ProcessEnv): DetectedAgents;
20
+ export declare function resolveInitAgents(input: {
21
+ executorFlag?: string;
22
+ architectFlag?: string;
23
+ configExecutor?: string;
24
+ configArchitect?: string;
25
+ detected: DetectedAgents;
26
+ }): {
27
+ executor: string;
28
+ architect: string;
29
+ executorSource: AgentDetectSource;
30
+ architectSource: AgentDetectSource;
31
+ };
@@ -1,5 +1,9 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
1
3
  export const DEFAULT_EXECUTOR = "Claude Code";
2
4
  export const DEFAULT_ARCHITECT = "Gemini";
5
+ export const EXECUTOR_CHOICES = ["Claude Code", "Cursor", "Windsurf", "Copilot"];
6
+ export const ARCHITECT_CHOICES = ["Gemini"];
3
7
  export const EXECUTOR_FILE_MAP = {
4
8
  "claude code": "CLAUDE.md",
5
9
  "claude": "CLAUDE.md",
@@ -26,4 +30,82 @@ export function getExecutorDisplayName(agentName) {
26
30
  export function getArchitectDisplayName(agentName) {
27
31
  return agentName || DEFAULT_ARCHITECT;
28
32
  }
33
+ const EXECUTOR_FILE_HINTS = [
34
+ { file: ".cursorrules", agent: "Cursor" },
35
+ { file: ".github/copilot-instructions.md", agent: "Copilot" },
36
+ { file: ".windsurfrules", agent: "Windsurf" },
37
+ { file: "CLAUDE.md", agent: "Claude Code" },
38
+ ];
39
+ /** Detect preferred agents from existing instruction files or env (Cursor / Claude). */
40
+ export function detectPreferredAgents(cwd, env = process.env) {
41
+ let executor;
42
+ let architect;
43
+ let executorSource = "none";
44
+ let architectSource = "none";
45
+ for (const hint of EXECUTOR_FILE_HINTS) {
46
+ if (existsSync(join(cwd, hint.file))) {
47
+ executor = hint.agent;
48
+ executorSource = "file";
49
+ break;
50
+ }
51
+ }
52
+ if (existsSync(join(cwd, "GEMINI.md"))) {
53
+ architect = "Gemini";
54
+ architectSource = "file";
55
+ }
56
+ if (!executor) {
57
+ if (env.CURSOR_TRACE_ID || env.CURSOR_AGENT || env.CURSOR) {
58
+ executor = "Cursor";
59
+ executorSource = "env";
60
+ }
61
+ else if (env.CLAUDECODE || env.CLAUDE_CODE) {
62
+ executor = "Claude Code";
63
+ executorSource = "env";
64
+ }
65
+ }
66
+ return { executor, architect, executorSource, architectSource };
67
+ }
68
+ export function resolveInitAgents(input) {
69
+ const executorFlag = input.executorFlag?.trim();
70
+ const architectFlag = input.architectFlag?.trim();
71
+ const configExecutor = input.configExecutor?.trim();
72
+ const configArchitect = input.configArchitect?.trim();
73
+ let executor;
74
+ let executorSource;
75
+ if (executorFlag) {
76
+ executor = executorFlag;
77
+ executorSource = "flag";
78
+ }
79
+ else if (configExecutor) {
80
+ executor = configExecutor;
81
+ executorSource = "config";
82
+ }
83
+ else if (input.detected.executor) {
84
+ executor = input.detected.executor;
85
+ executorSource = input.detected.executorSource === "env" ? "env" : "file";
86
+ }
87
+ else {
88
+ executor = DEFAULT_EXECUTOR;
89
+ executorSource = "default";
90
+ }
91
+ let architect;
92
+ let architectSource;
93
+ if (architectFlag) {
94
+ architect = architectFlag;
95
+ architectSource = "flag";
96
+ }
97
+ else if (configArchitect) {
98
+ architect = configArchitect;
99
+ architectSource = "config";
100
+ }
101
+ else if (input.detected.architect) {
102
+ architect = input.detected.architect;
103
+ architectSource = input.detected.architectSource === "env" ? "env" : "file";
104
+ }
105
+ else {
106
+ architect = DEFAULT_ARCHITECT;
107
+ architectSource = "default";
108
+ }
109
+ return { executor, architect, executorSource, architectSource };
110
+ }
29
111
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,aAAa,EAAE,WAAW;IAC1B,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,cAAc;IACxB,UAAU,EAAE,gBAAgB;IAC5B,SAAS,EAAE,iCAAiC;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAA2B;IACxD,QAAQ,EAAE,WAAW;CACtB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,IAAI,CAAC,SAAS;QAAE,OAAO,iBAAiB,CAAC,aAAa,CAAE,CAAC;IACzD,OAAO,iBAAiB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,aAAa,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAkB;IACrD,IAAI,CAAC,SAAS;QAAE,OAAO,kBAAkB,CAAC,QAAQ,CAAE,CAAC;IACrD,OAAO,kBAAkB,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,IAAI,cAAc,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAkB;IACvD,OAAO,SAAS,IAAI,gBAAgB,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAkB;IACxD,OAAO,SAAS,IAAI,iBAAiB,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /** AppMap Memory Bank convention — file-first index and last-run history. */
2
+ export declare const LAST_RUN_SCHEMA = "tocket.appmaps.last-run/v0";
3
+ export declare const APPMAPS_DIR = ".context/appmaps";
4
+ export declare const LAST_RUN_JSON = "last-run.json";
5
+ export declare const LAST_RUN_MD = "last-run.md";
6
+ export declare const APPMAPS_README = "README.md";
7
+ export declare const APPMAPS_GOALS = "goals.md";
8
+ export declare const APPMAP_SUFFIX = ".appmap.json";
9
+ export interface LastRunResult {
10
+ id: string;
11
+ name: string;
12
+ ok: boolean;
13
+ ms: number;
14
+ jev_choice?: string | null;
15
+ jev_confidence?: number | null;
16
+ /** Real last-run snapshots use objects; older fixtures may use a string. */
17
+ evidence?: unknown;
18
+ error?: string | null;
19
+ }
20
+ export interface LastRun {
21
+ schema: typeof LAST_RUN_SCHEMA;
22
+ app: string;
23
+ map: string;
24
+ runner: string;
25
+ model: string;
26
+ mode: string;
27
+ finished_at: string;
28
+ all_ok: boolean;
29
+ passed: number;
30
+ total: number;
31
+ results: LastRunResult[];
32
+ }
33
+ export declare class LastRunValidationError extends Error {
34
+ constructor(message: string);
35
+ }
36
+ /** Validate and normalize a parsed last-run document. */
37
+ export declare function validateLastRun(value: unknown): LastRun;
38
+ /** Parse a last-run.json string and validate it against v0. */
39
+ export declare function parseLastRun(raw: string): LastRun;
40
+ /** Empty but schema-valid last-run document used by `tocket suite init`. */
41
+ export declare function emptyLastRun(): LastRun;
42
+ /** Human table for `.context/appmaps/last-run.md`. */
43
+ export declare function writeLastRunMd(run: LastRun): string;
44
+ /** Slug used for bank filenames (\`<app>.appmap.json\`, triage). */
45
+ export declare function appSlug(app: string): string;
46
+ /** Bank filename for a copied mapper AppMap. */
47
+ export declare function appmapBankFile(app: string): string;
48
+ /** Repo-relative path for the bank map copy. */
49
+ export declare function appmapBankRel(app: string): string;
50
+ export declare class AppmapDiscoveryError extends Error {
51
+ constructor(message: string);
52
+ }
53
+ /** Parse mapper (or hand) AppMap JSON. Object only; no full schema vendoring. */
54
+ export declare function parseAppmapJson(raw: string): unknown;
55
+ /**
56
+ * Find `*.appmap.json` in a mapper `--out` directory.
57
+ * Prefers `<app>.appmap.json` when several files exist.
58
+ */
59
+ export declare function discoverAppmapJson(dir: string, app?: string): string;
60
+ /** Point last-run.map at the bank copy; fill empty app from --app. */
61
+ export declare function normalizeLastRunRaw(raw: unknown, mapRel: string, app?: string): unknown;
62
+ /** Minimal README stub written when `.context/appmaps/` is created. */
63
+ export declare function appmapsReadmeStub(): string;
64
+ export declare function appmapsGoalsStub(): string;
65
+ export declare function prettyLastRunJson(value: unknown): string;
@@ -0,0 +1,280 @@
1
+ /** AppMap Memory Bank convention — file-first index and last-run history. */
2
+ import { existsSync, readdirSync, statSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ export const LAST_RUN_SCHEMA = "tocket.appmaps.last-run/v0";
5
+ export const APPMAPS_DIR = ".context/appmaps";
6
+ export const LAST_RUN_JSON = "last-run.json";
7
+ export const LAST_RUN_MD = "last-run.md";
8
+ export const APPMAPS_README = "README.md";
9
+ export const APPMAPS_GOALS = "goals.md";
10
+ export const APPMAP_SUFFIX = ".appmap.json";
11
+ export class LastRunValidationError extends Error {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "LastRunValidationError";
15
+ }
16
+ }
17
+ function isRecord(value) {
18
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19
+ }
20
+ function expectString(value, field) {
21
+ if (typeof value !== "string") {
22
+ throw new LastRunValidationError(`${field} must be a string`);
23
+ }
24
+ return value;
25
+ }
26
+ function expectBoolean(value, field) {
27
+ if (typeof value !== "boolean") {
28
+ throw new LastRunValidationError(`${field} must be a boolean`);
29
+ }
30
+ return value;
31
+ }
32
+ function expectNumber(value, field) {
33
+ if (typeof value !== "number" || !Number.isFinite(value)) {
34
+ throw new LastRunValidationError(`${field} must be a finite number`);
35
+ }
36
+ return value;
37
+ }
38
+ function optionalString(value, field) {
39
+ if (value === undefined)
40
+ return undefined;
41
+ if (value === null)
42
+ return null;
43
+ if (typeof value !== "string") {
44
+ throw new LastRunValidationError(`${field} must be a string or null`);
45
+ }
46
+ return value;
47
+ }
48
+ function optionalNumber(value, field) {
49
+ if (value === undefined)
50
+ return undefined;
51
+ if (value === null)
52
+ return null;
53
+ if (typeof value !== "number" || !Number.isFinite(value)) {
54
+ throw new LastRunValidationError(`${field} must be a finite number or null`);
55
+ }
56
+ return value;
57
+ }
58
+ function parseResult(value, index) {
59
+ if (!isRecord(value)) {
60
+ throw new LastRunValidationError(`results[${index}] must be an object`);
61
+ }
62
+ const result = {
63
+ id: expectString(value.id, `results[${index}].id`),
64
+ name: expectString(value.name, `results[${index}].name`),
65
+ ok: expectBoolean(value.ok, `results[${index}].ok`),
66
+ ms: expectNumber(value.ms, `results[${index}].ms`),
67
+ };
68
+ const jevChoice = optionalString(value.jev_choice, `results[${index}].jev_choice`);
69
+ if (jevChoice !== undefined)
70
+ result.jev_choice = jevChoice;
71
+ const jevConfidence = optionalNumber(value.jev_confidence, `results[${index}].jev_confidence`);
72
+ if (jevConfidence !== undefined)
73
+ result.jev_confidence = jevConfidence;
74
+ if (value.evidence !== undefined)
75
+ result.evidence = value.evidence;
76
+ const error = optionalString(value.error, `results[${index}].error`);
77
+ if (error !== undefined)
78
+ result.error = error;
79
+ return result;
80
+ }
81
+ /** Validate and normalize a parsed last-run document. */
82
+ export function validateLastRun(value) {
83
+ if (!isRecord(value)) {
84
+ throw new LastRunValidationError("last-run.json must be a JSON object");
85
+ }
86
+ const schema = expectString(value.schema, "schema");
87
+ if (schema !== LAST_RUN_SCHEMA) {
88
+ throw new LastRunValidationError(`schema must be "${LAST_RUN_SCHEMA}"`);
89
+ }
90
+ if (!Array.isArray(value.results)) {
91
+ throw new LastRunValidationError("results must be an array");
92
+ }
93
+ return {
94
+ schema: LAST_RUN_SCHEMA,
95
+ app: expectString(value.app, "app"),
96
+ map: expectString(value.map, "map"),
97
+ runner: expectString(value.runner, "runner"),
98
+ model: expectString(value.model, "model"),
99
+ mode: expectString(value.mode, "mode"),
100
+ finished_at: expectString(value.finished_at, "finished_at"),
101
+ all_ok: expectBoolean(value.all_ok, "all_ok"),
102
+ passed: expectNumber(value.passed, "passed"),
103
+ total: expectNumber(value.total, "total"),
104
+ results: value.results.map((item, index) => parseResult(item, index)),
105
+ };
106
+ }
107
+ /** Parse a last-run.json string and validate it against v0. */
108
+ export function parseLastRun(raw) {
109
+ let parsed;
110
+ try {
111
+ parsed = JSON.parse(raw);
112
+ }
113
+ catch {
114
+ throw new LastRunValidationError("last-run.json is not valid JSON");
115
+ }
116
+ return validateLastRun(parsed);
117
+ }
118
+ function mdCell(value) {
119
+ if (value === null || value === undefined || value === "")
120
+ return "";
121
+ const text = typeof value === "object" ? JSON.stringify(value) : String(value);
122
+ return text.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
123
+ }
124
+ function formatOk(ok) {
125
+ return ok ? "pass" : "fail";
126
+ }
127
+ /** Empty but schema-valid last-run document used by `tocket suite init`. */
128
+ export function emptyLastRun() {
129
+ return {
130
+ schema: LAST_RUN_SCHEMA,
131
+ app: "",
132
+ map: "",
133
+ runner: "",
134
+ model: "",
135
+ mode: "",
136
+ finished_at: "",
137
+ all_ok: true,
138
+ passed: 0,
139
+ total: 0,
140
+ results: [],
141
+ };
142
+ }
143
+ /** Human table for `.context/appmaps/last-run.md`. */
144
+ export function writeLastRunMd(run) {
145
+ const resultRows = run.results.length
146
+ ? run.results
147
+ .map((result) => `| ${mdCell(result.id)} | ${mdCell(result.name)} | ${formatOk(result.ok)} | ${mdCell(result.ms)} | ${mdCell(result.jev_choice)} | ${mdCell(result.jev_confidence)} | ${mdCell(result.evidence)} | ${mdCell(result.error)} |`)
148
+ .join("\n")
149
+ : "| _none_ | | | | | | | |";
150
+ return `# Last AppMap run
151
+
152
+ | Field | Value |
153
+ | --- | --- |
154
+ | Schema | ${mdCell(run.schema)} |
155
+ | App | ${mdCell(run.app)} |
156
+ | Map | ${mdCell(run.map)} |
157
+ | Runner | ${mdCell(run.runner)} |
158
+ | Model | ${mdCell(run.model)} |
159
+ | Mode | ${mdCell(run.mode)} |
160
+ | Finished | ${mdCell(run.finished_at)} |
161
+ | Result | ${run.passed}/${run.total} passed |
162
+ | All OK | ${run.all_ok ? "yes" : "no"} |
163
+
164
+ ## Results
165
+
166
+ | ID | Name | OK | ms | Jev | Confidence | Evidence | Error |
167
+ | --- | --- | --- | --- | --- | --- | --- | --- |
168
+ ${resultRows}
169
+ `;
170
+ }
171
+ /** Slug used for bank filenames (\`<app>.appmap.json\`, triage). */
172
+ export function appSlug(app) {
173
+ return app.trim() ? app.trim().replace(/[^a-zA-Z0-9._-]+/g, "-") : "suite";
174
+ }
175
+ /** Bank filename for a copied mapper AppMap. */
176
+ export function appmapBankFile(app) {
177
+ return `${appSlug(app)}${APPMAP_SUFFIX}`;
178
+ }
179
+ /** Repo-relative path for the bank map copy. */
180
+ export function appmapBankRel(app) {
181
+ return `${APPMAPS_DIR}/${appmapBankFile(app)}`;
182
+ }
183
+ export class AppmapDiscoveryError extends Error {
184
+ constructor(message) {
185
+ super(message);
186
+ this.name = "AppmapDiscoveryError";
187
+ }
188
+ }
189
+ /** Parse mapper (or hand) AppMap JSON. Object only; no full schema vendoring. */
190
+ export function parseAppmapJson(raw) {
191
+ let parsed;
192
+ try {
193
+ parsed = JSON.parse(raw);
194
+ }
195
+ catch {
196
+ throw new Error("AppMap is not valid JSON");
197
+ }
198
+ if (!isRecord(parsed)) {
199
+ throw new Error("AppMap must be a JSON object");
200
+ }
201
+ return parsed;
202
+ }
203
+ /**
204
+ * Find `*.appmap.json` in a mapper `--out` directory.
205
+ * Prefers `<app>.appmap.json` when several files exist.
206
+ */
207
+ export function discoverAppmapJson(dir, app) {
208
+ if (!existsSync(dir)) {
209
+ throw new AppmapDiscoveryError(`mapper-out directory not found: ${dir}`);
210
+ }
211
+ if (!statSync(dir).isDirectory()) {
212
+ throw new AppmapDiscoveryError(`mapper-out is not a directory: ${dir}`);
213
+ }
214
+ const files = readdirSync(dir)
215
+ .filter((name) => name.endsWith(APPMAP_SUFFIX))
216
+ .sort();
217
+ if (files.length === 0) {
218
+ throw new AppmapDiscoveryError(`No *${APPMAP_SUFFIX} found in ${dir}`);
219
+ }
220
+ if (app) {
221
+ const preferred = appmapBankFile(app);
222
+ if (files.includes(preferred)) {
223
+ return join(dir, preferred);
224
+ }
225
+ }
226
+ if (files.length === 1) {
227
+ return join(dir, files[0]);
228
+ }
229
+ throw new AppmapDiscoveryError(`Multiple *${APPMAP_SUFFIX} in ${dir} (${files.join(", ")}). Pass --map <file>.`);
230
+ }
231
+ /** Point last-run.map at the bank copy; fill empty app from --app. */
232
+ export function normalizeLastRunRaw(raw, mapRel, app) {
233
+ if (!isRecord(raw))
234
+ return raw;
235
+ const next = { ...raw, map: mapRel };
236
+ if (app && (typeof next.app !== "string" || next.app.trim() === "")) {
237
+ next.app = app;
238
+ }
239
+ return next;
240
+ }
241
+ /** Minimal README stub written when `.context/appmaps/` is created. */
242
+ export function appmapsReadmeStub() {
243
+ return `# AppMaps
244
+
245
+ Index, last-run history, and a Memory Bank copy of the mapper AppMap.
246
+
247
+ \`tocket suite loop\` copies \`<app>.appmap.json\` here so status and triage
248
+ can read what Oficina wrote. Runners stay outside this directory.
249
+ \`.context/appmaps/\` is file-first: \`tocket suite\` does not execute maps.
250
+
251
+ | File | Purpose |
252
+ | --- | --- |
253
+ | \`goals.md\` | Suite goals and coverage intent |
254
+ | \`<app>.appmap.json\` | Mapper (or hand) map copy |
255
+ | \`last-run.json\` | Last run (\`schema\`: \`${LAST_RUN_SCHEMA}\`) |
256
+ | \`last-run.md\` | Human-readable last-run table |
257
+ | \`<app>.triage.json\` | Optional Jev/heuristic triage (\`tocket.appmaps.triage/v0\`) |
258
+
259
+ ## Tempestivita loop (Oficina)
260
+
261
+ 1. Mapper (sibling, not vendored): \`npx tsx src/cli.ts all --url https://tempestivita.civita.dev --smoke\`
262
+ 2. \`tocket suite loop --app tempestivita --mapper-out <mapper>/out --last-run <last-run.json> [--dry-run]\`
263
+ 3. \`tocket suite status\`
264
+
265
+ Generic decisions (any state) use \`tocket decide\` → \`.context/decisions/<research|write|review>/\`. Loop does not call decide.
266
+ `;
267
+ }
268
+ export function appmapsGoalsStub() {
269
+ return `# AppMap goals
270
+
271
+ Record suite goals and coverage intent here.
272
+
273
+ \`tocket suite loop\` copies \`<app>.appmap.json\` into this directory for the Memory Bank.
274
+ This file is the index, not a runner.
275
+ `;
276
+ }
277
+ export function prettyLastRunJson(value) {
278
+ return `${JSON.stringify(value, null, 2)}\n`;
279
+ }
280
+ //# sourceMappingURL=appmaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appmaps.js","sourceRoot":"","sources":["../../src/utils/appmaps.ts"],"names":[],"mappings":"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"}