@aramassa/ai-rules 0.1.1-npmjs.20250910072942

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.
Files changed (72) hide show
  1. package/README-npmjs.md +37 -0
  2. package/README.md +37 -0
  3. package/artifact/chatmodes/Instruction Improve.md +142 -0
  4. package/artifact/chatmodes/Planning.md +173 -0
  5. package/artifact/instructions/git-rules.md +68 -0
  6. package/artifact/instructions/package-management.md +113 -0
  7. package/artifact/instructions/planning.md +54 -0
  8. package/artifact/instructions/python/workspace-management.md +673 -0
  9. package/artifact/instructions/python-cli.md +261 -0
  10. package/artifact/instructions/retrospective.md +32 -0
  11. package/artifact/instructions/rules/coding/nodejs.md +299 -0
  12. package/artifact/instructions/rules/coding/openai.md +39 -0
  13. package/artifact/instructions/rules/coding/typescript.md +92 -0
  14. package/artifact/instructions/rules/development/ansible.md +258 -0
  15. package/artifact/instructions/rules/development/code-quality-tools.md +181 -0
  16. package/artifact/instructions/rules/development/github.md +140 -0
  17. package/artifact/instructions/rules/development/npm-publish.md +108 -0
  18. package/artifact/instructions/rules/development/typescript-rollup-build.md +249 -0
  19. package/artifact/instructions/rules/development/typescript.md +46 -0
  20. package/artifact/instructions/rules/documentation/common.md +16 -0
  21. package/artifact/instructions/rules/documentation/docs-ai-external.md +12 -0
  22. package/artifact/instructions/rules/documentation/docs-ai-history.md +46 -0
  23. package/artifact/instructions/rules/documentation/docs-ai-internal.md +70 -0
  24. package/artifact/instructions/rules/documentation/docs-ai-learning.md +53 -0
  25. package/artifact/instructions/rules/documentation/docs.md +41 -0
  26. package/artifact/instructions/rules/documentation/github-protection.md +122 -0
  27. package/artifact/instructions/rules/test/e2e-bdd.md +31 -0
  28. package/artifact/instructions/rules/test/nodejs-test-restrictions.md +101 -0
  29. package/artifact/instructions/rules/test/timeout-configuration-typescript.md +67 -0
  30. package/artifact/instructions/rules/test/timeout-configuration.md +89 -0
  31. package/artifact/instructions/skel/common/change_plans/.gitkeep +0 -0
  32. package/artifact/instructions/skel/common/docs/.gitkeep +0 -0
  33. package/artifact/instructions/skel/common/docs_ai/.gitkeep +0 -0
  34. package/artifact/instructions/skel/common/skel/.gitkeep +0 -0
  35. package/artifact/instructions/skel/common/todo_plans/.gitkeep +0 -0
  36. package/artifact/instructions/skel/typescript/tsconfig.build.json +17 -0
  37. package/artifact/instructions/skel/typescript/tsconfig.json +117 -0
  38. package/artifact/instructions/skel/typescript/tsdoc.json +4 -0
  39. package/artifact/instructions/skel.md +88 -0
  40. package/artifact/instructions/todo_planning.md +25 -0
  41. package/artifact/instructions/tyding-up.md +30 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +10934 -0
  45. package/dist/filter.d.ts +8 -0
  46. package/dist/filter.d.ts.map +1 -0
  47. package/dist/filter.js +72 -0
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +1 -0
  51. package/dist/optionValidator.d.ts +28 -0
  52. package/dist/optionValidator.d.ts.map +1 -0
  53. package/dist/optionValidator.js +29 -0
  54. package/dist/templateEngine.d.ts +55 -0
  55. package/dist/templateEngine.d.ts.map +1 -0
  56. package/dist/templateEngine.js +124 -0
  57. package/dist/utils/objectUtils.d.ts +11 -0
  58. package/dist/utils/objectUtils.d.ts.map +1 -0
  59. package/dist/utils/objectUtils.js +17 -0
  60. package/dist/utils/test/structureExtractors.d.ts +30 -0
  61. package/dist/utils/test/structureExtractors.d.ts.map +1 -0
  62. package/dist/utils/test/structureExtractors.js +164 -0
  63. package/dist/variableResolver.d.ts +68 -0
  64. package/dist/variableResolver.d.ts.map +1 -0
  65. package/dist/variableResolver.js +190 -0
  66. package/package.json +69 -0
  67. package/presets/README.md +109 -0
  68. package/presets/basic.yaml +14 -0
  69. package/presets/chatmodes.yaml +64 -0
  70. package/presets/docs-ai.yaml +7 -0
  71. package/presets/infrastructure-ansible.yaml +19 -0
  72. package/presets/typescript.yaml +16 -0
