@h2nguyen/arc42-node-mcp-server 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,35 @@ All notable changes to the arc42 MCP Server will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.2.0] - 2026-03-09
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Claude Skill for Arc42**: Pre-built Claude skill (`.claude/skills/arc42-docs-mcp/`) that teaches Claude how to effectively use the arc42 MCP server tools
|
|
12
|
+
- `SKILL.md` with workflows, tool reference, and behavioral guidelines
|
|
13
|
+
- Reference documents for setup and practical usage examples (8 scenarios)
|
|
14
|
+
- Can be copied or symlinked into other projects for automatic arc42 documentation assistance
|
|
15
|
+
- **Project CLAUDE.md**: Added project-level instructions for Claude Code with build commands, code conventions, architecture overview, and key constraints
|
|
16
|
+
- **Dependency Review Configuration**: Added `.github/dependency-review-config.yml` with allowed license list (Apache-2.0, MIT, ISC, BSD, CC-BY-SA-4.0, CC0-1.0, 0BSD)
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- Updated license metadata in `package.json` to SPDX expression `(Apache-2.0 AND CC-BY-SA-4.0)` with explicit dual-license entries for Apache-2.0 (code) and CC-BY-SA-4.0 (arc42 template content)
|
|
20
|
+
|
|
21
|
+
### Security
|
|
22
|
+
- Bump `express-rate-limit` from 8.2.1 to 8.3.1 in the npm_and_yarn group
|
|
23
|
+
- Bump `hono` from 4.12.3 to 4.12.5 and `@hono/node-server` from 1.19.9 to 1.19.10
|
|
24
|
+
|
|
25
|
+
### Documentation
|
|
26
|
+
- Added "Claude Skill for Arc42" section to README with installation instructions, skill triggers, and benefits comparison table
|
|
27
|
+
|
|
28
|
+
## [2.1.1] - 2026-02-26
|
|
29
|
+
|
|
30
|
+
### Security
|
|
31
|
+
- Remove direct system shell access to eliminate code execution risk
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
- Mark dependencies as peer in package-lock.json
|
|
35
|
+
- Update dependencies in package-lock.json (balanced-match, brace-expansion, minimatch) to latest versions
|
|
36
|
+
|
|
8
37
|
## [2.1.0] - 2026-02-14
|
|
9
38
|
|
|
10
39
|
### Added
|
package/README.md
CHANGED
|
@@ -49,6 +49,11 @@ A Model Context Protocol (MCP) server that helps you create comprehensive archit
|
|
|
49
49
|
* [🎯 Best Practices](#-best-practices)
|
|
50
50
|
* [For AI Assistants](#for-ai-assistants)
|
|
51
51
|
* [For Users](#for-users)
|
|
52
|
+
* [🧠 Claude Skill for Arc42](#-claude-skill-for-arc42)
|
|
53
|
+
* [What Is the Arc42 Skill?](#what-is-the-arc42-skill)
|
|
54
|
+
* [Installing the Skill in Other Projects](#installing-the-skill-in-other-projects)
|
|
55
|
+
* [Skill Triggers](#skill-triggers)
|
|
56
|
+
* [Benefits for Your Projects](#benefits-for-your-projects)
|
|
52
57
|
* [🔧 Development](#-development)
|
|
53
58
|
* [Development Methodology](#development-methodology)
|
|
54
59
|
* [Documentation Quality Assurance](#documentation-quality-assurance)
|
|
@@ -705,6 +710,77 @@ your-project/
|
|
|
705
710
|
4. **Keep it current**: Update as architecture evolves
|
|
706
711
|
5. **Use version control**: Commit your arc42-docs directory to Git
|
|
707
712
|
|
|
713
|
+
## 🧠 Claude Skill for Arc42
|
|
714
|
+
|
|
715
|
+
This project includes a pre-built **Claude Skill** that teaches Claude (via [Claude Code](https://docs.anthropic.com/en/docs/claude-code) or any skill-aware Claude integration) how to effectively use the arc42 MCP server tools for architecture documentation — without manual prompting.
|
|
716
|
+
|
|
717
|
+
### What Is the Arc42 Skill?
|
|
718
|
+
|
|
719
|
+
The skill is a structured knowledge package located at `.claude/skills/arc42-docs-mcp/` containing:
|
|
720
|
+
|
|
721
|
+
```
|
|
722
|
+
.claude/skills/arc42-docs-mcp/
|
|
723
|
+
├── SKILL.md # Skill definition with workflows, tool reference, and behavioral guidelines
|
|
724
|
+
└── references/
|
|
725
|
+
├── setup.md # MCP server installation and configuration for all clients
|
|
726
|
+
└── examples.md # Practical usage examples (8 scenarios)
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
When present in a project, Claude automatically loads the skill and understands:
|
|
730
|
+
|
|
731
|
+
- The correct **workflow order** for arc42 documentation (guide → init → status → template → write → review)
|
|
732
|
+
- **All 6 MCP tools**, their parameters, and expected responses
|
|
733
|
+
- **Best practices** such as always generating a template before writing, using append mode for ADRs, and asking clarifying questions before assuming project details
|
|
734
|
+
- The **recommended documentation order** (Section 1 → 3 → 4 → 5 → 9, then fill the remaining sections)
|
|
735
|
+
|
|
736
|
+
### Installing the Skill in Other Projects
|
|
737
|
+
|
|
738
|
+
To enable the arc42 skill in any project where Claude Code is used:
|
|
739
|
+
|
|
740
|
+
**Option 1: Copy the skill directory**
|
|
741
|
+
|
|
742
|
+
```bash
|
|
743
|
+
# From your project root
|
|
744
|
+
mkdir -p .claude/skills
|
|
745
|
+
cp -r /path/to/Arc42-Node-MCP-Server/.claude/skills/arc42-docs-mcp .claude/skills/
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
**Option 2: Symlink (keeps the skill up-to-date)**
|
|
749
|
+
|
|
750
|
+
```bash
|
|
751
|
+
# From your project root
|
|
752
|
+
mkdir -p .claude/skills
|
|
753
|
+
ln -s /path/to/Arc42-Node-MCP-Server/.claude/skills/arc42-docs-mcp .claude/skills/arc42-docs-mcp
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
> **Prerequisite**: The arc42 MCP server must also be configured in your project's MCP settings (`.mcp.json`, Claude Desktop config, etc.). The skill teaches Claude *how* to use the tools, but the MCP server must be running to provide them. See [Setup in Claude Desktop](#setup-in-claude-desktop), [Setup in Cursor](#setup-in-cursor), or [Setup in Cline](#setup-in-cline) for server configuration.
|
|
757
|
+
|
|
758
|
+
After installation, commit the `.claude/skills/arc42-docs-mcp/` directory to version control so all team members benefit from the skill automatically.
|
|
759
|
+
|
|
760
|
+
### Skill Triggers
|
|
761
|
+
|
|
762
|
+
Claude activates the arc42 skill when it detects any of the following in conversation:
|
|
763
|
+
|
|
764
|
+
| Trigger | Examples |
|
|
765
|
+
|-------------------------------------|----------------------------------------------------------------------------------------------|
|
|
766
|
+
| Architecture documentation keywords | "create architecture documentation", "document the architecture", "update architecture docs" |
|
|
767
|
+
| Arc42 references | "arc42", "initialize arc42", "arc42 template" |
|
|
768
|
+
| Section-specific requests | "document the deployment view", "add quality requirements", "describe the building blocks" |
|
|
769
|
+
| ADR mentions | "add an Architecture Decision Record", "document why we chose PostgreSQL" |
|
|
770
|
+
| Any of the 12 arc42 sections | Introduction and Goals, Constraints, Context and Scope, Solution Strategy, etc. |
|
|
771
|
+
|
|
772
|
+
### Benefits for Your Projects
|
|
773
|
+
|
|
774
|
+
| Benefit | Without Skill | With Skill |
|
|
775
|
+
|------------------------|---------------------------------------------------|-----------------------------------------------------------------------------------|
|
|
776
|
+
| **Workflow knowledge** | Must manually prompt Claude to follow arc42 order | Claude automatically follows guide → init → template → write workflow |
|
|
777
|
+
| **Tool usage** | May call tools incorrectly or skip steps | Calls the right tools with correct parameters in the right sequence |
|
|
778
|
+
| **Content quality** | Generic documentation output | Generates templates first, asks clarifying questions, documents WHY not just WHAT |
|
|
779
|
+
| **ADR handling** | Risk of overwriting existing decisions | Always reads existing ADRs first and uses append mode |
|
|
780
|
+
| **Format awareness** | May mix AsciiDoc and Markdown syntax | Checks `arc42-status` for configured format and writes consistently |
|
|
781
|
+
| **Multi-language** | Defaults to English only | Respects configured language across all tool calls |
|
|
782
|
+
| **Team consistency** | Each developer gets different results | Shared skill in version control ensures consistent documentation quality |
|
|
783
|
+
|
|
708
784
|
## 🔧 Development
|
|
709
785
|
|
|
710
786
|
### Development Methodology
|
|
@@ -958,7 +1034,8 @@ This project is licensed under the Apache License 2.0 – see the [LICENSE](LICE
|
|
|
958
1034
|
- **arc42 GitHub**: https://github.com/arc42
|
|
959
1035
|
- **arc42 Examples**: https://arc42.org/examples (Additional examples are embedded within the documentation at https://docs.arc42.org/)
|
|
960
1036
|
- **arc42 FAQ**: https://faq.arc42.org/
|
|
961
|
-
- **arc42 Node MCP Server Github**: https://github.com/h2nguyen/Arc42-Node-MCP-Server
|
|
1037
|
+
- **arc42 Node MCP Server on Github**: https://github.com/h2nguyen/Arc42-Node-MCP-Server
|
|
1038
|
+
- **arc42 Node MCP Server on NPM**: https://www.npmjs.com/package/@h2nguyen/arc42-node-mcp-server/v/latest
|
|
962
1039
|
- **MCP Specification**: https://modelcontextprotocol.io/specification/
|
|
963
1040
|
|
|
964
1041
|
---
|
|
@@ -5,8 +5,14 @@
|
|
|
5
5
|
* When the submodule is updated, this file automatically reflects the new version.
|
|
6
6
|
*
|
|
7
7
|
* Source: https://github.com/arc42/arc42-template
|
|
8
|
-
* Version file: vendor/arc42-template/
|
|
8
|
+
* Version file: vendor/arc42-template/{LANG}/version.properties
|
|
9
9
|
*/
|
|
10
|
+
/** Supported languages in the arc42 template */
|
|
11
|
+
export type Arc42Language = 'EN' | 'DE' | 'ES' | 'FR' | 'IT' | 'NL' | 'PT' | 'RU' | 'CZ' | 'UKR' | 'ZH';
|
|
12
|
+
/** Default language for arc42 templates */
|
|
13
|
+
export declare const DEFAULT_LANGUAGE: Arc42Language;
|
|
14
|
+
/** List of all supported languages */
|
|
15
|
+
export declare const SUPPORTED_LANGUAGES: Arc42Language[];
|
|
10
16
|
export interface Arc42Reference {
|
|
11
17
|
/** The arc42 template version (e.g., "9.0-EN") */
|
|
12
18
|
version: string;
|
|
@@ -18,6 +24,8 @@ export interface Arc42Reference {
|
|
|
18
24
|
sourceRepo: string;
|
|
19
25
|
/** Whether the submodule is available */
|
|
20
26
|
submoduleAvailable: boolean;
|
|
27
|
+
/** Language code used for this reference */
|
|
28
|
+
language: Arc42Language;
|
|
21
29
|
/** Notes about any deviations from the original template */
|
|
22
30
|
notes: string[];
|
|
23
31
|
}
|
|
@@ -30,29 +38,39 @@ export declare function parseVersionProperties(content: string): {
|
|
|
30
38
|
revdate: string;
|
|
31
39
|
};
|
|
32
40
|
/**
|
|
33
|
-
* Get commit SHA from git submodule
|
|
41
|
+
* Get commit SHA from git submodule by reading .git files directly
|
|
42
|
+
* (Avoids shell access for security - no execSync required)
|
|
34
43
|
* @internal Exported for testing purposes
|
|
35
44
|
*/
|
|
36
45
|
export declare function getSubmoduleCommitSha(): string;
|
|
37
46
|
/**
|
|
38
47
|
* Reference information for the arc42 template version this MCP server is based on.
|
|
39
|
-
* This is loaded dynamically from the submodule at module initialization.
|
|
48
|
+
* This is loaded dynamically from the submodule at module initialization (default: English).
|
|
40
49
|
*/
|
|
41
50
|
export declare const ARC42_REFERENCE: Arc42Reference;
|
|
51
|
+
/**
|
|
52
|
+
* Get arc42 reference information for a specific language
|
|
53
|
+
* @param language - Language code (defaults to EN)
|
|
54
|
+
*/
|
|
55
|
+
export declare function getArc42ReferenceForLanguage(language?: Arc42Language): Arc42Reference;
|
|
42
56
|
/**
|
|
43
57
|
* Get a formatted string describing the arc42 reference version
|
|
58
|
+
* @param language - Language code (defaults to EN)
|
|
44
59
|
*/
|
|
45
|
-
export declare function getArc42ReferenceString(): string;
|
|
60
|
+
export declare function getArc42ReferenceString(language?: Arc42Language): string;
|
|
46
61
|
/**
|
|
47
62
|
* Get the full reference information as a Markdown block
|
|
63
|
+
* @param language - Language code (defaults to EN)
|
|
48
64
|
*/
|
|
49
|
-
export declare function getArc42ReferenceMarkdown(): string;
|
|
65
|
+
export declare function getArc42ReferenceMarkdown(language?: Arc42Language): string;
|
|
50
66
|
/**
|
|
51
67
|
* Get reference info suitable for config.yaml
|
|
68
|
+
* @param language - Language code (defaults to EN)
|
|
52
69
|
*/
|
|
53
|
-
export declare function getArc42ReferenceConfig(): Record<string, string>;
|
|
70
|
+
export declare function getArc42ReferenceConfig(language?: Arc42Language): Record<string, string>;
|
|
54
71
|
/**
|
|
55
72
|
* Force reload the reference from submodule (useful for testing)
|
|
73
|
+
* @param language - Language code (defaults to EN)
|
|
56
74
|
*/
|
|
57
|
-
export declare function reloadArc42Reference(): Arc42Reference;
|
|
75
|
+
export declare function reloadArc42Reference(language?: Arc42Language): Arc42Reference;
|
|
58
76
|
//# sourceMappingURL=arc42-reference.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arc42-reference.d.ts","sourceRoot":"","sources":["../../src/templates/arc42-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"arc42-reference.d.ts","sourceRoot":"","sources":["../../src/templates/arc42-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;AAExG,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,aAAoB,CAAC;AAEpD,sCAAsC;AACtC,eAAO,MAAM,mBAAmB,EAAE,aAAa,EAAwE,CAAC;AASxH,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,EAAE,aAAa,CAAC;IACxB,4DAA4D;IAC5D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAkB9F;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAiD9C;AA6DD;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,cAAqC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,GAAE,aAAgC,GAAG,cAAc,CAEvG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,MAAM,CAGxE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,MAAM,CAU1E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,cAAc,CAE7E"}
|
|
@@ -5,18 +5,26 @@
|
|
|
5
5
|
* When the submodule is updated, this file automatically reflects the new version.
|
|
6
6
|
*
|
|
7
7
|
* Source: https://github.com/arc42/arc42-template
|
|
8
|
-
* Version file: vendor/arc42-template/
|
|
8
|
+
* Version file: vendor/arc42-template/{LANG}/version.properties
|
|
9
9
|
*/
|
|
10
10
|
import { existsSync, readFileSync } from 'fs';
|
|
11
|
-
import { execSync } from 'child_process';
|
|
12
11
|
import { join, dirname } from 'path';
|
|
13
12
|
import { fileURLToPath } from 'url';
|
|
14
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
15
14
|
const __dirname = dirname(__filename);
|
|
16
15
|
// Path to submodule (relative to src/templates/)
|
|
17
16
|
const SUBMODULE_PATH = join(__dirname, '../../vendor/arc42-template');
|
|
18
|
-
const VERSION_FILE = join(SUBMODULE_PATH, 'EN/version.properties');
|
|
19
17
|
const SOURCE_REPO = 'https://github.com/arc42/arc42-template';
|
|
18
|
+
/** Default language for arc42 templates */
|
|
19
|
+
export const DEFAULT_LANGUAGE = 'EN';
|
|
20
|
+
/** List of all supported languages */
|
|
21
|
+
export const SUPPORTED_LANGUAGES = ['EN', 'DE', 'ES', 'FR', 'IT', 'NL', 'PT', 'RU', 'CZ', 'UKR', 'ZH'];
|
|
22
|
+
/**
|
|
23
|
+
* Get the version file path for a specific language
|
|
24
|
+
*/
|
|
25
|
+
function getVersionFilePath(language = DEFAULT_LANGUAGE) {
|
|
26
|
+
return join(SUBMODULE_PATH, language, 'version.properties');
|
|
27
|
+
}
|
|
20
28
|
/**
|
|
21
29
|
* Parse version.properties file content
|
|
22
30
|
* @internal Exported for testing purposes
|
|
@@ -39,64 +47,88 @@ export function parseVersionProperties(content) {
|
|
|
39
47
|
};
|
|
40
48
|
}
|
|
41
49
|
/**
|
|
42
|
-
* Get commit SHA from git submodule
|
|
50
|
+
* Get commit SHA from git submodule by reading .git files directly
|
|
51
|
+
* (Avoids shell access for security - no execSync required)
|
|
43
52
|
* @internal Exported for testing purposes
|
|
44
53
|
*/
|
|
45
54
|
export function getSubmoduleCommitSha() {
|
|
46
55
|
try {
|
|
47
|
-
//
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
// Method 1: Read from submodule's .git file (gitdir reference)
|
|
57
|
+
const submoduleGitPath = join(SUBMODULE_PATH, '.git');
|
|
58
|
+
if (existsSync(submoduleGitPath)) {
|
|
59
|
+
const gitContent = readFileSync(submoduleGitPath, 'utf-8').trim();
|
|
60
|
+
// .git file in submodule contains "gitdir: ../../.git/modules/vendor/arc42-template"
|
|
61
|
+
if (gitContent.startsWith('gitdir:')) {
|
|
62
|
+
const gitDir = gitContent.replace('gitdir:', '').trim();
|
|
63
|
+
const resolvedGitDir = join(SUBMODULE_PATH, gitDir);
|
|
64
|
+
const headPath = join(resolvedGitDir, 'HEAD');
|
|
65
|
+
if (existsSync(headPath)) {
|
|
66
|
+
const headContent = readFileSync(headPath, 'utf-8').trim();
|
|
67
|
+
// HEAD can be a direct commit SHA or a ref
|
|
68
|
+
if (headContent.startsWith('ref:')) {
|
|
69
|
+
const refPath = join(resolvedGitDir, headContent.replace('ref:', '').trim());
|
|
70
|
+
if (existsSync(refPath)) {
|
|
71
|
+
return readFileSync(refPath, 'utf-8').trim();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Direct commit SHA
|
|
76
|
+
return headContent;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
66
80
|
}
|
|
67
|
-
|
|
68
|
-
|
|
81
|
+
// Method 2: Read from parent repo's .git/modules directory
|
|
82
|
+
const projectRoot = join(__dirname, '../..');
|
|
83
|
+
const modulesHeadPath = join(projectRoot, '.git/modules/vendor/arc42-template/HEAD');
|
|
84
|
+
if (existsSync(modulesHeadPath)) {
|
|
85
|
+
const headContent = readFileSync(modulesHeadPath, 'utf-8').trim();
|
|
86
|
+
if (!headContent.startsWith('ref:')) {
|
|
87
|
+
return headContent;
|
|
88
|
+
}
|
|
89
|
+
// If it's a ref, resolve it
|
|
90
|
+
const refPath = join(projectRoot, '.git/modules/vendor/arc42-template', headContent.replace('ref:', '').trim());
|
|
91
|
+
if (existsSync(refPath)) {
|
|
92
|
+
return readFileSync(refPath, 'utf-8').trim();
|
|
93
|
+
}
|
|
69
94
|
}
|
|
95
|
+
return 'unknown';
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return 'unknown';
|
|
70
99
|
}
|
|
71
100
|
}
|
|
72
101
|
/**
|
|
73
|
-
* Read arc42 reference info from the submodule
|
|
102
|
+
* Read arc42 reference info from the submodule for a specific language
|
|
74
103
|
* Falls back to hardcoded values if submodule is not available
|
|
104
|
+
* @param language - Language code (defaults to EN)
|
|
75
105
|
*/
|
|
76
|
-
function loadArc42Reference() {
|
|
106
|
+
function loadArc42Reference(language = DEFAULT_LANGUAGE) {
|
|
77
107
|
// Default/fallback values (used when submodule not available, e.g., npm install)
|
|
78
108
|
const fallback = {
|
|
79
|
-
version:
|
|
109
|
+
version: `9.0-${language}`,
|
|
80
110
|
date: 'July 2025',
|
|
81
111
|
commitSha: 'b29e08928644af7ae49f51d729d14313db0d934c',
|
|
82
112
|
sourceRepo: SOURCE_REPO,
|
|
83
113
|
submoduleAvailable: false,
|
|
114
|
+
language,
|
|
84
115
|
notes: [
|
|
85
116
|
'Templates adapted from AsciiDoc to Markdown format',
|
|
86
117
|
'Section guidance text customized for AI-assisted documentation',
|
|
87
118
|
'Fallback values used - submodule not available'
|
|
88
119
|
]
|
|
89
120
|
};
|
|
121
|
+
const versionFile = getVersionFilePath(language);
|
|
90
122
|
// Check if submodule exists
|
|
91
|
-
if (!existsSync(SUBMODULE_PATH) || !existsSync(
|
|
123
|
+
if (!existsSync(SUBMODULE_PATH) || !existsSync(versionFile)) {
|
|
92
124
|
return fallback;
|
|
93
125
|
}
|
|
94
126
|
try {
|
|
95
127
|
// Read version.properties
|
|
96
|
-
const content = readFileSync(
|
|
128
|
+
const content = readFileSync(versionFile, 'utf-8');
|
|
97
129
|
const { revnumber, revdate } = parseVersionProperties(content);
|
|
98
130
|
if (!revnumber || !revdate) {
|
|
99
|
-
console.warn(
|
|
131
|
+
console.warn(`Warning: Could not parse version.properties for ${language}, using fallback`);
|
|
100
132
|
return fallback;
|
|
101
133
|
}
|
|
102
134
|
// Get commit SHA
|
|
@@ -107,6 +139,7 @@ function loadArc42Reference() {
|
|
|
107
139
|
commitSha,
|
|
108
140
|
sourceRepo: SOURCE_REPO,
|
|
109
141
|
submoduleAvailable: true,
|
|
142
|
+
language,
|
|
110
143
|
notes: [
|
|
111
144
|
'Templates adapted from AsciiDoc to Markdown format',
|
|
112
145
|
'Section guidance text customized for AI-assisted documentation'
|
|
@@ -114,48 +147,64 @@ function loadArc42Reference() {
|
|
|
114
147
|
};
|
|
115
148
|
}
|
|
116
149
|
catch (error) {
|
|
117
|
-
console.warn(
|
|
150
|
+
console.warn(`Warning: Failed to read from submodule for ${language}, using fallback:`, error);
|
|
118
151
|
return fallback;
|
|
119
152
|
}
|
|
120
153
|
}
|
|
121
154
|
/**
|
|
122
155
|
* Reference information for the arc42 template version this MCP server is based on.
|
|
123
|
-
* This is loaded dynamically from the submodule at module initialization.
|
|
156
|
+
* This is loaded dynamically from the submodule at module initialization (default: English).
|
|
124
157
|
*/
|
|
125
158
|
export const ARC42_REFERENCE = loadArc42Reference();
|
|
159
|
+
/**
|
|
160
|
+
* Get arc42 reference information for a specific language
|
|
161
|
+
* @param language - Language code (defaults to EN)
|
|
162
|
+
*/
|
|
163
|
+
export function getArc42ReferenceForLanguage(language = DEFAULT_LANGUAGE) {
|
|
164
|
+
return loadArc42Reference(language);
|
|
165
|
+
}
|
|
126
166
|
/**
|
|
127
167
|
* Get a formatted string describing the arc42 reference version
|
|
168
|
+
* @param language - Language code (defaults to EN)
|
|
128
169
|
*/
|
|
129
|
-
export function getArc42ReferenceString() {
|
|
130
|
-
|
|
170
|
+
export function getArc42ReferenceString(language) {
|
|
171
|
+
const ref = language ? loadArc42Reference(language) : ARC42_REFERENCE;
|
|
172
|
+
return `arc42 Template v${ref.version} (${ref.date})`;
|
|
131
173
|
}
|
|
132
174
|
/**
|
|
133
175
|
* Get the full reference information as a Markdown block
|
|
176
|
+
* @param language - Language code (defaults to EN)
|
|
134
177
|
*/
|
|
135
|
-
export function getArc42ReferenceMarkdown() {
|
|
178
|
+
export function getArc42ReferenceMarkdown(language) {
|
|
179
|
+
const ref = language ? loadArc42Reference(language) : ARC42_REFERENCE;
|
|
136
180
|
return `---
|
|
137
181
|
**arc42 Template Reference**
|
|
138
|
-
- Version: ${
|
|
139
|
-
- Date: ${
|
|
140
|
-
-
|
|
141
|
-
-
|
|
182
|
+
- Version: ${ref.version}
|
|
183
|
+
- Date: ${ref.date}
|
|
184
|
+
- Language: ${ref.language}
|
|
185
|
+
- Source: [arc42-template](${ref.sourceRepo})
|
|
186
|
+
- Commit: \`${ref.commitSha.substring(0, 7)}\`
|
|
142
187
|
---`;
|
|
143
188
|
}
|
|
144
189
|
/**
|
|
145
190
|
* Get reference info suitable for config.yaml
|
|
191
|
+
* @param language - Language code (defaults to EN)
|
|
146
192
|
*/
|
|
147
|
-
export function getArc42ReferenceConfig() {
|
|
193
|
+
export function getArc42ReferenceConfig(language) {
|
|
194
|
+
const ref = language ? loadArc42Reference(language) : ARC42_REFERENCE;
|
|
148
195
|
return {
|
|
149
|
-
arc42_template_version:
|
|
150
|
-
arc42_template_date:
|
|
151
|
-
|
|
152
|
-
|
|
196
|
+
arc42_template_version: ref.version,
|
|
197
|
+
arc42_template_date: ref.date,
|
|
198
|
+
arc42_template_language: ref.language,
|
|
199
|
+
arc42_template_source: ref.sourceRepo,
|
|
200
|
+
arc42_template_commit: ref.commitSha
|
|
153
201
|
};
|
|
154
202
|
}
|
|
155
203
|
/**
|
|
156
204
|
* Force reload the reference from submodule (useful for testing)
|
|
205
|
+
* @param language - Language code (defaults to EN)
|
|
157
206
|
*/
|
|
158
|
-
export function reloadArc42Reference() {
|
|
159
|
-
return loadArc42Reference();
|
|
207
|
+
export function reloadArc42Reference(language) {
|
|
208
|
+
return loadArc42Reference(language);
|
|
160
209
|
}
|
|
161
210
|
//# sourceMappingURL=arc42-reference.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arc42-reference.js","sourceRoot":"","sources":["../../src/templates/arc42-reference.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"arc42-reference.js","sourceRoot":"","sources":["../../src/templates/arc42-reference.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@h2nguyen/arc42-node-mcp-server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "MCP server for arc42 architecture documentation - AI-assisted architecture documentation following arc42 template",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -44,7 +44,17 @@
|
|
|
44
44
|
"email": "me@viethainguyen.de",
|
|
45
45
|
"url": "https://github.com/h2nguyen"
|
|
46
46
|
},
|
|
47
|
-
"license": "Apache-2.0",
|
|
47
|
+
"license": "(Apache-2.0 AND CC-BY-SA-4.0)",
|
|
48
|
+
"licenses": [
|
|
49
|
+
{
|
|
50
|
+
"type": "Apache-2.0",
|
|
51
|
+
"url": "https://github.com/h2nguyen/Arc42-Node-MCP-Server/blob/main/LICENSE"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"type": "CC-BY-SA-4.0",
|
|
55
|
+
"url": "https://github.com/h2nguyen/Arc42-Node-MCP-Server/blob/main/LICENSE-ARC42"
|
|
56
|
+
}
|
|
57
|
+
],
|
|
48
58
|
"repository": {
|
|
49
59
|
"type": "git",
|
|
50
60
|
"url": "https://github.com/h2nguyen/Arc42-Node-MCP-Server.git"
|