@doxbrix/doxloop 0.1.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 +34 -0
- package/LICENSE +93 -0
- package/README.md +576 -0
- package/SECURITY.md +15 -0
- package/assets/brand/README.md +8 -0
- package/assets/brand/doxloop-favicon.png +0 -0
- package/assets/brand/doxloop-logo-dark.png +0 -0
- package/assets/brand/doxloop-logo-light.png +0 -0
- package/assets/doxbrix-preview.css +6672 -0
- package/dist/agents.d.ts +26 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +258 -0
- package/dist/agents.js.map +1 -0
- package/dist/args.d.ts +8 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +95 -0
- package/dist/args.js.map +1 -0
- package/dist/artifact-deploy.d.ts +8 -0
- package/dist/artifact-deploy.d.ts.map +1 -0
- package/dist/artifact-deploy.js +240 -0
- package/dist/artifact-deploy.js.map +1 -0
- package/dist/auth.d.ts +17 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +245 -0
- package/dist/auth.js.map +1 -0
- package/dist/author.d.ts +30 -0
- package/dist/author.d.ts.map +1 -0
- package/dist/author.js +195 -0
- package/dist/author.js.map +1 -0
- package/dist/capture.d.ts +10 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +299 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +558 -0
- package/dist/cli.js.map +1 -0
- package/dist/deploy.d.ts +22 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +136 -0
- package/dist/deploy.js.map +1 -0
- package/dist/doctor.d.ts +18 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +222 -0
- package/dist/doctor.js.map +1 -0
- package/dist/doxbrix-markdown.d.ts +20 -0
- package/dist/doxbrix-markdown.d.ts.map +1 -0
- package/dist/doxbrix-markdown.js +873 -0
- package/dist/doxbrix-markdown.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/fs.d.ts +6 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +77 -0
- package/dist/fs.js.map +1 -0
- package/dist/generator-api.d.ts +69 -0
- package/dist/generator-api.d.ts.map +1 -0
- package/dist/generator-api.js +6 -0
- package/dist/generator-api.js.map +1 -0
- package/dist/generator-manager.d.ts +13 -0
- package/dist/generator-manager.d.ts.map +1 -0
- package/dist/generator-manager.js +155 -0
- package/dist/generator-manager.js.map +1 -0
- package/dist/generator-runtime.d.ts +24 -0
- package/dist/generator-runtime.d.ts.map +1 -0
- package/dist/generator-runtime.js +265 -0
- package/dist/generator-runtime.js.map +1 -0
- package/dist/generators.d.ts +21 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +202 -0
- package/dist/generators.js.map +1 -0
- package/dist/preview.d.ts +21 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +691 -0
- package/dist/preview.js.map +1 -0
- package/dist/progress.d.ts +19 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +70 -0
- package/dist/progress.js.map +1 -0
- package/dist/project.d.ts +37 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +499 -0
- package/dist/project.js.map +1 -0
- package/dist/sync.d.ts +7 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +221 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +141 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +4 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +478 -0
- package/dist/validation.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/docs/agent-compatibility.md +41 -0
- package/docs/ci-and-automation.md +56 -0
- package/docs/doxbrix-http-api.md +182 -0
- package/docs/generator-authoring.md +59 -0
- package/docs/generator-selection.md +25 -0
- package/docs/project-format.md +97 -0
- package/docs/security-model.md +90 -0
- package/docs/troubleshooting.md +103 -0
- package/package.json +87 -0
- package/skills/doxloop-authoring/SKILL.md +381 -0
- package/skills/doxloop-authoring/agents/openai.yaml +4 -0
- package/skills/doxloop-authoring/assets/screenshot-highlight.js +83 -0
- package/skills/doxloop-authoring/references/accessibility.md +54 -0
- package/skills/doxloop-authoring/references/audience-flavors.md +93 -0
- package/skills/doxloop-authoring/references/branding.md +50 -0
- package/skills/doxloop-authoring/references/documentation-types.md +236 -0
- package/skills/doxloop-authoring/references/domain-ai-ml.md +67 -0
- package/skills/doxloop-authoring/references/domain-api-platform.md +68 -0
- package/skills/doxloop-authoring/references/domain-cli-tool.md +65 -0
- package/skills/doxloop-authoring/references/domain-data-platform.md +65 -0
- package/skills/doxloop-authoring/references/domain-developer-library.md +63 -0
- package/skills/doxloop-authoring/references/domain-ecommerce.md +63 -0
- package/skills/doxloop-authoring/references/domain-infrastructure-devops.md +67 -0
- package/skills/doxloop-authoring/references/domain-payments-fintech.md +69 -0
- package/skills/doxloop-authoring/references/domain-saas.md +71 -0
- package/skills/doxloop-authoring/references/domain-security-identity.md +65 -0
- package/skills/doxloop-authoring/references/editorial-style.md +105 -0
- package/skills/doxloop-authoring/references/examples-and-evidence.md +71 -0
- package/skills/doxloop-authoring/references/navigation-architecture.md +152 -0
- package/skills/doxloop-authoring/references/project-format.md +119 -0
- package/skills/doxloop-authoring/references/quality.md +122 -0
- package/skills/doxloop-authoring/references/reference-sites.md +207 -0
- package/skills/doxloop-authoring/references/screenshots.md +251 -0
- package/skills/doxloop-authoring/references/template-routing.md +94 -0
- package/skills/doxloop-authoring/references/type-administrator-guide.md +59 -0
- package/skills/doxloop-authoring/references/type-api-reference.md +66 -0
- package/skills/doxloop-authoring/references/type-architecture-concepts.md +61 -0
- package/skills/doxloop-authoring/references/type-cli-manual.md +61 -0
- package/skills/doxloop-authoring/references/type-deployment-operations.md +64 -0
- package/skills/doxloop-authoring/references/type-developer-portal.md +69 -0
- package/skills/doxloop-authoring/references/type-getting-started.md +59 -0
- package/skills/doxloop-authoring/references/type-integration-guide.md +59 -0
- package/skills/doxloop-authoring/references/type-migration-release.md +66 -0
- package/skills/doxloop-authoring/references/type-sdk-guide.md +63 -0
- package/skills/doxloop-authoring/references/type-troubleshooting-kb.md +63 -0
- package/skills/doxloop-authoring/references/type-user-guide.md +59 -0
- package/skills/doxloop-doxbrix/SKILL.md +83 -0
- package/skills/doxloop-doxbrix/agents/openai.yaml +4 -0
- package/skills/doxloop-doxbrix/references/api-endpoints.md +128 -0
- package/skills/doxloop-doxbrix/references/components.md +137 -0
- package/skills/doxloop-doxbrix/references/manifest.md +117 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Doxbrix HTTP API used by Doxloop
|
|
2
|
+
|
|
3
|
+
This document is the integration boundary between the public Doxloop CLI and
|
|
4
|
+
the Doxbrix platform. Doxloop calls these endpoints directly and does not
|
|
5
|
+
depend on server source code or a server-side SDK.
|
|
6
|
+
|
|
7
|
+
The default base URL is `https://app.doxbrix.com`. It can be replaced with
|
|
8
|
+
`DOXLOOP_API_URL` or `--api-url`. All requests and responses use JSON.
|
|
9
|
+
Authenticated requests send `Authorization: Bearer dxb_…` with a Doxbrix
|
|
10
|
+
Personal Access Token. Redirects are refused so bearer credentials are never
|
|
11
|
+
forwarded to another destination. Alternate API URLs must use HTTPS; HTTP is
|
|
12
|
+
accepted only for loopback development.
|
|
13
|
+
|
|
14
|
+
## Device authorization
|
|
15
|
+
|
|
16
|
+
Start authorization:
|
|
17
|
+
|
|
18
|
+
```http
|
|
19
|
+
POST /api/v1/auth/device/start
|
|
20
|
+
Content-Type: application/json
|
|
21
|
+
|
|
22
|
+
{"name":"doxloop @ hostname","scopes":["docs:read","docs:write","project:read","project:admin"]}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Successful response:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"deviceCode": "opaque-device-code",
|
|
30
|
+
"userCode": "ABCD-EFGH",
|
|
31
|
+
"verificationUri": "https://app.doxbrix.com/activate",
|
|
32
|
+
"expiresIn": 600,
|
|
33
|
+
"interval": 5
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Poll for completion:
|
|
38
|
+
|
|
39
|
+
```http
|
|
40
|
+
POST /api/v1/auth/device/poll
|
|
41
|
+
Content-Type: application/json
|
|
42
|
+
|
|
43
|
+
{"deviceCode":"opaque-device-code"}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The response is one of:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{"status":"pending"}
|
|
50
|
+
{"status":"approved","token":"dxb_opaque-access-token"}
|
|
51
|
+
{"status":"expired"}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Tokens can also be created manually in the Doxbrix web app and passed with
|
|
55
|
+
`doxloop login --token dxb_…` or the `DOXLOOP_TOKEN`/`DOXBRIX_TOKEN`
|
|
56
|
+
environment variables. Doxloop verifies a token against `/api/v1/me` before
|
|
57
|
+
storing it. Prefer the device flow or environment variables so a token does not
|
|
58
|
+
remain in shell history.
|
|
59
|
+
|
|
60
|
+
## Current account
|
|
61
|
+
|
|
62
|
+
```http
|
|
63
|
+
GET /api/v1/me
|
|
64
|
+
Authorization: Bearer dxb_…
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Response:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{"id":"account-id","email":"user@example.com","name":"Example User"}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`name` may be `null`.
|
|
74
|
+
|
|
75
|
+
## Projects
|
|
76
|
+
|
|
77
|
+
Fetch a project by id or slug (`404` when it does not exist):
|
|
78
|
+
|
|
79
|
+
```http
|
|
80
|
+
GET /api/v1/projects/{idOrSlug}
|
|
81
|
+
Authorization: Bearer dxb_…
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{"project":{"id":"project-id","name":"Example documentation","slug":"example-documentation"}}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Create a project:
|
|
89
|
+
|
|
90
|
+
```http
|
|
91
|
+
POST /api/v1/projects
|
|
92
|
+
Authorization: Bearer dxb_…
|
|
93
|
+
Content-Type: application/json
|
|
94
|
+
|
|
95
|
+
{"name":"Example documentation","slug":"example-documentation","seedTemplate":false}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The response uses the same `{"project":{…}}` envelope. API-created projects
|
|
99
|
+
default to `seedTemplate: false` so the following bundle is their only
|
|
100
|
+
documentation structure. Pass `true` only when the Doxbrix web starter spaces
|
|
101
|
+
and pages are wanted.
|
|
102
|
+
|
|
103
|
+
## Push a documentation bundle
|
|
104
|
+
|
|
105
|
+
```http
|
|
106
|
+
POST /api/v1/projects/{idOrSlug}/bundle
|
|
107
|
+
Authorization: Bearer dxb_…
|
|
108
|
+
Content-Type: application/json
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The request body is:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"manifest": { "version": 1, "spaces": [] },
|
|
116
|
+
"basePath": "docs",
|
|
117
|
+
"pages": [
|
|
118
|
+
{"path": "index.mdx", "markdown": "---\ntitle: Welcome\n---\n\n# Welcome"}
|
|
119
|
+
],
|
|
120
|
+
"media": [
|
|
121
|
+
{"path": "assets/logo.svg", "base64": "…"}
|
|
122
|
+
],
|
|
123
|
+
"publish": true
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`manifest` is the parsed `docs.json` object. Page and media paths are relative
|
|
128
|
+
to the documentation directory. Media content is base64-encoded. The server
|
|
129
|
+
converts markdown to blocks and materializes spaces, navigation, and pages.
|
|
130
|
+
Only the manifest and files under the configured documentation directory may
|
|
131
|
+
be represented in the payload; configured product-source directories must
|
|
132
|
+
never be included.
|
|
133
|
+
|
|
134
|
+
This endpoint is the native Doxbrix generator boundary. Do not send external
|
|
135
|
+
generator output to it; use the artifact deployment API below.
|
|
136
|
+
|
|
137
|
+
Successful response:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"result": {
|
|
142
|
+
"spaces": 1,
|
|
143
|
+
"pagesCreated": 2,
|
|
144
|
+
"pagesUpdated": 0,
|
|
145
|
+
"navItems": 3,
|
|
146
|
+
"warnings": []
|
|
147
|
+
},
|
|
148
|
+
"dryRun": false
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Deploy a locally-built static artifact
|
|
153
|
+
|
|
154
|
+
Create the project with its producing generator:
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"name": "Example documentation",
|
|
159
|
+
"slug": "example-documentation",
|
|
160
|
+
"connectedArtifact": { "generator": "docusaurus" }
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Reserve an upload by sending the ZIP byte length and lowercase/uppercase SHA-256
|
|
165
|
+
hex digest to `POST /api/v1/projects/{idOrSlug}/deployments`. PUT the exact ZIP
|
|
166
|
+
bytes to the returned `deployment.upload.url` with every returned header, then
|
|
167
|
+
call `POST /api/v1/projects/{idOrSlug}/deployments/{buildId}/complete`.
|
|
168
|
+
Doxbrix rejects missing, expired, size-mismatched, or checksum-mismatched objects.
|
|
169
|
+
|
|
170
|
+
Poll `GET /api/v1/projects/{idOrSlug}/deployments/{buildId}` until `status` is
|
|
171
|
+
`ready` or `failed`. A ready response includes `hostedUrl`, file/page counts, and
|
|
172
|
+
the generator retained for finalization.
|
|
173
|
+
|
|
174
|
+
## Errors
|
|
175
|
+
|
|
176
|
+
Error responses use:
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{"error":{"code":"machine-readable-code","message":"Human-readable message"}}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Doxloop also accepts `{"error":"message"}` and `{"message":"message"}` shapes.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Author a generator package
|
|
2
|
+
|
|
3
|
+
A generator package connects Doxloop's shared authoring workflow to one native
|
|
4
|
+
documentation framework.
|
|
5
|
+
|
|
6
|
+
## Package contract
|
|
7
|
+
|
|
8
|
+
Export a default adapter created with `defineGenerator` from
|
|
9
|
+
`@doxbrix/doxloop/generator-api`. The adapter declares:
|
|
10
|
+
|
|
11
|
+
- generator API version and stable ID;
|
|
12
|
+
- package identity and version;
|
|
13
|
+
- authoring skill name and directory;
|
|
14
|
+
- content root, page extensions, ignored output, and content format;
|
|
15
|
+
- native build command and output directory;
|
|
16
|
+
- scaffold, preview, and validation implementations;
|
|
17
|
+
- an optional local-asset resolver for root-relative public assets outside the
|
|
18
|
+
content directory; and
|
|
19
|
+
- an optional page reader for non-Markdown formats.
|
|
20
|
+
|
|
21
|
+
Package metadata should include:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"doxloop": {
|
|
26
|
+
"type": "generator",
|
|
27
|
+
"apiVersion": 1,
|
|
28
|
+
"id": "example",
|
|
29
|
+
"skill": "./skills/doxloop-example"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Responsibilities
|
|
35
|
+
|
|
36
|
+
Scaffolding creates a minimal native project with explicit starter markers that
|
|
37
|
+
must fail release validation until authoring replaces them. Preview runs the
|
|
38
|
+
native development workflow without editing generated output. Validation checks
|
|
39
|
+
native navigation, configuration, metadata, routes, and conventions; shared
|
|
40
|
+
validation checks professional content, local links, placeholders, and secrets.
|
|
41
|
+
|
|
42
|
+
The format skill must use `$doxloop-authoring`, route all reader pages through
|
|
43
|
+
native navigation, document native components and theme mapping, identify
|
|
44
|
+
generated directories, and require both `doxloop test` and the strict native
|
|
45
|
+
build. It must also document how committed application guide screenshots reach
|
|
46
|
+
the built site: the native source directory, public or base-aware URL, caption
|
|
47
|
+
or figure syntax, and any required build-copy step. Guide screenshots must not
|
|
48
|
+
use `.doxloop/cache/reference/`, which is reserved for ignored external
|
|
49
|
+
design-reference evidence.
|
|
50
|
+
|
|
51
|
+
## Compatibility and testing
|
|
52
|
+
|
|
53
|
+
Increment `GENERATOR_API_VERSION` only for breaking adapter changes. Generator
|
|
54
|
+
packages declare a compatible core peer dependency and are published after the
|
|
55
|
+
matching core version.
|
|
56
|
+
|
|
57
|
+
Tests should scaffold, load, validate, install the format skill, build, and
|
|
58
|
+
exercise preview failure behavior. Skill validation checks frontmatter,
|
|
59
|
+
metadata, local reference links, shared-skill delegation, and generator routing.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Select a documentation generator
|
|
2
|
+
|
|
3
|
+
Choose the generator when initializing a project. Doxbrix is built in; external
|
|
4
|
+
generators require their package in the new project.
|
|
5
|
+
|
|
6
|
+
Use Doxbrix for native Doxbrix publishing and interactive API endpoint blocks.
|
|
7
|
+
Choose another generator when an existing toolchain, extension ecosystem, or
|
|
8
|
+
static-hosting requirement is more important.
|
|
9
|
+
|
|
10
|
+
`doxloop generator add <name>` installs support; it does not rewrite the project
|
|
11
|
+
or convert existing content. Doxloop currently has no automatic generator
|
|
12
|
+
migration because navigation, frontmatter, components, themes, and route rules
|
|
13
|
+
are not mechanically equivalent.
|
|
14
|
+
|
|
15
|
+
To migrate:
|
|
16
|
+
|
|
17
|
+
1. Create a new project with the target generator.
|
|
18
|
+
2. Copy the confirmed documentation brief and source bindings.
|
|
19
|
+
3. Ask `doxloop create` to preserve the agreed coverage while translating
|
|
20
|
+
content into the target generator's native format.
|
|
21
|
+
4. Compare routes, navigation, metadata, components, and theme behavior.
|
|
22
|
+
5. Run `doxloop test` and the target generator's strict build.
|
|
23
|
+
6. Redirect changed public URLs before replacing the existing site.
|
|
24
|
+
|
|
25
|
+
Keep the original project until the new site passes validation and route review.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Doxloop project format
|
|
2
|
+
|
|
3
|
+
Doxloop stores project configuration under `.doxloop/`. Commit the configuration
|
|
4
|
+
and synchronization state when a team should share the same authoring decisions.
|
|
5
|
+
|
|
6
|
+
Create a new documentation project beside, never inside, the product source:
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
doxloop create --source ./my-product --output ./my-docs
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## `project.json`
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"schemaVersion": 1,
|
|
17
|
+
"title": "Example documentation",
|
|
18
|
+
"contentDir": "docs",
|
|
19
|
+
"generator": "doxbrix",
|
|
20
|
+
"sources": [{ "name": "product", "path": "../product" }],
|
|
21
|
+
"designReferences": [{ "url": "https://docs.example.com/" }],
|
|
22
|
+
"application": {
|
|
23
|
+
"baseUrl": "http://localhost:3000/",
|
|
24
|
+
"source": "product",
|
|
25
|
+
"startCommand": "npm run dev",
|
|
26
|
+
"readyPath": "/health",
|
|
27
|
+
"screenshots": {
|
|
28
|
+
"policy": "requested",
|
|
29
|
+
"viewport": { "width": 1440, "height": 900 },
|
|
30
|
+
"highlight": true
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"documentation": {
|
|
34
|
+
"primaryAudience": "Application developers",
|
|
35
|
+
"experienceLevel": "intermediate",
|
|
36
|
+
"priorityOutcomes": ["Install the SDK", "Send the first request"],
|
|
37
|
+
"locale": "en-US",
|
|
38
|
+
"tone": ["clear", "direct", "professional"],
|
|
39
|
+
"standardsProfile": "doxloop-v1",
|
|
40
|
+
"styleGuide": "doxloop",
|
|
41
|
+
"terminology": {},
|
|
42
|
+
"exclusions": [],
|
|
43
|
+
"accessibilityTarget": "WCAG 2.2 AA"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- `contentDir` must be a non-symlinked relative directory inside the project.
|
|
49
|
+
- `sources` is the optional read-only evidence allowlist used by the authoring
|
|
50
|
+
workflow. It may be empty when no local product source is available. Configured
|
|
51
|
+
source paths must be outside the documentation project; sibling product and
|
|
52
|
+
documentation directories are the recommended layout.
|
|
53
|
+
- `generatorPackage` is required for an external generator and must match the
|
|
54
|
+
official package selected by `generator`.
|
|
55
|
+
- `designReferences` accept absolute HTTP or HTTPS URLs without credentials.
|
|
56
|
+
- `application` is optional and describes a safe local or test application
|
|
57
|
+
surface for guide screenshots. `source` names a configured source and is
|
|
58
|
+
required when `startCommand` is present. Screenshot policy is `requested`,
|
|
59
|
+
`auto`, or `off`; projects without this object keep the existing behavior.
|
|
60
|
+
- `documentation` persists confirmed reader, scope, terminology, editorial, and
|
|
61
|
+
accessibility decisions.
|
|
62
|
+
|
|
63
|
+
Schema version 1 treats a missing legacy `generator` as `doxbrix` and supplies
|
|
64
|
+
the default documentation brief when it is absent. Unsupported structures fail
|
|
65
|
+
closed rather than being silently migrated.
|
|
66
|
+
|
|
67
|
+
## `sync-state.json`
|
|
68
|
+
|
|
69
|
+
Each Git source records the commit, timestamp, and a fingerprint of tracked and
|
|
70
|
+
untracked non-ignored, non-credential source content used by the last successful
|
|
71
|
+
authoring run. The fingerprint prevents an unchanged dirty working tree from
|
|
72
|
+
being reported again after its content is committed.
|
|
73
|
+
|
|
74
|
+
Doxloop updates synchronization state only when create or update exits
|
|
75
|
+
successfully, documentation validation passes, and create has saved a primary
|
|
76
|
+
audience and priority outcomes.
|
|
77
|
+
|
|
78
|
+
## `last-run.json`
|
|
79
|
+
|
|
80
|
+
After a successful create or update, Doxloop records the mode, selected agent,
|
|
81
|
+
completion time, validation summary, and synchronized source count. This is an
|
|
82
|
+
ignored operational receipt, not an evidence map or a substitute for version
|
|
83
|
+
control.
|
|
84
|
+
|
|
85
|
+
## Reference-design evidence
|
|
86
|
+
|
|
87
|
+
`.doxloop/reference-design.json` is authored by the design-reference workflow.
|
|
88
|
+
Screenshots and raw measurements remain under `.doxloop/cache/` and should not
|
|
89
|
+
be committed.
|
|
90
|
+
|
|
91
|
+
Application guide screenshots are different: they are reader-facing assets,
|
|
92
|
+
are placed in the selected generator's native asset directory, and should be
|
|
93
|
+
committed with the guide. `doxloop create --screenshots` and
|
|
94
|
+
`doxloop update --screenshots` require them explicitly; a request that clearly asks for
|
|
95
|
+
screenshots also enables the authoring workflow. Contextual focus rings and
|
|
96
|
+
numbered markers are baked into the image so they render consistently across
|
|
97
|
+
generators.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Security model
|
|
2
|
+
|
|
3
|
+
Doxloop separates local authoring from explicit publishing. This document
|
|
4
|
+
describes which guarantees the CLI enforces and which behavior depends on the
|
|
5
|
+
selected coding agent and host environment.
|
|
6
|
+
|
|
7
|
+
## Trust boundaries
|
|
8
|
+
|
|
9
|
+
- `.doxloop/project.json`, installed generator packages, configured product
|
|
10
|
+
sources, and public design references are user-selected inputs.
|
|
11
|
+
- Source text, comments, tests, generated files, command output, and reference
|
|
12
|
+
pages are evidence, not instructions. The authoring prompt tells agents to
|
|
13
|
+
ignore embedded requests that change scope, reveal secrets, weaken safeguards,
|
|
14
|
+
contact unrelated services, or publish.
|
|
15
|
+
- Coding agents retain the filesystem permissions granted by their host. The
|
|
16
|
+
configured `sources` list is an authoring-policy boundary, not an operating
|
|
17
|
+
system sandbox.
|
|
18
|
+
- Product sources are read-only evidence. The create and update workflows tell
|
|
19
|
+
the agent to write only inside the separate documentation project.
|
|
20
|
+
- `doxloop review` launches supported agents in read-only or plan mode.
|
|
21
|
+
Create and update require write access to the documentation project.
|
|
22
|
+
|
|
23
|
+
## Local files
|
|
24
|
+
|
|
25
|
+
The documentation `contentDir` must be a relative directory inside the project.
|
|
26
|
+
Doxloop rejects project-root, escaping, absolute, and symlinked content
|
|
27
|
+
directories. Deployment rejects a content directory that differs from
|
|
28
|
+
`.doxloop/project.json` and refuses symlinks anywhere in documentation content.
|
|
29
|
+
|
|
30
|
+
The first-run create flow rejects a documentation project that is the same as,
|
|
31
|
+
inside, or contains a configured product source. It also rejects configured
|
|
32
|
+
sources that are missing and non-empty output directories before writing project
|
|
33
|
+
files.
|
|
34
|
+
|
|
35
|
+
Do not place credentials, private keys, environment files, internal data, or
|
|
36
|
+
product source under the documentation content directory.
|
|
37
|
+
|
|
38
|
+
## Network access
|
|
39
|
+
|
|
40
|
+
Authoring and validation do not publish. A coding agent may still have network
|
|
41
|
+
access according to its own configuration.
|
|
42
|
+
|
|
43
|
+
Design capture:
|
|
44
|
+
|
|
45
|
+
- accepts only configured HTTP or HTTPS reference origins;
|
|
46
|
+
- captures at most three requested pages per origin;
|
|
47
|
+
- blocks navigation away from the configured origin;
|
|
48
|
+
- blocks loopback, private, link-local, multicast, and other non-public network
|
|
49
|
+
destinations; and
|
|
50
|
+
- stores screenshots and measurements under the Git-ignored
|
|
51
|
+
`.doxloop/cache/reference/`.
|
|
52
|
+
|
|
53
|
+
For a trusted local documentation reference, set
|
|
54
|
+
`DOXLOOP_ALLOW_PRIVATE_REFERENCES=1` for that capture invocation.
|
|
55
|
+
|
|
56
|
+
Application guide screenshots are separate authoring actions. They run only
|
|
57
|
+
when requested, forced with `--screenshots`, or enabled by the optional
|
|
58
|
+
`application.screenshots.policy`. The authoring workflow limits navigation to
|
|
59
|
+
the configured application surface and requires non-production fixtures or test
|
|
60
|
+
accounts, but the selected coding agent and its browser retain the permissions
|
|
61
|
+
granted by their host. Do not configure a production application, store
|
|
62
|
+
credentials in `.doxloop/project.json`, or expose customer data for capture.
|
|
63
|
+
Use `--no-screenshots` when the authoring environment should not operate an
|
|
64
|
+
application.
|
|
65
|
+
|
|
66
|
+
Doxbrix API requests require HTTPS. HTTP is accepted only for loopback
|
|
67
|
+
development. Authenticated and device-flow requests refuse redirects.
|
|
68
|
+
|
|
69
|
+
## Credentials and publishing
|
|
70
|
+
|
|
71
|
+
Prefer `doxloop login` and the device flow. Environment variables avoid placing
|
|
72
|
+
tokens in shell history; `--token` is intended for controlled automation.
|
|
73
|
+
Stored credentials use user-only file permissions on operating systems that
|
|
74
|
+
support them.
|
|
75
|
+
|
|
76
|
+
Only `doxloop deploy` publishes. Native projects send a contained documentation
|
|
77
|
+
bundle to the Doxbrix API. External generators are built on the user's machine;
|
|
78
|
+
Doxloop removes its Doxbrix tokens from the child build environment, scans only
|
|
79
|
+
the declared static output, rejects symbolic links/private keys/likely secret
|
|
80
|
+
files, omits source maps, and enforces file and expansion limits before packaging.
|
|
81
|
+
|
|
82
|
+
The archive is uploaded directly to one short-lived, single-object S3 URL whose
|
|
83
|
+
SHA-256 checksum is signed. Doxbrix verifies the object size and checksum before
|
|
84
|
+
queueing its trusted indexing/infusion pipeline. Generator code never runs in the
|
|
85
|
+
Doxbrix web or finalizer process for this deployment path.
|
|
86
|
+
|
|
87
|
+
## Reporting vulnerabilities
|
|
88
|
+
|
|
89
|
+
Follow [the repository security policy](../SECURITY.md). Never put credentials,
|
|
90
|
+
private product source, or unpublished vulnerability details in a public issue.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Troubleshoot Doxloop
|
|
2
|
+
|
|
3
|
+
## Check the complete setup
|
|
4
|
+
|
|
5
|
+
Inside an existing documentation project, run:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
doxloop doctor
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Before creating a new project, check the proposed sibling directories:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
doxloop doctor --source ./my-product --output ./my-docs
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Doctor checks the Node.js version, product-source boundary, selected agent and
|
|
18
|
+
authentication, project skills, generator readiness, and documentation
|
|
19
|
+
validation, plus the default preview port. It exits with code 1 when a required
|
|
20
|
+
check fails.
|
|
21
|
+
|
|
22
|
+
## No supported agent is available
|
|
23
|
+
|
|
24
|
+
Install Codex, Claude Code, or Gemini CLI and confirm its executable is on
|
|
25
|
+
`PATH`. Alternatively:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
doxloop create --print
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Paste the prompt into an agent session opened at the project root.
|
|
32
|
+
|
|
33
|
+
## An installed skill is modified
|
|
34
|
+
|
|
35
|
+
Doxloop does not overwrite local skill changes automatically.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
doxloop agent status
|
|
39
|
+
doxloop agent update
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Review the diff before replacing intentional customizations.
|
|
43
|
+
|
|
44
|
+
## An external generator cannot load
|
|
45
|
+
|
|
46
|
+
Install both core and the selected generator package in the documentation
|
|
47
|
+
project. Then run:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
doxloop generator doctor
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Native generators may also require Python, Ruby, Hugo, or Node dependencies.
|
|
54
|
+
The doctor output reports the expected build command.
|
|
55
|
+
|
|
56
|
+
## Create exits but synchronization is not recorded
|
|
57
|
+
|
|
58
|
+
Doxloop withholds the baseline when validation fails or the create brief lacks
|
|
59
|
+
`primaryAudience` or `priorityOutcomes`. Run `doxloop test`, resolve every
|
|
60
|
+
error, and rerun create or update.
|
|
61
|
+
|
|
62
|
+
## Capture blocks a URL
|
|
63
|
+
|
|
64
|
+
Capture rejects unconfigured origins, cross-origin navigation, and private
|
|
65
|
+
network destinations. Add the intended public origin with `--reference`. For a
|
|
66
|
+
trusted local reference only:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
DOXLOOP_ALLOW_PRIVATE_REFERENCES=1 doxloop capture http://localhost:3000/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Guide screenshots are missing
|
|
73
|
+
|
|
74
|
+
Application guide screenshots are created during `doxloop create` or
|
|
75
|
+
`doxloop update`, not by design-reference capture. Ask for screenshots in the
|
|
76
|
+
request or pass `--screenshots`. Configure `application.baseUrl` and, when
|
|
77
|
+
Doxloop should start the application, a configured source name plus
|
|
78
|
+
`startCommand` in `.doxloop/project.json`.
|
|
79
|
+
|
|
80
|
+
If the selected agent has no browser capability, the application is unreachable,
|
|
81
|
+
or authentication and safe test data are unavailable, Doxloop keeps the text
|
|
82
|
+
guide complete and omits broken image links. Establish a non-production browser
|
|
83
|
+
session or local fixture and rerun the affected update. Never provide production
|
|
84
|
+
credentials or customer data for screenshot capture.
|
|
85
|
+
|
|
86
|
+
## API requests fail
|
|
87
|
+
|
|
88
|
+
Confirm the API URL uses HTTPS, the token starts with `dxb_`, and the endpoint
|
|
89
|
+
does not redirect. HTTP is accepted only for loopback development. Prefer
|
|
90
|
+
`doxloop login` to refresh credentials.
|
|
91
|
+
|
|
92
|
+
## Preview port is occupied
|
|
93
|
+
|
|
94
|
+
Choose another port:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
doxloop preview --port 4400 --open
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Validation and native builds disagree
|
|
101
|
+
|
|
102
|
+
`doxloop test` performs fast project and content checks; the native build is the
|
|
103
|
+
final generator parser. Run both and treat either failure as blocking.
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@doxbrix/doxloop",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A local-first documentation agent CLI for Codex, Claude Code, and Gemini.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/doxbrix/doxloop.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/doxbrix/doxloop#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/doxbrix/doxloop/issues"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"doxloop": "dist/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"assets",
|
|
21
|
+
"docs",
|
|
22
|
+
"skills/doxloop-authoring",
|
|
23
|
+
"skills/doxloop-doxbrix",
|
|
24
|
+
"README.md",
|
|
25
|
+
"CHANGELOG.md",
|
|
26
|
+
"SECURITY.md",
|
|
27
|
+
"LICENSE"
|
|
28
|
+
],
|
|
29
|
+
"exports": {
|
|
30
|
+
"./generator-api": {
|
|
31
|
+
"types": "./dist/generator-api.d.ts",
|
|
32
|
+
"import": "./dist/generator-api.js"
|
|
33
|
+
},
|
|
34
|
+
"./generator-runtime": {
|
|
35
|
+
"types": "./dist/generator-runtime.d.ts",
|
|
36
|
+
"import": "./dist/generator-runtime.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"registry": "https://registry.npmjs.org",
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"chokidar": "^4.0.3",
|
|
45
|
+
"fflate": "^0.8.2",
|
|
46
|
+
"gray-matter": "^4.0.3",
|
|
47
|
+
"highlight.js": "^11.11.1"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.15.3",
|
|
51
|
+
"tsx": "^4.19.4",
|
|
52
|
+
"typescript": "^5.8.3",
|
|
53
|
+
"vitest": "^3.1.2",
|
|
54
|
+
"@doxbrix/doxloop-generator-docusaurus": "0.1.0",
|
|
55
|
+
"@doxbrix/doxloop-generator-hugo": "0.1.0",
|
|
56
|
+
"@doxbrix/doxloop-generator-jekyll": "0.1.0",
|
|
57
|
+
"@doxbrix/doxloop-generator-markdoc": "0.1.0",
|
|
58
|
+
"@doxbrix/doxloop-generator-mkdocs": "0.1.0",
|
|
59
|
+
"@doxbrix/doxloop-generator-nextra": "0.1.0",
|
|
60
|
+
"@doxbrix/doxloop-generator-starlight": "0.1.0",
|
|
61
|
+
"@doxbrix/doxloop-generator-sphinx": "0.1.0",
|
|
62
|
+
"@doxbrix/doxloop-generator-vitepress": "0.1.0",
|
|
63
|
+
"@doxbrix/doxloop-generator-static": "0.1.0"
|
|
64
|
+
},
|
|
65
|
+
"engines": {
|
|
66
|
+
"node": ">=20.12.0"
|
|
67
|
+
},
|
|
68
|
+
"main": "index.js",
|
|
69
|
+
"directories": {
|
|
70
|
+
"doc": "docs"
|
|
71
|
+
},
|
|
72
|
+
"keywords": [],
|
|
73
|
+
"author": "",
|
|
74
|
+
"scripts": {
|
|
75
|
+
"build": "pnpm run build:core && pnpm run build:generators",
|
|
76
|
+
"build:core": "rm -rf dist && tsc -p tsconfig.json && node scripts/prepare-dist.mjs",
|
|
77
|
+
"build:generators": "pnpm --filter './packages/*' run build",
|
|
78
|
+
"dev": "tsx src/cli.ts",
|
|
79
|
+
"typecheck": "tsc --noEmit && pnpm --filter './packages/*' run typecheck",
|
|
80
|
+
"pretest": "pnpm run build",
|
|
81
|
+
"test": "vitest run",
|
|
82
|
+
"eval:agents": "pnpm run build && node scripts/run-authoring-evals.mjs",
|
|
83
|
+
"check": "pnpm run typecheck && pnpm run test && pnpm run validate:skill && pnpm run check:boundary",
|
|
84
|
+
"validate:skill": "node scripts/validate-skills.mjs",
|
|
85
|
+
"check:boundary": "node scripts/check-boundary.mjs"
|
|
86
|
+
}
|
|
87
|
+
}
|