@@ -0,0 +1,190 @@
1
+ import fs from "fs/promises";
2
+ import path from "path";
3
+ /**
4
+ * Variable resolver that handles collecting variables from multiple sources
5
+ * with proper priority order: CLI > recipe > .env > environment variables
6
+ */
7
+ export class VariableResolver {
8
+ /**
9
+ * Resolve variables from multiple sources according to priority
10
+ * @param options Resolution options specifying sources
11
+ * @returns Merged variables with proper priority
12
+ */
13
+ async resolveVariables(options) {
14
+ const sources = [];
15
+ // Lowest priority: environment variables
16
+ if (options.environmentVariables !== false) {
17
+ sources.push(this.getEnvironmentVariables());
18
+ }
19
+ // .env file variables
20
+ if (options.envFile) {
21
+ try {
22
+ const envVars = await this.loadEnvFile(options.envFile);
23
+ sources.push(envVars);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Failed to load .env file '${options.envFile}': ${error instanceof Error ? error.message : String(error)}`);
27
+ }
28
+ }
29
+ // Recipe variables
30
+ if (options.recipeVariables) {
31
+ sources.push(options.recipeVariables);
32
+ }
33
+ // Highest priority: CLI variables
34
+ if (options.cliVariables) {
35
+ sources.push(options.cliVariables);
36
+ }
37
+ return this.mergeVariables(...sources);
38
+ }
39
+ /**
40
+ * Load variables from .env file
41
+ * @param filePath Path to .env file
42
+ * @returns Variables loaded from file
43
+ */
44
+ async loadEnvFile(filePath) {
45
+ const absolutePath = path.resolve(filePath);
46
+ try {
47
+ await fs.access(absolutePath);
48
+ }
49
+ catch {
50
+ throw new Error(`File not found: ${absolutePath}`);
51
+ }
52
+ const content = await fs.readFile(absolutePath, "utf-8");
53
+ return this.parseEnvContent(content);
54
+ }
55
+ /**
56
+ * Parse .env file content into variables object
57
+ * @param content .env file content
58
+ * @returns Parsed variables
59
+ */
60
+ parseEnvContent(content) {
61
+ const variables = {};
62
+ const lines = content.split('\n');
63
+ for (let i = 0; i < lines.length; i++) {
64
+ const line = lines[i].trim();
65
+ // Skip empty lines and comments
66
+ if (!line || line.startsWith('#')) {
67
+ continue;
68
+ }
69
+ // Parse KEY=value format
70
+ const match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);
71
+ if (match) {
72
+ const [, key, value] = match;
73
+ // Remove surrounding quotes if present
74
+ variables[key] = this.unquoteValue(value);
75
+ }
76
+ }
77
+ return variables;
78
+ }
79
+ /**
80
+ * Remove surrounding quotes from environment variable values
81
+ * @param value Value to unquote
82
+ * @returns Unquoted value
83
+ */
84
+ unquoteValue(value) {
85
+ const trimmed = value.trim();
86
+ // Remove single or double quotes if they wrap the entire value
87
+ if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
88
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
89
+ return trimmed.slice(1, -1);
90
+ }
91
+ return trimmed;
92
+ }
93
+ /**
94
+ * Get relevant environment variables (those that match template variable naming convention)
95
+ * @returns Environment variables that could be used as template variables
96
+ */
97
+ getEnvironmentVariables() {
98
+ const variables = {};
99
+ // System/CI environment variables to exclude from template variable display
100
+ const excludedPrefixes = [
101
+ 'GITHUB_', 'RUNNER_', 'ACTIONS_', 'CI_', 'DEBIAN_', 'LANG', 'LC_', 'PWD', 'OLDPWD',
102
+ 'SHELL', 'TERM', 'USER', 'HOME', 'LOGNAME', 'MAIL', 'PATH', 'PS1', 'PS2', 'PS4',
103
+ 'TMPDIR', 'TMP', 'TEMP', 'HOSTNAME', 'HOSTTYPE', 'MACHTYPE', 'OSTYPE', 'DISPLAY',
104
+ 'XDG_', 'DBUS_', 'SESSION_', 'DESKTOP_', 'GTK_', 'QT_', 'KDE_', 'GNOME_', 'WAYLAND_',
105
+ 'SSH_', 'GPG_', 'EDITOR', 'VISUAL', 'PAGER', 'BROWSER', 'MANPATH', 'INFOPATH',
106
+ 'DEBIAN_FRONTEND', 'APT_', 'DPKG_', 'DEB_', 'COLORTERM', 'INVOCATION_ID',
107
+ 'JOURNAL_STREAM', 'SYSTEMD_', 'NODE_', 'NPM_', 'YARN_', 'PNPM_', 'COPILOT_',
108
+ 'AGENT_', 'ANDROID_', 'ANT_', 'AZURE_', 'BLACKBIRD_', 'BOOTSTRAP_', 'CAROOT',
109
+ 'CHROME_', 'CHROMEWEBDRIVER', 'CONDA', 'CPD_', 'CURL_', 'DOTNET_', 'EDGEWEBDRIVER',
110
+ 'ENABLE_', 'FIREWALL_', 'FORCE_', 'GECKOWEBDRIVER', 'GHCUP_', 'GOROOT_', 'GRADLE_',
111
+ 'INIT_', 'JAVA_', 'MEMORY_', 'NVM_', 'PIPX_', 'POWERSHELL_', 'REQUESTS_', 'SELENIUM_',
112
+ 'SGX_', 'SSL_', 'SUDO_', 'SWIFT_', 'TINYPOOL_', 'VCPKG_', 'VITEST_', 'ACCEPT_',
113
+ 'BASE_'
114
+ ];
115
+ const excludedExact = [
116
+ 'CI', 'SHLVL', '_', 'COLOR', 'DEV', 'MODE', 'PROD', 'SSR', 'VITEST'
117
+ ];
118
+ // Only include environment variables that match the template variable naming pattern
119
+ // and don't appear to be system variables
120
+ for (const [key, value] of Object.entries(process.env)) {
121
+ if (/^[A-Z_][A-Z0-9_]*$/.test(key) && value !== undefined) {
122
+ // Skip if it matches any excluded prefix or exact name
123
+ const shouldExclude = excludedPrefixes.some(prefix => key.startsWith(prefix)) ||
124
+ excludedExact.includes(key);
125
+ if (!shouldExclude) {
126
+ variables[key] = value;
127
+ }
128
+ }
129
+ }
130
+ return variables;
131
+ }
132
+ /**
133
+ * Merge variables from multiple sources with later sources taking precedence
134
+ * @param sources Variable objects in order of precedence (lowest to highest)
135
+ * @returns Merged variables object
136
+ */
137
+ mergeVariables(...sources) {
138
+ return Object.assign({}, ...sources);
139
+ }
140
+ /**
141
+ * Parse CLI variables string in key=value format
142
+ * @param varsString Comma-separated key=value pairs
143
+ * @returns Parsed variables object
144
+ */
145
+ static parseCliVariables(varsString) {
146
+ const variables = {};
147
+ if (!varsString.trim()) {
148
+ return variables;
149
+ }
150
+ const pairs = varsString.split(',');
151
+ for (const pair of pairs) {
152
+ const trimmed = pair.trim();
153
+ if (!trimmed)
154
+ continue;
155
+ const equalIndex = trimmed.indexOf('=');
156
+ if (equalIndex === -1) {
157
+ throw new Error(`Invalid variable format: '${trimmed}'. Expected 'KEY=value' format.`);
158
+ }
159
+ const key = trimmed.substring(0, equalIndex).trim();
160
+ const value = trimmed.substring(equalIndex + 1).trim();
161
+ // Validate key format
162
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {
163
+ throw new Error(`Invalid variable name: '${key}'. Variable names must start with a letter or underscore and contain only uppercase letters, numbers, and underscores.`);
164
+ }
165
+ variables[key] = value;
166
+ }
167
+ return variables;
168
+ }
169
+ /**
170
+ * Get variables by source for display purposes
171
+ * @param options Options specifying which sources to check
172
+ * @returns Object with variables grouped by source
173
+ */
174
+ async getVariablesBySource(options) {
175
+ const result = {
176
+ environment: this.getEnvironmentVariables(),
177
+ envFile: {}
178
+ };
179
+ if (options.envFile) {
180
+ try {
181
+ result.envFile = await this.loadEnvFile(options.envFile);
182
+ }
183
+ catch {
184
+ // Silently ignore .env file errors for display purposes
185
+ result.envFile = {};
186
+ }
187
+ }
188
+ return result;
189
+ }
190
+ }
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@aramassa/ai-rules",
3
+ "version": "0.1.1-npmjs.20250910072942",
4
+ "description": "This repository collects guidelines and instructions for developing AI agents. It contains documents covering communication rules, coding standards, testing strategies, and general operational practices.",
5
+ "workspaces": [
6
+ "packages/extract",
7
+ "packages/core"
8
+ ],
9
+ "main": "index.js",
10
+ "bin": {
11
+ "ai-rules": "dist/cli.js"
12
+ },
13
+ "files": [
14
+ "dist/",
15
+ "artifact/",
16
+ "presets/",
17
+ "README-npmjs.md"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public",
21
+ "registry": "https://registry.npmjs.org/"
22
+ },
23
+ "scripts": {
24
+ "start:cli": "node dist/cli.js",
25
+ "start:dev:cli": "tsx src/cli.ts",
26
+ "test": "vitest run --environment node test",
27
+ "test:all": "npm run test --workspaces",
28
+ "build": "npm run --ws build && tsc -p tsconfig.build.json",
29
+ "build:pkg:clean": "npm run --ws clean",
30
+ "clean": "npm run build:pkg:clean && rm -rf dist",
31
+ "root:build": "npm run build && if [ \"$NODE_ENV\" != \"test\" ]; then rollup -c && chmod +x dist/cli.js; fi"
32
+ },
33
+ "prepublishOnly": "npm run root:build",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/Aramassa/ai-rules.git"
37
+ },
38
+ "keywords": [],
39
+ "author": "",
40
+ "license": "ISC",
41
+ "type": "module",
42
+ "bugs": {
43
+ "url": "https://github.com/Aramassa/ai-rules/issues"
44
+ },
45
+ "homepage": "https://github.com/Aramassa/ai-rules#readme",
46
+ "devDependencies": {
47
+ "@aramassa/skel-extractor": "^0.0.1",
48
+ "@rollup/plugin-alias": "^5.1.1",
49
+ "@rollup/plugin-commonjs": "^28.0.6",
50
+ "@rollup/plugin-json": "^6.1.0",
51
+ "@rollup/plugin-node-resolve": "^16.0.1",
52
+ "@rollup/plugin-typescript": "^12.1.4",
53
+ "@types/commander": "^2.12.0",
54
+ "@types/node": "^24.3.0",
55
+ "fast-glob": "^3.3.3",
56
+ "gray-matter": "^4.0.3",
57
+ "rollup": "^4.45.0",
58
+ "ts-node": "^10.9.2",
59
+ "tslib": "^2.8.1",
60
+ "tsx": "^4.20.3",
61
+ "typescript": "^5.9.2",
62
+ "vitest": "^3.2.4"
63
+ },
64
+ "dependencies": {
65
+ "commander": "^14.0.0",
66
+ "glob": "^11.0.3",
67
+ "yaml": "^2.8.0"
68
+ }
69
+ }
@@ -0,0 +1,109 @@
1
+ # Presets
2
+
3
+ このディレクトリには、プロジェクトタイプ別の事前定義されたrecipeファイルが含まれています。
4
+
5
+ ## 利用可能なプリセット
6
+
7
+ ### `basic.yaml`
8
+
9
+ すべてのプロジェクトタイプで共通して必要となる基本的なinstruction構成です。
10
+
11
+ **含まれる内容:**
12
+
13
+ - Communication Rules
14
+ - Retrospective Instructions
15
+
16
+ **使用方法:**
17
+
18
+ ```bash
19
+ npx @aramassa/ai-rules extract --recipe presets/basic.yaml --src artifact/instructions
20
+ ```
21
+
22
+ **対象プロジェクト:**
23
+
24
+ - すべてのプロジェクトタイプ(言語・環境に依存しない共通ルール)
25
+
26
+ ### `typescript.yaml`
27
+
28
+ TypeScriptプロジェクト向けの標準的なinstruction構成です。
29
+
30
+ **含まれる内容:**
31
+
32
+ - AI Document Generation
33
+ - TypeScript Coding Rules
34
+ - TypeScript / Vitest
35
+
36
+ **使用方法:**
37
+
38
+ ```bash
39
+ npx @aramassa/ai-rules extract --recipe presets/typescript.yaml --src artifact/instructions
40
+ ```
41
+
42
+ ### `infrastructure-ansible.yaml`
43
+
44
+ インフラストラクチャ管理とAnsibleを使用したプロジェクト向けの設定です。
45
+
46
+ **含まれる内容:**
47
+
48
+ - Infrastructure General Principles
49
+ - Ansible Infrastructure Automation
50
+ - Infrastructure Change Planning
51
+
52
+ **使用方法:**
53
+
54
+ ```bash
55
+ npx @aramassa/ai-rules extract --recipe presets/infrastructure-ansible.yaml --src artifact/instructions
56
+ ```
57
+
58
+ **対象プロジェクト:**
59
+
60
+ - Ansibleを使用したインフラ自動化プロジェクト
61
+ - クラウドインフラ管理プロジェクト
62
+ - DevOps・SRE関連プロジェクト
63
+ - 設定管理・自動化プロジェクト
64
+
65
+ ### `chatmodes.yaml`
66
+
67
+ AI対話支援機能(chatmodes)をプロジェクトに統合するための設定です。
68
+
69
+ **含まれる内容:**
70
+
71
+ - Instruction Improve Chatmode - プロジェクト指示の改善支援
72
+ - Planning Chatmode - todo_plans作成支援
73
+
74
+ **使用方法:**
75
+
76
+ ```bash
77
+ npx @aramassa/ai-rules extract --recipe presets/chatmodes.yaml --src artifact/chatmodes
78
+ ```
79
+
80
+ **対象プロジェクト:**
81
+
82
+ - ai-rulesを活用した開発プロジェクト
83
+ - 構造化されたプランニングプロセスが必要なプロジェクト
84
+ - 継続的なinstruction改善を行うプロジェクト
85
+
86
+ ## カスタムプリセットの作成
87
+
88
+ 新しいプリセットを作成する場合は、以下の手順で行ってください:
89
+
90
+ 1. 必要なinstructionファイルを `artifact/instructions/` 以下に作成
91
+ 2. YAML形式のrecipeファイルを `presets/` ディレクトリに作成
92
+ 3. このREADMEにプリセットの説明を追加
93
+ 4. テスト実行して動作確認
94
+
95
+ ### recipeファイル形式例
96
+
97
+ ```yaml
98
+ recipe:
99
+ - title: "ドキュメントのタイトル"
100
+ frontmatter:
101
+ description: "説明"
102
+ applyTo: "適用対象パターン"
103
+ out: "./出力先パス"
104
+ type: "対象のinstructionタイプ"
105
+ language: "対象言語"
106
+ mode: "append" # オプション:既存ファイルに追記
107
+ ```
108
+
109
+ 詳細な仕様については、プロジェクトのメインREADMEを参照してください。
@@ -0,0 +1,14 @@
1
+ recipe:
2
+ - title: Communication Rules
3
+ frontmatter:
4
+ description: |
5
+ These rules are for writing clear and effective communication in the project.
6
+ out: ./.github/copilot-instructions.md
7
+ type: planning,documentation
8
+ - title: Package Management Rules
9
+ frontmatter:
10
+ description: |
11
+ These rules are for managing project dependencies and packages effectively.
12
+ out: ./.github/copilot-instructions.md
13
+ mode: append
14
+ type: package-management
@@ -0,0 +1,64 @@
1
+ recipe:
2
+ - title: Instruction Improve Chatmode
3
+ frontmatter:
4
+ description: |
5
+ Chatmode for improving the project instructions through retrospective analysis.
6
+ Provides structured approach to analyzing past tasks and converting insights into GitHub issues.
7
+ Includes comprehensive GitHub integration tools for issue and pull request management.
8
+ tools:
9
+ [
10
+ "changes",
11
+ "create_issue",
12
+ "list_issues",
13
+ "get_issue",
14
+ "get_pull_request",
15
+ "create_pull_request",
16
+ "list_pull_requests",
17
+ "get_pull_request_comments",
18
+ "get_pull_request_reviews",
19
+ "search_issues",
20
+ "search_pull_requests",
21
+ ]
22
+ out: ./.github/chatmodes/Instruction Improve.chatmode.md
23
+ type: chatmode
24
+ filters:
25
+ chatmode: instruction-improve
26
+ variables:
27
+ INSTRUCTION_GITHUB_REPO: https://github.com/Aramassa/ai-rules
28
+ - title: Planning Chatmode
29
+ frontmatter:
30
+ description: |
31
+ Chatmode for supporting todo_plans creation with structured planning process.
32
+ Provides phase-based guidance for requirement clarification, technical investigation, and implementation planning.
33
+ tools:
34
+ [
35
+ "changes",
36
+ "searchResults",
37
+ "editFiles",
38
+ "search",
39
+ "add_issue_comment",
40
+ "add_sub_issue",
41
+ "assign_copilot_to_issue",
42
+ "create_issue",
43
+ "create_pull_request_with_copilot",
44
+ "get_code_scanning_alert",
45
+ "get_discussion",
46
+ "get_discussion_comments",
47
+ "get_issue_comments",
48
+ "get_pull_request",
49
+ "get_pull_request_diff",
50
+ "get_pull_request_files",
51
+ "list_commits",
52
+ "list_issues",
53
+ "list_pull_requests",
54
+ "search_code",
55
+ "search_issues",
56
+ "search_pull_requests",
57
+ "search_repositories",
58
+ "update_issue",
59
+ "update_pull_request",
60
+ ]
61
+ out: ./.github/chatmodes/Planning.chatmode.md
62
+ type: chatmode
63
+ filters:
64
+ chatmode: planning
@@ -0,0 +1,7 @@
1
+ recipe:
2
+ - title: Documentation for AI
3
+ frontmatter:
4
+ description: These rules are for writing clear and effective documentation for AI Coding tools.
5
+ applyTo: "docs-ai/**/*.md"
6
+ out: ./.github/instructions/docs-ai.instructions.md
7
+ type: documentation-ai
@@ -0,0 +1,19 @@
1
+ recipe:
2
+ - title: Infrastructure General Principles
3
+ frontmatter:
4
+ description: |
5
+ General principles and best practices for infrastructure management.
6
+ applyTo: "**/*"
7
+ out: ./.github/instructions/infrastructure.instructions.md
8
+ type: infrastructure
9
+ category: best-practices
10
+ - title: Ansible Infrastructure Automation
11
+ mode: append
12
+ out: ./.github/instructions/infrastructure.instructions.md
13
+ type: infrastructure
14
+ language: ansible
15
+ - title: Infrastructure Change Planning
16
+ mode: append
17
+ out: ./.github/instructions/infrastructure.instructions.md
18
+ type: infrastructure
19
+ category: planning
@@ -0,0 +1,16 @@
1
+ recipe:
2
+ - import: :basic
3
+ - import: :docs-ai
4
+ - title: Typescript Coding Rules
5
+ frontmatter:
6
+ description: |
7
+ These rules are for writing TypeScript code in the project.
8
+ applyTo: "**/*.ts"
9
+ out: ./.github/instructions/typescript.instructions.md
10
+ type: coding-rules
11
+ language: typescript
12
+ - title: TypeScript / Vitest
13
+ mode: append
14
+ out: ./.github/instructions/typescript.instructions.md
15
+ type: test
16
+ language: typescript