用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill documentation-bc-ccn-generator命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | documentation-bc-ccn-generator |
| description | >- Use when this capability is needed. |
Generate a Business Central Change Control Note (CCN) under docs/ccn/ (English) or docs/<lang>-ccn/ (any other supported language) as the single stakeholder-facing artefact that consolidates an approved user story, technical spec, architecture document, and feasibility analysis into one consistent markdown file. The file is designed to be fed downstream into the md-to-docx-converter skill using a single CCN-specific Word template that works across all languages.
The user has at least an approved user story (US-NNN) and a draft/approved spec (SPEC-NNN); optionally also ARCH-NNN and ANALYSIS-NNN. They want a single document — in any language — that summarises the change for sign-off and that converts cleanly to Word later.
The CCN supports any BCP-47 language code (en, es, fr, de, it, pt, nl, etc.). To keep the downstream JSON extraction keys used by md-to-docx-converter byte-stable across languages, the document is split into two layers:
| Layer | Language | Examples |
|---|---|---|
| Structural layer (NEVER translated) | English / canonical | YAML frontmatter keys (id, title, customer, dsd_ticket, user_story, spec, architecture, analysis, recommendation, related_docs); all H1/H2/H3 section headings (## 1. Header, ## 2. Business context (from US-NNN), ### 2.1 Who, …); §1 Header field labels (CCN ID, Customer, DSD ticket, BC environment, Prepared by, Date, Status, Recommendation, …); table column headers in §2.6, §3.2, §3.7, §4.1, §4.3, §4.5, §5.3, §6.1, §6.2, §6.3, §7, §10; diagram marker attributes (<!-- DIAGRAM: mermaid type="…" name="…" -->); decision tokens (GO, CONDITIONAL-GO, NO-GO); the verdict heading ### **<VERDICT>**. |
| Content layer (translated to target language) | Target language | All prose paragraphs, blockquote text, numbered/bulleted item content, table cell values, SWOT body text, risk descriptions/mitigations, advisory items, the leading blockquote under the H1, the approval checkbox labels (☐ Approved, etc., translated as words but keeping the ☐ symbol). |
Why: the converter slugifies H2/H3 headings into JSON keys (e.g. 1Header, 2ContextoDeNegocio… in the legacy bilingual run). Keeping headings canonical-English guarantees a single field-map.json and a single Word template work for any language.
language = en → docs/ccn/<filename> (default).docs/<lang>-ccn/<filename> where <lang> is the lowercase BCP-47 primary subtag (e.g. docs/es-ccn/, docs/fr-ccn/, docs/de-ccn/). Create the folder if it does not exist.Do not ask the user where to save the file beyond confirming the language.
Follow these steps in order. Do not skip the source validation step (Step 1), the interview step (Step 3), or the diagram marker step (Step 6).
openspec/userstories/ (or openspec/user-stories/) and openspec/specs/ and ask which feature to consolidate via vscode_askQuestions.id (US-NNN), title, status, module, ProductOwner, approved_date, the role / want / so-that triplet, business context, functional scope, acceptance criteria, Out-of-Scope, Future Enhancements, Open Questions.id (SPEC-NNN), title, module, prefix, id_range, design principles, AL object inventory, No. Series setup, API surface, localisation notes, Open-Questions resolutions, phase overview.openspec/architecture/ARCH-NNN-<kebab>.architecture.md exists, read it and capture: id (ARCH-NNN), ADR summary table, logical component view (ASCII / mermaid), cross-cutting concerns table, legacy coexistence statement, known constraints (C-N).openspec/analysis/ANALYSIS-NNN-<kebab>.analysis.md exists, read it and capture: id (ANALYSIS-NNN), change summary, per-phase effort hours (Optimistic / Expected / Pessimistic), contingency line, cost table, SWOT, risk register (R-NN), verdict (GO / CONDITIONAL-GO / NO-GO).> _Architecture document not yet available — section derived from SPEC only._ blockquote is inserted.CCN-*.md.CCN-NNN (zero-padded to 3 digits).CCN-001.Ask the four questions below in a single vscode_askQuestions call (one block, four entries) before drafting. All four questions are mandatory.
language — BCP-47 primary subtag. Default en. Accept any of en, es, fr, de, it, pt, nl, ca, eu, gl, pl, da, sv, no, fi, cs, el, ja, zh. If the user provides a non-listed code, accept it but warn that terminology has not been pre-validated. Drives ONLY (a) the output folder (docs/ccn/ for en, docs/<lang>-ccn/ otherwise) and (b) the natural-language content of paragraphs, list items, and table cell values. It MUST NOT change any section heading, frontmatter key, §1 field label, table column header, diagram marker, or verdict token — those remain canonical English per the §Language model table above.include_costs — yes / no. If no, all monetary figures, EUR/h rates, and the §5 Cost table from ANALYSIS are omitted. The §6 Time table is preserved (hours only) unless include_hours is also no. If yes, the §5 Cost table is included using the rate recorded in ANALYSIS.include_hours — yes / no. If no, all hour figures and calendar-duration tables are omitted; §6 is replaced by a one-line "Effort and duration intentionally omitted from this version." statement. If yes, include the §6 Time table.scenarios — multi-select from Optimistic, Expected, Pessimistic, Neutral. Pre-validate that the chosen scenarios exist in ANALYSIS. If ANALYSIS only reports a single neutral estimate (as in CCN-001), accept only Neutral and warn the user that the other scenarios are not available. Default selection: Expected + Neutral (when both exist), otherwise whatever ANALYSIS provides.If include_costs = yes and include_hours = no, abort with an explanatory error — costs cannot be reported without their underlying hour basis.
If ANALYSIS is missing entirely, force include_costs = no and include_hours = no and inform the user that §5 and §6 will be omitted because the analysis source is unavailable.
<kebab-title> from the user-story title: lowercase, ASCII-fold (diacritics stripped), non-alphanumerics replaced by hyphens, hyphens collapsed.related_docs:
../../openspec/userstories/US-NNN-<kebab>.story.md../../openspec/specs/SPEC-NNN-<kebab>.spec.md../../openspec/architecture/ARCH-NNN-<kebab>.architecture.md (omit if missing)../../openspec/analysis/ANALYSIS-NNN-<kebab>.analysis.md (omit if missing)Follow the section order and rules below. Section headings, IDs, and ordering MUST be byte-stable so the same Word template placeholder set keeps working release after release. Source citations are mandatory.
Section headings are always in canonical English regardless of language. Translate only the body content (prose, list items, table cell values).
| § | Canonical heading (always English) | Source |
|---|---|---|
| 1 | Header | SPEC + USER + ANALYSIS frontmatter |
| 2 | Business context (from US-NNN) | USER §Business Context, §Functional Scope, §AC, §Out-of-Scope, §Future Enhancements |
| 3 | Proposed solution (from SPEC-NNN) | SPEC §Design Principles, §Object Inventory, §No. Series, §API, §Localisation, §Phase Overview |
| 4 | Architecture solution (from ARCH-NNN) | ARCH §ADRs, §Component View, §Cross-cutting, §Coexistence, §Constraints |
| 5 | Feasibility analysis (from ANALYSIS-NNN) | ANALYSIS §Change Summary, §SWOT, §Risk Register, §OQ Status |
| 6 | Time estimate | ANALYSIS §Effort (filtered by scenarios) |
| 7 | Testing setup (planned) | SPEC §Phase Overview + ANALYSIS §Test Strategy |
| 8 | Testing steps (acceptance, executed by Customer) | USER §AC translated into manual steps |
| 9 | Recommendation | ANALYSIS §Verdict + §Non-blocking advisories |
| 10 | Approvals | Empty 3-row table (PO, Tech Lead, PM) |
Rules:
| **Field** | Value |), so the downstream md-to-docx-converter skill's metadata extraction works. The label set is fixed: CCN ID, Title, Customer, DSD ticket, BC environment, BC version baseline, Extension affected, Source user story, Source spec, Architecture, Analysis, Prepared by, Date, Status, Recommendation. Field labels are NEVER translated — even when language ≠ en — because the converter keys off them.Customer notes; identifiers like CCN-001, US-001, SPEC-001, dates, version numbers, and the GO/CONDITIONAL-GO/NO-GO token MUST stay verbatim). No markdown links, no backticks, no em-dashes. This guarantees clean substitution into the Word template.include_hours = no → render only the line: _Effort and duration intentionally omitted from this version of the document._include_hours = yes and include_costs = no → render the effort-per-phase table and calendar duration table, but strip any EUR / cost columns.include_hours = yes and include_costs = yes → render the effort table, calendar table, and a cost-per-scenario table at the chosen scenarios. State the EUR/h rate from ANALYSIS verbatim.Every block that the docx converter will render as a Mermaid diagram MUST be surrounded by an explicit HTML comment marker pair so the converter recognises it. Use exactly these markers and nothing else:
<!-- DIAGRAM: mermaid type="<flowchart|erDiagram|stateDiagram|sequenceDiagram>" name="<short-kebab-id>" -->
... optional ASCII fallback kept verbatim for the markdown reader ...
```mermaid
<actual Mermaid source — valid for the declared `type`>
Mandatory rules for every marker block:
1. **A ```mermaid fenced block is REQUIRED inside the markers.** It is the only source the `md-to-docx-converter` can render into a PNG; without it the converter will fall back to plain text. Author the Mermaid syntax yourself — do NOT rely on the converter to regenerate Mermaid from ASCII art.
2. The Mermaid source must be **valid for the declared `type`** (e.g. `type="flowchart"` requires a `flowchart` / `graph` diagram; `type="erDiagram"` requires an `erDiagram` diagram).
3. The optional ASCII art kept above the ```mermaid fence is for human readability of the raw markdown only. The converter ignores it.
4. `name` must be **unique within the CCN** and kebab-cased.
5. Do NOT nest a marker block inside another fenced code block (` ```text `, ` ```` ` ``` ` ```` `, …). The converter only matches markers at body level.
Apply markers to **at least** these diagrams when their source document supplies them:
| Source | Block | Suggested `type` | Suggested `name` |
|---|---|---|---|
| ARCH §4.2 (logical component view) | ASCII / fenced block in §4 of the CCN | `flowchart` | `component-view` |
| ARCH §6.1 (entity-relationship overview) | If present, inserted into §4 of the CCN | `erDiagram` | `entity-relationship` |
| SPEC / ARCH (status lifecycle) | Forward-only Status transition, inserted into §3 or §4 | `stateDiagram` | `status-lifecycle` |
| ARCH §5 (key runtime flow) | Each flow inserted into §4 of the CCN | `sequenceDiagram` | `flow-<short-name>` |
Do not auto-convert pre-existing ASCII art into Mermaid blindly — understand the source diagram first, then write a hand-crafted Mermaid block that reflects it. Keep the ASCII above the ```mermaid fence so the raw markdown remains readable for reviewers. If a diagrammable block is not present in any source document, do not invent it.
When the CCN is later passed through the `md-to-docx-converter` skill, each marker block is replaced in the JSON body by a `{{DIAGRAM:<name>}}` token, the captured Mermaid source is stored under the JSON `_diagrams` key, and the token is rendered as an inline PNG image (via the Mermaid CLI `mmdc`) in the generated `.docx`. A missing or invalid Mermaid block degrades to a labelled text block in the docx but does not abort the conversion.
### Step 7 — Build the filename
Format: `CCN-NNN-<kebab-title>.md`
- `<kebab-title>` is the lowercase ASCII-folded title from Step 4.
- Validate against `^CCN-\d{3}-[a-z0-9]+(-[a-z0-9]+)*\.md$` before writing.
### Step 8 — Write the CCN document
Create the file at `<docs-folder>/<filename>` using the template in `references/ccn-template.md`. The file MUST contain, in this exact order:
1. YAML frontmatter — **keys are ALWAYS in canonical English regardless of `language`**; only free-text values (e.g. `title`, `prepared_by`) may be in the target language. Identifier values (`id`, `user_story`, `spec`, `architecture`, `analysis`, `recommendation`), enum values (`status: Pending Approval`), and the `version` number MUST stay verbatim:
```yaml
---
id: CCN-NNN
title: Change Control Note — <Title>
version: 1.0
status: Pending Approval
customer: <Customer name from SPEC / USER>
dsd_ticket: TBD
user_story: US-NNN
spec: SPEC-NNN
architecture: ARCH-NNN # omit key entirely if ARCH not present
analysis: ANALYSIS-NNN # omit key entirely if ANALYSIS not present
prepared_by: <author>
date: <YYYY-MM-DD>
recommendation: <GO | CONDITIONAL-GO | NO-GO>
related_docs:
- openspec/userstories/US-NNN-<kebab>.story.md
- openspec/specs/SPEC-NNN-<kebab>.spec.md
# add architecture / analysis lines only if those files exist
---
# CCN-NNN — <Title> H1.language. Only the prose paragraphs, list item text, and table-cell values inside each section are translated to the target language.After writing, report to the user:
CCN-NNN id and language (en / es).include_costs, include_hours, scenarios).<!-- DIAGRAM: mermaid ... --> markers inserted, with their name attributes.md-to-docx-converter skill with the CCN-specific Word template once the sign-off table in §10 has been countersigned.Every artefact produced by this skill MUST follow these rules. They exist so
the downstream documentation-bc-md-to-docx-converter pipeline (AXZ Word
templates) renders correctly in every supported language and so headings
never leak design-time tokens.
## Business context, never
## 2. Business context. The Word template's multilevel-list style
numbers the H2s automatically; a manual N. prefix produces double
numbering (e.g. 2. 2. Business context) in the rendered docx.(from US-NNN), (from US-<NNN>), (procedente de SPEC-001),
(aus ARCH-NNN), etc. Trace links to source artefacts belong in the
frontmatter or section body, not in the visible heading text.N.M prefix
shape (e.g. ### 3.1 …) but the label text MUST be translated into the
target language declared in the frontmatter language / locale field.^## \d+(?:\.\d+)*\.\s (numeric-prefixed H2)\((?:from|procedente de|issu[e]? de|aus|da|de|uit)\s+[A-Z]+-\S+\)\s*$
on any heading line (source-ID suffix)Origin: defects discovered while producing
CCN-001-driver-penalty-management. Tracked indocs/plans/PLAN-documentation-bc-heading-translation-fix.md(PLAN-DOC-BC-003).
Pending Approval on initial creation. version MUST be 1.0.prepared_by frontmatter field is mandatory. It must contain the full name of the human user — never an agent role or agent name. If the author name is not evident from context (git user, previous artefacts, or explicit user input), ask the user before writing the file.docs/ccn/ for language = en; switch to docs/<lang>-ccn/ for any other language (lowercase BCP-47 primary subtag). Never ask, never write elsewhere..md (no .ccn.md suffix — the CCN convention uses plain .md).include_costs = no — strip both the cost table and any EUR symbols from the rest of the document.include_hours = no — replace §6 with the one-line omission statement.md-to-docx-converter JSON extraction depend on them. Translation only ever applies to the content layer (prose, list items, table cell values).<!-- DIAGRAM: mermaid type=… name=… --> / <!-- /DIAGRAM --> markers AND MUST contain a mermaid fenced block with valid Mermaid source matching the declared `type`** — no exceptions. The optional ASCII art above the mermaid fence is for human readability of the markdown only; the docx converter only renders the mermaid source.recommendation: frontmatter field MUST match the verdict heading in §9 exactly.references/ccn-template.md — full markdown skeleton with frontmatter, §1 Header table layout, all 10 section headings, diagram-marker placement examples, and placeholder tokens for both languages.references/ccn-fields.json — canonical, language-neutral static field/section keys (skill-local copy, kept in sync with .github/skills/shared/field-map.json) used to drive the mandatory JSON output (below) and the CCN Word template consumed by md-to-docx-converter.On every invocation, in addition to writing the CCN .md file the skill MUST also write a sibling JSON file:
docs/ccn/ for language = en, docs/<lang>-ccn/ otherwise), filename pattern CCN-NNN-<kebab-title>.json (see outputJson.filePattern in references/ccn-fields.json).{
"artifactType": "CCN",
"id": "CCN-NNN",
"language": "<bcp47-primary-subtag>",
"frontmatter": { "<yamlKey>": "<value>", ... },
"headerFields": { "<CcnMetadataKey>": "<value, translated where translateValue=true>", ... },
"sections": { "<CanonicalKey>": "<markdown body of the section, translated>", ... }
}
references/ccn-fields.json: frontmatterFields[].key → frontmatter, ccnMetadataFields[].key → (these populate the §1 Header table), and → (the ten CCN §1–§10 bodies). They are byte-stable across runs and languages so they can bind 1:1 to placeholder tokens in the CCN Word template.The markdown produced by this skill is intended to be converted to .docx by the documentation-bc-md-to-docx-converter skill. Any Mermaid block in the output — whether emitted as an explicit <!-- DIAGRAM: mermaid ... --> marker or as a bare triple-backtick ```mermaid fence — is rendered to PNG by the Mermaid CLI (mmdc). When mmdc is unavailable the converter falls back to the diagram's plain-text content, so generated documents stay readable but lose their visual diagrams.
Install once per machine (Node.js required):
npm install -g @mermaid-js/mermaid-cli
mmdc --version
Inline  images in the generated markdown are also embedded into the docx body by the converter (resolved relative to the markdown file, then to repo root). Missing image files are left as literal text and produce a warning.
This step is mandatory before reporting the artefact as done. It enforces the language-neutral binding contract used by the documentation-bc-md-to-docx-converter.
After writing the markdown file, the skill MUST re-read it and verify the anchor contract:
## in the body (not inside fenced code blocks, not in YAML frontmatter), the next non-blank line MUST be:
`
`<CanonicalKey> MUST be one of the sections[].key values declared in the matching references/*-fields.json schema (PascalCase, English, byte-stable across languages).*.json output emitted by this skill — NEVER a translated derivative.Recommended automation: run python .github/skills/shared/scripts/sync-section-keys.py --dry-run against the just-written file; if it reports any missing/mismatched anchor, fix the file in place, then re-run without --dry-run to apply.
Failure of this self-check is a hard failure of the skill — do not deliver the artefact until every H2 carries a valid schema-backed anchor.
Source: fernandoartalf/AL-Copilot-Skills-Collection — distributed by TomeVault.
**GO**, **CONDITIONAL-GO**, or **NO-GO**).openspec/plans/ as the place where phase plans are flipped from not-started to approved.| **Label** | Value |headerFieldssections[].keysectionstranslateValue: false in the map (IDs, dates, enum tokens like GO/CONDITIONAL-GO/NO-GO) MUST remain in its canonical form regardless of language.<!-- section-key: <CanonicalKey> --> immediately after every H2) is what allows the same map to be reconstructed by parsing the .md after the fact.