
Research
/Security News
Mini Shai-Hulud Campaign Hits Red Hat Cloud Services npm Packages
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.
@finos/calm-cli
Advanced tools
A set of tools for interacting with the Common Architecture Language Model (CALM)
A command line interface to interact with the CALM schema. You can use these tools to create an architecture from a CALM pattern, or validate that an architecture conforms to a given pattern.
Install the CLI on to your machine with this command:
% npm install -g @finos/calm-cli
or if you use Homebrew:
brew install calm-cli
Type calm into your terminal, and you should see the help text printed out.
% calm
Usage: calm [options] [command]
A set of tools for interacting with the Common Architecture Language Model (CALM)
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
generate [options] Generate an architecture from a CALM pattern file.
validate [options] Validate that an architecture conforms to a given CALM pattern.
template [options] Generate files from a CALM model using a Handlebars template bundle.
docify [options] Generate a documentation website off your CALM model.
init-ai [options] Augment a git repository with AI assistance for CALM
help [command] display help for command
This command lets you create a shell of an architecture from a pattern file.
You can try it out using the example patterns provided in this repo under calm/pattern.
calm
Usage: calm generate [options]
Generate an architecture from a CALM pattern file.
Options:
-p, --pattern <file> Path to the pattern file to use. May be a file path or a URL.
-o, --output <file> Path location at which to output the generated file. (default: "architecture.json")
-s, --schema-directory <path> Path to the directory containing the meta schemas to use. (default: "../calm/release")
-c, --calm-hub-url <url> URL to CalmHub to use when loading documents.
-v, --verbose Enable verbose logging. (default: false)
-h, --help display help for command
The most simple way to use this command is to call it with only the pattern option, which will generate an architecture with the default filename architecture.json in the current working directory.
% calm generate -p ./conferences/osff-ln-2025/workshop/conference-signup.pattern.json
This command will tell you if an architecture matches a pattern that you provide. If it doesn't, then it will output a list of problems that you can address to help your architecture conform to the pattern.
% calm validate --help
Usage: calm validate [options]
Validate that an architecture conforms to a given CALM pattern.
Options:
-p, --pattern <file> Path to the pattern file to use. May be a file path or a URL.
-a, --architecture <file> Path to the pattern architecture file to use. May be a file path or a URL.
-s, --schema-directory <path> Path to the directory containing the meta schemas to use. (default: "../calm/release")
-c, --calm-hub-url <url> URL to CalmHub to use when loading documents.
--strict When run in strict mode, the CLI will fail if any warnings are reported. (default: false)
-f, --format <format> The format of the output (choices: "json", "junit", default: "json")
-o, --output <file> Path location at which to output the generated file.
-v, --verbose Enable verbose logging. (default: false)
-h, --help display help for command
This command can output warnings and errors - the command will only exit with an error code if there are errors present in the output. Warnings are sometimes provided as hints about how to improve the architecture, but they are not essential for the architecture to match the pattern.
If you were to try and generate an architecture from the conference pattern, and then validate the architecture against that pattern like this
% calm generate -p ./conferences/osff-ln-2025/workshop/conference-signup.pattern.json -o ./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json
% calm validate -p ./conferences/osff-ln-2025/workshop/conference-signup.pattern.json -a ./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json
You would get an output which includes a warning like this:
...
{
"jsonSchemaValidationOutputs": [],
"spectralSchemaValidationOutputs": [
{
"code": "architecture-has-no-placeholder-properties-string",
"severity": "warning",
"message": "String placeholder detected in architecture.",
"path": "/nodes/conference-website/interfaces/conference-website-url/url",
"schemaPath": "",
"line_start": 11,
"line_end": 11,
"character_start": 17,
"character_end": 28
},
{
"code": "architecture-has-no-placeholder-properties-string",
"severity": "warning",
"message": "String placeholder detected in architecture.",
"path": "/nodes/load-balancer/interfaces/load-balancer-host-port/host",
"schemaPath": "",
"line_start": 23,
"line_end": 23,
"character_start": 18,
"character_end": 30
},
{
"code": "architecture-has-no-placeholder-properties-numerical",
"severity": "warning",
"message": "Numerical placeholder (-1) detected in architecture.",
"path": "/nodes/load-balancer/interfaces/load-balancer-host-port/port",
"schemaPath": "",
"line_start": 24,
"line_end": 24,
"character_start": 18,
"character_end": 20
},
{
"code": "architecture-has-no-placeholder-properties-string",
"severity": "warning",
"message": "String placeholder detected in architecture.",
"path": "/nodes/attendees/interfaces/attendees-image/image",
"schemaPath": "",
"line_start": 36,
"line_end": 36,
"character_start": 19,
"character_end": 32
},
{
"code": "architecture-has-no-placeholder-properties-numerical",
"severity": "warning",
"message": "Numerical placeholder (-1) detected in architecture.",
"path": "/nodes/attendees/interfaces/attendees-port/port",
"schemaPath": "",
"line_start": 40,
"line_end": 40,
"character_start": 18,
"character_end": 20
},
{
"code": "architecture-has-no-placeholder-properties-string",
"severity": "warning",
"message": "String placeholder detected in architecture.",
"path": "/nodes/attendees-store/interfaces/database-image/image",
"schemaPath": "",
"line_start": 52,
"line_end": 52,
"character_start": 19,
"character_end": 32
},
{
"code": "architecture-has-no-placeholder-properties-numerical",
"severity": "warning",
"message": "Numerical placeholder (-1) detected in architecture.",
"path": "/nodes/attendees-store/interfaces/database-port/port",
"schemaPath": "",
"line_start": 56,
"line_end": 56,
"character_start": 18,
"character_end": 20
}
],
"hasErrors": false,
"hasWarnings": true
}
...
You can also request pretty text output, which shows the same paths and the exact source lines/columns:
Summary
- Errors: no (0)
- Warnings: yes (7)
- Info/Hints: 0
WARN issues:
- In conference-signup.arch.json (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json):
WARN architecture-has-no-placeholder-properties-string: String placeholder detected in architecture.
path: /nodes/conference-website/interfaces/conference-website-url/url
at line 11, col 18 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
11 | "url": "[[ URL ]]"
| ^^^^^^^^^^^
WARN architecture-has-no-placeholder-properties-string: String placeholder detected in architecture.
path: /nodes/load-balancer/interfaces/load-balancer-host-port/host
at line 23, col 19 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
23 | "host": "[[ HOST ]]",
| ^^^^^^^^^^^^
WARN architecture-has-no-placeholder-properties-numerical: Numerical placeholder (-1) detected in architecture.
path: /nodes/load-balancer/interfaces/load-balancer-host-port/port
at line 24, col 19 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
24 | "port": -1
| ^^
WARN architecture-has-no-placeholder-properties-string: String placeholder detected in architecture.
path: /nodes/attendees/interfaces/attendees-image/image
at line 36, col 20 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
36 | "image": "[[ IMAGE ]]"
| ^^^^^^^^^^^^^
WARN architecture-has-no-placeholder-properties-numerical: Numerical placeholder (-1) detected in architecture.
path: /nodes/attendees/interfaces/attendees-port/port
at line 40, col 19 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
40 | "port": -1
| ^^
WARN architecture-has-no-placeholder-properties-string: String placeholder detected in architecture.
path: /nodes/attendees-store/interfaces/database-image/image
at line 52, col 20 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
52 | "image": "[[ IMAGE ]]"
| ^^^^^^^^^^^^^
WARN architecture-has-no-placeholder-properties-numerical: Numerical placeholder (-1) detected in architecture.
path: /nodes/attendees-store/interfaces/database-port/port
at line 56, col 19 (./conferences/osff-ln-2025/workshop/architecture/conference-signup.arch.json)
56 | "port": -1
| ^^
which is just letting you know that you have left in some placeholder values which might have been generated with the generate command. This isn't a full break, but it implies that you've forgotten to fill out a detail in your architecture.
The init-ai command sets up AI-powered development assistance for CALM architecture modeling by configuring a specialized VSCode agent with comprehensive tool prompts. At present two AI Assistant providers are supported: Github Copilot and AWS Kiro.
calm init-ai --help
Usage: calm init-ai [options]
Augment a git repository with AI assistance for CALM
Options:
-p, --provider <provider> AI provider to initialize (choices: "copilot", "kiro")
-d, --directory <path> Target directory (defaults to current directory) (default: ".")
-v, --verbose Enable verbose logging. (default: false)
-h, --help display help for command
This command creates a custom chat prompt configuration for the specified that provides AI assistance with specialized knowledge about CALM architecture modeling, including:
To set up AI assistance for your CALM project:
# In your project directory
calm init-ai -p <provider>
# Or specify a different directory
calm init-ai -p <provider> --directory /path/to/your/calm-project
This will create the necessary IDE-specific configuration files to enable CALM-specific AI assistance. Once set up, you can use GitHub Copilot Chat with specialized CALM tools that understand schema requirements, validation rules, and best practices.
The agent includes specialized tools for each CALM component:
Each tool includes complete schema definitions, validation rules, realistic examples, and cross-references to related tools.
The CALM Template system allows users to generate different machine or human-readable outputs from a CALM model by providing a template bundle.
calm template --help
Usage: calm template [options]
Generate files from a CALM model using a Handlebars template bundle.
Options:
-a, --architecture <path> Path to the CALM model JSON file.
-o, --output <path> Path to output directory.
--clear-output-directory Completely delete the contents of the output path before generation.
-b, --bundle <path> Path to the template bundle directory.
-t, --template <path> Path to a single .hbs or .md template file
-d, --template-dir <path> Path to a directory of .hbs/.md templates
-u, --url-to-local-file-mapping <path> Path to mapping file which maps URLs to local paths.
-v, --verbose Enable verbose logging. (default: false)
-h, --help display help for command
calm template will create the output directory if it does not exist.
If the output directory exists, files will be modified if they already
exist. Files that are not in the template bundle will be unmodified.
The --clear-output-directory option changes this behaviour to delete all
files and subdirectories from the output path first.
A template bundle consists of:
index.json: Defines the structure of the template and how it maps to CALM model elements.
A CalmTemplateTransformer implementation: Transforms the CALM model into a format that can be rendered by Handlebars.
Handlebar templates define the final output format.
The --url-to-local-file-mapping option allows you to provide a JSON file that maps external URLs to local files.
This is useful when working with files that are not yet published but are referenced in the model.
Example content
```json
{
"https://calm.finos.org/docuflow/flow/document-upload": "flows/flow-document-upload.json"
}
```
Sample usage would be as follows (assuming at root of project)
calm template -a ./cli/test_fixtures/template/model/document-system.json -b cli/test_fixtures/template/template-bundles/doc-system -o one_pager -u cli/test_fixtures/template/model/url-to-file-directory.json -v
The CALM Docify command generates documentation from a CALM model.
calm docify --help
Usage: calm docify [options]
Generate a documentation website off your CALM model.
Options:
-a, --architecture <path> Path to the CALM model JSON file.
-o, --output <path> Path to output directory.
--clear-output-directory Completely delete the contents of the output path before generation.
--scaffold Generate scaffold only (templates with placeholders, no rendering).
-t, --template <path> Path to a single .hbs or .md template file
-d, --template-dir <path> Path to a directory of .hbs/.md templates
-u, --url-to-local-file-mapping <path> Path to mapping file which maps URLs to local paths.
-v, --verbose Enable verbose logging. (default: false)
-h, --help display help for command
calm docify will create the output directory if it does not exist.
If the output directory exists, files will be modified if they already
exist. Other files will be unmodified.
The --clear-output-directory option changes this behaviour to delete all
files and subdirectories from the output path first.
Scaffold mode enables a two-stage documentation workflow where you can review and edit generated templates before final rendering:
# Stage 1: Generate scaffold with widget placeholders
calm docify --scaffold -a ./architecture.json -o ./website
# Edit generated MDX files in ./website/docs/ as needed
# Stage 2: Render final website from scaffolded templates
calm docify -a ./architecture.json --template-dir ./website -o ./final-site
This allows architects to customize the documentation before deployment, ensuring that what's previewed in the VSCode extension matches the final output.
Sample usage for you to try is as follows (assuming at root of project)
calm docify -a ./cli/test_fixtures/template/model/document-system.json -o ./output/documentation -u ./cli/test_fixtures/template/model/url-to-file-directory.json
Frontmatter can be used in templates to provide default options for any widgets used:
---
widget-options:
block-architecture:
render-node-type-shapes: true
---
These two are the same:
{{ block-architecture }}
and
{{ block-architecture render-node-type-shapes=true }}
This differs:
{{ block-architecture render-node-type-shapes=false }}
FAQs
A set of tools for interacting with the Common Architecture Language Model (CALM)
The npm package @finos/calm-cli receives a total of 581 weekly downloads. As such, @finos/calm-cli popularity was classified as not popular.
We found that @finos/calm-cli demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
A mini Shai-Hulud campaign compromised Red Hat Cloud Services npm packages to steal developer and CI/CD secrets during installation.

Research
/Security News
The North Korean malware loader hides in a Packagist-listed package and its GitHub branch to fetch and execute remote code in a likely Contagious Interview-style lure.

Security News
The Rust project is moving toward formal rules on LLM use in contributions after months of internal debate over maintainer burden, code quality, and contributor experience.