@reqlan/cli 0.1.0 → 0.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/README.md CHANGED
@@ -1,6 +1,25 @@
1
- # reqlan CLI (`reqlan` / `rq`)
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/littletuna4/reqlan/HEAD/packages/extension/media/logo.png" alt="reqlan logo" width="128" height="128">
3
+ </p>
2
4
 
3
- Command-line interface for parsing `.rq` files and analysing the workspace requirement graph.
5
+ # @reqlan/cli
6
+
7
+ CLI for parsing, analysing, and exporting reqlan requirement graphs
8
+
9
+ ## Features
10
+
11
+ - `reqlan` / `rq` Clipanion CLI for requirement workspaces
12
+ - `parse` — parse a `.rq` file and print diagnostics or an AST summary
13
+ - `analyse` / `analyze` — file, idea, or workspace graph analysis via `AnalysisApi`
14
+ - `search` — semantic search across indexed requirements (`--json` for scripting)
15
+
16
+ ## Install
17
+
18
+ ```bash
19
+ npm install -g @reqlan/cli
20
+ # or
21
+ npx @reqlan/cli --help
22
+ ```
4
23
 
5
24
  ## Commands
6
25
 
@@ -11,15 +30,49 @@ reqlan analyze # alias of analyse
11
30
  reqlan search <query> [--limit <n>] [--cwd <dir>] [--json]
12
31
  ```
13
32
 
14
- Workspace-scoped commands use `@reqlan/analytical`'s `AnalysisApi` (same headless path as MCP). Set `REQLAN_WORKSPACE` or pass `--cwd` to override the workspace root.
33
+ Set `REQLAN_WORKSPACE` or pass `--cwd` to override the workspace root.
15
34
 
16
- ## Build
35
+ The ideas index is shared application memory at `<workspace>/.reqlan/ideas-index.sqlite` (same path as the VS Code extension and MCP). Override the storage directory with `REQLAN_INDEX_PATH` when needed.
17
36
 
18
- From the monorepo root:
37
+ ## Links
19
38
 
20
- ```bash
21
- pnpm run build
22
- # or
23
- pnpm --filter @reqlan/cli run build
24
- node packages/cli/bin/cli.js --help
25
- ```
39
+ - [Site](https://tony.is-a.dev/reqlan)
40
+ - [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=reqlan.reqlan-extension)
41
+ - [Open VSX](https://open-vsx.org/extension/reqlan/reqlan-extension)
42
+ - [GitHub repository](https://github.com/littletuna4/reqlan)
43
+ - [Contact](mailto:reqlan@tony.is-a.dev)
44
+
45
+ ## Changelog
46
+
47
+ ### 0.2.0
48
+
49
+ #### Minor Changes
50
+
51
+ - 627d502: updates to cli, site export, site (showing spec), replace welcome screen, temp remove old extension name.
52
+
53
+ #### Patch Changes
54
+
55
+ - Updated dependencies [627d502]
56
+ - @reqlan/analytical@0.5.0
57
+ - @reqlan/language@1.5.0
58
+
59
+ ### 0.1.1
60
+
61
+ #### Patch Changes
62
+
63
+ - 1790ce1: Update the landers.
64
+ - Updated dependencies [1790ce1]
65
+ - @reqlan/language@1.4.1
66
+ - @reqlan/analytical@0.4.1
67
+
68
+ ### 0.1.0
69
+
70
+ #### Minor Changes
71
+
72
+ - 8ac3f82: Minor site showcase fixes, extension search functinoality, cli init.
73
+
74
+ #### Patch Changes
75
+
76
+ - Updated dependencies [8ac3f82]
77
+ - @reqlan/analytical@0.4.0
78
+ - @reqlan/language@1.4.0
@@ -0,0 +1,47 @@
1
+ <p align="center">
2
+ <img src="{{LOGO_URL}}" alt="reqlan logo" width="128" height="128">
3
+ </p>
4
+
5
+ # {{PACKAGE_NAME}}
6
+
7
+ {{DESCRIPTION}}
8
+
9
+ ## Features
10
+
11
+ - `reqlan` / `rq` Clipanion CLI for requirement workspaces
12
+ - `parse` — parse a `.rq` file and print diagnostics or an AST summary
13
+ - `analyse` / `analyze` — file, idea, or workspace graph analysis via `AnalysisApi`
14
+ - `search` — semantic search across indexed requirements (`--json` for scripting)
15
+
16
+ ## Install
17
+
18
+ ```bash
19
+ npm install -g @reqlan/cli
20
+ # or
21
+ npx @reqlan/cli --help
22
+ ```
23
+
24
+ ## Commands
25
+
26
+ ```bash
27
+ reqlan parse <file> [--json]
28
+ reqlan analyse [--file <path> | --idea <name>] [--depth <n>] [--cwd <dir>] [--json]
29
+ reqlan analyze # alias of analyse
30
+ reqlan search <query> [--limit <n>] [--cwd <dir>] [--json]
31
+ ```
32
+
33
+ Set `REQLAN_WORKSPACE` or pass `--cwd` to override the workspace root.
34
+
35
+ The ideas index is shared application memory at `<workspace>/.reqlan/ideas-index.sqlite` (same path as the VS Code extension and MCP). Override the storage directory with `REQLAN_INDEX_PATH` when needed.
36
+
37
+ ## Links
38
+
39
+ - [{{SITE_LABEL}}]({{SITE_URL}})
40
+ - [{{VSC_LABEL}}]({{VSC_URL}})
41
+ - [{{OPENVSX_LABEL}}]({{OPENVSX_URL}})
42
+ - [GitHub repository]({{GITHUB_URL}})
43
+ - [Contact]({{EMAIL_URL}})
44
+
45
+ ## Changelog
46
+
47
+ {{CHANGELOG}}
@@ -0,0 +1,17 @@
1
+ import { Command } from 'clipanion';
2
+ export declare class ExportCommand extends Command {
3
+ static paths: string[][];
4
+ static usage: import("clipanion").Usage;
5
+ output: string | undefined;
6
+ name: string;
7
+ file: string | undefined;
8
+ runtimeMode: string;
9
+ clusterStrategy: string;
10
+ excludeSecret: boolean;
11
+ urlBase: string | undefined;
12
+ headerHref: string | undefined;
13
+ headerLabel: string | undefined;
14
+ cwd: string | undefined;
15
+ json: boolean;
16
+ execute(): Promise<number>;
17
+ }
@@ -0,0 +1,137 @@
1
+ import { Command, Option } from 'clipanion';
2
+ import { resolve } from 'node:path';
3
+ import { toWorkspaceRelativePath } from '@reqlan/analytical';
4
+ import { withAnalysisApi, resolveWorkspaceRoot } from '../runtime.js';
5
+ import { emit } from '../output.js';
6
+ const RUNTIME_MODES = new Set(['interactive', 'document', 'print']);
7
+ const CLUSTER_STRATEGIES = new Set(['hybrid', 'deterministic']);
8
+ export class ExportCommand extends Command {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.output = Option.String('-o,--output', {
12
+ description: 'Parent directory for the export folder (default: <cwd>/reqlan-export)'
13
+ });
14
+ this.name = Option.String('-n,--name', 'reqlan-export', {
15
+ description: 'Export folder name (default: reqlan-export)'
16
+ });
17
+ this.file = Option.String('-f,--file', {
18
+ description: 'Export only the given .rq file and its local graph'
19
+ });
20
+ this.runtimeMode = Option.String('--runtime-mode', 'interactive', {
21
+ description: 'HTML runtime mode: interactive | document | print (default: interactive)'
22
+ });
23
+ this.clusterStrategy = Option.String('--cluster-strategy', 'hybrid', {
24
+ description: 'Cluster strategy: hybrid | deterministic (default: hybrid)'
25
+ });
26
+ this.excludeSecret = Option.Boolean('--exclude-secret', false, {
27
+ description: 'Omit ideas hosted in *.secret.rq files'
28
+ });
29
+ this.urlBase = Option.String('--url-base', {
30
+ description: 'Absolute URL prefix for the export mount (e.g. /spec or /reqlan/spec)'
31
+ });
32
+ this.headerHref = Option.String('--header-href', {
33
+ description: 'Optional topbar link href back to a parent site'
34
+ });
35
+ this.headerLabel = Option.String('--header-label', {
36
+ description: 'Optional topbar link label (requires --header-href)'
37
+ });
38
+ this.cwd = Option.String('--cwd', {
39
+ description: 'Workspace root (default: walk from cwd, or REQLAN_WORKSPACE)'
40
+ });
41
+ this.json = Option.Boolean('--json', false, {
42
+ description: 'Emit machine-readable JSON with export paths'
43
+ });
44
+ }
45
+ async execute() {
46
+ const runtimeMode = this.runtimeMode;
47
+ if (!RUNTIME_MODES.has(runtimeMode)) {
48
+ this.context.stderr.write(`Invalid --runtime-mode "${this.runtimeMode}". Expected interactive, document, or print.\n`);
49
+ return 1;
50
+ }
51
+ const clusterStrategy = this.clusterStrategy;
52
+ if (!CLUSTER_STRATEGIES.has(clusterStrategy)) {
53
+ this.context.stderr.write(`Invalid --cluster-strategy "${this.clusterStrategy}". Expected hybrid or deterministic.\n`);
54
+ return 1;
55
+ }
56
+ const headerHref = this.headerHref?.trim();
57
+ const headerLabel = this.headerLabel?.trim();
58
+ if ((headerHref && !headerLabel) || (!headerHref && headerLabel)) {
59
+ this.context.stderr.write('Both --header-href and --header-label are required when setting a header link.\n');
60
+ return 1;
61
+ }
62
+ const exportName = this.name.trim() || 'reqlan-export';
63
+ if (/[\\/]/.test(exportName)) {
64
+ this.context.stderr.write('Export name cannot contain path separators.\n');
65
+ return 1;
66
+ }
67
+ const workspaceRoot = resolveWorkspaceRoot(this.cwd);
68
+ const outputDir = resolve(this.output?.trim() || resolve(workspaceRoot, 'reqlan-export'));
69
+ const scope = this.file ? 'currentFile' : 'workspace';
70
+ const sourceFileUri = this.file
71
+ ? toWorkspaceRelativePath(resolve(workspaceRoot, this.file), workspaceRoot)
72
+ : undefined;
73
+ try {
74
+ await withAnalysisApi(this.cwd, async (api) => {
75
+ const result = await api.exportHtml({
76
+ format: 'html',
77
+ outputDir,
78
+ exportName,
79
+ templateId: 'default',
80
+ scope,
81
+ sourceFileUri,
82
+ includeRequirementsPage: true,
83
+ includeGraphPage: true,
84
+ printEntryFileName: 'print.html',
85
+ runtimeMode,
86
+ clusterStrategy,
87
+ includeIdeaPages: true,
88
+ includeFilePages: true,
89
+ includeCodeFilePages: true,
90
+ includeClusterPages: true,
91
+ includeAttributePages: true,
92
+ includePrintPages: true,
93
+ excludeSecretFiles: this.excludeSecret,
94
+ urlBase: this.urlBase?.trim() || undefined,
95
+ headerLink: headerHref && headerLabel
96
+ ? { href: headerHref, label: headerLabel }
97
+ : undefined
98
+ });
99
+ if (this.json) {
100
+ emit({
101
+ outputDir: result.outputDir,
102
+ indexFilePath: result.indexFilePath,
103
+ printFilePath: result.printFilePath,
104
+ graphFilePath: result.graphFilePath,
105
+ dataFilePath: result.dataFilePath
106
+ }, true);
107
+ return;
108
+ }
109
+ emit(`Exported HTML site to ${result.outputDir}`, false);
110
+ });
111
+ return 0;
112
+ }
113
+ catch (error) {
114
+ const message = error instanceof Error ? error.message : String(error);
115
+ this.context.stderr.write(`${message}\n`);
116
+ return 1;
117
+ }
118
+ }
119
+ }
120
+ ExportCommand.paths = [['export'], ['export', 'html']];
121
+ ExportCommand.usage = Command.Usage({
122
+ description: 'Export the requirement graph as a multi-file static HTML site.',
123
+ details: `
124
+ Writes an HTML export under <output>/<name>/.
125
+ Use --exclude-secret to omit gitignored *.secret.rq files from the export.
126
+ `,
127
+ examples: [
128
+ ['Workspace HTML export', '$0 export --output ./reqlan-export --name workspace'],
129
+ ['Public non-secret graph', '$0 export html --exclude-secret --output ./out --name spec'],
130
+ [
131
+ 'Site embed with mount + home link',
132
+ '$0 export html --exclude-secret --url-base /spec --header-href / --header-label reqlan --output ./out --name spec'
133
+ ],
134
+ ['Current-file scope', '$0 export --file ./reqlan\\ rq/cli/cli_package.rq --output ./tmp']
135
+ ]
136
+ });
137
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
package/out/main.js CHANGED
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url';
5
5
  import { ParseCommand } from './commands/parse.js';
6
6
  import { AnalyseCommand } from './commands/analyse.js';
7
7
  import { SearchCommand } from './commands/search.js';
8
+ import { ExportCommand } from './commands/export.js';
8
9
  const __dirname = dirname(fileURLToPath(import.meta.url));
9
10
  const packageJson = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf8'));
10
11
  const cli = new Cli({
@@ -17,5 +18,6 @@ cli.register(Builtins.VersionCommand);
17
18
  cli.register(ParseCommand);
18
19
  cli.register(AnalyseCommand);
19
20
  cli.register(SearchCommand);
21
+ cli.register(ExportCommand);
20
22
  await cli.runExit(process.argv.slice(2));
21
23
  //# sourceMappingURL=main.js.map
package/out/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE5F,CAAC;AAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAChB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,WAAW,CAAC,OAAO;CACrC,CAAC,CAAC;AAEH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC3B,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC7B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE5F,CAAC;AAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAChB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,WAAW,CAAC,OAAO;CACrC,CAAC,CAAC;AAEH,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC3B,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC7B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC5B,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@reqlan/cli",
3
- "description": "CLI for parsing and analysing reqlan requirement graphs",
4
- "version": "0.1.0",
3
+ "description": "CLI for parsing, analysing, and exporting reqlan requirement graphs",
4
+ "version": "0.2.0",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
7
7
  "repository": {
@@ -26,8 +26,8 @@
26
26
  "dependencies": {
27
27
  "clipanion": "3.2.1",
28
28
  "langium": "~4.3.0",
29
- "@reqlan/language": "1.4.0",
30
- "@reqlan/analytical": "0.4.0"
29
+ "@reqlan/analytical": "0.5.0",
30
+ "@reqlan/language": "1.5.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "shx": "~0.4.0"
@@ -1,2 +0,0 @@
1
- import type { Model } from 'reqlan-language';
2
- export declare function generateJavaScript(model: Model, filePath: string, destination: string | undefined): string;
package/out/generator.js DELETED
@@ -1,19 +0,0 @@
1
- import { expandToNode, joinToNode, toString } from 'langium/generate';
2
- import * as fs from 'node:fs';
3
- import * as path from 'node:path';
4
- import { extractDestinationAndName } from './util.js';
5
- export function generateJavaScript(model, filePath, destination) {
6
- const data = extractDestinationAndName(filePath, destination);
7
- const generatedFilePath = `${path.join(data.destination, data.name)}.js`;
8
- const fileNode = expandToNode `
9
- "use strict";
10
-
11
- ${joinToNode(model.elements, (element) => `// ${element.$type}`, { appendNewLineIfNotEmpty: true })}
12
- `.appendNewLineIfNotEmpty();
13
- if (!fs.existsSync(data.destination)) {
14
- fs.mkdirSync(data.destination, { recursive: true });
15
- }
16
- fs.writeFileSync(generatedFilePath, toString(fileNode));
17
- return generatedFilePath;
18
- }
19
- //# sourceMappingURL=generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,KAAY,EAAE,QAAgB,EAAE,WAA+B;IAC9F,MAAM,IAAI,GAAG,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAEzE,MAAM,QAAQ,GAAG,YAAY,CAAA;;;UAGvB,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAwB,EAAE,EAAE,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC;KACvH,CAAC,uBAAuB,EAAE,CAAC;IAE5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,OAAO,iBAAiB,CAAC;AAC7B,CAAC"}