61 lines
2.3 KiB
JavaScript
61 lines
2.3 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { spawnSync } from 'node:child_process'
|
|
import { chmodSync, existsSync, readFileSync } from 'node:fs'
|
|
import { dirname, join } from 'node:path'
|
|
import test from 'node:test'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { cleanup, tempDir, write } from './helpers.mjs'
|
|
|
|
const here = dirname(fileURLToPath(import.meta.url))
|
|
const script = join(here, '..', 'install.sh')
|
|
const root = join(here, '..', '..')
|
|
const agentsSkills = join(root, '.agents', 'skills')
|
|
const NAMES = [
|
|
'openspec-apply-change',
|
|
'openspec-archive-change',
|
|
'openspec-explore',
|
|
'openspec-propose',
|
|
'openspec-sync-specs',
|
|
'openspec-update-change',
|
|
]
|
|
|
|
test('repository ships six agents skills for DSH', () => {
|
|
assert.equal(readFileSync(join(agentsSkills, '.openspec-target'), 'utf8').trim(), 'agents')
|
|
for (const name of NAMES) {
|
|
const file = join(agentsSkills, name, 'SKILL.md')
|
|
assert.ok(existsSync(file), `${name}/SKILL.md is missing`)
|
|
const text = readFileSync(file, 'utf8')
|
|
assert.match(text, new RegExp(`^name: ${name}$`, 'm'), `${name}: frontmatter name must match the dir`)
|
|
assert.match(text, /description: .*openspec/i, `${name}: description must mention openspec`)
|
|
}
|
|
})
|
|
|
|
test('install.sh --check reports the openspec CLI and the agents skills', () => {
|
|
const home = tempDir()
|
|
try {
|
|
const bin = join(home, 'bin')
|
|
write(join(bin, 'openspec'), '#!/bin/sh\n[ "$1" = "--version" ] && echo 1.13.1\nexit 0\n')
|
|
chmodSync(join(bin, 'openspec'), 0o755)
|
|
const env = { ...process.env, HOME: home, DSH_HOME: join(home, '.dsh'), PATH: `${bin}:${process.env.PATH}` }
|
|
const run = spawnSync('bash', [script, '--check'], { env, encoding: 'utf8' })
|
|
assert.equal(run.status, 0, run.stderr)
|
|
assert.match(run.stdout, /ok: openspec 1\.13\.1/)
|
|
assert.match(run.stdout, /ok: openspec agents skills \(/)
|
|
} finally {
|
|
cleanup(home)
|
|
}
|
|
})
|
|
|
|
test('install.sh --check warns but does not fail without the openspec CLI', () => {
|
|
const home = tempDir()
|
|
try {
|
|
const bin = join(home, 'bin')
|
|
const env = { ...process.env, HOME: home, DSH_HOME: join(home, '.dsh'), PATH: bin }
|
|
const run = spawnSync('bash', [script, '--check'], { env, encoding: 'utf8' })
|
|
assert.match(run.stdout + run.stderr, /WARN: openspec not found/)
|
|
assert.equal(run.status, 0)
|
|
} finally {
|
|
cleanup(home)
|
|
}
|
|
})
|