codoc-cli 0.1.2
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/LICENSE +21 -0
- package/README.md +104 -0
- package/assets/drawio-viewer/README.md +13 -0
- package/assets/drawio-viewer/viewer-static.min.js +8640 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +7 -0
- package/dist/clients/confluence/clients/attachments-client.js +74 -0
- package/dist/clients/confluence/clients/folders-client.js +111 -0
- package/dist/clients/confluence/clients/pages-client.js +128 -0
- package/dist/clients/confluence/confluence-client.js +44 -0
- package/dist/clients/confluence/utils/confluence-url.js +25 -0
- package/dist/clients/confluence/utils/confluence-util.js +20 -0
- package/dist/commands/init.js +29 -0
- package/dist/commands/publish.js +34 -0
- package/dist/commands/pull.js +54 -0
- package/dist/commands/sync.js +27 -0
- package/dist/commands/tree.js +17 -0
- package/dist/config/codoc-config-atlassian.js +89 -0
- package/dist/config/codoc-config-raw.js +21 -0
- package/dist/config/codoc-config.js +50 -0
- package/dist/config/codoc-paths.js +9 -0
- package/dist/hooks/command_not_found.js +7 -0
- package/dist/hooks/init/check-for-update.js +68 -0
- package/dist/hooks/init/load-env.js +15 -0
- package/dist/index.js +2 -0
- package/dist/services/codoc-id.js +7 -0
- package/dist/services/confluence/attachments.js +56 -0
- package/dist/services/confluence/folders.js +42 -0
- package/dist/services/confluence/labels.js +17 -0
- package/dist/services/confluence/pages.js +28 -0
- package/dist/services/conversion/confluenceToMarkdown/diagrams/drawio-diagrams.js +77 -0
- package/dist/services/conversion/confluenceToMarkdown/diagrams/drawio-to-image.js +131 -0
- package/dist/services/conversion/confluenceToMarkdown/index.js +17 -0
- package/dist/services/conversion/confluenceToMarkdown/preprocess/macro-converters.js +68 -0
- package/dist/services/conversion/confluenceToMarkdown/preprocess/preprocess.js +113 -0
- package/dist/services/conversion/confluenceToMarkdown/turndown.js +71 -0
- package/dist/services/conversion/markdownToConfluence/conversion-state.js +18 -0
- package/dist/services/conversion/markdownToConfluence/diagrams/mermaid-diagrams.js +56 -0
- package/dist/services/conversion/markdownToConfluence/diagrams/mermaid-to-drawio.js +331 -0
- package/dist/services/conversion/markdownToConfluence/index.js +48 -0
- package/dist/services/conversion/markdownToConfluence/languages.js +66 -0
- package/dist/services/conversion/markdownToConfluence/links.js +40 -0
- package/dist/services/conversion/markdownToConfluence/raw-html/raw-html.js +86 -0
- package/dist/services/conversion/markdownToConfluence/raw-html/task-lists.js +59 -0
- package/dist/services/conversion/markdownToConfluence/render/blocks.js +171 -0
- package/dist/services/conversion/markdownToConfluence/render/inline.js +44 -0
- package/dist/services/conversion/markdownToConfluence/render/page.js +31 -0
- package/dist/services/conversion/shared/confluence-macro-builder.js +11 -0
- package/dist/services/conversion/shared/gitlab-url.js +16 -0
- package/dist/services/conversion/shared/image-attachments.js +57 -0
- package/dist/services/conversion/shared/jira.js +7 -0
- package/dist/services/conversion/shared/macro-types.js +12 -0
- package/dist/services/conversion/shared/preserved-macros.js +8 -0
- package/dist/services/conversion/shared/read-storage-format.js +29 -0
- package/dist/services/conversion/shared/regex-cache.js +14 -0
- package/dist/services/conversion/shared/xml-escaping.js +19 -0
- package/dist/services/ensure-env.js +59 -0
- package/dist/services/files-service.js +74 -0
- package/dist/services/git/default-branch.js +33 -0
- package/dist/services/init-templates/agent-md-init.js +55 -0
- package/dist/services/init-templates/doc-guide-init.js +131 -0
- package/dist/services/init-templates/env-init.js +12 -0
- package/dist/services/init-templates/yaml-init.js +56 -0
- package/dist/services/lock/lock-file.js +61 -0
- package/dist/services/log/init-printer.js +50 -0
- package/dist/services/log/logger.js +131 -0
- package/dist/services/prompt.js +32 -0
- package/dist/services/slugify.js +6 -0
- package/dist/types/codoc-types.js +1 -0
- package/dist/use-cases/init/init.js +150 -0
- package/dist/use-cases/publish/publish.js +166 -0
- package/dist/use-cases/pull/parse-page-input.js +22 -0
- package/dist/use-cases/pull/pull.js +337 -0
- package/dist/use-cases/shared/codoc-yaml.js +45 -0
- package/dist/use-cases/shared/confluence-client-registry.js +27 -0
- package/dist/use-cases/shared/env-select.js +23 -0
- package/dist/use-cases/shared/fetch-page.js +11 -0
- package/dist/use-cases/shared/list-documents.js +172 -0
- package/dist/use-cases/shared/pull-folder.js +90 -0
- package/dist/use-cases/shared/render-remote-page.js +71 -0
- package/dist/use-cases/sync/attachment-upload.js +31 -0
- package/dist/use-cases/sync/sync-actions.js +170 -0
- package/dist/use-cases/sync/sync-associate.js +41 -0
- package/dist/use-cases/sync/sync-entries.js +36 -0
- package/dist/use-cases/sync/sync-handlers.js +140 -0
- package/dist/use-cases/sync/sync-helpers.js +8 -0
- package/dist/use-cases/sync/sync.js +94 -0
- package/dist/use-cases/tree/docs-tree.js +141 -0
- package/oclif.manifest.json +255 -0
- package/package.json +98 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { getCodocConfig } from "../../config/codoc-config.js";
|
|
2
|
+
import { createRl, resolveConfirm } from "../../services/prompt.js";
|
|
3
|
+
import { log } from "../../services/log/logger.js";
|
|
4
|
+
import { loadPublishState, savePublishState } from "../../services/lock/lock-file.js";
|
|
5
|
+
import { getDefaultBranch } from "../../services/git/default-branch.js";
|
|
6
|
+
import { listDocumentTargets } from "../shared/list-documents.js";
|
|
7
|
+
import { EnvRegistry } from "../shared/confluence-client-registry.js";
|
|
8
|
+
import { selectEnvs } from "../shared/env-select.js";
|
|
9
|
+
import { buildSyncEntries } from "./sync-entries.js";
|
|
10
|
+
import { closeDrawioRenderer } from "../../services/conversion/confluenceToMarkdown/diagrams/drawio-to-image.js";
|
|
11
|
+
import { handleLockOrphan, syncMatched, syncNew } from "./sync-handlers.js";
|
|
12
|
+
import { associateByCodocId, validateCodocIds } from "./sync-associate.js";
|
|
13
|
+
//#region src/use-cases/sync/sync.ts
|
|
14
|
+
async function sync(opts = {}) {
|
|
15
|
+
log.startProcess("Synchronisation de la documentation...");
|
|
16
|
+
const config = getCodocConfig();
|
|
17
|
+
const envByKey = new Map(config.atlassian.environments.map((e) => [e.key, e]));
|
|
18
|
+
const targetEnv = opts.env;
|
|
19
|
+
selectEnvs(config, targetEnv);
|
|
20
|
+
if (targetEnv) {
|
|
21
|
+
log.info0(`Environnement ciblé : ${targetEnv}`);
|
|
22
|
+
log.blank();
|
|
23
|
+
}
|
|
24
|
+
if (opts.confirm === false) {
|
|
25
|
+
log.info0("--no-confirm : les suppressions et adoptions nécessitant confirmation sont refusées (rien de risqué n'est fait).");
|
|
26
|
+
log.blank();
|
|
27
|
+
}
|
|
28
|
+
const previousState = loadPublishState();
|
|
29
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
30
|
+
const entries = buildSyncEntries(config).filter((e) => !targetEnv || e.env.key === targetEnv);
|
|
31
|
+
const scopedLock = {};
|
|
32
|
+
const keptOutOfScope = {};
|
|
33
|
+
for (const [key, p] of Object.entries(previousState.pages)) (!targetEnv || p.environment === targetEnv ? scopedLock : keptOutOfScope)[key] = p;
|
|
34
|
+
validateCodocIds(entries);
|
|
35
|
+
const codeTargetsByCodocId = /* @__PURE__ */ new Map();
|
|
36
|
+
for (const t of await listDocumentTargets()) {
|
|
37
|
+
if (t.maintainedIn !== "code" || !t.codocId) continue;
|
|
38
|
+
const list = codeTargetsByCodocId.get(t.codocId);
|
|
39
|
+
if (list) list.push(t);
|
|
40
|
+
else codeTargetsByCodocId.set(t.codocId, [t]);
|
|
41
|
+
}
|
|
42
|
+
const assoc = associateByCodocId(scopedLock, entries);
|
|
43
|
+
const rl = createRl();
|
|
44
|
+
const ctx = {
|
|
45
|
+
config,
|
|
46
|
+
generatedAt: now,
|
|
47
|
+
registry: new EnvRegistry(),
|
|
48
|
+
envByKey,
|
|
49
|
+
now,
|
|
50
|
+
confirm: (question) => resolveConfirm(rl, {
|
|
51
|
+
flag: opts.confirm,
|
|
52
|
+
question,
|
|
53
|
+
default: false
|
|
54
|
+
}),
|
|
55
|
+
codeTargetsByCodocId,
|
|
56
|
+
defaultBranch: await getDefaultBranch()
|
|
57
|
+
};
|
|
58
|
+
const newPages = { ...keptOutOfScope };
|
|
59
|
+
try {
|
|
60
|
+
if (assoc.lockOrphans.length) {
|
|
61
|
+
log.info0(`${assoc.lockOrphans.length} entrée(s) de lock sans config :`);
|
|
62
|
+
log.blank();
|
|
63
|
+
}
|
|
64
|
+
for (const { codocId, lock } of assoc.lockOrphans) {
|
|
65
|
+
const kept = await handleLockOrphan(ctx, lock);
|
|
66
|
+
if (kept) newPages[codocId] = kept;
|
|
67
|
+
}
|
|
68
|
+
if (assoc.matched.length) {
|
|
69
|
+
log.blank();
|
|
70
|
+
log.info0(`${assoc.matched.length} doc(s) suivie(s) :`);
|
|
71
|
+
log.blank();
|
|
72
|
+
}
|
|
73
|
+
for (const { entry, lock } of assoc.matched) newPages[entry.codocId] = await syncMatched(ctx, entry, lock);
|
|
74
|
+
if (assoc.yamlNew.length) {
|
|
75
|
+
log.blank();
|
|
76
|
+
log.info0(`${assoc.yamlNew.length} nouvelle(s) doc(s) :`);
|
|
77
|
+
log.blank();
|
|
78
|
+
}
|
|
79
|
+
for (const entry of assoc.yamlNew) {
|
|
80
|
+
const state = await syncNew(ctx, entry);
|
|
81
|
+
if (state) newPages[entry.codocId] = state;
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
rl.close();
|
|
85
|
+
await closeDrawioRenderer();
|
|
86
|
+
}
|
|
87
|
+
savePublishState({
|
|
88
|
+
lastPublished: now,
|
|
89
|
+
pages: newPages
|
|
90
|
+
});
|
|
91
|
+
log.endProcess(`codoc.lock mis à jour (${Object.keys(newPages).length} entrée(s)).`);
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { sync };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { getCodocConfig } from "../../config/codoc-config.js";
|
|
2
|
+
import { ansi, log } from "../../services/log/logger.js";
|
|
3
|
+
import { findLockedRef, loadPublishState } from "../../services/lock/lock-file.js";
|
|
4
|
+
import { listDocumentTargets } from "../shared/list-documents.js";
|
|
5
|
+
import { pageUrl, wikiBase } from "../../clients/confluence/utils/confluence-url.js";
|
|
6
|
+
import { EnvRegistry } from "../shared/confluence-client-registry.js";
|
|
7
|
+
import { selectEnvs } from "../shared/env-select.js";
|
|
8
|
+
//#region src/use-cases/tree/docs-tree.ts
|
|
9
|
+
const ROOT_KEY = "(racine)";
|
|
10
|
+
const isPageId = (id) => /^\d+$/.test(id);
|
|
11
|
+
function printPage(node, prefix, isLast) {
|
|
12
|
+
const connector = isLast ? "└─ " : "├─ ";
|
|
13
|
+
const badge = node.isFolder ? "[FOLDER]" : node.deployed ? ansi.green("✅") : ansi.yellow("⚠️");
|
|
14
|
+
const label = node.isFolder ? ansi.bold(node.title) : node.title;
|
|
15
|
+
const hint = node.isFolder ? "" : ` ${ansi.dim(node.sourceFile)}`;
|
|
16
|
+
log.raw(`${prefix}${connector}${badge} ${ansi.link(label, node.url)}${hint}`);
|
|
17
|
+
const childPrefix = prefix + (isLast ? " " : "│ ");
|
|
18
|
+
const kids = [...node.children].sort((a, b) => a.title.localeCompare(b.title, "fr"));
|
|
19
|
+
kids.forEach((k, i) => printPage(k, childPrefix, i === kids.length - 1));
|
|
20
|
+
}
|
|
21
|
+
function printFolder(folder, prefix, isLast) {
|
|
22
|
+
const connector = isLast ? "└─ " : "├─ ";
|
|
23
|
+
const idHint = isPageId(folder.id) ? ansi.dim(` (${folder.id})`) : "";
|
|
24
|
+
log.raw(`${prefix}${connector}[FOLDER] ${ansi.link(ansi.bold(folder.title), folder.url)}${idHint}`);
|
|
25
|
+
const childPrefix = prefix + (isLast ? " " : "│ ");
|
|
26
|
+
const subs = [...folder.subFolders.values()].sort((a, b) => a.title.localeCompare(b.title, "fr"));
|
|
27
|
+
const pages = [...folder.pages].sort((a, b) => a.title.localeCompare(b.title, "fr"));
|
|
28
|
+
const total = subs.length + pages.length;
|
|
29
|
+
let i = 0;
|
|
30
|
+
for (const sf of subs) printFolder(sf, childPrefix, ++i === total);
|
|
31
|
+
for (const p of pages) printPage(p, childPrefix, ++i === total);
|
|
32
|
+
}
|
|
33
|
+
/** Place chaque groupe de pages sous son dossier, imbriqué selon `chains` si fourni. */
|
|
34
|
+
function buildFolderForest(pagesByFolder, chains, baseUrl, spaceKey) {
|
|
35
|
+
const roots = /* @__PURE__ */ new Map();
|
|
36
|
+
const getOrCreate = (level, id, title) => {
|
|
37
|
+
let f = level.get(id);
|
|
38
|
+
if (!f) {
|
|
39
|
+
f = {
|
|
40
|
+
id,
|
|
41
|
+
title,
|
|
42
|
+
url: isPageId(id) ? pageUrl(baseUrl, spaceKey, id) : void 0,
|
|
43
|
+
subFolders: /* @__PURE__ */ new Map(),
|
|
44
|
+
pages: []
|
|
45
|
+
};
|
|
46
|
+
level.set(id, f);
|
|
47
|
+
}
|
|
48
|
+
return f;
|
|
49
|
+
};
|
|
50
|
+
for (const [folderId, pages] of pagesByFolder) {
|
|
51
|
+
const chain = chains.get(folderId) ?? [{
|
|
52
|
+
id: folderId,
|
|
53
|
+
title: folderId === ROOT_KEY ? "Racine de l'espace" : `Dossier`
|
|
54
|
+
}];
|
|
55
|
+
let level = roots;
|
|
56
|
+
let node;
|
|
57
|
+
for (const { id, title } of chain) {
|
|
58
|
+
node = getOrCreate(level, id, title);
|
|
59
|
+
level = node.subFolders;
|
|
60
|
+
}
|
|
61
|
+
node.pages.push(...pages);
|
|
62
|
+
}
|
|
63
|
+
return [...roots.values()];
|
|
64
|
+
}
|
|
65
|
+
async function printEnvTree(env, registry, targets, lock) {
|
|
66
|
+
const locked = (t) => findLockedRef(lock, env.key, t.sourceFile);
|
|
67
|
+
const nodes = targets.map((t) => {
|
|
68
|
+
const l = locked(t);
|
|
69
|
+
return {
|
|
70
|
+
title: t.title,
|
|
71
|
+
sourceFile: t.sourceFile,
|
|
72
|
+
deployed: !!l,
|
|
73
|
+
pageId: l?.confluencePageId,
|
|
74
|
+
url: l?.confluenceUrl,
|
|
75
|
+
parentPageId: t.parentPageId,
|
|
76
|
+
children: [],
|
|
77
|
+
isFolder: t.isFolder
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
const nodeByLocalFolderKey = /* @__PURE__ */ new Map();
|
|
81
|
+
targets.forEach((t, i) => {
|
|
82
|
+
if (t.isFolder) nodeByLocalFolderKey.set(`${env.key}:${t.id}`, nodes[i]);
|
|
83
|
+
});
|
|
84
|
+
const byPageId = /* @__PURE__ */ new Map();
|
|
85
|
+
for (const n of nodes) if (n.pageId) byPageId.set(n.pageId, n);
|
|
86
|
+
const pagesByFolder = /* @__PURE__ */ new Map();
|
|
87
|
+
targets.forEach((t, i) => {
|
|
88
|
+
const n = nodes[i];
|
|
89
|
+
const localFolder = t.parentFolderKey ? nodeByLocalFolderKey.get(t.parentFolderKey) : void 0;
|
|
90
|
+
if (localFolder) {
|
|
91
|
+
localFolder.children.push(n);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const parent = n.parentPageId ? byPageId.get(n.parentPageId) : void 0;
|
|
95
|
+
if (parent) {
|
|
96
|
+
parent.children.push(n);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const key = n.parentPageId ?? ROOT_KEY;
|
|
100
|
+
(pagesByFolder.get(key) ?? pagesByFolder.set(key, []).get(key)).push(n);
|
|
101
|
+
});
|
|
102
|
+
const chains = /* @__PURE__ */ new Map();
|
|
103
|
+
try {
|
|
104
|
+
const client = registry.raw(env);
|
|
105
|
+
for (const id of pagesByFolder.keys()) {
|
|
106
|
+
if (!isPageId(id)) continue;
|
|
107
|
+
try {
|
|
108
|
+
chains.set(id, await client.pages.fetchAncestors(id));
|
|
109
|
+
} catch {
|
|
110
|
+
log.warning2("dossier inaccessible → reste à plat avec son id");
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
} catch {
|
|
114
|
+
log.warning2("impossible d'initialiser le client (creds absentes) → tout reste à plat");
|
|
115
|
+
}
|
|
116
|
+
const forest = buildFolderForest(pagesByFolder, chains, env.baseUrl, env.spaceKey);
|
|
117
|
+
const deployedCount = nodes.filter((n) => n.deployed).length;
|
|
118
|
+
const spaceUrl = `${wikiBase(env.baseUrl)}/spaces/${env.spaceKey}`;
|
|
119
|
+
log.blank();
|
|
120
|
+
log.raw(`${ansi.bold(`Documentation Confluence [${env.key}]`)} - espace ${ansi.link(ansi.cyan(env.spaceKey), spaceUrl)} ${ansi.dim(env.baseUrl)}`);
|
|
121
|
+
log.blank();
|
|
122
|
+
const sorted = forest.sort((a, b) => a.title.localeCompare(b.title, "fr"));
|
|
123
|
+
sorted.forEach((f, i) => printFolder(f, "", i === sorted.length - 1));
|
|
124
|
+
log.raw(ansi.dim(`${nodes.length} page(s) · ${deployedCount} déployée(s)`));
|
|
125
|
+
}
|
|
126
|
+
async function printDocsTree(opts = {}) {
|
|
127
|
+
const config = getCodocConfig();
|
|
128
|
+
const environments = selectEnvs(config, opts.env);
|
|
129
|
+
const allTargets = await listDocumentTargets();
|
|
130
|
+
const lock = loadPublishState();
|
|
131
|
+
const registry = new EnvRegistry();
|
|
132
|
+
for (const env of environments) {
|
|
133
|
+
const targets = allTargets.filter((t) => t.env.key === env.key);
|
|
134
|
+
if (!targets.length) continue;
|
|
135
|
+
await printEnvTree(env, registry, targets, lock);
|
|
136
|
+
}
|
|
137
|
+
log.blank();
|
|
138
|
+
log.raw(`${ansi.dim("Légende :")} ${ansi.green("✅")} déployé ${ansi.yellow("⚠️")} défini mais pas encore publié`);
|
|
139
|
+
}
|
|
140
|
+
//#endregion
|
|
141
|
+
export { printDocsTree };
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
{
|
|
2
|
+
"commands": {
|
|
3
|
+
"init": {
|
|
4
|
+
"aliases": [],
|
|
5
|
+
"args": {},
|
|
6
|
+
"description": "Initialise la configuration codoc : codoc.yaml, .env-codoc, guide de démarrage. Avec --agent-md, ne génère que le guide agent IA (rien d'autre).",
|
|
7
|
+
"examples": [
|
|
8
|
+
"<%= config.bin %> <%= command.id %>",
|
|
9
|
+
"<%= config.bin %> <%= command.id %> --agent-md"
|
|
10
|
+
],
|
|
11
|
+
"flags": {
|
|
12
|
+
"agent-md": {
|
|
13
|
+
"description": "Ne génère QUE le guide agent IA basé sur `codoc.yaml` (qui doit déjà exister et être rempli) - au choix (via --agent-target, sinon celui déjà en place, sinon demandé) dans `.github/agents/codoc-agent.md` (fichier dédié) ou injecté en bloc dans `.github/copilot-instructions.md`. N'affecte aucun autre fichier.",
|
|
14
|
+
"name": "agent-md",
|
|
15
|
+
"allowNo": false,
|
|
16
|
+
"type": "boolean"
|
|
17
|
+
},
|
|
18
|
+
"agent-target": {
|
|
19
|
+
"description": "Avec --agent-md : destination du guide (fichier dédié ou bloc copilot-instructions.md). Par défaut : celle déjà en place, sinon demandé.",
|
|
20
|
+
"name": "agent-target",
|
|
21
|
+
"hasDynamicHelp": false,
|
|
22
|
+
"multiple": false,
|
|
23
|
+
"options": [
|
|
24
|
+
"agent",
|
|
25
|
+
"copilot"
|
|
26
|
+
],
|
|
27
|
+
"type": "option"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"hasDynamicHelp": false,
|
|
31
|
+
"hiddenAliases": [],
|
|
32
|
+
"id": "init",
|
|
33
|
+
"pluginAlias": "codoc-cli",
|
|
34
|
+
"pluginName": "codoc-cli",
|
|
35
|
+
"pluginType": "core",
|
|
36
|
+
"strict": true,
|
|
37
|
+
"enableJsonFlag": false,
|
|
38
|
+
"isESM": true,
|
|
39
|
+
"relativePath": [
|
|
40
|
+
"dist",
|
|
41
|
+
"commands",
|
|
42
|
+
"init.js"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"publish": {
|
|
46
|
+
"aliases": [],
|
|
47
|
+
"args": {
|
|
48
|
+
"path": {
|
|
49
|
+
"description": "Chemin local relatif de la doc .md ou du dossier à publier",
|
|
50
|
+
"name": "path",
|
|
51
|
+
"required": false
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"description": "Publie une doc locale (fichier ou dossier) vers Confluence, avec ajout optionnel à codoc.yaml. Toute information non fournie en flag (ni déjà présente dans codoc.yaml) est demandée en console.",
|
|
55
|
+
"flags": {
|
|
56
|
+
"env": {
|
|
57
|
+
"description": "Environnement Confluence cible (clé). Par défaut : celui de la config existante, sinon auto/prompt.",
|
|
58
|
+
"name": "env",
|
|
59
|
+
"hasDynamicHelp": false,
|
|
60
|
+
"multiple": false,
|
|
61
|
+
"type": "option"
|
|
62
|
+
},
|
|
63
|
+
"in-config": {
|
|
64
|
+
"description": "Ajoute (ou met à jour) l'entrée codoc.yaml de cette doc. --no-in-config publie sans toucher ni à codoc.yaml ni à codoc.lock (publication ponctuelle, non suivie par `codoc sync`). Non fourni : demande en fin de commande.",
|
|
65
|
+
"name": "in-config",
|
|
66
|
+
"allowNo": true,
|
|
67
|
+
"type": "boolean"
|
|
68
|
+
},
|
|
69
|
+
"parent-page-id": {
|
|
70
|
+
"description": "parentPageId Confluence cible. Par défaut : celui de la config existante ou defaultParentPageId de l’env.",
|
|
71
|
+
"name": "parent-page-id",
|
|
72
|
+
"hasDynamicHelp": false,
|
|
73
|
+
"multiple": false,
|
|
74
|
+
"type": "option"
|
|
75
|
+
},
|
|
76
|
+
"title": {
|
|
77
|
+
"description": "Titre de la page Confluence (fichier unique uniquement). Par défaut : celui de la config existante, sinon le H1 du fichier.",
|
|
78
|
+
"name": "title",
|
|
79
|
+
"hasDynamicHelp": false,
|
|
80
|
+
"multiple": false,
|
|
81
|
+
"type": "option"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"hasDynamicHelp": false,
|
|
85
|
+
"hiddenAliases": [],
|
|
86
|
+
"id": "publish",
|
|
87
|
+
"pluginAlias": "codoc-cli",
|
|
88
|
+
"pluginName": "codoc-cli",
|
|
89
|
+
"pluginType": "core",
|
|
90
|
+
"strict": true,
|
|
91
|
+
"enableJsonFlag": false,
|
|
92
|
+
"isESM": true,
|
|
93
|
+
"relativePath": [
|
|
94
|
+
"dist",
|
|
95
|
+
"commands",
|
|
96
|
+
"publish.js"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"pull": {
|
|
100
|
+
"aliases": [],
|
|
101
|
+
"args": {
|
|
102
|
+
"page": {
|
|
103
|
+
"description": "URL ou ID de la page Confluence à importer",
|
|
104
|
+
"name": "page",
|
|
105
|
+
"required": false
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
"description": "Importe une page Confluence en local, avec ajout optionnel à codoc.yaml. Toute information non fournie en flag (ni déjà présente dans codoc.yaml) est demandée en console.",
|
|
109
|
+
"flags": {
|
|
110
|
+
"env": {
|
|
111
|
+
"description": "Environnement Confluence où chercher la page. Par défaut : déduit de l’URL, sinon auto/prompt.",
|
|
112
|
+
"name": "env",
|
|
113
|
+
"hasDynamicHelp": false,
|
|
114
|
+
"multiple": false,
|
|
115
|
+
"type": "option"
|
|
116
|
+
},
|
|
117
|
+
"as-folder": {
|
|
118
|
+
"description": "Si la page a des sous-pages/sous-dossiers, importe tout le dossier (--as-folder) ou seulement la page (--no-as-folder). Sans sous-élément, ignoré. Non fourni : demande le cas échéant.",
|
|
119
|
+
"name": "as-folder",
|
|
120
|
+
"allowNo": true,
|
|
121
|
+
"type": "boolean"
|
|
122
|
+
},
|
|
123
|
+
"keep-existing": {
|
|
124
|
+
"description": "Si un import précédent est détecté (même ID/titre/config), le remplace (--keep-existing, valeurs existantes comme défauts) ou crée un import séparé (--no-keep-existing). Non fourni : demande le cas échéant.",
|
|
125
|
+
"name": "keep-existing",
|
|
126
|
+
"allowNo": true,
|
|
127
|
+
"type": "boolean"
|
|
128
|
+
},
|
|
129
|
+
"in-config": {
|
|
130
|
+
"description": "Ajoute (ou met à jour) l'entrée codoc.yaml de cette doc. --no-in-config importe sans toucher ni à codoc.yaml ni à codoc.lock (import ponctuel, non suivi par `codoc sync`). Non fourni : demande en fin de commande.",
|
|
131
|
+
"name": "in-config",
|
|
132
|
+
"allowNo": true,
|
|
133
|
+
"type": "boolean"
|
|
134
|
+
},
|
|
135
|
+
"local-path": {
|
|
136
|
+
"description": "Chemin local du fichier .md (page unique) ou du dossier de destination (import dossier).",
|
|
137
|
+
"name": "local-path",
|
|
138
|
+
"hasDynamicHelp": false,
|
|
139
|
+
"multiple": false,
|
|
140
|
+
"type": "option"
|
|
141
|
+
},
|
|
142
|
+
"title": {
|
|
143
|
+
"description": "Titre de la page Confluence (page unique). Par défaut : celui de la config existante, sinon le titre Confluence.",
|
|
144
|
+
"name": "title",
|
|
145
|
+
"hasDynamicHelp": false,
|
|
146
|
+
"multiple": false,
|
|
147
|
+
"type": "option"
|
|
148
|
+
},
|
|
149
|
+
"parent-page-id": {
|
|
150
|
+
"description": "parentPageId Confluence. Par défaut : celui de la config existante, sinon le parent réel de la page.",
|
|
151
|
+
"name": "parent-page-id",
|
|
152
|
+
"hasDynamicHelp": false,
|
|
153
|
+
"multiple": false,
|
|
154
|
+
"type": "option"
|
|
155
|
+
},
|
|
156
|
+
"maintained-in": {
|
|
157
|
+
"description": "code → le .md local fait foi ; confluence → la page Confluence fait foi. Par défaut : confluence.",
|
|
158
|
+
"name": "maintained-in",
|
|
159
|
+
"hasDynamicHelp": false,
|
|
160
|
+
"multiple": false,
|
|
161
|
+
"options": [
|
|
162
|
+
"code",
|
|
163
|
+
"confluence"
|
|
164
|
+
],
|
|
165
|
+
"type": "option"
|
|
166
|
+
},
|
|
167
|
+
"images-dir": {
|
|
168
|
+
"description": "Dossier local pour les images (\"\" pour désactiver). Par défaut : doc/img.",
|
|
169
|
+
"name": "images-dir",
|
|
170
|
+
"hasDynamicHelp": false,
|
|
171
|
+
"multiple": false,
|
|
172
|
+
"type": "option"
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
"hasDynamicHelp": false,
|
|
176
|
+
"hiddenAliases": [],
|
|
177
|
+
"id": "pull",
|
|
178
|
+
"pluginAlias": "codoc-cli",
|
|
179
|
+
"pluginName": "codoc-cli",
|
|
180
|
+
"pluginType": "core",
|
|
181
|
+
"strict": true,
|
|
182
|
+
"enableJsonFlag": false,
|
|
183
|
+
"isESM": true,
|
|
184
|
+
"relativePath": [
|
|
185
|
+
"dist",
|
|
186
|
+
"commands",
|
|
187
|
+
"pull.js"
|
|
188
|
+
]
|
|
189
|
+
},
|
|
190
|
+
"sync": {
|
|
191
|
+
"aliases": [],
|
|
192
|
+
"args": {},
|
|
193
|
+
"description": "Synchronise chaque doc locale et Confluence",
|
|
194
|
+
"flags": {
|
|
195
|
+
"env": {
|
|
196
|
+
"description": "Ne synchronise que cet environnement Confluence (clé). Par défaut : tous.",
|
|
197
|
+
"name": "env",
|
|
198
|
+
"hasDynamicHelp": false,
|
|
199
|
+
"multiple": false,
|
|
200
|
+
"type": "option"
|
|
201
|
+
},
|
|
202
|
+
"confirm": {
|
|
203
|
+
"char": "f",
|
|
204
|
+
"description": "Répond automatiquement aux suppressions de pages et adoptions de page en conflit de titre : --confirm accepte tout (CI), --no-confirm refuse tout (rien de risqué ne se fait). Non fourni : demande à chaque cas, comme en local.",
|
|
205
|
+
"name": "confirm",
|
|
206
|
+
"allowNo": true,
|
|
207
|
+
"type": "boolean"
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"hasDynamicHelp": false,
|
|
211
|
+
"hiddenAliases": [],
|
|
212
|
+
"id": "sync",
|
|
213
|
+
"pluginAlias": "codoc-cli",
|
|
214
|
+
"pluginName": "codoc-cli",
|
|
215
|
+
"pluginType": "core",
|
|
216
|
+
"strict": true,
|
|
217
|
+
"enableJsonFlag": false,
|
|
218
|
+
"isESM": true,
|
|
219
|
+
"relativePath": [
|
|
220
|
+
"dist",
|
|
221
|
+
"commands",
|
|
222
|
+
"sync.js"
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
"tree": {
|
|
226
|
+
"aliases": [],
|
|
227
|
+
"args": {},
|
|
228
|
+
"description": "Affiche l’arborescence des documents",
|
|
229
|
+
"flags": {
|
|
230
|
+
"env": {
|
|
231
|
+
"description": "N’affiche que cet environnement Confluence (clé). Par défaut : tous.",
|
|
232
|
+
"name": "env",
|
|
233
|
+
"hasDynamicHelp": false,
|
|
234
|
+
"multiple": false,
|
|
235
|
+
"type": "option"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"hasDynamicHelp": false,
|
|
239
|
+
"hiddenAliases": [],
|
|
240
|
+
"id": "tree",
|
|
241
|
+
"pluginAlias": "codoc-cli",
|
|
242
|
+
"pluginName": "codoc-cli",
|
|
243
|
+
"pluginType": "core",
|
|
244
|
+
"strict": true,
|
|
245
|
+
"enableJsonFlag": false,
|
|
246
|
+
"isESM": true,
|
|
247
|
+
"relativePath": [
|
|
248
|
+
"dist",
|
|
249
|
+
"commands",
|
|
250
|
+
"tree.js"
|
|
251
|
+
]
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"version": "0.1.2"
|
|
255
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "codoc-cli",
|
|
3
|
+
"displayName": "codoc-cli",
|
|
4
|
+
"description": "Synchronisation de documentation Confluence <-> code (Markdown <-> Confluence)",
|
|
5
|
+
"version": "0.1.2",
|
|
6
|
+
"author": "CDA - Klee",
|
|
7
|
+
"bin": {
|
|
8
|
+
"codoc": "bin/run.js"
|
|
9
|
+
},
|
|
10
|
+
"bugs": "https://github.com/klee-contrib/codoc/issues",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/klee-contrib/codoc.git"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@inquirer/prompts": "^8.2.0",
|
|
17
|
+
"@oclif/core": "^4",
|
|
18
|
+
"@puppeteer/browsers": "^2.13.2",
|
|
19
|
+
"@oclif/plugin-autocomplete": "^3.2.40",
|
|
20
|
+
"@oclif/plugin-help": "^6",
|
|
21
|
+
"@oclif/plugin-version": "^2.2.36",
|
|
22
|
+
"dotenv": "^17.4.2",
|
|
23
|
+
"execa": "^9.6.1",
|
|
24
|
+
"js-yaml": "^4.2.0",
|
|
25
|
+
"ky": "^1.14.2",
|
|
26
|
+
"marked": "^11.1.1",
|
|
27
|
+
"ora": "^9.0.0",
|
|
28
|
+
"puppeteer": "^24",
|
|
29
|
+
"simple-git": "^3.30.0",
|
|
30
|
+
"turndown": "^7.1.2",
|
|
31
|
+
"turndown-plugin-gfm": "^1.0.2"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@oclif/prettier-config": "0.2.1",
|
|
35
|
+
"@oclif/test": "^4.1.18",
|
|
36
|
+
"@types/js-yaml": "^4.0.9",
|
|
37
|
+
"@types/marked": "^6.0.0",
|
|
38
|
+
"@types/node": "^24",
|
|
39
|
+
"@types/turndown": "^5.0.2",
|
|
40
|
+
"c8": "^11.0.0",
|
|
41
|
+
"oclif": "^4.23.7",
|
|
42
|
+
"oxlint": "1.65.0",
|
|
43
|
+
"shx": "^0.4.0",
|
|
44
|
+
"ts-node": "^10.9.2",
|
|
45
|
+
"tsdown": "^0.22.0",
|
|
46
|
+
"typescript": "6.0.3"
|
|
47
|
+
},
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=24.0.0"
|
|
50
|
+
},
|
|
51
|
+
"files": [
|
|
52
|
+
"./bin",
|
|
53
|
+
"./dist",
|
|
54
|
+
"./assets",
|
|
55
|
+
"./oclif.manifest.json"
|
|
56
|
+
],
|
|
57
|
+
"homepage": "https://github.com/klee-contrib/codoc",
|
|
58
|
+
"keywords": [
|
|
59
|
+
"oclif"
|
|
60
|
+
],
|
|
61
|
+
"license": "MIT",
|
|
62
|
+
"main": "dist/index.js",
|
|
63
|
+
"type": "module",
|
|
64
|
+
"oclif": {
|
|
65
|
+
"bin": "codoc",
|
|
66
|
+
"dirname": "codoc",
|
|
67
|
+
"commands": "./dist/commands",
|
|
68
|
+
"plugins": [
|
|
69
|
+
"@oclif/plugin-help",
|
|
70
|
+
"@oclif/plugin-autocomplete",
|
|
71
|
+
"@oclif/plugin-version"
|
|
72
|
+
],
|
|
73
|
+
"topicSeparator": " ",
|
|
74
|
+
"hooks": {
|
|
75
|
+
"init": [
|
|
76
|
+
"./dist/hooks/init/load-env",
|
|
77
|
+
"./dist/hooks/init/check-for-update"
|
|
78
|
+
],
|
|
79
|
+
"command_not_found": "./dist/hooks/command_not_found"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"scripts": {
|
|
83
|
+
"build": "tsdown",
|
|
84
|
+
"typecheck": "tsc --noEmit",
|
|
85
|
+
"lint": "oxlint",
|
|
86
|
+
"lint-fix": "oxlint --fix",
|
|
87
|
+
"prepack": "tsdown && oclif manifest",
|
|
88
|
+
"postpack": "shx rm -f oclif.manifest.json",
|
|
89
|
+
"posttest": "npm run lint",
|
|
90
|
+
"test": "node --import ./test/register.mjs --test \"test/**/*.test.ts\"",
|
|
91
|
+
"test:update-snapshots": "node --import ./test/register.mjs --test --test-update-snapshots \"test/**/*.test.ts\"",
|
|
92
|
+
"test:junit": "shx mkdir -p test-results && node --import ./test/register.mjs --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=junit --test-reporter-destination=./test-results/junit.xml \"test/**/*.test.ts\"",
|
|
93
|
+
"test:coverage": "c8 node --import ./test/register.mjs --test \"test/**/*.test.ts\"",
|
|
94
|
+
"test:ci": "shx mkdir -p test-results && c8 node --import ./test/register.mjs --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=junit --test-reporter-destination=./test-results/junit.xml \"test/**/*.test.ts\"",
|
|
95
|
+
"coverage:report": "c8 --reporter=lcov node --import ./test/register.mjs --test \"test/**/*.test.ts\""
|
|
96
|
+
},
|
|
97
|
+
"types": "dist/index.d.ts"
|
|
98
|
+
}
|