cgraphx 1.2.0 → 1.3.1

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 (136) hide show
  1. package/dist/.claude-template/hooks/precommit-check/precommit-check.cjs +90 -0
  2. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +100 -78
  3. package/dist/.claude-template/skills/precommit-review/SKILL.md +50 -0
  4. package/dist/.claude-template/skills/run-api-test/SKILL.md +187 -0
  5. package/dist/.claude-template/skills/run-api-test/assets/template-test-report.md +103 -0
  6. package/dist/.claude-template/skills/run-api-test/assets/template-test-verify.jsonl +5 -0
  7. package/dist/.claude-template/skills/run-api-test/references/bru-run.md +60 -0
  8. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +81 -0
  9. package/dist/.claude-template/skills/run-api-test/references/report-format.md +104 -0
  10. package/dist/.claude-template/skills/run-api-test/references/service-readiness.md +61 -0
  11. package/dist/.claude-template/skills/run-api-test/references/test-scope.md +64 -0
  12. package/dist/.claude-template/skills/write-api/SKILL.md +150 -0
  13. package/dist/.claude-template/skills/write-api/assets/template-api-spec.md +112 -0
  14. package/dist/.claude-template/skills/write-api/assets/template-request.bru +72 -0
  15. package/dist/.claude-template/skills/write-api/references/ai-prompts.md +133 -0
  16. package/dist/.claude-template/skills/write-api/references/api-spec-format.md +108 -0
  17. package/dist/.claude-template/skills/write-api/references/bru-format.md +139 -0
  18. package/dist/.claude-template/skills/write-api/references/collection-layout.md +90 -0
  19. package/dist/.claude-template/skills/write-api/references/environment-setup.md +105 -0
  20. package/dist/.claude-template/skills/write-api/references/interface-scope.md +74 -0
  21. package/dist/api-test/ai-fields.d.ts +37 -0
  22. package/dist/api-test/ai-fields.d.ts.map +1 -0
  23. package/dist/api-test/ai-fields.js +114 -0
  24. package/dist/api-test/ai-fields.js.map +1 -0
  25. package/dist/api-test/assemble.d.ts +76 -0
  26. package/dist/api-test/assemble.d.ts.map +1 -0
  27. package/dist/api-test/assemble.js +185 -0
  28. package/dist/api-test/assemble.js.map +1 -0
  29. package/dist/api-test/bru-cli-invoker.d.ts +72 -0
  30. package/dist/api-test/bru-cli-invoker.d.ts.map +1 -0
  31. package/dist/api-test/bru-cli-invoker.js +169 -0
  32. package/dist/api-test/bru-cli-invoker.js.map +1 -0
  33. package/dist/api-test/bru-report-parser.d.ts +24 -0
  34. package/dist/api-test/bru-report-parser.d.ts.map +1 -0
  35. package/dist/api-test/bru-report-parser.js +110 -0
  36. package/dist/api-test/bru-report-parser.js.map +1 -0
  37. package/dist/api-test/bru-runner.d.ts +101 -0
  38. package/dist/api-test/bru-runner.d.ts.map +1 -0
  39. package/dist/api-test/bru-runner.js +316 -0
  40. package/dist/api-test/bru-runner.js.map +1 -0
  41. package/dist/api-test/bru-writer.d.ts +52 -0
  42. package/dist/api-test/bru-writer.d.ts.map +1 -0
  43. package/dist/api-test/bru-writer.js +159 -0
  44. package/dist/api-test/bru-writer.js.map +1 -0
  45. package/dist/api-test/call-chain-extractor.d.ts +80 -0
  46. package/dist/api-test/call-chain-extractor.d.ts.map +1 -0
  47. package/dist/api-test/call-chain-extractor.js +179 -0
  48. package/dist/api-test/call-chain-extractor.js.map +1 -0
  49. package/dist/api-test/cli.d.ts +133 -0
  50. package/dist/api-test/cli.d.ts.map +1 -0
  51. package/dist/api-test/cli.js +1009 -0
  52. package/dist/api-test/cli.js.map +1 -0
  53. package/dist/api-test/config.d.ts +75 -0
  54. package/dist/api-test/config.d.ts.map +1 -0
  55. package/dist/api-test/config.js +406 -0
  56. package/dist/api-test/config.js.map +1 -0
  57. package/dist/api-test/db-query-cli.d.ts +51 -0
  58. package/dist/api-test/db-query-cli.d.ts.map +1 -0
  59. package/dist/api-test/db-query-cli.js +119 -0
  60. package/dist/api-test/db-query-cli.js.map +1 -0
  61. package/dist/api-test/enhance-prepare.d.ts +111 -0
  62. package/dist/api-test/enhance-prepare.d.ts.map +1 -0
  63. package/dist/api-test/enhance-prepare.js +425 -0
  64. package/dist/api-test/enhance-prepare.js.map +1 -0
  65. package/dist/api-test/enhance-write.d.ts +28 -0
  66. package/dist/api-test/enhance-write.d.ts.map +1 -0
  67. package/dist/api-test/enhance-write.js +145 -0
  68. package/dist/api-test/enhance-write.js.map +1 -0
  69. package/dist/api-test/errors.d.ts +48 -0
  70. package/dist/api-test/errors.d.ts.map +1 -0
  71. package/dist/api-test/errors.js +76 -0
  72. package/dist/api-test/errors.js.map +1 -0
  73. package/dist/api-test/field-extractor.d.ts +98 -0
  74. package/dist/api-test/field-extractor.d.ts.map +1 -0
  75. package/dist/api-test/field-extractor.js +327 -0
  76. package/dist/api-test/field-extractor.js.map +1 -0
  77. package/dist/api-test/impl-finder.d.ts +37 -0
  78. package/dist/api-test/impl-finder.d.ts.map +1 -0
  79. package/dist/api-test/impl-finder.js +54 -0
  80. package/dist/api-test/impl-finder.js.map +1 -0
  81. package/dist/api-test/index.d.ts +41 -0
  82. package/dist/api-test/index.d.ts.map +1 -0
  83. package/dist/api-test/index.js +124 -0
  84. package/dist/api-test/index.js.map +1 -0
  85. package/dist/api-test/java-parser.d.ts +89 -0
  86. package/dist/api-test/java-parser.d.ts.map +1 -0
  87. package/dist/api-test/java-parser.js +508 -0
  88. package/dist/api-test/java-parser.js.map +1 -0
  89. package/dist/api-test/md-writer.d.ts +49 -0
  90. package/dist/api-test/md-writer.d.ts.map +1 -0
  91. package/dist/api-test/md-writer.js +202 -0
  92. package/dist/api-test/md-writer.js.map +1 -0
  93. package/dist/api-test/parser-httpservice.d.ts +91 -0
  94. package/dist/api-test/parser-httpservice.d.ts.map +1 -0
  95. package/dist/api-test/parser-httpservice.js +271 -0
  96. package/dist/api-test/parser-httpservice.js.map +1 -0
  97. package/dist/api-test/report.d.ts +188 -0
  98. package/dist/api-test/report.d.ts.map +1 -0
  99. package/dist/api-test/report.js +522 -0
  100. package/dist/api-test/report.js.map +1 -0
  101. package/dist/api-test/snapshot.d.ts +26 -0
  102. package/dist/api-test/snapshot.d.ts.map +1 -0
  103. package/dist/api-test/snapshot.js +150 -0
  104. package/dist/api-test/snapshot.js.map +1 -0
  105. package/dist/api-test/test-history.d.ts +48 -0
  106. package/dist/api-test/test-history.d.ts.map +1 -0
  107. package/dist/api-test/test-history.js +122 -0
  108. package/dist/api-test/test-history.js.map +1 -0
  109. package/dist/api-test/types.d.ts +174 -0
  110. package/dist/api-test/types.d.ts.map +1 -0
  111. package/dist/api-test/types.js +13 -0
  112. package/dist/api-test/types.js.map +1 -0
  113. package/dist/api-test/verify-prepare.d.ts +30 -0
  114. package/dist/api-test/verify-prepare.d.ts.map +1 -0
  115. package/dist/api-test/verify-prepare.js +150 -0
  116. package/dist/api-test/verify-prepare.js.map +1 -0
  117. package/dist/api-test/verify-write.d.ts +31 -0
  118. package/dist/api-test/verify-write.d.ts.map +1 -0
  119. package/dist/api-test/verify-write.js +159 -0
  120. package/dist/api-test/verify-write.js.map +1 -0
  121. package/dist/dbquery/dump-schema.d.ts +46 -0
  122. package/dist/dbquery/dump-schema.d.ts.map +1 -0
  123. package/dist/dbquery/dump-schema.js +379 -0
  124. package/dist/dbquery/dump-schema.js.map +1 -0
  125. package/dist/installer/targets/claude.d.ts +15 -0
  126. package/dist/installer/targets/claude.d.ts.map +1 -1
  127. package/dist/installer/targets/claude.js +53 -0
  128. package/dist/installer/targets/claude.js.map +1 -1
  129. package/package.json +1 -1
  130. package/scripts/agent-eval/block-cgraphx-and-gitnexus-cli-hook.sh +0 -43
  131. package/scripts/agent-eval/block-cgraphx-cli-hook.sh +0 -32
  132. package/scripts/agent-eval/block-cgraphx-cli-settings.json +0 -16
  133. package/scripts/agent-eval/cli-vs-mcp-3arm.sh +0 -121
  134. package/scripts/agent-eval/multi-tool-eval.sh +0 -171
  135. package/scripts/agent-eval/parse-cli-vs-mcp.mjs +0 -232
  136. package/scripts/agent-eval/parse-multi-tool.mjs +0 -242
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Report + list phase — Phase 6 of the api-test pipeline (T-60).
3
+ *
4
+ * Spec contract:
5
+ * - `generateReport(projectRoot, date)` aggregates the day's JSONL run
6
+ * history + the static `.md` catalog into a Markdown report written to
7
+ * `docs/api-test/report-YYYY-MM-DD.md`.
8
+ * - `listEndpoints(projectRoot, filters)` renders a terminal table of every
9
+ * endpoint discovered from the `.md` catalog, with the most recent run
10
+ * result joined from JSONL history.
11
+ *
12
+ * Aggregation rules (spec §5.6):
13
+ * - total endpoints = number of `.md` files (the catalog is the source of
14
+ * truth for "what interfaces exist").
15
+ * - passed / failed = count of JSONL lines with `passed: true` / `false`.
16
+ * - skip count = number of `.md` files whose frontmatter `status` is
17
+ * `skip`.
18
+ * - per-service rate = group JSONL runs by `service`, passed/total.
19
+ * - failure list = JSONL lines with `passed: false` (endpoint + error).
20
+ * - skip list = `.md` files with `status: skip` (endpoint + skip_reason).
21
+ * - avg duration = mean of `duration_ms` across all JSONL lines for the date.
22
+ * - p99 duration = nearest-rank 99th percentile of `duration_ms` (degenerates
23
+ * to max for small N — that's expected, not a bug).
24
+ *
25
+ * JSONL missing for the requested date → `ReportError` (CLI exit code 2).
26
+ *
27
+ * Independent subsystem — only depends on `node:fs` / `node:path` and the
28
+ * subsystem's own `test-history.ts` / `errors.ts` / `types.ts`. No imports
29
+ * from `src/extraction/` / `src/resolution/` / `src/db/`, and no third-party
30
+ * YAML / table libraries (frontmatter is parsed with a hand-rolled scalar
31
+ * parser; the terminal table is rendered with manual padding).
32
+ */
33
+ import type { TestRun } from './types';
34
+ /** Parsed frontmatter for a catalog `.md` file. */
35
+ export interface EndpointMd {
36
+ /** `<svc_id>_<methodName>` — the endpoint identifier used in JSONL `endpoint`. */
37
+ endpoint: string;
38
+ svcId: string;
39
+ service: string;
40
+ method: string;
41
+ status: 'active' | 'skip';
42
+ skipReason: string | null;
43
+ /** Absolute path to the `.md` file. */
44
+ mdPath: string;
45
+ }
46
+ /** Aggregated report data — rendered into Markdown by `renderReport`. */
47
+ export interface ReportData {
48
+ date: string;
49
+ totalEndpoints: number;
50
+ passedCount: number;
51
+ failedCount: number;
52
+ skipCount: number;
53
+ perService: Array<{
54
+ service: string;
55
+ total: number;
56
+ passed: number;
57
+ passRate: number;
58
+ }>;
59
+ failures: Array<{
60
+ endpoint: string;
61
+ service: string;
62
+ error: string | null;
63
+ }>;
64
+ skips: Array<{
65
+ endpoint: string;
66
+ service: string;
67
+ skipReason: string | null;
68
+ }>;
69
+ avgDurationMs: number;
70
+ p99DurationMs: number;
71
+ }
72
+ /** Filters applied by the `list` subcommand. */
73
+ export interface ListFilters {
74
+ service?: string;
75
+ status?: 'active' | 'skip';
76
+ svcId?: string;
77
+ }
78
+ /** A row in the `list` terminal table. */
79
+ export interface ListRow {
80
+ endpoint: string;
81
+ service: string;
82
+ svcId: string;
83
+ status: 'active' | 'skip';
84
+ /** 'true' / 'false' / '—' when no run history exists. */
85
+ lastRunResult: string;
86
+ }
87
+ /**
88
+ * Generate the Markdown report for a single day.
89
+ *
90
+ * Reads `<projectRoot>/.cgraphx/api-test/runs/<date>.jsonl` and every
91
+ * `docs/api-test/<service>/*.md` catalog file, aggregates statistics, and
92
+ * returns the Markdown content. Throws `ReportError` when the JSONL file
93
+ * for the requested date doesn't exist (the report has no run data to
94
+ * summarize — that's a hard error, not an empty report).
95
+ */
96
+ export declare function generateReport(projectRoot: string, date: string): Promise<string>;
97
+ /**
98
+ * Resolve the report output path: `<projectRoot>/docs/api-test/report-<date>.md`.
99
+ */
100
+ export declare function reportFilePath(projectRoot: string, date: string): string;
101
+ /**
102
+ * List every catalog endpoint with its most recent run result, after filters.
103
+ *
104
+ * The "most recent run" is found by scanning every `*.jsonl` file in the runs
105
+ * directory and picking the entry with the largest `ran_at` for each endpoint.
106
+ * Endpoints with no run history get `lastRunResult = '—'`.
107
+ */
108
+ export declare function listEndpoints(projectRoot: string, filters?: ListFilters): ListRow[];
109
+ /**
110
+ * Render `listEndpoints` output as a fixed-width terminal table with a header
111
+ * row and a separator line. Returns the empty string when there are no rows
112
+ * (the CLI prints a "no endpoints" notice instead).
113
+ */
114
+ export declare function renderListTable(rows: ListRow[]): string;
115
+ /**
116
+ * Read every `TestRun` from `<runsDir>/<date>.jsonl`. Throws `ReportError`
117
+ * when the file doesn't exist (the report cannot be summarized without run
118
+ * data — the spec says "选抛错,exit code 2").
119
+ */
120
+ export declare function readRunsForDate(projectRoot: string, date: string): TestRun[];
121
+ /**
122
+ * Parse a JSONL string into `TestRun[]`. Blank lines are skipped; malformed
123
+ * lines throw `ReportError` (a corrupted history file shouldn't silently
124
+ * produce wrong stats).
125
+ */
126
+ export declare function parseJsonl(content: string): TestRun[];
127
+ /** Convert a parsed JSONL object (snake_case keys) back into a `TestRun`. */
128
+ declare function deserializeRun(obj: Record<string, unknown>): TestRun;
129
+ /**
130
+ * Build a map of `endpoint → most recent TestRun` by scanning every JSONL
131
+ * file in the runs directory. Returns an empty map when the runs directory
132
+ * doesn't exist (a fresh project with no run history — `list` still works,
133
+ * every endpoint just shows `—`).
134
+ */
135
+ export declare function readLatestRunByEndpoint(projectRoot: string): Map<string, TestRun>;
136
+ /**
137
+ * Walk `docs/api-test/<service>/*.md` and parse each file's frontmatter into
138
+ * an `EndpointMd` record. Skips `report-*.md` files at the api-test root
139
+ * (those are this subsystem's own output, not catalog entries).
140
+ */
141
+ export declare function readAllEndpoints(projectRoot: string): EndpointMd[];
142
+ /**
143
+ * Parse the YAML frontmatter block (the text between `---` lines at the top
144
+ * of a `.md` file) into a string-keyed map.
145
+ *
146
+ * Scalar `key: value` pairs are extracted. Quoted scalars (`"..."` / `'...'`)
147
+ * are unquoted. The literal `null` becomes `null` in the map. Block scalars
148
+ * (`|-` followed by indented lines) and nested lists (`key:` + `- item`) are
149
+ * NOT parsed — the report/list phase only needs scalar fields (`svc_id`,
150
+ * `service`, `method`, `status`, `skip_reason`). Lines that look like list
151
+ * items or continuation lines (leading whitespace) are skipped.
152
+ */
153
+ export declare function parseFrontmatter(content: string): Record<string, string | null>;
154
+ /** Aggregate JSONL runs + `.md` catalog into `ReportData` for rendering. */
155
+ export declare function aggregateReport(date: string, runs: TestRun[], endpoints: EndpointMd[]): ReportData;
156
+ /**
157
+ * Nearest-rank percentile. For a sample of size N, the P-th percentile (where
158
+ * `p` is a fraction in [0, 1]) is the value at the 1-indexed position
159
+ * `ceil(p * N)` of the sorted (ascending) sample. For N=0 returns 0. For
160
+ * small N this degenerates to the max — that's the documented behavior, not
161
+ * a bug.
162
+ */
163
+ export declare function percentile(values: number[], p: number): number;
164
+ /** Render `ReportData` as a Markdown document. */
165
+ export declare function renderReport(data: ReportData): string;
166
+ /**
167
+ * Render a 2D string matrix as a fixed-width terminal table. The first row
168
+ * is treated as the header and separated from the body by a `---` divider
169
+ * line. Column widths are the max cell width in each column. Empty matrix
170
+ * returns the empty string.
171
+ */
172
+ export declare function renderTable(rows: string[][]): string;
173
+ /** Internal helpers re-exported for tests. */
174
+ export declare const __INTERNAL_REPORT: {
175
+ DEFAULT_OUTPUT_DIR: string;
176
+ reportFilePath: typeof reportFilePath;
177
+ parseJsonl: typeof parseJsonl;
178
+ deserializeRun: typeof deserializeRun;
179
+ readLatestRunByEndpoint: typeof readLatestRunByEndpoint;
180
+ readAllEndpoints: typeof readAllEndpoints;
181
+ parseFrontmatter: typeof parseFrontmatter;
182
+ aggregateReport: typeof aggregateReport;
183
+ percentile: typeof percentile;
184
+ renderReport: typeof renderReport;
185
+ renderTable: typeof renderTable;
186
+ };
187
+ export {};
188
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/api-test/report.ts"],"names":[],"mappings":"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"}