pixotope-documentalist 1.2.9 → 1.2.10
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/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# pixotope-documentalist
|
|
2
2
|
|
|
3
|
-
Parses JSDoc-style API documentation comments from source files (TypeScript, JavaScript, Python, Rust) and publishes them as formatted pages to Confluence.
|
|
3
|
+
Parses JSDoc-style API documentation comments and TypeScript interface definitions from source files (TypeScript, JavaScript, Python, Rust, C++) and publishes them as formatted pages to Confluence.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -80,13 +80,48 @@ pub fn discover_devices(subnet: &str, timeout: u64) {
|
|
|
80
80
|
}
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
+
### TypeScript interfaces
|
|
84
|
+
|
|
85
|
+
Use `@kind interface` in a JSDoc block above an interface declaration. The property tree is extracted automatically — no `@param` or `@value` tags needed.
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
interface Color {
|
|
89
|
+
R: number;
|
|
90
|
+
G: number;
|
|
91
|
+
B: number;
|
|
92
|
+
A: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @group State
|
|
97
|
+
* @description The persisted state tree.
|
|
98
|
+
*/
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* @kind interface
|
|
102
|
+
* @description The full state of the system.
|
|
103
|
+
*/
|
|
104
|
+
interface State {
|
|
105
|
+
State: {
|
|
106
|
+
FrameRate: number;
|
|
107
|
+
Cameras: Record<string, Camera>;
|
|
108
|
+
Projects: string[];
|
|
109
|
+
WorkingColorSpace: "sRGB" | "Rec2020" | "ACESAP1";
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Only `@kind interface`-annotated interfaces become roots. Others (like `Color`) are helpers resolved when referenced.
|
|
115
|
+
|
|
83
116
|
## Tag Reference
|
|
84
117
|
|
|
118
|
+
### Comment mode tags (for `@api` endpoints)
|
|
119
|
+
|
|
85
120
|
| Tag | Required | Description |
|
|
86
121
|
|-----|----------|-------------|
|
|
87
122
|
| `@api` | Yes | Endpoint name (displayed as title) |
|
|
88
|
-
| `@group` | No | Section grouping header |
|
|
89
|
-
| `@kind` | No | `call` (default), `get`, `set`, `state
|
|
123
|
+
| `@group` | No | Section grouping header (with optional `@description`) |
|
|
124
|
+
| `@kind` | No | `call` (default), `get`, `set`, `state`, or `interface` |
|
|
90
125
|
| `@description` | No | Multi-line description (continues until next tag) |
|
|
91
126
|
| `@param` | No | `{type} Name - Description`. `[Name]` = optional, `[Name=default]` = with default |
|
|
92
127
|
| `@returns` | No | `{type} Name - Description` |
|
|
@@ -97,6 +132,16 @@ pub fn discover_devices(subnet: &str, timeout: u64) {
|
|
|
97
132
|
| `@internal` | No | Flag to exclude from published docs |
|
|
98
133
|
| `@value` | No | For state docs: `{type} Name - Description` |
|
|
99
134
|
|
|
135
|
+
### Interface mode tags (for TypeScript interface trees)
|
|
136
|
+
|
|
137
|
+
When `@kind interface` appears in a file, it switches to interface parsing mode using the TypeScript compiler API. Properties, nested types, Records, arrays, and unions are resolved automatically.
|
|
138
|
+
|
|
139
|
+
| Tag | Description |
|
|
140
|
+
|-----|-------------|
|
|
141
|
+
| `@kind interface` | Marks an interface declaration as a root value tree |
|
|
142
|
+
| `@group` | Assigns the interface to a named group (standalone block with optional `@description`) |
|
|
143
|
+
| `@description` | Description for the interface or for the group (depending on which block it appears in) |
|
|
144
|
+
|
|
100
145
|
## Configuration
|
|
101
146
|
|
|
102
147
|
Create a `config.yml` in your project:
|
|
@@ -117,14 +162,17 @@ documents:
|
|
|
117
162
|
sources:
|
|
118
163
|
- path: "packages/Daemon/src/endpoints/calls.ts" # single file
|
|
119
164
|
|
|
120
|
-
- id:
|
|
121
|
-
title: "
|
|
122
|
-
description: "docs/
|
|
165
|
+
- id: store_state
|
|
166
|
+
title: "Store API - State"
|
|
167
|
+
description: "docs/store_overview.md"
|
|
123
168
|
confluence_id:
|
|
124
169
|
master: "3333333333"
|
|
125
170
|
release: "4444444444"
|
|
126
171
|
sources:
|
|
127
|
-
- path: "packages/
|
|
172
|
+
- path: "packages/Store/src/interfaces.ts" # interface mode (auto-detected)
|
|
173
|
+
- path: "packages/Store/src/gets.ts" # comment mode (auto-detected)
|
|
174
|
+
- path: "packages/Store/src/endpoints/" # entire folder (recursive)
|
|
175
|
+
mode: comments # explicit mode override
|
|
128
176
|
```
|
|
129
177
|
|
|
130
178
|
- `source_root`: base path for resolving relative source paths (relative to config file location)
|
|
@@ -132,6 +180,7 @@ documents:
|
|
|
132
180
|
- `confluence_id.release`: page ID for release docs
|
|
133
181
|
- `description` *(optional)*: text rendered at the top of the Confluence page body, beneath the page title. Accepts either a plain string or a path to a `.md` file (resolved relative to the config file). Markdown is rendered to HTML.
|
|
134
182
|
- `sources[].path`: can point to a **single file** or a **folder**. When a folder is given, all supported files inside are scanned recursively. `node_modules` and hidden directories are skipped. Supported extensions: `.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.rs`, `.h`, `.cpp`, `.hpp`.
|
|
183
|
+
- `sources[].mode` *(optional)*: `"comments"` or `"interfaces"`. When omitted, auto-detected from file content (files containing `@kind interface` use interface mode). **Source order matters** — groups appear in the output in the order their source files are listed.
|
|
135
184
|
|
|
136
185
|
## CLI Commands
|
|
137
186
|
|
|
@@ -7,20 +7,32 @@ export declare class ConfluenceClient {
|
|
|
7
7
|
private client;
|
|
8
8
|
constructor(baseUrl: string, username: string, token: string);
|
|
9
9
|
/**
|
|
10
|
-
* Fetch title, version number, and
|
|
10
|
+
* Fetch title, version number, body, and space key in a single round-trip.
|
|
11
11
|
*/
|
|
12
12
|
getPageInfo(pageId: string): Promise<{
|
|
13
13
|
title: string;
|
|
14
14
|
version: number;
|
|
15
15
|
body: string;
|
|
16
|
+
spaceKey: string;
|
|
16
17
|
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Search for a page by title within a space.
|
|
20
|
+
* Returns the page ID if a match is found, or null if the title is unclaimed.
|
|
21
|
+
*/
|
|
22
|
+
findPageByTitle(spaceKey: string, title: string): Promise<string | null>;
|
|
17
23
|
/**
|
|
18
24
|
* Publish content to a Confluence page.
|
|
19
25
|
* Only updates if content has actually changed.
|
|
20
26
|
*/
|
|
21
|
-
publish(pageId: string,
|
|
27
|
+
publish(pageId: string, title: string, html: string, options?: {
|
|
22
28
|
force?: boolean;
|
|
23
29
|
}): Promise<PublishResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Determine which title to use on the Confluence PUT.
|
|
32
|
+
* Prefers configTitle unless it is already taken by a different page,
|
|
33
|
+
* in which case falls back to the existing Confluence title.
|
|
34
|
+
*/
|
|
35
|
+
private resolveTitle;
|
|
24
36
|
/**
|
|
25
37
|
* Get a diff summary of what would change.
|
|
26
38
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confluenceApi.d.ts","sourceRoot":"","sources":["../../src/publisher/confluenceApi.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAa5D;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"confluenceApi.d.ts","sourceRoot":"","sources":["../../src/publisher/confluenceApi.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAa5D;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAc9E;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS9E;;;OAGG;IACG,OAAO,CACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAChC,OAAO,CAAC,aAAa,CAAC;IAwDzB;;;;OAIG;YACW,YAAY;IAyB1B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAc7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAYrE"}
|
|
@@ -20,24 +20,36 @@ class ConfluenceClient {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
* Fetch title, version number, and
|
|
23
|
+
* Fetch title, version number, body, and space key in a single round-trip.
|
|
24
24
|
*/
|
|
25
25
|
async getPageInfo(pageId) {
|
|
26
26
|
const response = await this.client.get(`/${pageId}`, {
|
|
27
|
-
params: { expand: "version,body.storage.value" },
|
|
27
|
+
params: { expand: "version,body.storage.value,space" },
|
|
28
28
|
});
|
|
29
29
|
const data = response.data;
|
|
30
30
|
return {
|
|
31
31
|
title: data.title,
|
|
32
32
|
version: data.version?.number ?? 0,
|
|
33
33
|
body: data.body?.storage?.value ?? "",
|
|
34
|
+
spaceKey: data.space?.key ?? "",
|
|
34
35
|
};
|
|
35
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Search for a page by title within a space.
|
|
39
|
+
* Returns the page ID if a match is found, or null if the title is unclaimed.
|
|
40
|
+
*/
|
|
41
|
+
async findPageByTitle(spaceKey, title) {
|
|
42
|
+
const response = await this.client.get("", {
|
|
43
|
+
params: { spaceKey, title, type: "page", limit: 1 },
|
|
44
|
+
});
|
|
45
|
+
const results = response.data?.results ?? [];
|
|
46
|
+
return results.length > 0 ? String(results[0].id) : null;
|
|
47
|
+
}
|
|
36
48
|
/**
|
|
37
49
|
* Publish content to a Confluence page.
|
|
38
50
|
* Only updates if content has actually changed.
|
|
39
51
|
*/
|
|
40
|
-
async publish(pageId,
|
|
52
|
+
async publish(pageId, title, html, options = {}) {
|
|
41
53
|
try {
|
|
42
54
|
const pageInfo = await this.getPageInfo(pageId);
|
|
43
55
|
if (!options.force) {
|
|
@@ -50,11 +62,10 @@ class ConfluenceClient {
|
|
|
50
62
|
}
|
|
51
63
|
}
|
|
52
64
|
const newVersion = pageInfo.version + 1;
|
|
53
|
-
|
|
54
|
-
// collide with another page in the same space.
|
|
65
|
+
const resolvedTitle = await this.resolveTitle(pageId, pageInfo.title, pageInfo.spaceKey, title);
|
|
55
66
|
const response = await this.client.put(`/${pageId}`, {
|
|
56
67
|
version: { number: newVersion },
|
|
57
|
-
title:
|
|
68
|
+
title: resolvedTitle,
|
|
58
69
|
type: "page",
|
|
59
70
|
status: "current",
|
|
60
71
|
body: {
|
|
@@ -88,6 +99,28 @@ class ConfluenceClient {
|
|
|
88
99
|
};
|
|
89
100
|
}
|
|
90
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Determine which title to use on the Confluence PUT.
|
|
104
|
+
* Prefers configTitle unless it is already taken by a different page,
|
|
105
|
+
* in which case falls back to the existing Confluence title.
|
|
106
|
+
*/
|
|
107
|
+
async resolveTitle(pageId, confluenceTitle, spaceKey, configTitle) {
|
|
108
|
+
if (configTitle === confluenceTitle) {
|
|
109
|
+
return configTitle;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const ownerPageId = await this.findPageByTitle(spaceKey, configTitle);
|
|
113
|
+
if (ownerPageId === null || ownerPageId === pageId) {
|
|
114
|
+
return configTitle;
|
|
115
|
+
}
|
|
116
|
+
console.warn(` Warning: title "${configTitle}" is already used by page ${ownerPageId}. ` +
|
|
117
|
+
`Keeping existing Confluence title "${confluenceTitle}".`);
|
|
118
|
+
return confluenceTitle;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return confluenceTitle;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
91
124
|
/**
|
|
92
125
|
* Get a diff summary of what would change.
|
|
93
126
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confluenceApi.js","sourceRoot":"","sources":["../../src/publisher/confluenceApi.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"confluenceApi.js","sourceRoot":"","sources":["../../src/publisher/confluenceApi.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED