mirror of
https://github.com/hansjone/netxops.git
synced 2026-10-09 08:00:45 +08:00
Load hasSkills packs onto preset/public planes with groupKb toggles; unify content has* keys and keep netx-ops pure. Co-authored-by: Cursor <cursoragent@cursor.com>
95 lines
2.5 KiB
JavaScript
95 lines
2.5 KiB
JavaScript
/**
|
|
* KB pack skill loader from realRoot/_skills.
|
|
*/
|
|
|
|
import assert from 'node:assert/strict'
|
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
import { tmpdir } from 'node:os'
|
|
import { join } from 'node:path'
|
|
import test from 'node:test'
|
|
|
|
import { kbPackSkillsEnabled, registerKbPackSkills } from '../src/netx/kb-pack-skills.ts'
|
|
|
|
async function withTemp(run) {
|
|
const root = mkdtempSync(join(tmpdir(), 'netxops-kb-pack-'))
|
|
try {
|
|
await run(root)
|
|
} finally {
|
|
rmSync(root, { recursive: true, force: true })
|
|
}
|
|
}
|
|
|
|
function configuredSnap(realRoot, content = {}) {
|
|
return {
|
|
status: 'configured',
|
|
realRoot,
|
|
operatorName: 'IOH',
|
|
country: 'ID',
|
|
version: '1',
|
|
content: {
|
|
hasRegions: false,
|
|
hasTheory: false,
|
|
hasPacket: false,
|
|
hasCommon: false,
|
|
hasSkills: true,
|
|
...content,
|
|
},
|
|
errorMessage: '',
|
|
}
|
|
}
|
|
|
|
test('kbPackSkillsEnabled requires configured + hasSkills', () => {
|
|
assert.equal(kbPackSkillsEnabled(configuredSnap('/x')), true)
|
|
assert.equal(kbPackSkillsEnabled(configuredSnap('/x', { hasSkills: false })), false)
|
|
assert.equal(kbPackSkillsEnabled({
|
|
...configuredSnap('/x'),
|
|
status: 'unconfigured',
|
|
}), false)
|
|
})
|
|
|
|
test('registerKbPackSkills loads _skills/*/SKILL.md', async () => {
|
|
await withTemp(async (root) => {
|
|
const skillDir = join(root, '_skills', 'kb-troubleshoot')
|
|
mkdirSync(skillDir, { recursive: true })
|
|
writeFileSync(join(skillDir, 'SKILL.md'), `---
|
|
name: kb-troubleshoot
|
|
description: KB triage playbook
|
|
---
|
|
|
|
# kb-troubleshoot
|
|
`, 'utf8')
|
|
|
|
const registered = []
|
|
const ctx = {
|
|
logger: { info() {}, warn() {} },
|
|
skills: {
|
|
register(skill) {
|
|
registered.push(skill)
|
|
return () => {}
|
|
},
|
|
},
|
|
}
|
|
|
|
const dispose = await registerKbPackSkills(ctx, configuredSnap(root), { enabled: true })
|
|
assert.equal(registered.length, 1)
|
|
assert.equal(registered[0].name, 'kb-troubleshoot')
|
|
assert.equal(registered[0].provider, 'netxops-kb-pack')
|
|
dispose()
|
|
})
|
|
})
|
|
|
|
test('registerKbPackSkills no-op when disabled or hasSkills false', async () => {
|
|
const registered = []
|
|
const ctx = {
|
|
logger: { info() {}, warn() {} },
|
|
skills: {
|
|
register(skill) {
|
|
registered.push(skill)
|
|
return () => {}
|
|
},
|
|
},
|
|
}
|
|
await registerKbPackSkills(ctx, configuredSnap('/nope'), { enabled: false })
|
|
await registerKbPackSkills(ctx, configuredSnap('/nope', { hasSkills: false }), { enabled: true })
|
|
assert.equal(registered.length, 0)
|
|
})
|