specweave 1.0.488 ā 1.0.490
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 +1 -1
- package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.d.ts +13 -5
- package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +28 -26
- package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-client.d.ts +14 -0
- package/dist/plugins/specweave-ado/lib/ado-client.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-client.js +29 -1
- package/dist/plugins/specweave-ado/lib/ado-client.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-pull-sync.d.ts +35 -0
- package/dist/plugins/specweave-ado/lib/ado-pull-sync.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-pull-sync.js +53 -0
- package/dist/plugins/specweave-ado/lib/ado-pull-sync.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-rate-limiter.d.ts +46 -0
- package/dist/plugins/specweave-ado/lib/ado-rate-limiter.d.ts.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-rate-limiter.js +65 -0
- package/dist/plugins/specweave-ado/lib/ado-rate-limiter.js.map +1 -0
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts +7 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +25 -1
- package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts +17 -1
- package/dist/plugins/specweave-ado/lib/ado-status-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-status-sync.js +51 -9
- package/dist/plugins/specweave-ado/lib/ado-status-sync.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js +1 -1
- package/dist/plugins/specweave-github/lib/github-client-v2.js.map +1 -1
- package/dist/plugins/specweave-github/lib/github-push-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-github/lib/github-push-sync.js +15 -3
- package/dist/plugins/specweave-github/lib/github-push-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts +31 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +170 -97
- package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts +36 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.d.ts.map +1 -1
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js +185 -82
- package/dist/plugins/specweave-jira/lib/jira-status-sync.js.map +1 -1
- package/dist/src/adapters/adapter-loader.d.ts.map +1 -1
- package/dist/src/adapters/adapter-loader.js +8 -2
- package/dist/src/adapters/adapter-loader.js.map +1 -1
- package/dist/src/adapters/codex/adapter.d.ts.map +1 -1
- package/dist/src/adapters/codex/adapter.js +1 -0
- package/dist/src/adapters/codex/adapter.js.map +1 -1
- package/dist/src/adapters/cursor/adapter.d.ts.map +1 -1
- package/dist/src/adapters/cursor/adapter.js +1 -0
- package/dist/src/adapters/cursor/adapter.js.map +1 -1
- package/dist/src/adapters/generic/adapter.d.ts +6 -3
- package/dist/src/adapters/generic/adapter.d.ts.map +1 -1
- package/dist/src/adapters/generic/adapter.js +53 -47
- package/dist/src/adapters/generic/adapter.js.map +1 -1
- package/dist/src/adapters/kimi/adapter.d.ts +21 -0
- package/dist/src/adapters/kimi/adapter.d.ts.map +1 -0
- package/dist/src/adapters/kimi/adapter.js +57 -0
- package/dist/src/adapters/kimi/adapter.js.map +1 -0
- package/dist/src/adapters/opencode/adapter.d.ts +24 -0
- package/dist/src/adapters/opencode/adapter.d.ts.map +1 -0
- package/dist/src/adapters/opencode/adapter.js +71 -0
- package/dist/src/adapters/opencode/adapter.js.map +1 -0
- package/dist/src/adapters/registry.yaml +59 -0
- package/dist/src/adapters/trae/adapter.d.ts +21 -0
- package/dist/src/adapters/trae/adapter.d.ts.map +1 -0
- package/dist/src/adapters/trae/adapter.js +64 -0
- package/dist/src/adapters/trae/adapter.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +156 -5
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/update-instructions.d.ts.map +1 -1
- package/dist/src/cli/commands/update-instructions.js +10 -0
- package/dist/src/cli/commands/update-instructions.js.map +1 -1
- package/dist/src/cli/helpers/init/index.d.ts +1 -0
- package/dist/src/cli/helpers/init/index.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/index.js +2 -0
- package/dist/src/cli/helpers/init/index.js.map +1 -1
- package/dist/src/cli/helpers/init/next-steps.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/next-steps.js +52 -0
- package/dist/src/cli/helpers/init/next-steps.js.map +1 -1
- package/dist/src/cli/helpers/init/skill-creator-installer.d.ts +24 -0
- package/dist/src/cli/helpers/init/skill-creator-installer.d.ts.map +1 -0
- package/dist/src/cli/helpers/init/skill-creator-installer.js +54 -0
- package/dist/src/cli/helpers/init/skill-creator-installer.js.map +1 -0
- package/dist/src/core/ado-description-updater.d.ts +22 -0
- package/dist/src/core/ado-description-updater.d.ts.map +1 -0
- package/dist/src/core/ado-description-updater.js +46 -0
- package/dist/src/core/ado-description-updater.js.map +1 -0
- package/dist/src/core/closure-dispatcher.d.ts +96 -0
- package/dist/src/core/closure-dispatcher.d.ts.map +1 -0
- package/dist/src/core/closure-dispatcher.js +116 -0
- package/dist/src/core/closure-dispatcher.js.map +1 -0
- package/dist/src/core/config/types.d.ts +2 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/errors/sync-error.d.ts +12 -0
- package/dist/src/core/errors/sync-error.d.ts.map +1 -0
- package/dist/src/core/errors/sync-error.js +19 -0
- package/dist/src/core/errors/sync-error.js.map +1 -0
- package/dist/src/core/skill-gen/rule-collector.d.ts +28 -0
- package/dist/src/core/skill-gen/rule-collector.d.ts.map +1 -0
- package/dist/src/core/skill-gen/rule-collector.js +112 -0
- package/dist/src/core/skill-gen/rule-collector.js.map +1 -0
- package/dist/src/core/skill-gen/signal-collector.d.ts +2 -1
- package/dist/src/core/skill-gen/signal-collector.d.ts.map +1 -1
- package/dist/src/core/skill-gen/signal-collector.js +21 -5
- package/dist/src/core/skill-gen/signal-collector.js.map +1 -1
- package/dist/src/core/sync/persistent-circuit-breaker.d.ts +22 -0
- package/dist/src/core/sync/persistent-circuit-breaker.d.ts.map +1 -0
- package/dist/src/core/sync/persistent-circuit-breaker.js +65 -0
- package/dist/src/core/sync/persistent-circuit-breaker.js.map +1 -0
- package/dist/src/core/sync/retry-wrapper.d.ts +13 -0
- package/dist/src/core/sync/retry-wrapper.d.ts.map +1 -0
- package/dist/src/core/sync/retry-wrapper.js +37 -0
- package/dist/src/core/sync/retry-wrapper.js.map +1 -0
- package/dist/src/importers/ac-parser.d.ts +27 -0
- package/dist/src/importers/ac-parser.d.ts.map +1 -0
- package/dist/src/importers/ac-parser.js +47 -0
- package/dist/src/importers/ac-parser.js.map +1 -0
- package/dist/src/sync/types.d.ts +8 -0
- package/dist/src/sync/types.d.ts.map +1 -1
- package/dist/src/sync/types.js +12 -0
- package/dist/src/sync/types.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/PLUGIN.md +1 -0
- package/plugins/specweave/hooks/v2/guards/increment-existence-guard.sh +9 -3
- package/plugins/specweave/skills/code-reviewer/SKILL.md +401 -0
- package/plugins/specweave/skills/code-reviewer/agents/reviewer-silent-failures.md +65 -0
- package/plugins/specweave/skills/code-reviewer/agents/reviewer-spec-compliance.md +83 -0
- package/plugins/specweave/skills/code-reviewer/agents/reviewer-types.md +68 -0
- package/plugins/specweave/skills/skill-gen/SKILL.md +20 -3
- package/plugins/specweave/skills/team-lead/SKILL.md +155 -4
- package/plugins/specweave/skills/team-lead/agents/architect.md +52 -0
- package/plugins/specweave/skills/team-lead/agents/pm.md +50 -0
- package/plugins/specweave/skills/team-lead/agents/researcher.md +64 -0
- package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +23 -21
- package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.ts +37 -29
- package/plugins/specweave-ado/lib/ado-client.js +27 -1
- package/plugins/specweave-ado/lib/ado-client.ts +37 -2
- package/plugins/specweave-ado/lib/ado-pull-sync.js +35 -0
- package/plugins/specweave-ado/lib/ado-pull-sync.ts +74 -0
- package/plugins/specweave-ado/lib/ado-rate-limiter.js +56 -0
- package/plugins/specweave-ado/lib/ado-rate-limiter.ts +86 -0
- package/plugins/specweave-ado/lib/ado-spec-sync.js +25 -1
- package/plugins/specweave-ado/lib/ado-spec-sync.ts +32 -2
- package/plugins/specweave-ado/lib/ado-status-sync.js +52 -14
- package/plugins/specweave-ado/lib/ado-status-sync.ts +64 -16
- package/plugins/specweave-github/lib/github-client-v2.ts +1 -1
- package/plugins/specweave-github/lib/github-push-sync.js +11 -3
- package/plugins/specweave-github/lib/github-push-sync.ts +16 -3
- package/plugins/specweave-jira/lib/jira-spec-sync.js +60 -1
- package/plugins/specweave-jira/lib/jira-spec-sync.ts +93 -1
- package/plugins/specweave-jira/lib/jira-status-sync.js +151 -109
- package/plugins/specweave-jira/lib/jira-status-sync.ts +161 -39
|
@@ -109,24 +109,23 @@ Ready to build with SpecWeave using ANY AI tool!
|
|
|
109
109
|
/**
|
|
110
110
|
* Compile and install a plugin for Generic adapter
|
|
111
111
|
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* NEW: Injects system prompts for non-English languages
|
|
112
|
+
* 1. Writes individual skill files to .agents/skills/ via base class helper
|
|
113
|
+
* 2. Appends a concise skills INDEX to AGENTS.md (not full content)
|
|
115
114
|
*
|
|
116
115
|
* @param plugin Plugin to install
|
|
117
116
|
*/
|
|
118
117
|
async compilePlugin(plugin) {
|
|
119
118
|
const projectPath = process.cwd();
|
|
120
119
|
const agentsMdPath = path.join(projectPath, 'AGENTS.md');
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
const language = await this.getLanguageConfig();
|
|
124
|
-
if (language !== 'en') {
|
|
125
|
-
console.log(` š Language: ${language} (system prompts will be injected)`);
|
|
126
|
-
}
|
|
120
|
+
const skillsDir = '.agents/skills';
|
|
121
|
+
console.log(`\nš¦ Installing plugin: ${plugin.manifest.name}`);
|
|
127
122
|
if (!(await fs.pathExists(agentsMdPath))) {
|
|
128
123
|
throw new Error('AGENTS.md not found. Run specweave init first.');
|
|
129
124
|
}
|
|
125
|
+
// 1. Write individual skill files to .agents/skills/
|
|
126
|
+
await this.writeSkillFiles(plugin, skillsDir);
|
|
127
|
+
console.log(` ā ${plugin.skills.length} skill(s) written to ${skillsDir}/`);
|
|
128
|
+
// 2. Append concise index to AGENTS.md
|
|
130
129
|
let agentsMd = await fs.readFile(agentsMdPath, 'utf-8');
|
|
131
130
|
const pluginMarker = `<!-- Plugin: ${plugin.manifest.name} -->`;
|
|
132
131
|
if (agentsMd.includes(pluginMarker)) {
|
|
@@ -137,47 +136,47 @@ Ready to build with SpecWeave using ANY AI tool!
|
|
|
137
136
|
pluginSection += `# Plugin: ${plugin.manifest.name}\n\n`;
|
|
138
137
|
pluginSection += `${plugin.manifest.description}\n\n`;
|
|
139
138
|
if (plugin.skills.length > 0) {
|
|
140
|
-
pluginSection += `## Skills\n\n`;
|
|
139
|
+
pluginSection += `## Available Skills\n\n`;
|
|
140
|
+
pluginSection += `| Skill | Description |\n`;
|
|
141
|
+
pluginSection += `|-------|-------------|\n`;
|
|
141
142
|
for (const skill of plugin.skills) {
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
// Inject system prompt if needed
|
|
145
|
-
const modifiedContent = this.injectSystemPrompt(contentWithoutFrontmatter, language);
|
|
146
|
-
pluginSection += `### ${skill.name}\n\n${modifiedContent}\n\n`;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
if (plugin.agents.length > 0) {
|
|
150
|
-
pluginSection += `## Agents\n\n`;
|
|
151
|
-
for (const agent of plugin.agents) {
|
|
152
|
-
const agentContent = await fs.readFile(path.join(agent.path, 'AGENT.md'), 'utf-8');
|
|
153
|
-
// Inject system prompt if needed
|
|
154
|
-
const modifiedContent = this.injectSystemPrompt(agentContent, language);
|
|
155
|
-
pluginSection += `### ${agent.name}\n\n${modifiedContent}\n\n`;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
if (plugin.commands.length > 0) {
|
|
159
|
-
pluginSection += `## Workflows (Manual)\n\n`;
|
|
160
|
-
for (const command of plugin.commands) {
|
|
161
|
-
const commandContent = await fs.readFile(command.path, 'utf-8');
|
|
162
|
-
const contentWithoutFrontmatter = commandContent.replace(/^---\n[\s\S]+?\n---\n/, '');
|
|
163
|
-
// Inject system prompt if needed
|
|
164
|
-
const modifiedContent = this.injectSystemPrompt(contentWithoutFrontmatter, language);
|
|
165
|
-
pluginSection += `### ${command.name.replace('specweave.', '')}\n\n${modifiedContent}\n\n`;
|
|
143
|
+
const desc = skill.description || skill.name;
|
|
144
|
+
pluginSection += `| ${skill.name} | ${desc} |\n`;
|
|
166
145
|
}
|
|
146
|
+
pluginSection += `\n`;
|
|
167
147
|
}
|
|
148
|
+
pluginSection += `## CLI Commands\n\n`;
|
|
149
|
+
pluginSection += `All workflows are available via the \`specweave\` CLI:\n\n`;
|
|
150
|
+
pluginSection += `| Command | Description |\n`;
|
|
151
|
+
pluginSection += `|---------|-------------|\n`;
|
|
152
|
+
pluginSection += `| \`specweave create-increment\` | Create a new feature increment |\n`;
|
|
153
|
+
pluginSection += `| \`specweave status\` | Check current progress |\n`;
|
|
154
|
+
pluginSection += `| \`specweave validate\` | Run quality checks |\n`;
|
|
155
|
+
pluginSection += `| \`specweave complete\` | Close an increment |\n`;
|
|
156
|
+
pluginSection += `| \`specweave sync-living-docs\` | Sync documentation |\n`;
|
|
157
|
+
pluginSection += `\n`;
|
|
158
|
+
pluginSection += `## Skill Files\n\n`;
|
|
159
|
+
pluginSection += `Individual skill instructions are installed at \`.agents/skills/\`.\n`;
|
|
160
|
+
pluginSection += `Reference these files when you need detailed workflow instructions.\n\n`;
|
|
168
161
|
pluginSection += `<!-- End Plugin: ${plugin.manifest.name} -->\n`;
|
|
169
162
|
agentsMd += pluginSection;
|
|
170
163
|
await fs.writeFile(agentsMdPath, agentsMd, 'utf-8');
|
|
171
|
-
console.log(` ā
|
|
172
|
-
console.log(`\nā
Plugin ${plugin.manifest.name}
|
|
164
|
+
console.log(` ā Skills index added to AGENTS.md`);
|
|
165
|
+
console.log(`\nā
Plugin ${plugin.manifest.name} installed!`);
|
|
173
166
|
}
|
|
174
167
|
/**
|
|
175
168
|
* Unload a plugin from Generic adapter
|
|
169
|
+
*
|
|
170
|
+
* Removes both the AGENTS.md index section and individual skill files.
|
|
176
171
|
*/
|
|
177
172
|
async unloadPlugin(pluginName) {
|
|
178
173
|
const projectPath = process.cwd();
|
|
179
174
|
const agentsMdPath = path.join(projectPath, 'AGENTS.md');
|
|
180
|
-
console.log(`\nšļø Removing plugin
|
|
175
|
+
console.log(`\nšļø Removing plugin: ${pluginName}`);
|
|
176
|
+
// 1. Remove skill files from .agents/skills/
|
|
177
|
+
await this.removeSkillFiles(pluginName, '.agents/skills');
|
|
178
|
+
console.log(` ā Removed skill files from .agents/skills/`);
|
|
179
|
+
// 2. Remove index section from AGENTS.md
|
|
181
180
|
if (!(await fs.pathExists(agentsMdPath))) {
|
|
182
181
|
console.warn(`ā ļø AGENTS.md not found`);
|
|
183
182
|
return;
|
|
@@ -197,26 +196,33 @@ Ready to build with SpecWeave using ANY AI tool!
|
|
|
197
196
|
}
|
|
198
197
|
agentsMd = agentsMd.slice(0, startIndex) + agentsMd.slice(endIndex + endMarker.length);
|
|
199
198
|
await fs.writeFile(agentsMdPath, agentsMd, 'utf-8');
|
|
200
|
-
console.log(` ā Removed from AGENTS.md`);
|
|
199
|
+
console.log(` ā Removed index from AGENTS.md`);
|
|
201
200
|
console.log(`\nā
Plugin ${pluginName} removed!`);
|
|
202
201
|
}
|
|
203
202
|
/**
|
|
204
203
|
* Get list of installed plugins for Generic adapter
|
|
204
|
+
*
|
|
205
|
+
* Checks both AGENTS.md markers and .agents/skills/ directory.
|
|
205
206
|
*/
|
|
206
207
|
async getInstalledPlugins() {
|
|
208
|
+
const plugins = new Set();
|
|
209
|
+
// 1. Check AGENTS.md markers
|
|
207
210
|
const projectPath = process.cwd();
|
|
208
211
|
const agentsMdPath = path.join(projectPath, 'AGENTS.md');
|
|
209
|
-
if (
|
|
210
|
-
|
|
212
|
+
if (await fs.pathExists(agentsMdPath)) {
|
|
213
|
+
const agentsMd = await fs.readFile(agentsMdPath, 'utf-8');
|
|
214
|
+
const pluginMarkerRegex = /<!-- Plugin: (specweave-[a-z0-9-]+) -->/g;
|
|
215
|
+
const matches = agentsMd.matchAll(pluginMarkerRegex);
|
|
216
|
+
for (const match of matches) {
|
|
217
|
+
plugins.add(match[1]);
|
|
218
|
+
}
|
|
211
219
|
}
|
|
212
|
-
|
|
213
|
-
const
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
for (const match of matches) {
|
|
217
|
-
plugins.push(match[1]);
|
|
220
|
+
// 2. Check .agents/skills/ directory
|
|
221
|
+
const dirPlugins = await this.listInstalledPluginsInDir('.agents/skills');
|
|
222
|
+
for (const p of dirPlugins) {
|
|
223
|
+
plugins.add(p);
|
|
218
224
|
}
|
|
219
|
-
return plugins;
|
|
225
|
+
return Array.from(plugins);
|
|
220
226
|
}
|
|
221
227
|
}
|
|
222
228
|
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/generic/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,cAAe,SAAQ,WAAW;IAA/C;;QACE,SAAI,GAAG,SAAS,CAAC;QACjB,gBAAW,GAAG,qFAAqF,CAAC;QACpG,oBAAe,GAAG,QAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/generic/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,cAAe,SAAQ,WAAW;IAA/C;;QACE,SAAI,GAAG,SAAS,CAAC;QACjB,gBAAW,GAAG,qFAAqF,CAAC;QACpG,oBAAe,GAAG,QAAiB,CAAC;IAmPtC,CAAC;IAjPC;;;;;OAKG;IACH,KAAK,CAAC,MAAM;QACV,yDAAyD;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QAEtE,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,iFAAiF,CAAC,CAAC;IACjG,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwCN,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,gBAAgB,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,qDAAqD;QACrD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,SAAS,GAAG,CAAC,CAAC;QAE9E,uCAAuC;QACvC,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAExD,MAAM,YAAY,GAAG,gBAAgB,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;QAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,IAAI,aAAa,GAAG,OAAO,YAAY,MAAM,CAAC;QAC9C,aAAa,IAAI,aAAa,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;QACzD,aAAa,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,MAAM,CAAC;QAEtD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,aAAa,IAAI,yBAAyB,CAAC;YAC3C,aAAa,IAAI,2BAA2B,CAAC;YAC7C,aAAa,IAAI,2BAA2B,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC;gBAC7C,aAAa,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,IAAI,MAAM,CAAC;YACnD,CAAC;YACD,aAAa,IAAI,IAAI,CAAC;QACxB,CAAC;QAED,aAAa,IAAI,qBAAqB,CAAC;QACvC,aAAa,IAAI,4DAA4D,CAAC;QAC9E,aAAa,IAAI,6BAA6B,CAAC;QAC/C,aAAa,IAAI,6BAA6B,CAAC;QAC/C,aAAa,IAAI,uEAAuE,CAAC;QACzF,aAAa,IAAI,qDAAqD,CAAC;QACvE,aAAa,IAAI,mDAAmD,CAAC;QACrE,aAAa,IAAI,mDAAmD,CAAC;QACrE,aAAa,IAAI,2DAA2D,CAAC;QAC7E,aAAa,IAAI,IAAI,CAAC;QAEtB,aAAa,IAAI,oBAAoB,CAAC;QACtC,aAAa,IAAI,uEAAuE,CAAC;QACzF,aAAa,IAAI,yEAAyE,CAAC;QAE3F,aAAa,IAAI,oBAAoB,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;QAElE,QAAQ,IAAI,aAAa,CAAC;QAC1B,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEzD,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;QAErD,6CAA6C;QAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAE7D,yCAAyC;QACzC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,gBAAgB,UAAU,MAAM,CAAC;QACrD,MAAM,SAAS,GAAG,oBAAoB,UAAU,MAAM,CAAC;QAEvD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,cAAc,UAAU,yBAAyB,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,cAAc,UAAU,oBAAoB,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACvF,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,WAAW,CAAC,CAAC;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,6BAA6B;QAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEzD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,iBAAiB,GAAG,0CAA0C,CAAC;YACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACrD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;QAC1E,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi CLI Adapter
|
|
3
|
+
*/
|
|
4
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
5
|
+
import { AdapterOptions, AdapterFile } from '../adapter-interface.js';
|
|
6
|
+
import type { Plugin } from '../../core/types/plugin.js';
|
|
7
|
+
export declare class KimiAdapter extends AdapterBase {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
automationLevel: "semi";
|
|
11
|
+
detect(): Promise<boolean>;
|
|
12
|
+
getFiles(): AdapterFile[];
|
|
13
|
+
install(options: AdapterOptions): Promise<void>;
|
|
14
|
+
supportsPlugins(): boolean;
|
|
15
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
16
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
17
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
18
|
+
postInstall(options: AdapterOptions): Promise<void>;
|
|
19
|
+
getInstructions(): string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/kimi/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,qBAAa,WAAY,SAAQ,WAAW;IAC1C,IAAI,SAAU;IACd,WAAW,SAA0D;IACrE,eAAe,EAAG,MAAM,CAAU;IAE5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,QAAQ,IAAI,WAAW,EAAE;IAInB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,eAAe,IAAI,OAAO;IAIpB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,eAAe,IAAI,MAAM;CAQ1B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi CLI Adapter
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as fs from '../../utils/fs-native.js';
|
|
6
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
7
|
+
export class KimiAdapter extends AdapterBase {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.name = 'kimi';
|
|
11
|
+
this.description = 'Kimi CLI adapter ā skills installed in .kimi/skills/';
|
|
12
|
+
this.automationLevel = 'semi';
|
|
13
|
+
}
|
|
14
|
+
async detect() {
|
|
15
|
+
return await this.commandExists('kimi') || await this.fileExists('.kimi');
|
|
16
|
+
}
|
|
17
|
+
getFiles() {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
async install(options) {
|
|
21
|
+
console.log('\nš¦ Installing Kimi CLI Adapter\n');
|
|
22
|
+
await fs.ensureDir(path.join(options.projectPath, '.kimi/skills'));
|
|
23
|
+
console.log('\n⨠Kimi CLI adapter installed!');
|
|
24
|
+
console.log(' Run `specweave refresh-plugins` to install skills.');
|
|
25
|
+
}
|
|
26
|
+
supportsPlugins() {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
async compilePlugin(plugin) {
|
|
30
|
+
const skillsDir = '.kimi/skills';
|
|
31
|
+
console.log(`\nš¦ Installing plugin skills for Kimi: ${plugin.manifest.name}`);
|
|
32
|
+
await this.writeSkillFiles(plugin, skillsDir);
|
|
33
|
+
console.log(` ā ${plugin.skills.length} skill(s) written to ${skillsDir}/`);
|
|
34
|
+
console.log(`\nā
Plugin ${plugin.manifest.name} installed for Kimi!`);
|
|
35
|
+
}
|
|
36
|
+
async unloadPlugin(pluginName) {
|
|
37
|
+
console.log(`\nšļø Unloading plugin from Kimi: ${pluginName}`);
|
|
38
|
+
await this.removeSkillFiles(pluginName, '.kimi/skills');
|
|
39
|
+
console.log(` ā Removed from .kimi/skills/`);
|
|
40
|
+
console.log(`\nā
Plugin ${pluginName} unloaded!`);
|
|
41
|
+
}
|
|
42
|
+
async getInstalledPlugins() {
|
|
43
|
+
return await this.listInstalledPluginsInDir('.kimi/skills');
|
|
44
|
+
}
|
|
45
|
+
async postInstall(options) {
|
|
46
|
+
console.log(this.getInstructions());
|
|
47
|
+
}
|
|
48
|
+
getInstructions() {
|
|
49
|
+
return `
|
|
50
|
+
Kimi CLI Adapter
|
|
51
|
+
|
|
52
|
+
Skills installed in .kimi/skills/.
|
|
53
|
+
Run: specweave refresh-plugins
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/kimi/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAA5C;;QACE,SAAI,GAAG,MAAM,CAAC;QACd,gBAAW,GAAG,sDAAsD,CAAC;QACrE,oBAAe,GAAG,MAAe,CAAC;IAoDpC,CAAC;IAlDC,KAAK,CAAC,MAAM;QACV,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,SAAS,GAAG,cAAc,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,2CAA2C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,SAAS,GAAG,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,sBAAsB,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,CAAC,GAAG,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;QACb,OAAO;;;;;KAKN,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapter for OpenCode AI coding tool.
|
|
5
|
+
* Writes skills to .opencode/skills/ for AI discovery.
|
|
6
|
+
*/
|
|
7
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
8
|
+
import { AdapterOptions, AdapterFile } from '../adapter-interface.js';
|
|
9
|
+
import type { Plugin } from '../../core/types/plugin.js';
|
|
10
|
+
export declare class OpenCodeAdapter extends AdapterBase {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
automationLevel: "semi";
|
|
14
|
+
detect(): Promise<boolean>;
|
|
15
|
+
getFiles(): AdapterFile[];
|
|
16
|
+
install(options: AdapterOptions): Promise<void>;
|
|
17
|
+
supportsPlugins(): boolean;
|
|
18
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
19
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
20
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
21
|
+
postInstall(options: AdapterOptions): Promise<void>;
|
|
22
|
+
getInstructions(): string;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/opencode/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,IAAI,SAAc;IAClB,WAAW,SAA8D;IACzE,eAAe,EAAG,MAAM,CAAU;IAE5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC,QAAQ,IAAI,WAAW,EAAE;IAInB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,eAAe,IAAI,OAAO;IAIpB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,eAAe,IAAI,MAAM;CAmB1B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapter for OpenCode AI coding tool.
|
|
5
|
+
* Writes skills to .opencode/skills/ for AI discovery.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as fs from '../../utils/fs-native.js';
|
|
9
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
10
|
+
export class OpenCodeAdapter extends AdapterBase {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments);
|
|
13
|
+
this.name = 'opencode';
|
|
14
|
+
this.description = 'OpenCode adapter ā skills installed in .opencode/skills/';
|
|
15
|
+
this.automationLevel = 'semi';
|
|
16
|
+
}
|
|
17
|
+
async detect() {
|
|
18
|
+
return await this.commandExists('opencode') || await this.fileExists('.opencode');
|
|
19
|
+
}
|
|
20
|
+
getFiles() {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
async install(options) {
|
|
24
|
+
console.log('\nš¦ Installing OpenCode Adapter\n');
|
|
25
|
+
await fs.ensureDir(path.join(options.projectPath, '.opencode/skills'));
|
|
26
|
+
console.log('\n⨠OpenCode adapter installed!');
|
|
27
|
+
console.log(' Skills will be written to .opencode/skills/');
|
|
28
|
+
}
|
|
29
|
+
supportsPlugins() {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
async compilePlugin(plugin) {
|
|
33
|
+
const skillsDir = '.opencode/skills';
|
|
34
|
+
console.log(`\nš¦ Installing plugin skills for OpenCode: ${plugin.manifest.name}`);
|
|
35
|
+
await this.writeSkillFiles(plugin, skillsDir);
|
|
36
|
+
console.log(` ā ${plugin.skills.length} skill(s) written to ${skillsDir}/`);
|
|
37
|
+
console.log(`\nā
Plugin ${plugin.manifest.name} installed for OpenCode!`);
|
|
38
|
+
}
|
|
39
|
+
async unloadPlugin(pluginName) {
|
|
40
|
+
console.log(`\nšļø Unloading plugin from OpenCode: ${pluginName}`);
|
|
41
|
+
await this.removeSkillFiles(pluginName, '.opencode/skills');
|
|
42
|
+
console.log(` ā Removed from .opencode/skills/`);
|
|
43
|
+
console.log(`\nā
Plugin ${pluginName} unloaded!`);
|
|
44
|
+
}
|
|
45
|
+
async getInstalledPlugins() {
|
|
46
|
+
return await this.listInstalledPluginsInDir('.opencode/skills');
|
|
47
|
+
}
|
|
48
|
+
async postInstall(options) {
|
|
49
|
+
console.log(this.getInstructions());
|
|
50
|
+
}
|
|
51
|
+
getInstructions() {
|
|
52
|
+
return `
|
|
53
|
+
OpenCode Adapter
|
|
54
|
+
|
|
55
|
+
Skills installed in .opencode/skills/.
|
|
56
|
+
AGENTS.md contains workflow reference.
|
|
57
|
+
|
|
58
|
+
Quick Start:
|
|
59
|
+
1. Open your project in OpenCode
|
|
60
|
+
2. Say: "Create increment for [feature]"
|
|
61
|
+
3. Use specweave CLI commands for workflow automation
|
|
62
|
+
|
|
63
|
+
Available CLI commands:
|
|
64
|
+
specweave create-increment Create a new increment
|
|
65
|
+
specweave status Check progress
|
|
66
|
+
specweave validate Run quality checks
|
|
67
|
+
specweave complete Close an increment
|
|
68
|
+
`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/opencode/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAAhD;;QACE,SAAI,GAAG,UAAU,CAAC;QAClB,gBAAW,GAAG,0DAA0D,CAAC;QACzE,oBAAe,GAAG,MAAe,CAAC;IA+DpC,CAAC;IA7DC,KAAK,CAAC,MAAM;QACV,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IACpF,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,SAAS,GAAG,kBAAkB,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,SAAS,GAAG,CAAC,CAAC;QAC9E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,0BAA0B,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;QACb,OAAO;;;;;;;;;;;;;;;;KAgBN,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -161,6 +161,21 @@ adapters:
|
|
|
161
161
|
market_share: 10%
|
|
162
162
|
priority: P1
|
|
163
163
|
|
|
164
|
+
- name: opencode
|
|
165
|
+
description: "OpenCode adapter - Skills installed in .opencode/skills/"
|
|
166
|
+
automation_level: semi
|
|
167
|
+
status: active
|
|
168
|
+
directory: opencode
|
|
169
|
+
features:
|
|
170
|
+
- .opencode/skills/*.md skill files auto-loaded by OpenCode
|
|
171
|
+
- MCP support for extensibility
|
|
172
|
+
- CLI-based AI coding tool
|
|
173
|
+
requirements:
|
|
174
|
+
- OpenCode CLI installed
|
|
175
|
+
- Node.js >= 18.0.0
|
|
176
|
+
market_share: 5%
|
|
177
|
+
priority: P2
|
|
178
|
+
|
|
164
179
|
- name: zed
|
|
165
180
|
description: "Zed adapter - Skills installed in .rules/"
|
|
166
181
|
automation_level: semi
|
|
@@ -231,6 +246,35 @@ adapters:
|
|
|
231
246
|
market_share: 5%
|
|
232
247
|
priority: P2
|
|
233
248
|
|
|
249
|
+
- name: kimi
|
|
250
|
+
description: "Kimi CLI adapter - Skills installed in .kimi/skills/"
|
|
251
|
+
automation_level: semi
|
|
252
|
+
status: active
|
|
253
|
+
directory: kimi
|
|
254
|
+
features:
|
|
255
|
+
- .kimi/skills/*.md skill files
|
|
256
|
+
- Moonshot AI coding assistant
|
|
257
|
+
requirements:
|
|
258
|
+
- Kimi CLI installed
|
|
259
|
+
- Node.js >= 18.0.0
|
|
260
|
+
market_share: 5%
|
|
261
|
+
priority: P2
|
|
262
|
+
|
|
263
|
+
- name: trae
|
|
264
|
+
description: "Trae adapter - Skills installed in .trae/rules/"
|
|
265
|
+
automation_level: semi
|
|
266
|
+
status: active
|
|
267
|
+
directory: trae
|
|
268
|
+
features:
|
|
269
|
+
- .trae/rules/*.md skill files
|
|
270
|
+
- ByteDance AI coding assistant
|
|
271
|
+
- MCP support
|
|
272
|
+
requirements:
|
|
273
|
+
- Trae installed
|
|
274
|
+
- Node.js >= 18.0.0
|
|
275
|
+
market_share: 5%
|
|
276
|
+
priority: P2
|
|
277
|
+
|
|
234
278
|
# Future adapters (P2/P3)
|
|
235
279
|
future_adapters: []
|
|
236
280
|
|
|
@@ -245,11 +289,14 @@ capabilities:
|
|
|
245
289
|
windsurf: via_rules_folder
|
|
246
290
|
continue: via_rules_folder
|
|
247
291
|
cline: via_rules_folder
|
|
292
|
+
opencode: via_rules_folder
|
|
248
293
|
zed: via_rules_folder
|
|
249
294
|
amazonq: via_rules_folder
|
|
250
295
|
jetbrains: via_rules_folder
|
|
251
296
|
aider: via_rules_folder
|
|
252
297
|
tabnine: via_rules_folder
|
|
298
|
+
kimi: via_rules_folder
|
|
299
|
+
trae: via_rules_folder
|
|
253
300
|
generic: via_rules_folder
|
|
254
301
|
|
|
255
302
|
agents:
|
|
@@ -261,11 +308,14 @@ capabilities:
|
|
|
261
308
|
windsurf: via_agents_md
|
|
262
309
|
continue: via_agents_md
|
|
263
310
|
cline: via_agents_md
|
|
311
|
+
opencode: via_agents_md
|
|
264
312
|
zed: via_agents_md
|
|
265
313
|
amazonq: via_agents_md
|
|
266
314
|
jetbrains: via_agents_md
|
|
267
315
|
aider: via_agents_md
|
|
268
316
|
tabnine: via_agents_md
|
|
317
|
+
kimi: via_agents_md
|
|
318
|
+
trae: via_agents_md
|
|
269
319
|
generic: via_agents_md
|
|
270
320
|
|
|
271
321
|
hooks:
|
|
@@ -277,11 +327,14 @@ capabilities:
|
|
|
277
327
|
windsurf: none
|
|
278
328
|
continue: none
|
|
279
329
|
cline: none
|
|
330
|
+
opencode: none
|
|
280
331
|
zed: none
|
|
281
332
|
amazonq: none
|
|
282
333
|
jetbrains: none
|
|
283
334
|
aider: none
|
|
284
335
|
tabnine: none
|
|
336
|
+
kimi: none
|
|
337
|
+
trae: none
|
|
285
338
|
generic: none
|
|
286
339
|
|
|
287
340
|
instruction_file:
|
|
@@ -293,11 +346,14 @@ capabilities:
|
|
|
293
346
|
windsurf: .windsurf/rules/
|
|
294
347
|
continue: .continue/rules/
|
|
295
348
|
cline: .cline/rules/
|
|
349
|
+
opencode: .opencode/skills/
|
|
296
350
|
zed: .rules/
|
|
297
351
|
amazonq: .amazonq/rules/
|
|
298
352
|
jetbrains: .aiassistant/rules/
|
|
299
353
|
aider: .aider/
|
|
300
354
|
tabnine: .tabnine/guidelines/
|
|
355
|
+
kimi: .kimi/skills/
|
|
356
|
+
trae: .trae/rules/
|
|
301
357
|
generic: AGENTS.md
|
|
302
358
|
|
|
303
359
|
context_manifests:
|
|
@@ -309,11 +365,14 @@ capabilities:
|
|
|
309
365
|
windsurf: manual_reference
|
|
310
366
|
continue: manual_reference
|
|
311
367
|
cline: manual_reference
|
|
368
|
+
opencode: manual_reference
|
|
312
369
|
zed: manual_reference
|
|
313
370
|
amazonq: manual_reference
|
|
314
371
|
jetbrains: manual_reference
|
|
315
372
|
aider: manual_reference
|
|
316
373
|
tabnine: manual_reference
|
|
374
|
+
kimi: manual_reference
|
|
375
|
+
trae: manual_reference
|
|
317
376
|
generic: manual_copy_paste
|
|
318
377
|
|
|
319
378
|
# Target market coverage
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trae Adapter (ByteDance)
|
|
3
|
+
*/
|
|
4
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
5
|
+
import { AdapterOptions, AdapterFile } from '../adapter-interface.js';
|
|
6
|
+
import type { Plugin } from '../../core/types/plugin.js';
|
|
7
|
+
export declare class TraeAdapter extends AdapterBase {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
automationLevel: "semi";
|
|
11
|
+
detect(): Promise<boolean>;
|
|
12
|
+
getFiles(): AdapterFile[];
|
|
13
|
+
install(options: AdapterOptions): Promise<void>;
|
|
14
|
+
supportsPlugins(): boolean;
|
|
15
|
+
compilePlugin(plugin: Plugin): Promise<void>;
|
|
16
|
+
unloadPlugin(pluginName: string): Promise<void>;
|
|
17
|
+
getInstalledPlugins(): Promise<string[]>;
|
|
18
|
+
postInstall(options: AdapterOptions): Promise<void>;
|
|
19
|
+
getInstructions(): string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/adapters/trae/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,qBAAa,WAAY,SAAQ,WAAW;IAC1C,IAAI,SAAU;IACd,WAAW,SAAqD;IAChE,eAAe,EAAG,MAAM,CAAU;IAE5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAUhC,QAAQ,IAAI,WAAW,EAAE;IAInB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrD,eAAe,IAAI,OAAO;IAIpB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,eAAe,IAAI,MAAM;CAQ1B"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trae Adapter (ByteDance)
|
|
3
|
+
*/
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as fs from '../../utils/fs-native.js';
|
|
6
|
+
import { AdapterBase } from '../adapter-base.js';
|
|
7
|
+
export class TraeAdapter extends AdapterBase {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.name = 'trae';
|
|
11
|
+
this.description = 'Trae adapter ā skills installed in .trae/rules/';
|
|
12
|
+
this.automationLevel = 'semi';
|
|
13
|
+
}
|
|
14
|
+
async detect() {
|
|
15
|
+
try {
|
|
16
|
+
const { execSync } = await import('child_process');
|
|
17
|
+
execSync('which trae', { stdio: 'ignore' });
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return await this.fileExists('.trae');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
getFiles() {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
async install(options) {
|
|
28
|
+
console.log('\nš¦ Installing Trae Adapter\n');
|
|
29
|
+
await fs.ensureDir(path.join(options.projectPath, '.trae/rules'));
|
|
30
|
+
console.log('\n⨠Trae adapter installed!');
|
|
31
|
+
console.log(' Run `specweave refresh-plugins` to install skills.');
|
|
32
|
+
}
|
|
33
|
+
supportsPlugins() {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
async compilePlugin(plugin) {
|
|
37
|
+
const rulesDir = '.trae/rules';
|
|
38
|
+
console.log(`\nš¦ Installing plugin skills for Trae: ${plugin.manifest.name}`);
|
|
39
|
+
await this.writeSkillFiles(plugin, rulesDir);
|
|
40
|
+
console.log(` ā ${plugin.skills.length} skill(s) written to ${rulesDir}/`);
|
|
41
|
+
console.log(`\nā
Plugin ${plugin.manifest.name} installed for Trae!`);
|
|
42
|
+
}
|
|
43
|
+
async unloadPlugin(pluginName) {
|
|
44
|
+
console.log(`\nšļø Unloading plugin from Trae: ${pluginName}`);
|
|
45
|
+
await this.removeSkillFiles(pluginName, '.trae/rules');
|
|
46
|
+
console.log(` ā Removed from .trae/rules/`);
|
|
47
|
+
console.log(`\nā
Plugin ${pluginName} unloaded!`);
|
|
48
|
+
}
|
|
49
|
+
async getInstalledPlugins() {
|
|
50
|
+
return await this.listInstalledPluginsInDir('.trae/rules');
|
|
51
|
+
}
|
|
52
|
+
async postInstall(options) {
|
|
53
|
+
console.log(this.getInstructions());
|
|
54
|
+
}
|
|
55
|
+
getInstructions() {
|
|
56
|
+
return `
|
|
57
|
+
Trae Adapter
|
|
58
|
+
|
|
59
|
+
Skills installed in .trae/rules/.
|
|
60
|
+
Run: specweave refresh-plugins
|
|
61
|
+
`;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/adapters/trae/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAA5C;;QACE,SAAI,GAAG,MAAM,CAAC;QACd,gBAAW,GAAG,iDAAiD,CAAC;QAChE,oBAAe,GAAG,MAAe,CAAC;IA0DpC,CAAC;IAxDC,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACnD,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAc;QAChC,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,2CAA2C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,wBAAwB,QAAQ,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,QAAQ,CAAC,IAAI,sBAAsB,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,OAAO,CAAC,GAAG,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,MAAM,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAuB;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,eAAe;QACb,OAAO;;;;;KAKN,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,OAAO,EACL,KAAK,WAAW,EAqBjB,MAAM,0BAA0B,CAAC;AASlC,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,OAAO,CAU7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAuef"}
|