@agentskit/doc-bridge 1.6.3 → 1.6.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.
@@ -2,7 +2,7 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "doc-bridge",
4
4
  "display_name": "Doc Bridge",
5
- "version": "1.6.3",
5
+ "version": "1.6.4",
6
6
  "description": "Deterministic repository handoffs for coding agents, running locally without an LLM or API key.",
7
7
  "long_description": "Doc Bridge turns a repository's own documentation and ownership metadata into deterministic handoffs: where an agent should start, which paths it may edit, which checks it must run, and when a human must take over. The local connector exposes the same read-only contract available through Doc Bridge CLI and CI.",
8
8
  "author": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentskit/doc-bridge",
3
- "version": "1.6.3",
3
+ "version": "1.6.4",
4
4
  "mcpName": "io.github.AgentsKit-io/doc-bridge",
5
5
  "description": "Human↔agent documentation bridge — deterministic handoffs, doc-site links, memory→docs, optional AgentsKit RAG/chat.",
6
6
  "type": "module",
@@ -35,7 +35,7 @@ const inspect = async (frame, width, height) => frame.evaluate(({ width: viewpor
35
35
  const failures = []
36
36
  if (document.documentElement.scrollWidth - document.documentElement.clientWidth > 1) failures.push('horizontal overflow')
37
37
  if (clippedControls.length) failures.push(`clipped controls: ${clippedControls.join(', ')}`)
38
- if (!workspace || workspace.top > Math.min(520, viewportHeight * 0.6)) failures.push('architecture map starts too far below the first screen')
38
+ if (!workspace || workspace.top > viewportHeight * 0.7) failures.push('architecture map starts too far below the first screen')
39
39
  if (!document.querySelector('#graph')) failures.push('architecture graph is missing')
40
40
  if (document.querySelectorAll('[data-lens]').length < 4 || document.querySelectorAll('[data-level]').length < 4) failures.push('required lens or level controls are missing')
41
41
  if (document.querySelectorAll('.finding').length > 40) failures.push('initial findings render grows beyond one bounded page')
@@ -89,6 +89,9 @@ const inspect = async (frame, width, height) => frame.evaluate(({ width: viewpor
89
89
  graphWidth: graph?.width ?? null,
90
90
  initialFindingCount: document.querySelectorAll('.finding').length,
91
91
  findingGroupCount: document.querySelectorAll('.finding-group').length,
92
+ diagnosticCount: typeof globalThis.__DOC_BRIDGE_DATA__?.diagnosticCount === 'number'
93
+ ? globalThis.__DOC_BRIDGE_DATA__.diagnosticCount
94
+ : Number.parseInt(document.querySelector('#finding-count')?.textContent ?? '', 10) || document.querySelectorAll('.finding').length,
92
95
  unnamedButtonCount: unnamedButtons.length,
93
96
  visibleOverflowCount: visibleOverflow.length,
94
97
  contrastFailures,
@@ -129,9 +132,9 @@ const exercise = async (frame, result) => {
129
132
  await run('finding groups load', async () => {
130
133
  const load = frame.locator('#load-findings')
131
134
  if (await load.count()) await load.click()
132
- else if (result.initialFindingCount > 0) throw new Error('finding loader is missing while findings are present')
135
+ else if (result.diagnosticCount > 0 && await frame.locator('.finding-group').count() === 0) throw new Error('finding loader is missing while findings are present')
133
136
  }, async () => {
134
- if (result.initialFindingCount > 0) {
137
+ if (result.diagnosticCount > 0) {
135
138
  await poll(() => frame.locator('.finding-group').count(), (count) => count > 0, 'finding groups')
136
139
  } else if (await frame.locator('.finding-group').count() !== 0) {
137
140
  throw new Error('finding groups rendered despite zero findings')
@@ -145,11 +148,19 @@ const exercise = async (frame, result) => {
145
148
  if (!(await frame.locator('[data-node]').count())) result.failures.push('architecture graph has no interactive nodes')
146
149
  else {
147
150
  const drillSelectors = [
148
- ['package', '[data-node][aria-label*=" app"]'],
149
- ['module', '[data-node][aria-label*=" package"]'],
150
- ['file', '[data-node][aria-label*=" module"]'],
151
+ ['package', ['[data-node][aria-label*=" app"]', '[data-node][aria-label*=" domain"]', '[data-node][aria-label*=" group"]', '[data-node]']],
152
+ ['module', ['[data-node][aria-label*=" package"]', '[data-node][aria-label*=" shared"]']],
153
+ ['file', ['[data-node][aria-label*=" module"]', '[data-node][aria-label*=" file"]']],
151
154
  ]
152
- for (const [expectedLevel, selector] of drillSelectors) {
155
+ for (const [expectedLevel, selectors] of drillSelectors) {
156
+ let selector
157
+ for (const candidate of selectors) {
158
+ if (await frame.locator(candidate).count()) {
159
+ selector = candidate
160
+ break
161
+ }
162
+ }
163
+ if (!selector) continue
153
164
  await run(`double-click drill-down to ${expectedLevel}`, () => frame.locator(selector).first().dblclick(), async () => {
154
165
  await poll(() => frame.locator('[data-level][aria-pressed="true"]').getAttribute('data-level'), (actual) => actual === expectedLevel, `drill-down ${expectedLevel}`)
155
166
  const details = await frame.locator('#details').innerText()
@@ -3,7 +3,7 @@
3
3
  import { spawnSync } from 'node:child_process'
4
4
  import { isAbsolute } from 'node:path'
5
5
 
6
- const VERSION = '1.6.3'
6
+ const VERSION = '1.6.4'
7
7
  const kinds = new Set(['package', 'ownership'])
8
8
  const args = process.argv.slice(2)
9
9
  const id = args[0]
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const PACKAGE_VERSION = '1.6.3'
1
+ export const PACKAGE_VERSION = '1.6.4'