@c8y/websdk 1023.81.3 → 1023.82.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 +111 -0
- package/dist/ng-add/ai-tools-configure.d.ts +10 -0
- package/dist/ng-add/ai-tools-configure.js +318 -0
- package/dist/ng-add/ai-tools-configure.js.map +1 -0
- package/dist/ng-add/index.js +60 -0
- package/dist/ng-add/index.js.map +1 -1
- package/dist/ng-add/ng-add.model.d.ts +1 -0
- package/dist/templates/ai-configs/claude/CLAUDE.md +98 -0
- package/dist/templates/ai-configs/claude/rules/e2e-tests.instructions.md +187 -0
- package/dist/templates/ai-configs/claude/rules/frontend.instructions.md +251 -0
- package/dist/templates/ai-configs/claude/rules/unit-tests.instructions.md +172 -0
- package/dist/templates/ai-configs/cursor/cursor.mdc +98 -0
- package/dist/templates/ai-configs/cursor/rules/e2e-tests.instructions.md +187 -0
- package/dist/templates/ai-configs/cursor/rules/frontend.instructions.md +251 -0
- package/dist/templates/ai-configs/cursor/rules/unit-tests.instructions.md +172 -0
- package/dist/templates/ai-configs/gemini/GEMINI.md +98 -0
- package/dist/templates/ai-configs/gemini/rules/e2e-tests.instructions.md +181 -0
- package/dist/templates/ai-configs/gemini/rules/frontend.instructions.md +247 -0
- package/dist/templates/ai-configs/gemini/rules/unit-tests.instructions.md +166 -0
- package/dist/templates/ai-configs/github/copilot-instructions.md +98 -0
- package/dist/templates/ai-configs/github/instructions/e2e-tests.instructions.md +187 -0
- package/dist/templates/ai-configs/github/instructions/frontend.instructions.md +251 -0
- package/dist/templates/ai-configs/github/instructions/unit-tests.instructions.md +172 -0
- package/dist/templates/ai-configs/jetbrains/guidelines.md +98 -0
- package/dist/templates/ai-configs/jetbrains/rules/e2e-tests.instructions.md +181 -0
- package/dist/templates/ai-configs/jetbrains/rules/frontend.instructions.md +247 -0
- package/dist/templates/ai-configs/jetbrains/rules/unit-tests.instructions.md +166 -0
- package/dist/templates/ai-configs/windsurf/guidelines.md +98 -0
- package/dist/templates/ai-configs/windsurf/rules/e2e-tests.instructions.md +187 -0
- package/dist/templates/ai-configs/windsurf/rules/frontend.instructions.md +251 -0
- package/dist/templates/ai-configs/windsurf/rules/unit-tests.instructions.md +172 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -39,6 +39,117 @@ ng add @c8y/websdk --application=@c8y/<appName>@<version> --skip-confirmation
|
|
|
39
39
|
> - `<appName>` must be one of the following: administration, application, cockpit, codex, devicemanagement, hybrid, package-blueprint, tutorial, sample-plugin.
|
|
40
40
|
> - `<version>` denotes the specific package version listed in the npm registry.
|
|
41
41
|
|
|
42
|
+
## AI Tools Configuration
|
|
43
|
+
|
|
44
|
+
During the `ng add` process, you will be prompted to configure AI coding assistants with Cumulocity Web SDK best practices. This setup provides your AI tools with context about Angular patterns, TypeScript conventions, accessibility requirements, and Cumulocity-specific guidelines.
|
|
45
|
+
|
|
46
|
+
### Configuration Modes
|
|
47
|
+
|
|
48
|
+
**Interactive Mode (default)**
|
|
49
|
+
|
|
50
|
+
When running `ng add @c8y/websdk` without the `--skip-confirmation` flag, you'll be prompted to select which AI tools to configure:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
ng add @c8y/websdk
|
|
54
|
+
# Prompts for base project, version, and AI tools selection
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Non-Interactive Mode**
|
|
58
|
+
|
|
59
|
+
Skip AI tools configuration entirely using `--skip-confirmation`:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
ng add @c8y/websdk --application=@c8y/cockpit@1.0.0 --skip-confirmation
|
|
63
|
+
# No AI tools configured
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Explicit AI Tools Selection**
|
|
67
|
+
|
|
68
|
+
Use the `--ai-tools` flag to specify tools without interactive prompts:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Configure specific tools (comma-separated)
|
|
72
|
+
ng add @c8y/websdk --ai-tools=claude,github-copilot,gemini
|
|
73
|
+
|
|
74
|
+
# Explicitly skip AI tools configuration
|
|
75
|
+
ng add @c8y/websdk --ai-tools=none
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Valid tool names: `claude`, `github-copilot`, `cursor`, `jetbrains-ai`, `windsurf`, `gemini`
|
|
79
|
+
|
|
80
|
+
> **Note**: The `--ai-tools` flag takes precedence over `--skip-confirmation`. If both are provided, only the tools specified in `--ai-tools` will be configured.
|
|
81
|
+
|
|
82
|
+
### Supported AI Tools
|
|
83
|
+
|
|
84
|
+
- **Claude** — [Documentation](https://docs.anthropic.com/en/docs/claude-code/memory)
|
|
85
|
+
- **Cursor** — [Documentation](https://cursor.com/docs/rules)
|
|
86
|
+
- **Gemini** — [Documentation](https://geminicli.com/docs/cli/gemini-md)
|
|
87
|
+
- **GitHub Copilot** — [Documentation](https://code.visualstudio.com/docs/copilot/copilot-customization)
|
|
88
|
+
- **JetBrains AI** — [Documentation](https://www.jetbrains.com/help/junie/customize-guidelines.html)
|
|
89
|
+
- **Windsurf** — [Documentation](https://docs.windsurf.com/windsurf/cascade/memories)
|
|
90
|
+
|
|
91
|
+
You can select multiple tools during setup or skip configuration entirely by choosing "None".
|
|
92
|
+
|
|
93
|
+
### What Gets Configured
|
|
94
|
+
|
|
95
|
+
The schematic copies curated instruction files to your project, based on official Cumulocity Web SDK guidelines adapted for standalone Angular applications. Each tool receives the same core content, tailored to its specific configuration format:
|
|
96
|
+
|
|
97
|
+
#### Claude
|
|
98
|
+
- **Main file**: `.claude/CLAUDE.md` — Web SDK project identity and core best practices
|
|
99
|
+
- **Rules**: `.claude/rules/*.instructions.md` — Specialized guidelines (frontend, testing, etc.)
|
|
100
|
+
- **Frontmatter**: Preserved with `name`, `description` fields; `applyTo`/`paths` removed from frontend rules (applies universally)
|
|
101
|
+
|
|
102
|
+
#### GitHub Copilot
|
|
103
|
+
- **Main file**: `.github/copilot-instructions.md` — Project-wide Web SDK instructions
|
|
104
|
+
- **Rules**: `.github/instructions/*.instructions.md` — Domain-specific instructions
|
|
105
|
+
- **Frontmatter**: Preserved with `name`, `description` fields; `applyTo`/`paths` removed from frontend rules (applies universally)
|
|
106
|
+
|
|
107
|
+
#### Cursor
|
|
108
|
+
- **Main file**: `.cursor/rules/cursor.mdc` — Project context with high priority
|
|
109
|
+
- **Rules**: `.cursor/rules/*.mdc` — Transformed from `.instructions.md` to `.mdc` format
|
|
110
|
+
- **Frontmatter**: Transformed to Cursor format (`description`, `globs`, `alwaysApply`)
|
|
111
|
+
- Frontend rules: `alwaysApply: false` (universal application)
|
|
112
|
+
- Test rules: `globs` array for file pattern matching
|
|
113
|
+
|
|
114
|
+
#### Windsurf
|
|
115
|
+
- **Main file**: `.windsurf/rules/guidelines.md` — Always-on project guidelines
|
|
116
|
+
- **Rules**: `.windsurf/rules/*.md` — Specialized guidelines
|
|
117
|
+
- **Frontmatter**: Transformed to Windsurf format (`trigger`, `globs`)
|
|
118
|
+
- Frontend rules: `trigger: always_on`
|
|
119
|
+
- Test rules: `trigger: glob` with file patterns
|
|
120
|
+
|
|
121
|
+
#### JetBrains AI
|
|
122
|
+
- **Single file**: `.junie/guidelines.md` — All guidelines merged into one document
|
|
123
|
+
- **Structure**: Main content followed by section headers for each rule type
|
|
124
|
+
- **Frontmatter**: Completely stripped (JetBrains doesn't use frontmatter)
|
|
125
|
+
|
|
126
|
+
#### Gemini
|
|
127
|
+
- **Main file**: `.gemini/GEMINI.md` — Core guidelines with import references
|
|
128
|
+
- **Rules**: `.gemini/rules/*.instructions.md` — Imported rule files
|
|
129
|
+
- **Frontmatter**: Completely stripped (Gemini doesn't use frontmatter)
|
|
130
|
+
- **Imports**: Main file includes `@./.gemini/rules/<filename>` references
|
|
131
|
+
|
|
132
|
+
### Base Content
|
|
133
|
+
|
|
134
|
+
All configurations are adapted from official Cumulocity guidelines, customized for standalone Angular applications:
|
|
135
|
+
|
|
136
|
+
- **MAIN_INSTRUCTIONS.md** — Project overview tailored for Web SDK apps, TypeScript rules, Angular patterns, accessibility requirements, references to public [Cumulocity tutorial repository](https://github.com/Cumulocity-IoT/tutorial)
|
|
137
|
+
- **rules/frontend.instructions.md** — Angular/TypeScript UI development guidelines (no monorepo-specific references)
|
|
138
|
+
- **rules/e2e-tests.instructions.md** — Cypress end-to-end testing patterns (simplified for app development)
|
|
139
|
+
- **rules/unit-tests.instructions.md** — Jest unit testing conventions
|
|
140
|
+
|
|
141
|
+
These files are specifically designed for developers building custom Cumulocity applications with `ng add @c8y/websdk`, with all monorepo and internal tooling references removed. They are stored in `packages/websdk/ai-instructions/` and they are based on `.claude/` files but context of monorepo is removed.
|
|
142
|
+
|
|
143
|
+
### File Updates
|
|
144
|
+
|
|
145
|
+
The schematic intelligently handles existing files:
|
|
146
|
+
|
|
147
|
+
- **Matching filenames**: Overwrites with latest guidelines (e.g., `CLAUDE.md`, `frontend.instructions.md`)
|
|
148
|
+
- **Custom files**: Preserves any files that don't match the standard template names
|
|
149
|
+
- **Directories**: Creates if missing; never deletes existing directories or unrecognized files
|
|
150
|
+
|
|
151
|
+
This approach allows you to maintain custom AI instructions alongside the official Cumulocity guidelines.
|
|
152
|
+
|
|
42
153
|
## Run development server & build
|
|
43
154
|
|
|
44
155
|
Launch the development server:
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SchematicContext, Tree } from '@angular-devkit/schematics';
|
|
2
|
+
declare const validAiTools: readonly ["claude", "github-copilot", "cursor", "jetbrains-ai", "windsurf", "gemini"];
|
|
3
|
+
export type AiTool = (typeof validAiTools)[number];
|
|
4
|
+
/**
|
|
5
|
+
* Parse the --ai-tools flag value
|
|
6
|
+
* Supports: --ai-tools=none or --ai-tools=claude,github-copilot,gemini
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseAiToolsFlag(aiToolsFlag: string, context: SchematicContext): AiTool[];
|
|
9
|
+
export declare function configureAiTools(selectedTools: AiTool[], tree: Tree, context: SchematicContext): Promise<void>;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAiToolsFlag = parseAiToolsFlag;
|
|
4
|
+
exports.configureAiTools = configureAiTools;
|
|
5
|
+
const fs_extra_1 = require("fs-extra");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const validAiTools = [
|
|
8
|
+
'claude',
|
|
9
|
+
'github-copilot',
|
|
10
|
+
'cursor',
|
|
11
|
+
'jetbrains-ai',
|
|
12
|
+
'windsurf',
|
|
13
|
+
'gemini'
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Parse the --ai-tools flag value
|
|
17
|
+
* Supports: --ai-tools=none or --ai-tools=claude,github-copilot,gemini
|
|
18
|
+
*/
|
|
19
|
+
function parseAiToolsFlag(aiToolsFlag, context) {
|
|
20
|
+
const trimmed = aiToolsFlag.trim().toLowerCase();
|
|
21
|
+
// Handle --ai-tools=none
|
|
22
|
+
if (trimmed === 'none' || trimmed === '') {
|
|
23
|
+
context.logger.info('No AI tools will be configured (--ai-tools=none)');
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const requestedTools = trimmed.split(',').map(t => t.trim());
|
|
27
|
+
const selectedTools = [];
|
|
28
|
+
const invalidTools = [];
|
|
29
|
+
for (const tool of requestedTools) {
|
|
30
|
+
if (validAiTools.includes(tool)) {
|
|
31
|
+
selectedTools.push(tool);
|
|
32
|
+
}
|
|
33
|
+
else if (tool) {
|
|
34
|
+
invalidTools.push(tool);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (invalidTools.length > 0) {
|
|
38
|
+
context.logger.warn(`Invalid AI tools specified: ${invalidTools.join(', ')}. Valid options: ${validAiTools.join(', ')}`);
|
|
39
|
+
}
|
|
40
|
+
if (selectedTools.length > 0) {
|
|
41
|
+
context.logger.info(`Configuring AI tools: ${selectedTools.join(', ')}`);
|
|
42
|
+
}
|
|
43
|
+
return selectedTools;
|
|
44
|
+
}
|
|
45
|
+
async function configureAiTools(selectedTools, tree, context) {
|
|
46
|
+
if (selectedTools.length === 0) {
|
|
47
|
+
context.logger.info('Skipping AI tools configuration.');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const templatesPath = (0, path_1.join)(__dirname, '../templates/ai-configs');
|
|
51
|
+
for (const tool of selectedTools) {
|
|
52
|
+
try {
|
|
53
|
+
if (tool === 'claude') {
|
|
54
|
+
await configureClaude(templatesPath, tree, context);
|
|
55
|
+
}
|
|
56
|
+
else if (tool === 'github-copilot') {
|
|
57
|
+
await configureGitHubCopilot(templatesPath, tree, context);
|
|
58
|
+
}
|
|
59
|
+
else if (tool === 'cursor') {
|
|
60
|
+
await configureCursor(templatesPath, tree, context);
|
|
61
|
+
}
|
|
62
|
+
else if (tool === 'jetbrains-ai') {
|
|
63
|
+
await configureJetBrainsAI(templatesPath, tree, context);
|
|
64
|
+
}
|
|
65
|
+
else if (tool === 'windsurf') {
|
|
66
|
+
await configureWindsurf(templatesPath, tree, context);
|
|
67
|
+
}
|
|
68
|
+
else if (tool === 'gemini') {
|
|
69
|
+
await configureGemini(templatesPath, tree, context);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
74
|
+
context.logger.warn(`Failed to configure ${tool}: ${errorMessage}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function configureClaude(templatesPath, tree, context) {
|
|
79
|
+
context.logger.info('Configuring Claude with Cumulocity Web SDK best practices...');
|
|
80
|
+
const claudePath = (0, path_1.join)(templatesPath, 'claude');
|
|
81
|
+
// Copy CLAUDE.md (overwrite if exists)
|
|
82
|
+
const claudeMdPath = '.claude/CLAUDE.md';
|
|
83
|
+
const claudeMdContent = await (0, fs_extra_1.readFile)((0, path_1.join)(claudePath, 'CLAUDE.md'), 'utf-8');
|
|
84
|
+
if (tree.exists(claudeMdPath)) {
|
|
85
|
+
tree.overwrite(claudeMdPath, claudeMdContent);
|
|
86
|
+
context.logger.info(' → Updated existing CLAUDE.md');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
tree.create(claudeMdPath, claudeMdContent);
|
|
90
|
+
context.logger.info(' → Created CLAUDE.md');
|
|
91
|
+
}
|
|
92
|
+
// Copy rules files (add/overwrite without clearing existing folder)
|
|
93
|
+
const rulesPath = (0, path_1.join)(claudePath, 'rules');
|
|
94
|
+
const rulesFiles = await (0, fs_extra_1.readdir)(rulesPath);
|
|
95
|
+
for (const file of rulesFiles) {
|
|
96
|
+
const rulePath = `.claude/rules/${file}`;
|
|
97
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(rulesPath, file), 'utf-8');
|
|
98
|
+
if (tree.exists(rulePath)) {
|
|
99
|
+
tree.overwrite(rulePath, content);
|
|
100
|
+
context.logger.info(` → Updated ${file}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
tree.create(rulePath, content);
|
|
104
|
+
context.logger.info(` → Created ${file}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
context.logger.info('✓ Claude configuration completed in .claude/');
|
|
108
|
+
}
|
|
109
|
+
async function configureGitHubCopilot(templatesPath, tree, context) {
|
|
110
|
+
context.logger.info('Configuring GitHub Copilot with Cumulocity Web SDK best practices...');
|
|
111
|
+
const githubPath = (0, path_1.join)(templatesPath, 'github');
|
|
112
|
+
// Copy copilot-instructions.md (overwrite if exists)
|
|
113
|
+
const copilotInstructionsPath = '.github/copilot-instructions.md';
|
|
114
|
+
const copilotInstructionsContent = await (0, fs_extra_1.readFile)((0, path_1.join)(githubPath, 'copilot-instructions.md'), 'utf-8');
|
|
115
|
+
if (tree.exists(copilotInstructionsPath)) {
|
|
116
|
+
tree.overwrite(copilotInstructionsPath, copilotInstructionsContent);
|
|
117
|
+
context.logger.info(' → Updated existing copilot-instructions.md');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
tree.create(copilotInstructionsPath, copilotInstructionsContent);
|
|
121
|
+
context.logger.info(' → Created copilot-instructions.md');
|
|
122
|
+
}
|
|
123
|
+
// Copy instructions files (add/overwrite without clearing existing folder)
|
|
124
|
+
const instructionsPath = (0, path_1.join)(githubPath, 'instructions');
|
|
125
|
+
const instructionsFiles = await (0, fs_extra_1.readdir)(instructionsPath);
|
|
126
|
+
for (const file of instructionsFiles) {
|
|
127
|
+
const instructionPath = `.github/instructions/${file}`;
|
|
128
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(instructionsPath, file), 'utf-8');
|
|
129
|
+
if (tree.exists(instructionPath)) {
|
|
130
|
+
tree.overwrite(instructionPath, content);
|
|
131
|
+
context.logger.info(` → Updated ${file}`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
tree.create(instructionPath, content);
|
|
135
|
+
context.logger.info(` → Created ${file}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
context.logger.info('✓ GitHub Copilot configuration completed in .github/');
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Transform frontmatter from Claude format to Cursor format
|
|
142
|
+
* Converts applyTo/paths to globs array
|
|
143
|
+
*/
|
|
144
|
+
function transformFrontmatterToCursor(content) {
|
|
145
|
+
// More robust regex to handle different line endings and spacing
|
|
146
|
+
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n+([\s\S]*)$/);
|
|
147
|
+
if (!frontmatterMatch) {
|
|
148
|
+
return content;
|
|
149
|
+
}
|
|
150
|
+
const [, frontmatterContent, bodyContent] = frontmatterMatch;
|
|
151
|
+
const applyToMatch = frontmatterContent.match(/applyTo:\s*"([^"]+)"/);
|
|
152
|
+
// Extract description (handle both single and double quotes)
|
|
153
|
+
const descriptionMatch = frontmatterContent.match(/description:\s*["']([^"']+)["']/);
|
|
154
|
+
const description = descriptionMatch ? descriptionMatch[1] : '';
|
|
155
|
+
if (!applyToMatch) {
|
|
156
|
+
// No applyTo, use description for intelligent application
|
|
157
|
+
return `---\ndescription: "${description}"\nalwaysApply: false\n---\n\n${bodyContent}`;
|
|
158
|
+
}
|
|
159
|
+
const globs = applyToMatch[1].split(',').map(g => g.trim());
|
|
160
|
+
const globsYaml = globs.map(g => ` - "${g}"`).join('\n');
|
|
161
|
+
return `---\ndescription: "${description}"\nglobs:\n${globsYaml}\nalwaysApply: false\n---\n\n${bodyContent}`;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Transform frontmatter from Claude format to Windsurf format
|
|
165
|
+
* Converts applyTo/paths to trigger: glob + globs array
|
|
166
|
+
*/
|
|
167
|
+
function transformFrontmatterToWindsurf(content) {
|
|
168
|
+
// More robust regex to handle different line endings
|
|
169
|
+
const frontmatterMatch = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n+([\s\S]*)$/);
|
|
170
|
+
if (!frontmatterMatch) {
|
|
171
|
+
return content;
|
|
172
|
+
}
|
|
173
|
+
const [, frontmatterContent, bodyContent] = frontmatterMatch;
|
|
174
|
+
const applyToMatch = frontmatterContent.match(/applyTo:\s*"([^"]+)"/);
|
|
175
|
+
if (!applyToMatch) {
|
|
176
|
+
// No applyTo, make it always on
|
|
177
|
+
return `---\ntrigger: always_on\n---\n\n${bodyContent}`;
|
|
178
|
+
}
|
|
179
|
+
const globs = applyToMatch[1].split(',').map(g => g.trim());
|
|
180
|
+
const globsYaml = globs.map(g => ` - "${g}"`).join('\n');
|
|
181
|
+
return `---\ntrigger: glob\nglobs:\n${globsYaml}\n---\n\n${bodyContent}`;
|
|
182
|
+
}
|
|
183
|
+
async function configureCursor(templatesPath, tree, context) {
|
|
184
|
+
context.logger.info('Configuring Cursor with Cumulocity Web SDK best practices...');
|
|
185
|
+
const cursorPath = (0, path_1.join)(templatesPath, 'cursor');
|
|
186
|
+
// Copy main file as .mdc (overwrite if exists)
|
|
187
|
+
const mainFilePath = '.cursor/rules/cursor.mdc';
|
|
188
|
+
const mainContent = await (0, fs_extra_1.readFile)((0, path_1.join)(cursorPath, 'cursor.mdc'), 'utf-8');
|
|
189
|
+
// Add Cursor-specific frontmatter
|
|
190
|
+
const contentWithFrontmatter = `---
|
|
191
|
+
description: "Cumulocity project-wide rules and workflows"
|
|
192
|
+
alwaysApply: true
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
${mainContent}`;
|
|
196
|
+
if (tree.exists(mainFilePath)) {
|
|
197
|
+
tree.overwrite(mainFilePath, contentWithFrontmatter);
|
|
198
|
+
context.logger.info(' → Updated existing cursor.mdc');
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
tree.create(mainFilePath, contentWithFrontmatter);
|
|
202
|
+
context.logger.info(' → Created cursor.mdc');
|
|
203
|
+
}
|
|
204
|
+
// Copy rules files with transformed frontmatter
|
|
205
|
+
const rulesPath = (0, path_1.join)(cursorPath, 'rules');
|
|
206
|
+
const rulesFiles = await (0, fs_extra_1.readdir)(rulesPath);
|
|
207
|
+
for (const file of rulesFiles) {
|
|
208
|
+
const rulePath = `.cursor/rules/${file.replace('.md', '.mdc')}`;
|
|
209
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(rulesPath, file), 'utf-8');
|
|
210
|
+
const transformedContent = transformFrontmatterToCursor(content);
|
|
211
|
+
if (tree.exists(rulePath)) {
|
|
212
|
+
tree.overwrite(rulePath, transformedContent);
|
|
213
|
+
context.logger.info(` → Updated ${file.replace('.md', '.mdc')}`);
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
tree.create(rulePath, transformedContent);
|
|
217
|
+
context.logger.info(` → Created ${file.replace('.md', '.mdc')}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
context.logger.info('✓ Cursor configuration completed in .cursor/rules/');
|
|
221
|
+
}
|
|
222
|
+
async function configureJetBrainsAI(templatesPath, tree, context) {
|
|
223
|
+
context.logger.info('Configuring JetBrains AI with Cumulocity Web SDK best practices...');
|
|
224
|
+
const jetbrainsPath = (0, path_1.join)(templatesPath, 'jetbrains');
|
|
225
|
+
// Read main content
|
|
226
|
+
const mainContent = await (0, fs_extra_1.readFile)((0, path_1.join)(jetbrainsPath, 'guidelines.md'), 'utf-8');
|
|
227
|
+
// Read and append all rules (already without frontmatter in template)
|
|
228
|
+
const rulesPath = (0, path_1.join)(jetbrainsPath, 'rules');
|
|
229
|
+
const rulesFiles = await (0, fs_extra_1.readdir)(rulesPath);
|
|
230
|
+
const ruleSections = [];
|
|
231
|
+
for (const file of rulesFiles) {
|
|
232
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(rulesPath, file), 'utf-8');
|
|
233
|
+
// Content already has frontmatter stripped in the template
|
|
234
|
+
const sectionName = file.replace('.instructions.md', '').replace(/-/g, ' ');
|
|
235
|
+
ruleSections.push(`\n\n# ${sectionName.charAt(0).toUpperCase() + sectionName.slice(1)} Guidelines\n\n${content}`);
|
|
236
|
+
}
|
|
237
|
+
const fullContent = mainContent + ruleSections.join('');
|
|
238
|
+
const guidelinesPath = '.junie/guidelines.md';
|
|
239
|
+
if (tree.exists(guidelinesPath)) {
|
|
240
|
+
tree.overwrite(guidelinesPath, fullContent);
|
|
241
|
+
context.logger.info(' → Updated existing guidelines.md');
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
tree.create(guidelinesPath, fullContent);
|
|
245
|
+
context.logger.info(' → Created guidelines.md');
|
|
246
|
+
}
|
|
247
|
+
context.logger.info('✓ JetBrains AI configuration completed in .junie/');
|
|
248
|
+
}
|
|
249
|
+
async function configureWindsurf(templatesPath, tree, context) {
|
|
250
|
+
context.logger.info('Configuring Windsurf with Cumulocity Web SDK best practices...');
|
|
251
|
+
const windsurfPath = (0, path_1.join)(templatesPath, 'windsurf');
|
|
252
|
+
// Copy main file with always_on trigger
|
|
253
|
+
const mainFilePath = '.windsurf/rules/guidelines.md';
|
|
254
|
+
const mainContent = await (0, fs_extra_1.readFile)((0, path_1.join)(windsurfPath, 'guidelines.md'), 'utf-8');
|
|
255
|
+
const contentWithFrontmatter = `---\ntrigger: always_on\n---\n\n${mainContent}`;
|
|
256
|
+
if (tree.exists(mainFilePath)) {
|
|
257
|
+
tree.overwrite(mainFilePath, contentWithFrontmatter);
|
|
258
|
+
context.logger.info(' → Updated existing guidelines.md');
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
tree.create(mainFilePath, contentWithFrontmatter);
|
|
262
|
+
context.logger.info(' → Created guidelines.md');
|
|
263
|
+
}
|
|
264
|
+
// Copy rules files with transformed frontmatter
|
|
265
|
+
const rulesPath = (0, path_1.join)(windsurfPath, 'rules');
|
|
266
|
+
const rulesFiles = await (0, fs_extra_1.readdir)(rulesPath);
|
|
267
|
+
for (const file of rulesFiles) {
|
|
268
|
+
const rulePath = `.windsurf/rules/${file}`;
|
|
269
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(rulesPath, file), 'utf-8');
|
|
270
|
+
const transformedContent = transformFrontmatterToWindsurf(content);
|
|
271
|
+
if (tree.exists(rulePath)) {
|
|
272
|
+
tree.overwrite(rulePath, transformedContent);
|
|
273
|
+
context.logger.info(` → Updated ${file}`);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
tree.create(rulePath, transformedContent);
|
|
277
|
+
context.logger.info(` → Created ${file}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
context.logger.info('✓ Windsurf configuration completed in .windsurf/rules/');
|
|
281
|
+
}
|
|
282
|
+
async function configureGemini(templatesPath, tree, context) {
|
|
283
|
+
context.logger.info('Configuring Gemini with Cumulocity Web SDK best practices...');
|
|
284
|
+
const geminiPath = (0, path_1.join)(templatesPath, 'gemini');
|
|
285
|
+
// Read main content
|
|
286
|
+
const mainContent = await (0, fs_extra_1.readFile)((0, path_1.join)(geminiPath, 'GEMINI.md'), 'utf-8');
|
|
287
|
+
// Copy rules files first (already without frontmatter in template)
|
|
288
|
+
const rulesPath = (0, path_1.join)(geminiPath, 'rules');
|
|
289
|
+
const rulesFiles = await (0, fs_extra_1.readdir)(rulesPath);
|
|
290
|
+
const imports = [];
|
|
291
|
+
for (const file of rulesFiles) {
|
|
292
|
+
const content = await (0, fs_extra_1.readFile)((0, path_1.join)(rulesPath, file), 'utf-8');
|
|
293
|
+
// Content already has frontmatter stripped in the template
|
|
294
|
+
const rulePath = `.gemini/rules/${file}`;
|
|
295
|
+
if (tree.exists(rulePath)) {
|
|
296
|
+
tree.overwrite(rulePath, content);
|
|
297
|
+
context.logger.info(` → Updated ${file}`);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
tree.create(rulePath, content);
|
|
301
|
+
context.logger.info(` → Created ${file}`);
|
|
302
|
+
}
|
|
303
|
+
imports.push(`@./.gemini/rules/${file}`);
|
|
304
|
+
}
|
|
305
|
+
// Create main file with imports
|
|
306
|
+
const fullContent = `${mainContent}\n\n## Additional Guidelines\n\n${imports.join('\n\n')}`;
|
|
307
|
+
const geminiFilePath = '.gemini/GEMINI.md';
|
|
308
|
+
if (tree.exists(geminiFilePath)) {
|
|
309
|
+
tree.overwrite(geminiFilePath, fullContent);
|
|
310
|
+
context.logger.info(' → Updated existing GEMINI.md');
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
tree.create(geminiFilePath, fullContent);
|
|
314
|
+
context.logger.info(' → Created GEMINI.md');
|
|
315
|
+
}
|
|
316
|
+
context.logger.info('✓ Gemini configuration completed with imports in .gemini/GEMINI.md');
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=ai-tools-configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-tools-configure.js","sourceRoot":"","sources":["../../ng-add/ai-tools-configure.ts"],"names":[],"mappings":"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"}
|
package/dist/ng-add/index.js
CHANGED
|
@@ -12,6 +12,7 @@ const npmConfig = require("@npmcli/config");
|
|
|
12
12
|
const definitions_1 = require("@npmcli/config/lib/definitions");
|
|
13
13
|
const prompts_1 = require("@inquirer/prompts");
|
|
14
14
|
const semver_1 = require("semver");
|
|
15
|
+
const ai_tools_configure_1 = require("./ai-tools-configure");
|
|
15
16
|
/**
|
|
16
17
|
* This function adds a rule to the tree using the provided commandline options, predefined
|
|
17
18
|
* application options and module definitions.
|
|
@@ -25,7 +26,24 @@ function ngAdd(options) {
|
|
|
25
26
|
return async (tree, context) => {
|
|
26
27
|
const argv = await yargs((0, helpers_1.hideBin)(process.argv)).argv;
|
|
27
28
|
const registry = argv.registry;
|
|
29
|
+
const skipConfirmation = argv['skip-confirmation'];
|
|
30
|
+
const aiToolsFlag = options.aiTools || argv['ai-tools'];
|
|
28
31
|
const { appName, selectedVersion } = await getApplicationNameAndVersion(options.application, registry);
|
|
32
|
+
// Determine AI tools configuration based on flags
|
|
33
|
+
let selectedAiTools = [];
|
|
34
|
+
if (aiToolsFlag !== undefined) {
|
|
35
|
+
// Explicit --ai-tools flag provided
|
|
36
|
+
selectedAiTools = (0, ai_tools_configure_1.parseAiToolsFlag)(aiToolsFlag, context);
|
|
37
|
+
}
|
|
38
|
+
else if (skipConfirmation) {
|
|
39
|
+
// --skip-confirmation without --ai-tools: skip AI tools
|
|
40
|
+
context.logger.info('Skipping AI tools configuration (--skip-confirmation provided)');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// No flags: interactive mode
|
|
44
|
+
selectedAiTools = await selectAiToolsConfiguration();
|
|
45
|
+
}
|
|
46
|
+
await (0, ai_tools_configure_1.configureAiTools)(selectedAiTools, tree, context);
|
|
29
47
|
triggerDevkitNgAdd(appName, selectedVersion, tree, context, options);
|
|
30
48
|
};
|
|
31
49
|
}
|
|
@@ -182,4 +200,46 @@ async function getAllRelevantVersions(appName, registry) {
|
|
|
182
200
|
...versionList.map(version => ({ name: version, value: version }))
|
|
183
201
|
];
|
|
184
202
|
}
|
|
203
|
+
async function selectAiToolsConfiguration() {
|
|
204
|
+
const choices = [
|
|
205
|
+
{
|
|
206
|
+
name: 'None',
|
|
207
|
+
value: 'none'
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'Claude [ https://docs.anthropic.com/en/docs/claude-code/memory ]',
|
|
211
|
+
value: 'claude'
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
name: 'Cursor [ https://cursor.com/docs/rules ]',
|
|
215
|
+
value: 'cursor'
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'Gemini [ https://geminicli.com/docs/cli/gemini-md ]',
|
|
219
|
+
value: 'gemini'
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'GitHub Copilot [ https://code.visualstudio.com/docs/copilot/copilot-customization ]',
|
|
223
|
+
value: 'github-copilot'
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: 'JetBrains AI [ https://www.jetbrains.com/help/junie/customize-guidelines.html ]',
|
|
227
|
+
value: 'jetbrains-ai'
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
name: 'Windsurf [ https://docs.windsurf.com/windsurf/cascade/memories ]',
|
|
231
|
+
value: 'windsurf'
|
|
232
|
+
}
|
|
233
|
+
];
|
|
234
|
+
let selectedTools = await (0, prompts_1.checkbox)({
|
|
235
|
+
message: 'Which AI tools do you want to configure with Cumulocity Web SDK best practices?',
|
|
236
|
+
choices
|
|
237
|
+
});
|
|
238
|
+
if (!selectedTools || selectedTools.length === 0) {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
// Filter out 'none'
|
|
242
|
+
selectedTools = selectedTools.filter((tool) => tool !== 'none');
|
|
243
|
+
return selectedTools;
|
|
244
|
+
}
|
|
185
245
|
//# sourceMappingURL=index.js.map
|
package/dist/ng-add/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ng-add/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ng-add/index.ts"],"names":[],"mappings":"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"}
|