(message)
| 15 | } |
| 16 | |
| 17 | processSkillUpdate(message) { |
| 18 | if (!this.skillPath) { |
| 19 | this.logger.warn('[skill-updater] No skill path configured, skipping update'); |
| 20 | return false; |
| 21 | } |
| 22 | |
| 23 | const payload = message.payload || message; |
| 24 | const content = payload.content || payload.skill_content; |
| 25 | |
| 26 | if (!content || typeof content !== 'string') { |
| 27 | this.logger.warn('[skill-updater] No content in skill_update message'); |
| 28 | return false; |
| 29 | } |
| 30 | |
| 31 | try { |
| 32 | const dir = path.dirname(this.skillPath); |
| 33 | if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); |
| 34 | |
| 35 | if (fs.existsSync(this.skillPath)) { |
| 36 | const backupPath = this.skillPath + '.bak'; |
| 37 | fs.copyFileSync(this.skillPath, backupPath); |
| 38 | } |
| 39 | |
| 40 | fs.writeFileSync(this.skillPath, content, 'utf8'); |
| 41 | this.store.setState('last_skill_update', new Date().toISOString()); |
| 42 | this.store.setState('skill_version', payload.version || 'unknown'); |
| 43 | this.logger.log(`[skill-updater] Updated skill.md (version: ${payload.version || 'unknown'})`); |
| 44 | return true; |
| 45 | } catch (err) { |
| 46 | this.logger.error(`[skill-updater] Failed to update: ${err.message}`); |
| 47 | return false; |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | pollAndApply() { |
| 52 | const updates = this.store.poll({ type: 'skill_update' }); |
no test coverage detected