@doxbrix/doxloop 0.1.5 → 0.2.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 +1145 -0
- package/README.md +422 -227
- package/assets/doxbrix-preview.css +77 -15
- package/contracts/agent-events-v1.schema.json +1 -0
- package/contracts/coverage-v1.schema.json +59 -0
- package/contracts/drift-v1.schema.json +1 -0
- package/contracts/evaluation-v1.schema.json +62 -0
- package/contracts/quality-codes-v1.json +1 -0
- package/contracts/quality-report-v1.schema.json +1 -0
- package/contracts/validation-v1.schema.json +1 -0
- package/dist/agent-failure.d.ts +36 -0
- package/dist/agent-failure.js +98 -0
- package/dist/agent-isolation.d.ts +17 -0
- package/dist/agent-isolation.js +94 -0
- package/dist/agent-log.d.ts +197 -0
- package/dist/agent-log.js +1094 -0
- package/dist/agent-process.d.ts +63 -0
- package/dist/agent-process.js +128 -0
- package/dist/agent-reply.d.ts +47 -0
- package/dist/agent-reply.js +315 -0
- package/dist/agents.d.ts +24 -5
- package/dist/agents.js +60 -9
- package/dist/api-coverage.d.ts +11 -0
- package/dist/api-coverage.js +72 -0
- package/dist/application-probe.d.ts +28 -0
- package/dist/application-probe.js +93 -0
- package/dist/application-url.d.ts +14 -0
- package/dist/application-url.js +26 -0
- package/dist/args.js +15 -0
- package/dist/artifact-deploy.d.ts +9 -0
- package/dist/artifact-deploy.js +28 -8
- package/dist/assets.d.ts +72 -0
- package/dist/assets.js +382 -0
- package/dist/auth.d.ts +10 -0
- package/dist/auth.js +38 -9
- package/dist/author.d.ts +206 -4
- package/dist/author.js +1650 -52
- package/dist/authoring-batches.d.ts +190 -0
- package/dist/authoring-batches.js +489 -0
- package/dist/authoring-postpass.d.ts +79 -0
- package/dist/authoring-postpass.js +1289 -0
- package/dist/authoring-progress.d.ts +95 -0
- package/dist/authoring-progress.js +269 -0
- package/dist/autosync.d.ts +56 -0
- package/dist/autosync.js +442 -0
- package/dist/batch-artifacts.d.ts +81 -0
- package/dist/batch-artifacts.js +412 -0
- package/dist/batch-limits.d.ts +37 -0
- package/dist/batch-limits.js +80 -0
- package/dist/branding.d.ts +41 -0
- package/dist/branding.js +229 -0
- package/dist/bundle-upload.d.ts +26 -0
- package/dist/bundle-upload.js +99 -0
- package/dist/capture-auth.d.ts +95 -0
- package/dist/capture-auth.js +204 -0
- package/dist/capture.d.ts +48 -0
- package/dist/capture.js +20 -1
- package/dist/cli.js +839 -32
- package/dist/content-links.d.ts +10 -0
- package/dist/content-links.js +49 -0
- package/dist/contract-validation.d.ts +4 -0
- package/dist/contract-validation.js +25 -0
- package/dist/coverage-actions.d.ts +8 -0
- package/dist/coverage-actions.js +71 -0
- package/dist/coverage-resolutions.d.ts +16 -0
- package/dist/coverage-resolutions.js +58 -0
- package/dist/db.d.ts +37 -0
- package/dist/db.js +288 -0
- package/dist/demo.d.ts +12 -0
- package/dist/demo.js +122 -0
- package/dist/deploy-credentials.d.ts +7 -0
- package/dist/deploy-credentials.js +76 -0
- package/dist/deploy-targets/github-pages.d.ts +3 -0
- package/dist/deploy-targets/github-pages.js +100 -0
- package/dist/deploy-targets/index.d.ts +8 -0
- package/dist/deploy-targets/index.js +78 -0
- package/dist/deploy-targets/netlify.d.ts +3 -0
- package/dist/deploy-targets/netlify.js +49 -0
- package/dist/deploy-targets/types.d.ts +32 -0
- package/dist/deploy-targets/types.js +2 -0
- package/dist/deploy-targets/vercel.d.ts +3 -0
- package/dist/deploy-targets/vercel.js +95 -0
- package/dist/deploy.d.ts +9 -0
- package/dist/deploy.js +87 -13
- package/dist/deterministic-capture.d.ts +90 -0
- package/dist/deterministic-capture.js +435 -0
- package/dist/direct-edit.d.ts +40 -0
- package/dist/direct-edit.js +159 -0
- package/dist/docs-crawl.d.ts +86 -0
- package/dist/docs-crawl.js +536 -0
- package/dist/docs-site.d.ts +49 -0
- package/dist/docs-site.js +233 -0
- package/dist/doctor.js +8 -0
- package/dist/documentation-collections.d.ts +23 -0
- package/dist/documentation-collections.js +191 -0
- package/dist/documentation-plan.d.ts +253 -0
- package/dist/documentation-plan.js +2563 -0
- package/dist/doxbrix-build.d.ts +19 -0
- package/dist/doxbrix-build.js +167 -0
- package/dist/doxbrix-markdown.d.ts +9 -0
- package/dist/doxbrix-markdown.js +115 -14
- package/dist/drift.d.ts +10 -0
- package/dist/drift.js +164 -0
- package/dist/evaluation.d.ts +46 -0
- package/dist/evaluation.js +113 -0
- package/dist/evidence-pack.d.ts +47 -0
- package/dist/evidence-pack.js +358 -0
- package/dist/evidence.d.ts +25 -0
- package/dist/evidence.js +175 -0
- package/dist/fs.d.ts +8 -2
- package/dist/fs.js +41 -11
- package/dist/generator-api.d.ts +89 -0
- package/dist/generator-preflight.d.ts +27 -0
- package/dist/generator-preflight.js +105 -0
- package/dist/generator-runtime.d.ts +7 -0
- package/dist/generator-runtime.js +17 -1
- package/dist/generators.d.ts +24 -2
- package/dist/generators.js +54 -1
- package/dist/git-delivery.d.ts +17 -0
- package/dist/git-delivery.js +123 -0
- package/dist/globs.d.ts +16 -0
- package/dist/globs.js +65 -0
- package/dist/glossary.d.ts +26 -0
- package/dist/glossary.js +179 -0
- package/dist/history.d.ts +106 -0
- package/dist/history.js +600 -0
- package/dist/html-markdown.d.ts +46 -0
- package/dist/html-markdown.js +423 -0
- package/dist/interactive.js +3 -0
- package/dist/job-events.d.ts +74 -0
- package/dist/job-events.js +377 -0
- package/dist/keep-awake.d.ts +50 -0
- package/dist/keep-awake.js +123 -0
- package/dist/local-source-snapshot.d.ts +20 -0
- package/dist/local-source-snapshot.js +61 -0
- package/dist/mintlify-detect.d.ts +3 -0
- package/dist/mintlify-detect.js +18 -0
- package/dist/mintlify-import.d.ts +75 -0
- package/dist/mintlify-import.js +190 -0
- package/dist/navigation.d.ts +98 -0
- package/dist/navigation.js +310 -0
- package/dist/openapi.d.ts +60 -0
- package/dist/openapi.js +439 -0
- package/dist/page-editor-bridge.d.ts +3 -0
- package/dist/page-editor-bridge.js +109 -0
- package/dist/page-editor-preview.d.ts +10 -0
- package/dist/page-editor-preview.js +55 -0
- package/dist/page-extension.d.ts +9 -0
- package/dist/page-extension.js +15 -0
- package/dist/page-metadata.d.ts +28 -0
- package/dist/page-metadata.js +166 -0
- package/dist/page-operations.d.ts +34 -0
- package/dist/page-operations.js +215 -0
- package/dist/page-routes.d.ts +4 -0
- package/dist/page-routes.js +61 -0
- package/dist/pages.d.ts +20 -0
- package/dist/pages.js +184 -0
- package/dist/plan-generator.d.ts +3 -0
- package/dist/plan-generator.js +21 -0
- package/dist/plan-navigation.d.ts +11 -0
- package/dist/plan-navigation.js +30 -0
- package/dist/planning-captures.d.ts +20 -0
- package/dist/planning-captures.js +143 -0
- package/dist/planning-research.d.ts +135 -0
- package/dist/planning-research.js +472 -0
- package/dist/planning-triage.d.ts +23 -0
- package/dist/planning-triage.js +131 -0
- package/dist/preview.d.ts +24 -0
- package/dist/preview.js +280 -29
- package/dist/project-detect.d.ts +36 -0
- package/dist/project-detect.js +251 -0
- package/dist/project-import.d.ts +54 -0
- package/dist/project-import.js +157 -0
- package/dist/project-lock.d.ts +6 -0
- package/dist/project-lock.js +96 -0
- package/dist/project-registry.d.ts +25 -0
- package/dist/project-registry.js +79 -0
- package/dist/project.d.ts +35 -3
- package/dist/project.js +388 -38
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.js +25 -0
- package/dist/proposal-replay.d.ts +32 -0
- package/dist/proposal-replay.js +99 -0
- package/dist/quality-claims.d.ts +8 -0
- package/dist/quality-claims.js +168 -0
- package/dist/quality-config.d.ts +5 -0
- package/dist/quality-config.js +84 -0
- package/dist/quality-contract.d.ts +37 -0
- package/dist/quality-contract.js +46 -0
- package/dist/quality-examples.d.ts +4 -0
- package/dist/quality-examples.js +233 -0
- package/dist/quality-gates.d.ts +16 -0
- package/dist/quality-gates.js +192 -0
- package/dist/quality-links.d.ts +7 -0
- package/dist/quality-links.js +149 -0
- package/dist/quality-lint.d.ts +6 -0
- package/dist/quality-lint.js +124 -0
- package/dist/quality-rendered.d.ts +11 -0
- package/dist/quality-rendered.js +222 -0
- package/dist/quality-schema.d.ts +3 -0
- package/dist/quality-schema.js +71 -0
- package/dist/release-notes.d.ts +44 -0
- package/dist/release-notes.js +183 -0
- package/dist/remote-monitor.d.ts +16 -0
- package/dist/remote-monitor.js +74 -0
- package/dist/remote-source.d.ts +34 -0
- package/dist/remote-source.js +426 -0
- package/dist/review-diff.d.ts +82 -0
- package/dist/review-diff.js +400 -0
- package/dist/review-learning.d.ts +11 -0
- package/dist/review-learning.js +60 -0
- package/dist/review-render.d.ts +38 -0
- package/dist/review-render.js +224 -0
- package/dist/review-report.d.ts +9 -0
- package/dist/review-report.js +89 -0
- package/dist/review-ui.d.ts +14 -0
- package/dist/review-ui.js +1248 -0
- package/dist/schedule.d.ts +78 -0
- package/dist/schedule.js +480 -0
- package/dist/screen-capture-provider.d.ts +52 -0
- package/dist/screen-capture-provider.js +218 -0
- package/dist/screenshot-workflow.d.ts +167 -0
- package/dist/screenshot-workflow.js +1237 -0
- package/dist/settings.d.ts +1 -1
- package/dist/settings.js +95 -7
- package/dist/site-export.d.ts +18 -0
- package/dist/site-export.js +87 -0
- package/dist/source-connectors.d.ts +33 -0
- package/dist/source-connectors.js +268 -0
- package/dist/source-discovery.d.ts +132 -0
- package/dist/source-discovery.js +823 -0
- package/dist/source-intelligence.d.ts +9 -0
- package/dist/source-intelligence.js +306 -0
- package/dist/sync-review.d.ts +28 -0
- package/dist/sync-review.js +264 -0
- package/dist/sync-runs.d.ts +192 -0
- package/dist/sync-runs.js +2244 -0
- package/dist/sync.d.ts +35 -0
- package/dist/sync.js +298 -32
- package/dist/text-diff.d.ts +9 -0
- package/dist/text-diff.js +59 -0
- package/dist/types.d.ts +946 -1
- package/dist/ui/assets/doxloop-logo-light-De7Nx7j7.png +0 -0
- package/dist/ui/assets/index-BHBYU2aG.css +1 -0
- package/dist/ui/assets/index-Cq3RPQiC.js +33 -0
- package/dist/ui/index.html +18 -0
- package/dist/ui-server.d.ts +83 -0
- package/dist/ui-server.js +3532 -0
- package/dist/usage-budget.d.ts +28 -0
- package/dist/usage-budget.js +90 -0
- package/dist/validation.d.ts +25 -1
- package/dist/validation.js +312 -26
- package/dist/workspace-tools.d.ts +54 -0
- package/dist/workspace-tools.js +123 -0
- package/docs/agent-compatibility.md +49 -32
- package/docs/ci-and-automation.md +105 -66
- package/docs/doxbrix-http-api.md +8 -1
- package/docs/existing-documentation.md +80 -0
- package/docs/generation-performance.md +108 -0
- package/docs/generator-authoring.md +68 -5
- package/docs/generator-selection.md +50 -13
- package/docs/mintlify-import.md +71 -0
- package/docs/openapi-security.md +25 -0
- package/docs/project-format.md +331 -36
- package/docs/release-quality.md +158 -0
- package/docs/releasing.md +72 -0
- package/docs/review-workflows.md +51 -0
- package/docs/security-model.md +102 -39
- package/docs/troubleshooting.md +226 -93
- package/package.json +46 -15
- package/scripts/test-auto-screenshot.mjs +172 -0
- package/skills/doxloop-authoring/SKILL.md +242 -361
- package/skills/doxloop-authoring/references/existing-documentation.md +94 -0
- package/skills/doxloop-authoring/references/navigation-architecture.md +18 -7
- package/skills/doxloop-authoring/references/page-depth.md +169 -0
- package/skills/doxloop-authoring/references/project-format.md +106 -7
- package/skills/doxloop-authoring/references/quality.md +10 -0
- package/skills/doxloop-authoring/references/screenshot-manifest.md +113 -0
- package/skills/doxloop-authoring/references/screenshots.md +149 -235
- package/skills/doxloop-authoring/references/workflows.md +76 -0
- package/skills/doxloop-doxbrix/SKILL.md +38 -22
- package/skills/doxloop-doxbrix/references/api-endpoints.md +15 -14
- package/skills/doxloop-doxbrix/references/components.md +30 -3
- package/skills/doxloop-doxbrix/references/manifest.md +3 -2
- package/vendor/doxbrix-import/LICENSE +202 -0
- package/vendor/doxbrix-import/README.md +17 -0
- package/vendor/doxbrix-import/UPSTREAM.json +47 -0
- package/vendor/doxbrix-import/dist/docs/frontmatter.d.ts +13 -0
- package/vendor/doxbrix-import/dist/docs/frontmatter.js +83 -0
- package/vendor/doxbrix-import/dist/docs/import.d.ts +21 -0
- package/vendor/doxbrix-import/dist/docs/import.js +147 -0
- package/vendor/doxbrix-import/dist/docs/manifest.d.ts +163 -0
- package/vendor/doxbrix-import/dist/docs/manifest.js +64 -0
- package/vendor/doxbrix-import/dist/docs/project.d.ts +25 -0
- package/vendor/doxbrix-import/dist/docs/project.js +77 -0
- package/vendor/doxbrix-import/dist/docs/starter.d.ts +4 -0
- package/vendor/doxbrix-import/dist/docs/starter.js +11 -0
- package/vendor/doxbrix-import/dist/importer.d.ts +227 -0
- package/vendor/doxbrix-import/dist/importer.js +1567 -0
- package/vendor/doxbrix-import/dist/mintlify-openapi.d.ts +37 -0
- package/vendor/doxbrix-import/dist/mintlify-openapi.js +305 -0
- package/vendor/doxbrix-import/dist/safe-path.d.ts +9 -0
- package/vendor/doxbrix-import/dist/safe-path.js +47 -0
- package/dist/agents.d.ts.map +0 -1
- package/dist/agents.js.map +0 -1
- package/dist/args.d.ts.map +0 -1
- package/dist/args.js.map +0 -1
- package/dist/artifact-deploy.d.ts.map +0 -1
- package/dist/artifact-deploy.js.map +0 -1
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js.map +0 -1
- package/dist/author.d.ts.map +0 -1
- package/dist/author.js.map +0 -1
- package/dist/capture.d.ts.map +0 -1
- package/dist/capture.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/deploy.d.ts.map +0 -1
- package/dist/deploy.js.map +0 -1
- package/dist/deployment-visibility.d.ts.map +0 -1
- package/dist/deployment-visibility.js.map +0 -1
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/doxbrix-markdown.d.ts.map +0 -1
- package/dist/doxbrix-markdown.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/fs.d.ts.map +0 -1
- package/dist/fs.js.map +0 -1
- package/dist/generator-api.d.ts.map +0 -1
- package/dist/generator-api.js.map +0 -1
- package/dist/generator-manager.d.ts.map +0 -1
- package/dist/generator-manager.js.map +0 -1
- package/dist/generator-runtime.d.ts.map +0 -1
- package/dist/generator-runtime.js.map +0 -1
- package/dist/generators.d.ts.map +0 -1
- package/dist/generators.js.map +0 -1
- package/dist/interactive.d.ts.map +0 -1
- package/dist/interactive.js.map +0 -1
- package/dist/preview.d.ts.map +0 -1
- package/dist/preview.js.map +0 -1
- package/dist/progress.d.ts.map +0 -1
- package/dist/progress.js.map +0 -1
- package/dist/project.d.ts.map +0 -1
- package/dist/project.js.map +0 -1
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js.map +0 -1
- package/dist/settings.d.ts.map +0 -1
- package/dist/settings.js.map +0 -1
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js.map +0 -1
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js.map +0 -1
package/docs/project-format.md
CHANGED
|
@@ -3,14 +3,11 @@
|
|
|
3
3
|
Doxloop stores project configuration under `.doxloop/`. Commit the configuration
|
|
4
4
|
and synchronization state when a team should share the same authoring decisions.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Run `doxloop settings` inside the documentation project to change shared
|
|
13
|
-
configuration without editing JSON by hand.
|
|
6
|
+
The setup wizard creates a new documentation project beside, never inside, the
|
|
7
|
+
product source. Use **Settings** in the control center to change shared
|
|
8
|
+
configuration without editing JSON by hand; this page documents the files
|
|
9
|
+
themselves for review, version control, and advanced options that have no
|
|
10
|
+
form field.
|
|
14
11
|
|
|
15
12
|
## `project.json`
|
|
16
13
|
|
|
@@ -18,11 +15,21 @@ configuration without editing JSON by hand.
|
|
|
18
15
|
{
|
|
19
16
|
"schemaVersion": 1,
|
|
20
17
|
"title": "Example documentation",
|
|
21
|
-
"contentDir": "
|
|
18
|
+
"contentDir": "",
|
|
22
19
|
"generator": "doxbrix",
|
|
23
|
-
"sources": [{
|
|
20
|
+
"sources": [{
|
|
21
|
+
"name": "product",
|
|
22
|
+
"path": "../product",
|
|
23
|
+
"remote": {
|
|
24
|
+
"provider": "github",
|
|
25
|
+
"repository": "example/product",
|
|
26
|
+
"branch": "main",
|
|
27
|
+
"tokenEnv": "GITHUB_TOKEN"
|
|
28
|
+
}
|
|
29
|
+
}],
|
|
24
30
|
"designReferences": [{ "url": "https://docs.example.com/" }],
|
|
25
31
|
"deployment": {
|
|
32
|
+
"target": "doxbrix",
|
|
26
33
|
"name": "Example documentation",
|
|
27
34
|
"slug": "example-docs",
|
|
28
35
|
"visibility": "private",
|
|
@@ -31,18 +38,21 @@ configuration without editing JSON by hand.
|
|
|
31
38
|
"application": {
|
|
32
39
|
"baseUrl": "http://localhost:3000/",
|
|
33
40
|
"source": "product",
|
|
34
|
-
"startCommand": "npm run dev",
|
|
35
41
|
"readyPath": "/health",
|
|
36
42
|
"screenshots": {
|
|
37
43
|
"policy": "requested",
|
|
38
44
|
"viewport": { "width": 1440, "height": 900 },
|
|
39
|
-
"highlight": true
|
|
45
|
+
"highlight": true,
|
|
46
|
+
"startPath": "/settings/team",
|
|
47
|
+
"workflow": "Reuse the signed-in demo workspace and synthetic team members. Capture the invite form and successful invitation state."
|
|
40
48
|
}
|
|
41
49
|
},
|
|
42
50
|
"documentation": {
|
|
43
51
|
"primaryAudience": "Application developers",
|
|
44
52
|
"experienceLevel": "intermediate",
|
|
45
53
|
"priorityOutcomes": ["Install the SDK", "Send the first request"],
|
|
54
|
+
"preferredExamples": ["TypeScript", "curl"],
|
|
55
|
+
"designDirection": "Compact developer reference with task-led guides",
|
|
46
56
|
"locale": "en-US",
|
|
47
57
|
"tone": ["clear", "direct", "professional"],
|
|
48
58
|
"standardsProfile": "doxloop-v1",
|
|
@@ -50,42 +60,316 @@ configuration without editing JSON by hand.
|
|
|
50
60
|
"terminology": {},
|
|
51
61
|
"exclusions": [],
|
|
52
62
|
"accessibilityTarget": "WCAG 2.2 AA"
|
|
63
|
+
},
|
|
64
|
+
"sync": {
|
|
65
|
+
"mode": "check",
|
|
66
|
+
"branch": "main",
|
|
67
|
+
"on": ["every@15m"],
|
|
68
|
+
"watch": ["src/**", "openapi.yaml"],
|
|
69
|
+
"ignore": ["pnpm-lock.yaml"],
|
|
70
|
+
"budget": { "maxRunsPerDay": 8, "maxMinutes": 15, "maxUsd": 10 },
|
|
71
|
+
"maxVerificationAgeDays": 30,
|
|
72
|
+
"maxVerificationAgeSeverity": "warn"
|
|
53
73
|
}
|
|
54
74
|
}
|
|
55
75
|
```
|
|
56
76
|
|
|
57
|
-
- `
|
|
58
|
-
- `
|
|
59
|
-
|
|
77
|
+
- `title` and `defaultAgent` are edited under **Settings → General**.
|
|
78
|
+
- `contentDir` is empty for new native Doxbrix projects, meaning reader content
|
|
79
|
+
lives at the project root. Existing projects may retain a non-symlinked
|
|
80
|
+
relative directory such as `docs`; external generators use their native
|
|
81
|
+
content directories.
|
|
82
|
+
- `sources` is the read-only evidence allowlist managed on the **Sources**
|
|
83
|
+
page. It may be empty when no local product source is available. Configured
|
|
60
84
|
source paths must be outside the documentation project; sibling product and
|
|
61
|
-
documentation directories are the recommended layout.
|
|
85
|
+
documentation directories are the recommended layout. Git repository sources
|
|
86
|
+
carry a `remote` object and are downloaded as read-only snapshots into a
|
|
87
|
+
`.doxloop-sources` directory beside the project. A source may declare
|
|
88
|
+
`scope.space`, `scope.routePrefix`, and `scope.navigationGroup`, edited
|
|
89
|
+
through **Documentation ownership** on the Sources page. Route prefixes
|
|
90
|
+
cannot overlap. Pages intentionally shared by several sources must be named
|
|
91
|
+
in `scope.sharedPages`.
|
|
62
92
|
- `generatorPackage` is required for an external generator and must match the
|
|
63
93
|
official package selected by `generator`.
|
|
64
94
|
- `designReferences` accept absolute HTTP or HTTPS URLs without credentials.
|
|
65
|
-
- `application` is
|
|
66
|
-
surface for guide screenshots. `source` names
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
the
|
|
72
|
-
|
|
73
|
-
|
|
95
|
+
- `application` is edited under **Settings → Visual evidence** and describes a
|
|
96
|
+
safe local or test application surface for guide screenshots. `source` names
|
|
97
|
+
a configured source. A legacy `startCommand` is preserved when present but
|
|
98
|
+
is never executed by the capture workflow; the user owns application startup
|
|
99
|
+
and test data. Screenshot policy is `requested`, `auto`, or `off`; projects
|
|
100
|
+
without this object keep the existing behaviour. `screenshots.startPath`
|
|
101
|
+
records the default starting route, and `screenshots.workflow` records
|
|
102
|
+
authentication, safe fixture data, ordered actions, and expected outcomes
|
|
103
|
+
that constrain capture planning. `authentication.loginPath` names the
|
|
104
|
+
sign-in route the browser sign-in opens. Sign-in secrets are never stored
|
|
105
|
+
here: the recorded browser session and any test-account credentials live
|
|
106
|
+
under `~/.config/doxloop/capture-auth/<project key>/` (or
|
|
107
|
+
`$DOXLOOP_CONFIG_HOME`) with owner-only permissions, keyed by the project
|
|
108
|
+
root, and are managed under **Settings → Visual evidence → Application
|
|
109
|
+
sign-in**.
|
|
110
|
+
- `deployment.target` is `doxbrix`, `github-pages`, `netlify`, or `vercel`.
|
|
111
|
+
Common fields save the project name and slug. Doxbrix also uses `visibility`
|
|
112
|
+
and `apiUrl`; GitHub Pages uses `branch` and optional `basePath`; Netlify uses
|
|
113
|
+
`siteId`; Vercel uses `projectId` and optional `teamId`. Provider tokens are
|
|
114
|
+
never stored here—they come from the OS credential store, protected user
|
|
115
|
+
configuration, or `DOXLOOP_NETLIFY_TOKEN` / `DOXLOOP_VERCEL_TOKEN`. Missing
|
|
116
|
+
names and slugs are derived from the project title.
|
|
117
|
+
- `documentation` persists confirmed reader, scope, terminology, editorial,
|
|
118
|
+
and accessibility decisions, edited under **Settings → Audience and voice**
|
|
119
|
+
and in each plan's **Documentation brief**.
|
|
120
|
+
- `sync` configures automatic maintenance and is managed by the
|
|
121
|
+
**Monitoring** dialog on the Sources page. `mode` is `check` (report only),
|
|
122
|
+
`propose` (generate an isolated review when run manually), or `auto`
|
|
123
|
+
(generate an isolated review from configured triggers). Authoring modes
|
|
124
|
+
never alter real documentation before approval and do not require
|
|
125
|
+
documentation Git. `branch` names the product branch documentation follows.
|
|
126
|
+
`on` selects one polling frequency: `every@Nm`, `every@Nh`, `daily@HH:MM`,
|
|
127
|
+
`weekdays@HH:MM`, `weekly@<day>@HH:MM`, or `monthly@<day>@HH:MM`. `watch`
|
|
128
|
+
and `ignore` are path patterns applied to changed source files; `ignore`
|
|
129
|
+
always wins. `budget` caps unattended runs: `maxRunsPerDay` limits scheduled
|
|
130
|
+
runs, `maxMinutes` stops an agent (and the planner) after that many minutes,
|
|
131
|
+
and `maxUsd` passes a spending cap to Claude Code, which is the only agent
|
|
132
|
+
with such a flag. Missing values use the defaults below. `maxVerificationAgeDays` warns or fails (according to
|
|
133
|
+
`maxVerificationAgeSeverity`) when evidence has not been reverified
|
|
134
|
+
recently, even when source revisions are unchanged.
|
|
135
|
+
|
|
136
|
+
Default `ignore` patterns cover lock files and snapshots. Test files are
|
|
137
|
+
deliberately not ignored, because the authoring workflow treats tests as
|
|
138
|
+
evidence of supported behaviour, so a changed test can legitimately change
|
|
139
|
+
documentation.
|
|
74
140
|
|
|
75
141
|
Schema version 1 treats a missing legacy `generator` as `doxbrix` and supplies
|
|
76
142
|
the default documentation brief when it is absent. Unsupported structures fail
|
|
77
143
|
closed rather than being silently migrated.
|
|
78
144
|
|
|
145
|
+
### Imported projects
|
|
146
|
+
|
|
147
|
+
A folder that already holds a documentation site can be adopted from the
|
|
148
|
+
control center (**Use existing documentation folder** in the setup wizard, or
|
|
149
|
+
**Import existing documentation…** in the project switcher) or with
|
|
150
|
+
`doxloop init --existing [directory]`. The generator is recognized from its
|
|
151
|
+
configuration files: `docs.json` (Doxbrix), `docusaurus.config.*`,
|
|
152
|
+
`mkdocs.yml`, `astro.config.*` mentioning Starlight, `<dir>/.vitepress/config.*`,
|
|
153
|
+
`next.config.*` mentioning Nextra or `theme.config.*`, `markdoc.config.*`,
|
|
154
|
+
`hugo.*` or a Hugo `config.toml`, `<dir>/conf.py` (Sphinx), and `_config.yml`
|
|
155
|
+
(Jekyll). The content directory and title are read from the same files where
|
|
156
|
+
they are declared, and both can be overridden.
|
|
157
|
+
|
|
158
|
+
Import writes `project.json` with no sources and the default brief, an
|
|
159
|
+
`evidence-map.json` in which every existing page has no sources and the
|
|
160
|
+
confidence `needs-human` (so the first update run must attach evidence before
|
|
161
|
+
drift detection trusts the page), the machine-local `.gitignore` entries
|
|
162
|
+
listed above, and the agent skills. It then runs a read-only discovery pass.
|
|
163
|
+
Pages, navigation, and generator configuration are never modified. A
|
|
164
|
+
generator other than Doxbrix must have its Doxloop generator package
|
|
165
|
+
resolvable from the folder; the control center offers to add it as a
|
|
166
|
+
development dependency.
|
|
167
|
+
|
|
168
|
+
## `projects.json` (user level)
|
|
169
|
+
|
|
170
|
+
The control center keeps a list of the projects it has opened at
|
|
171
|
+
`~/.doxloop/projects.json` (`DOXLOOP_HOME` overrides the directory). Each
|
|
172
|
+
entry records the project path, title, generator, and when it was last opened,
|
|
173
|
+
newest first, capped at twenty entries. The file is a convenience: a damaged
|
|
174
|
+
one is ignored and rewritten on the next open, and a project whose
|
|
175
|
+
`.doxloop/project.json` has disappeared is shown as missing until it is removed
|
|
176
|
+
from the list.
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"schemaVersion": 1,
|
|
181
|
+
"projects": [
|
|
182
|
+
{ "path": "/work/product-docs", "title": "Product documentation", "generator": "doxbrix", "lastOpenedAt": "2026-09-04T10:12:00.000Z" }
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## `quality.json`
|
|
188
|
+
|
|
189
|
+
`.doxloop/quality.json` is an optional version 1 contract for external-link
|
|
190
|
+
policy and cache lifetime, opt-in executable examples, rendered routes and
|
|
191
|
+
viewports, lint limits, and disabled-by-default reader verification metadata.
|
|
192
|
+
See [release quality](./release-quality.md) for the complete schema and safety
|
|
193
|
+
model. Quality reports, link caches, current screenshots, and evaluation
|
|
194
|
+
results are derived artifacts; approved visual and evaluation baselines may be
|
|
195
|
+
committed when a team wants CI regression protection.
|
|
196
|
+
|
|
197
|
+
Proposal runs live under `.doxloop/runs/<id>/`: the isolated `workspace/`
|
|
198
|
+
the agent wrote into, the reviewed `run.json`, `baseline.json`, which holds a
|
|
199
|
+
content hash of every file as the workspace was created so review can tell
|
|
200
|
+
what the agent changed from what changed in the project while it ran, and
|
|
201
|
+
`authoring.json`, which records the instructions, agent, model, screenshot
|
|
202
|
+
mode, and source summary the run was started with so a failed run can be
|
|
203
|
+
resumed in place. UI recovery
|
|
204
|
+
checkpoints and logs live in `.doxloop/ui-jobs.json` and
|
|
205
|
+
`.doxloop/ui-job-logs/`. Learned local review guidance is stored in
|
|
206
|
+
`.doxloop/review-preferences.json`, and prepared Git delivery metadata is stored
|
|
207
|
+
in `.doxloop/deliveries/`. These machine-local artifacts are owner-readable,
|
|
208
|
+
excluded from proposal snapshots, and added to `.gitignore`; they are not part
|
|
209
|
+
of the portable project contract.
|
|
210
|
+
|
|
211
|
+
## Documentation plans
|
|
212
|
+
|
|
213
|
+
The control center creates `.doxloop/plans/<plan-id>/plan.json` before any
|
|
214
|
+
create or update authoring begins. The current approved snapshot is copied to
|
|
215
|
+
`.doxloop/documentation-plan.json` for the generation agent. Plan version 2 is
|
|
216
|
+
generator-neutral and records:
|
|
217
|
+
|
|
218
|
+
- the confirmed reader brief, scope, exclusions, terminology, locale,
|
|
219
|
+
accessibility target, and style guide;
|
|
220
|
+
- deterministic discovery metadata and an evidence-backed capability map;
|
|
221
|
+
- page actions, purposes, priorities, structured source evidence, and the
|
|
222
|
+
navigation outline;
|
|
223
|
+
- open clarification questions and their confirmed answers;
|
|
224
|
+
- the selected generator's content format, extensions, and native navigation
|
|
225
|
+
boundaries; and
|
|
226
|
+
- the estimated page count, effort, execution settings, approval hash, and
|
|
227
|
+
resulting proposal ID.
|
|
228
|
+
|
|
229
|
+
Every reviewable revision is archived in
|
|
230
|
+
`.doxloop/plans/<plan-id>/versions/v<N>.json`. Version 1 plans are migrated on
|
|
231
|
+
read without changing reader-facing documentation. Planning discovery is cached
|
|
232
|
+
by safe source-content hash under `.doxloop/cache/discovery/`; cache files and
|
|
233
|
+
plan run logs are operational state and should not be committed.
|
|
234
|
+
|
|
235
|
+
A plan in `planning`, `revising`, or `needs-input` cannot authorize authoring.
|
|
236
|
+
**Approve & generate** records an integrity hash, and generation refuses to
|
|
237
|
+
proceed if either the approved plan or its configured source snapshot changed.
|
|
238
|
+
Pages marked for a future backlog are omitted from the current proposed run.
|
|
239
|
+
|
|
240
|
+
## Quality review reports
|
|
241
|
+
|
|
242
|
+
Read-only agent reviews are stored as owner-readable JSON files under
|
|
243
|
+
`.doxloop/reviews/`. A report records the selected agent, model and reasoning,
|
|
244
|
+
the bounded score, hard-gate result, summary, and structured findings with page
|
|
245
|
+
and evidence references. Raw agent transcripts are not copied into these
|
|
246
|
+
reports. Reviews do not edit documentation, alter an approved plan, or create a
|
|
247
|
+
proposal; deterministic validation remains a separate release signal.
|
|
248
|
+
|
|
249
|
+
Request and deployment history uses `.doxloop/doxloop.db` and therefore requires
|
|
250
|
+
the package runtime contract, Node.js 22.13 or newer. Set
|
|
251
|
+
`DOXLOOP_NO_HISTORY=1` in the environment that starts the control center only
|
|
252
|
+
as an explicit opt-out; the **Update history** and **Deployment history**
|
|
253
|
+
panels surface that state.
|
|
254
|
+
|
|
79
255
|
## `sync-state.json`
|
|
80
256
|
|
|
81
|
-
Each
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
257
|
+
Each source records the provider commit and timestamp used by the last accepted
|
|
258
|
+
automatic proposal. Local manual workflows can also record a fingerprint of
|
|
259
|
+
tracked and untracked non-ignored, non-credential source content used by the
|
|
260
|
+
last successful authoring run. The fingerprint prevents an unchanged dirty
|
|
261
|
+
working tree from being reported again after its content is committed.
|
|
262
|
+
|
|
263
|
+
A local folder without Git history records the marker commit `local-content`
|
|
264
|
+
together with the fingerprint and a `files` map of source-relative paths to
|
|
265
|
+
content digests. A later check compares the folder against that map, so it
|
|
266
|
+
can name the added, modified, and deleted files even though there is no
|
|
267
|
+
commit range to diff. Credential files are never read or listed.
|
|
268
|
+
|
|
269
|
+
Doxloop updates synchronization state only when a create or update proposal
|
|
270
|
+
has been fully accepted, documentation validation passes, and the brief has a
|
|
271
|
+
primary audience and priority outcomes. Automatic review runs keep their staged
|
|
272
|
+
state separate and copy it into the real project only after every proposed
|
|
273
|
+
change has been accepted.
|
|
274
|
+
|
|
275
|
+
## `runs/`
|
|
276
|
+
|
|
277
|
+
`.doxloop/runs/` is ignored runtime state for generated documentation reviews.
|
|
278
|
+
Each run contains an isolated workspace, original copies of changed files, a
|
|
279
|
+
`baseline.json` hash manifest of the project as the run started, and a
|
|
280
|
+
`run.json` manifest with the trigger, validation result, exact line hunks, and
|
|
281
|
+
acceptance decisions. A change whose file also moved in the project while the
|
|
282
|
+
agent ran is marked `changedDuringRun`; the **Review** page groups those under
|
|
283
|
+
**Changed while the agent ran** and asks before applying them. The **Review** page lists the manifests and renders them.
|
|
284
|
+
The directory is not required to be committed and can be retained according to
|
|
285
|
+
local review policy; **Clean up archived** on the Review page removes eligible
|
|
286
|
+
workspaces.
|
|
287
|
+
|
|
288
|
+
The current run manifest is schema version 2. Each file change records its
|
|
289
|
+
reason, configured source paths or operations and revisions, affected public
|
|
290
|
+
interfaces, reader-facing claims, file-relevant validation, confidence,
|
|
291
|
+
assumptions, originating plan or request, and agent or human authorship. This
|
|
292
|
+
is what the **Why this change** panel shows. Schema-version-1 manifests are
|
|
293
|
+
migrated when read.
|
|
294
|
+
|
|
295
|
+
**Ask agent to revise** seeds a new isolated workspace from the prior proposal
|
|
296
|
+
and records the selected files or hunks and reviewer instruction. The old
|
|
297
|
+
proposal is retained as superseded. **Edit page** changes remain inside the
|
|
298
|
+
workspace, run validation, and record whether existing evidence still applies
|
|
299
|
+
or needs review.
|
|
300
|
+
|
|
301
|
+
Before the first accepted hunk, Doxloop snapshots the exact affected files and
|
|
302
|
+
operational sync state. A completed application also snapshots the exact
|
|
303
|
+
applied result. Undo compares the live files with that result and stops instead
|
|
304
|
+
of overwriting a later edit; successful undo restores the pre-acceptance
|
|
305
|
+
snapshot atomically. Proposals receive a 30-day retention date. Archived
|
|
306
|
+
workspaces are removed only through explicit cleanup, while expired rejected,
|
|
307
|
+
failed, superseded, and undone workspaces are eligible for cleanup.
|
|
308
|
+
|
|
309
|
+
## `evidence-map.json`
|
|
310
|
+
|
|
311
|
+
`.doxloop/evidence-map.json` records which configured source, and which
|
|
312
|
+
source-relative paths or API operations, produced each page. Commit it: it is
|
|
313
|
+
what lets Monitoring name the individual pages a later source change made
|
|
314
|
+
stale, rather than reporting only that a source changed.
|
|
315
|
+
|
|
316
|
+
```json
|
|
317
|
+
{
|
|
318
|
+
"schemaVersion": 1,
|
|
319
|
+
"pages": {
|
|
320
|
+
"docs/guides/authentication.md": {
|
|
321
|
+
"sources": [{ "source": "product", "paths": ["src/auth.ts"] }],
|
|
322
|
+
"verifiedAt": { "product": "9f2c1ab..." },
|
|
323
|
+
"verifiedOn": { "product": "2026-08-26T10:00:00.000Z" },
|
|
324
|
+
"confidence": "verified",
|
|
325
|
+
"claims": ["Access tokens expire after 900 seconds"],
|
|
326
|
+
"claimVerification": {
|
|
327
|
+
"Access tokens expire after 900 seconds": "verified"
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Pages are keyed by project-relative path including the extension. A recorded
|
|
335
|
+
directory matches everything below it. An entry without `paths` means the page
|
|
336
|
+
depends on the whole source. `confidence` is `verified`, `inferred`, or
|
|
337
|
+
`needs-human`; the last raises a validation warning so an unverified claim is
|
|
338
|
+
visible rather than silently published.
|
|
339
|
+
|
|
340
|
+
Authoring runs write this file. A malformed file fails closed: delete it and
|
|
341
|
+
run an update from the **Update** page to rebuild it.
|
|
342
|
+
|
|
343
|
+
`verifiedAt` records the source revision or content hash. `verifiedOn` records
|
|
344
|
+
when the claims were actually checked and drives the maximum-age policy. Claim
|
|
345
|
+
checks treat changed or expired evidence as `needs-human` rather than
|
|
346
|
+
preserving an old verified state. `claimVerification` may record an exact claim
|
|
347
|
+
as `verified`, `inferred`, `contradicted`, or `needs-human`; it must never
|
|
348
|
+
claim more certainty than the configured source supports.
|
|
349
|
+
|
|
350
|
+
The **Documentation coverage** section of the Sources page reports connector
|
|
351
|
+
health, coverage by public surface and source scope, and evidence-precision
|
|
352
|
+
suggestions. Coverage describes traceability to discovered evidence; it is not
|
|
353
|
+
a correctness score.
|
|
354
|
+
|
|
355
|
+
## `coverage-resolutions.json`
|
|
356
|
+
|
|
357
|
+
`.doxloop/coverage-resolutions.json` records explicit decisions made from the
|
|
358
|
+
coverage gap review on the Sources page. A resolution can link a reader journey
|
|
359
|
+
to an existing page (**Link existing page**), exclude a discovered source item
|
|
360
|
+
from the supported public surface (**Mark as internal**), drop a journey that
|
|
361
|
+
is no longer a priority, or retain a needs-human decision (**Decide later**).
|
|
362
|
+
Commit this file so exclusions and journey mappings remain stable for every
|
|
363
|
+
contributor and CI run.
|
|
364
|
+
|
|
365
|
+
Linking a product surface also writes its precise identifier to
|
|
366
|
+
`.doxloop/evidence-map.json`. Removing a reader journey updates
|
|
367
|
+
`documentation.priorityOutcomes` in `project.json`. Future documentation plans
|
|
368
|
+
preserve those configured outcomes verbatim, even when the planning agent adds a
|
|
369
|
+
more specific description, so wording changes do not reset journey coverage.
|
|
85
370
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
audience and priority outcomes.
|
|
371
|
+
Coverage uses the newest approved, generating, or generated plan. Planning,
|
|
372
|
+
cancelled, failed, and stale drafts do not replace the coverage baseline.
|
|
89
373
|
|
|
90
374
|
## `last-run.json`
|
|
91
375
|
|
|
@@ -102,8 +386,19 @@ be committed.
|
|
|
102
386
|
|
|
103
387
|
Application guide screenshots are different: they are reader-facing assets,
|
|
104
388
|
are placed in the selected generator's native asset directory, and should be
|
|
105
|
-
committed with the guide.
|
|
106
|
-
|
|
107
|
-
|
|
389
|
+
committed with the guide. They are enabled per run by **Add product
|
|
390
|
+
screenshots?** on the Create and Update pages, or by the screenshot policy
|
|
391
|
+
under **Settings → Visual evidence**; a request that clearly asks for
|
|
392
|
+
screenshots also enables the capture workflow. Contextual focus rings and
|
|
108
393
|
numbered markers are baked into the image so they render consistently across
|
|
109
|
-
generators.
|
|
394
|
+
generators. Plans record whether screenshots are automatic, required, or
|
|
395
|
+
disabled and identify the specific UI guides, application-relative start path,
|
|
396
|
+
ordered safe workflow, and an explicit capture sequence from entry through
|
|
397
|
+
verification before approval. The sequence contains one meaningful visible
|
|
398
|
+
state per planned image; UI-heavy tutorials and how-to guides therefore plan
|
|
399
|
+
several captures instead of defaulting to one final-state screenshot. Approval
|
|
400
|
+
requires a reachable configured application and complete capture details for
|
|
401
|
+
every visual guide. During generation the agent writes
|
|
402
|
+
`.doxloop/screenshot-manifest.json`; Doxloop verifies the planned page, purpose,
|
|
403
|
+
expected state, PNG dimensions, uniqueness, embedding, and completed privacy and
|
|
404
|
+
legibility checks before it creates a review proposal.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Release quality and evaluations
|
|
2
|
+
|
|
3
|
+
Doxloop applies quality gates at every step of the loop in the control center:
|
|
4
|
+
|
|
5
|
+
- **Planning** cannot be approved while clarification questions are open, and
|
|
6
|
+
generation refuses to start if the approved plan or its source snapshot
|
|
7
|
+
changed.
|
|
8
|
+
- **Proposals** run page validation before they appear on the **Review** page.
|
|
9
|
+
The **Why this change** panel shows each file's error and warning counts,
|
|
10
|
+
supporting evidence, reader-facing claims, and assumptions to verify.
|
|
11
|
+
Direct page edits are validated before they are saved.
|
|
12
|
+
- **Publish** validates the documentation again and builds the site before
|
|
13
|
+
anything is uploaded.
|
|
14
|
+
Validation errors stop a deployment; warnings are reported.
|
|
15
|
+
|
|
16
|
+
The versioned release-quality contract described below extends those checks
|
|
17
|
+
with external links, OpenAPI linting, documentation lint, claim
|
|
18
|
+
reverification, and opt-in executable, accessibility, and visual checks. It is
|
|
19
|
+
the release-grade definition of "ready", stores its complete JSON report below
|
|
20
|
+
`.doxloop/quality-reports/`, and is designed for the headless checks described
|
|
21
|
+
in [automation and CI](./ci-and-automation.md). A failing gate exits with
|
|
22
|
+
status 1; warnings exit 0 unless the contract is run with warnings treated as
|
|
23
|
+
errors.
|
|
24
|
+
|
|
25
|
+
## Shared quality configuration
|
|
26
|
+
|
|
27
|
+
Optional settings live in `.doxloop/quality.json`:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"schemaVersion": 1,
|
|
32
|
+
"links": {
|
|
33
|
+
"mode": "online",
|
|
34
|
+
"allowHosts": ["developer.example.com"],
|
|
35
|
+
"ignore": ["https://status.example.com/"],
|
|
36
|
+
"timeoutMs": 8000,
|
|
37
|
+
"retries": 2,
|
|
38
|
+
"cacheHours": 24
|
|
39
|
+
},
|
|
40
|
+
"examples": { "enabled": true },
|
|
41
|
+
"rendered": {
|
|
42
|
+
"enabled": true,
|
|
43
|
+
"routes": ["/", "/quickstart"],
|
|
44
|
+
"themes": ["light", "dark"],
|
|
45
|
+
"maximumDiffRatio": 0.001,
|
|
46
|
+
"viewports": [
|
|
47
|
+
{ "name": "desktop", "width": 1440, "height": 900 },
|
|
48
|
+
{ "name": "mobile", "width": 390, "height": 844 }
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"lint": {
|
|
52
|
+
"maximumTitleLength": 72,
|
|
53
|
+
"maximumNavigationLabelLength": 42
|
|
54
|
+
},
|
|
55
|
+
"suppressions": [{
|
|
56
|
+
"code": "quality.claim.needs-human",
|
|
57
|
+
"file": "reference/legacy.md",
|
|
58
|
+
"reason": "Owner-approved migration exception",
|
|
59
|
+
"expires": "2026-09-30"
|
|
60
|
+
}],
|
|
61
|
+
"ratchet": {
|
|
62
|
+
"enabled": true,
|
|
63
|
+
"baselineFile": ".doxloop/quality-baseline.json"
|
|
64
|
+
},
|
|
65
|
+
"readerVerification": { "enabled": false }
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
External checks cache successful and broken responses, so an offline run can
|
|
70
|
+
use only that cache. Authentication responses and temporary network/server
|
|
71
|
+
failures are warnings, not broken-link failures. Private destinations and
|
|
72
|
+
credential-bearing URLs are blocked.
|
|
73
|
+
|
|
74
|
+
Suppressions require a reason, can be limited to one file, and can expire. They
|
|
75
|
+
remain in the report as `skipped`; they are not silently removed. Ratcheting
|
|
76
|
+
matches the exact issue code, file, and message so an approved legacy issue does
|
|
77
|
+
not permit a different regression with the same broad code. The current
|
|
78
|
+
reviewed findings can be approved as the baseline from the headless quality
|
|
79
|
+
check. Advanced policy stays in this shared configuration so the control
|
|
80
|
+
center remains a simple status, fix, and recheck flow.
|
|
81
|
+
|
|
82
|
+
## Executable examples
|
|
83
|
+
|
|
84
|
+
Example execution is opt-in through `.doxloop/examples.json`:
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"schemaVersion": 1,
|
|
89
|
+
"examples": [{
|
|
90
|
+
"id": "parse-config",
|
|
91
|
+
"runtime": "node",
|
|
92
|
+
"file": "examples/parse-config.mjs",
|
|
93
|
+
"workingDirectory": ".",
|
|
94
|
+
"fixtures": ["examples/config.json"],
|
|
95
|
+
"network": "denied",
|
|
96
|
+
"expected": { "exitCode": 0, "stdoutIncludes": "valid" }
|
|
97
|
+
}]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Node examples run from a temporary workspace with a minimal environment,
|
|
102
|
+
explicit filesystem permissions, no network permission, a timeout, and no
|
|
103
|
+
shell. Python examples use `runtime: "python"` and require a locally installed,
|
|
104
|
+
digest-pinned Docker image configured with `DOXLOOP_PYTHON_SANDBOX_IMAGE`
|
|
105
|
+
(for example, `python@sha256:<the approved image digest>`). Doxloop never
|
|
106
|
+
executes Python examples directly on the host. Without the configured image,
|
|
107
|
+
the check is skipped and cannot earn executed-example credit. Containers use
|
|
108
|
+
no network, a read-only filesystem and fixture mount, an unprivileged user,
|
|
109
|
+
no Linux capabilities, and CPU, memory, PID and time limits. The image is
|
|
110
|
+
never pulled automatically. A missing image or unavailable daemon fails the
|
|
111
|
+
execution check; it does not fall back to host Python. Apparent credentials are rejected. Use `runtime:
|
|
112
|
+
"shell-source-verified"` or `runtime: "source-verified"` when a command cannot
|
|
113
|
+
be executed with a portable network/filesystem sandbox; the report keeps that
|
|
114
|
+
distinction instead of overstating verification.
|
|
115
|
+
|
|
116
|
+
Use `runtime: "openapi-request"` for `.http` request examples. The first
|
|
117
|
+
`METHOD /path` line and an optional `# expect-status: 202` directive are checked
|
|
118
|
+
against the currently connected OpenAPI contract without contacting an API.
|
|
119
|
+
|
|
120
|
+
## Rendered accessibility and visual checks
|
|
121
|
+
|
|
122
|
+
Rendered checks use a managed browser only when enabled. Representative pages
|
|
123
|
+
are checked at configured widths for landmarks, accessible names, images,
|
|
124
|
+
heading order, and horizontal overflow. The report always retains a manual
|
|
125
|
+
WCAG review requirement for keyboard order, focus, contrast, zoom, reflow, and
|
|
126
|
+
assistive-technology output.
|
|
127
|
+
|
|
128
|
+
Current screenshots are stored in `.doxloop/quality-artifacts/`. Approved
|
|
129
|
+
baselines are separate by generator, theme, route, and viewport under
|
|
130
|
+
`.doxloop/visual-baselines/`, and are updated from the headless quality check
|
|
131
|
+
after an intentional design change has been reviewed.
|
|
132
|
+
|
|
133
|
+
## Documentation lint and safe fixes
|
|
134
|
+
|
|
135
|
+
Linting reports terminology drift, substantial duplicate prose, common
|
|
136
|
+
spelling errors, difficult sentences, title length, and navigation-label
|
|
137
|
+
length. Safe fixes only perform deterministic formatting changes: inferred code
|
|
138
|
+
fence languages, unambiguous heading-rank repair, normalized local-link syntax,
|
|
139
|
+
trailing whitespace, and final newlines. They never rewrite factual prose.
|
|
140
|
+
|
|
141
|
+
## Claim states and reader metadata
|
|
142
|
+
|
|
143
|
+
Evidence-map claims resolve to `verified`, `inferred`, `contradicted`, or
|
|
144
|
+
`needs-human`. Changed evidence never remains verified automatically. When
|
|
145
|
+
`readerVerification.enabled` is true, Doxloop writes
|
|
146
|
+
`.doxloop/verification-metadata.json` and supplies the matching locale,
|
|
147
|
+
verification date, source revision, confidence, and state to native Doxbrix
|
|
148
|
+
preview and deployment output. The feature is disabled by default.
|
|
149
|
+
|
|
150
|
+
## Evaluations
|
|
151
|
+
|
|
152
|
+
Doxloop maintainers score generation, update, and review quality across agents
|
|
153
|
+
and models with fixture projects. Those evaluations drive the same plan-first
|
|
154
|
+
control-center workflow as a user, need a locally signed-in agent, and are
|
|
155
|
+
documented for contributors in [releasing](./releasing.md). Machine-readable
|
|
156
|
+
v1 schemas and the append-only issue-code policy are published in
|
|
157
|
+
`contracts/`. Codes can be baselined, suppressed, or ratcheted; presentation
|
|
158
|
+
text is not an API.
|
package/docs/releasing.md
CHANGED
|
@@ -58,3 +58,75 @@ peer range is updated when necessary, and they are built and published after
|
|
|
58
58
|
the root package. Unchanged generators keep their existing versions and are
|
|
59
59
|
skipped. A dry run lists the exact package set without changing versions or
|
|
60
60
|
publishing.
|
|
61
|
+
|
|
62
|
+
## Evaluations
|
|
63
|
+
|
|
64
|
+
Model-backed evaluations are maintainer tooling, not part of the reader
|
|
65
|
+
workflow. Keep the deterministic typecheck, tests, skill validation, build, and
|
|
66
|
+
package checks on every pull request, and run evaluations from a scheduled or
|
|
67
|
+
manually approved job on a developer machine or self-hosted worker where a
|
|
68
|
+
coding agent is signed in.
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
doxloop evaluate --mode generation --max-pages 12
|
|
72
|
+
doxloop evaluate --mode update --before ../docs-before \
|
|
73
|
+
--expected-change guides/billing.md --approve-baseline
|
|
74
|
+
pnpm eval:agents -- --agent codex --case cli
|
|
75
|
+
pnpm eval:agents -- --agent codex --model codex=<model> --case localized-update
|
|
76
|
+
pnpm eval:agents -- --mode generation --agent codex --case rest-api
|
|
77
|
+
pnpm eval:agents -- --mode update --agent codex --case localized-update
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Review evaluations run the agent read-only. A review case must exit
|
|
81
|
+
successfully, identify the required behaviour signals, cite enough configured
|
|
82
|
+
source evidence, prioritize findings, report a score out of 100, and leave the
|
|
83
|
+
fixture project byte-for-byte unchanged.
|
|
84
|
+
|
|
85
|
+
Generation and update evaluations instead exercise the same plan-first
|
|
86
|
+
control-center contract as a user: wait for the proposed plan, approve it,
|
|
87
|
+
generate into an isolated proposal, accept that proposal, and score the
|
|
88
|
+
resulting documentation. They mutate only the temporary fixture copy.
|
|
89
|
+
|
|
90
|
+
Workspace evaluations score factual grounding, unsupported claims, coverage,
|
|
91
|
+
information architecture, executable examples, evidence precision, page
|
|
92
|
+
economy, update locality and preservation, accessibility, and reviewer
|
|
93
|
+
outcomes. Reports compare with `.doxloop/evaluation-baseline.json` and can
|
|
94
|
+
block on a configured regression threshold. The agent matrix runs identical
|
|
95
|
+
fixtures across agents and models, records duration and scores, and compares
|
|
96
|
+
with the reviewed `evals/baseline.json`. Output is written below the
|
|
97
|
+
Git-ignored `evals/results/` directory. Use `--approve-baseline` only after
|
|
98
|
+
reviewing a deliberate improvement or model change.
|
|
99
|
+
|
|
100
|
+
### Product hardening acceptance checks
|
|
101
|
+
|
|
102
|
+
Run `DOXLOOP_E2E_REAL=1 pnpm exec playwright test` after building. CI runs this
|
|
103
|
+
suite against the actual local UI server and a deterministic fake agent. The
|
|
104
|
+
Pages test verifies proposed changes stay isolated, accepts an edit, compares
|
|
105
|
+
exact file contents after undo, and exercises direct draft preview/save/undo.
|
|
106
|
+
|
|
107
|
+
Run `node scripts/ci-existing-sites.mjs` for two existing-site fixtures in
|
|
108
|
+
`evals/native-sites`. The script installs the real Docusaurus and MkDocs
|
|
109
|
+
runtimes, builds before import, imports without changing pages/configuration,
|
|
110
|
+
creates a fake-agent update, accepts it, builds the result, undoes it, and
|
|
111
|
+
builds again. It asserts custom slugs, non-root base paths, file-style URLs,
|
|
112
|
+
asset contents and exact restored prose. CI runs this separately from unit
|
|
113
|
+
tests and uploads `evals/results/existing-sites.json`.
|
|
114
|
+
|
|
115
|
+
Real-agent evaluation remains opt-in, outside `pnpm test` and ordinary CI:
|
|
116
|
+
|
|
117
|
+
```sh
|
|
118
|
+
pnpm run build
|
|
119
|
+
node scripts/run-authoring-evals.mjs --agent codex --model codex=gpt-5.5 --case cli --mode review
|
|
120
|
+
node scripts/run-authoring-evals.mjs --agent claude --case cli --mode generation
|
|
121
|
+
node scripts/run-authoring-evals.mjs --agent codex --model codex=gpt-5.5 --case localized-update --mode update
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Choose a model supported by the installed agent CLI and your account. Results
|
|
125
|
+
record the CLI version, model selection, fixture digest, elapsed time, exit
|
|
126
|
+
status, matched evidence and quality measurements. Review scoring uses the
|
|
127
|
+
final response rather than the agent's echoed prompt or tool transcript.
|
|
128
|
+
Generation/update runs preserve generated workspaces and raw quality/evaluation
|
|
129
|
+
reports under the ignored results folder. Tooling failures remain failed runs;
|
|
130
|
+
they do not earn content-quality credit. No new baseline is approved unless
|
|
131
|
+
`--approve-baseline` is explicitly supplied. Review scores measure detection of
|
|
132
|
+
known fixture defects; they are not proof of production documentation quality.
|