@devenius/junamis-skills 0.0.0-stage → 1.1.0
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/CHANGELOG.md +150 -0
- package/LICENSE +21 -0
- package/README.md +231 -2
- package/SECURITY.md +81 -0
- package/bin/junamis-skills.js +7 -0
- package/dist/cli.d.ts +59 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +564 -0
- package/dist/cli.js.map +1 -0
- package/dist/color.d.ts +40 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +55 -0
- package/dist/color.js.map +1 -0
- package/dist/design/atomic.d.ts +4 -0
- package/dist/design/atomic.d.ts.map +1 -0
- package/dist/design/atomic.js +14 -0
- package/dist/design/atomic.js.map +1 -0
- package/dist/design/bootstrap.d.ts +23 -0
- package/dist/design/bootstrap.d.ts.map +1 -0
- package/dist/design/bootstrap.js +411 -0
- package/dist/design/bootstrap.js.map +1 -0
- package/dist/design/cli.d.ts +86 -0
- package/dist/design/cli.d.ts.map +1 -0
- package/dist/design/cli.js +425 -0
- package/dist/design/cli.js.map +1 -0
- package/dist/design/delta.d.ts +45 -0
- package/dist/design/delta.d.ts.map +1 -0
- package/dist/design/delta.js +557 -0
- package/dist/design/delta.js.map +1 -0
- package/dist/design/drift.d.ts +26 -0
- package/dist/design/drift.d.ts.map +1 -0
- package/dist/design/drift.js +341 -0
- package/dist/design/drift.js.map +1 -0
- package/dist/design/errors.d.ts +25 -0
- package/dist/design/errors.d.ts.map +1 -0
- package/dist/design/errors.js +30 -0
- package/dist/design/errors.js.map +1 -0
- package/dist/design/events.d.ts +18 -0
- package/dist/design/events.d.ts.map +1 -0
- package/dist/design/events.js +44 -0
- package/dist/design/events.js.map +1 -0
- package/dist/design/fingerprint.d.ts +10 -0
- package/dist/design/fingerprint.d.ts.map +1 -0
- package/dist/design/fingerprint.js +66 -0
- package/dist/design/fingerprint.js.map +1 -0
- package/dist/design/index-gen.d.ts +16 -0
- package/dist/design/index-gen.d.ts.map +1 -0
- package/dist/design/index-gen.js +94 -0
- package/dist/design/index-gen.js.map +1 -0
- package/dist/design/schema.d.ts +54 -0
- package/dist/design/schema.d.ts.map +1 -0
- package/dist/design/schema.js +408 -0
- package/dist/design/schema.js.map +1 -0
- package/dist/design/yaml.d.ts +12 -0
- package/dist/design/yaml.d.ts.map +1 -0
- package/dist/design/yaml.js +264 -0
- package/dist/design/yaml.js.map +1 -0
- package/dist/external.d.ts +61 -0
- package/dist/external.d.ts.map +1 -0
- package/dist/external.js +426 -0
- package/dist/external.js.map +1 -0
- package/dist/guide.d.ts +17 -0
- package/dist/guide.d.ts.map +1 -0
- package/dist/guide.js +219 -0
- package/dist/guide.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/install-external.d.ts +3 -0
- package/dist/install-external.d.ts.map +1 -0
- package/dist/install-external.js +37 -0
- package/dist/install-external.js.map +1 -0
- package/dist/library-install.d.ts +39 -0
- package/dist/library-install.d.ts.map +1 -0
- package/dist/library-install.js +663 -0
- package/dist/library-install.js.map +1 -0
- package/dist/orchestrator/boot.d.ts +3 -0
- package/dist/orchestrator/boot.d.ts.map +1 -0
- package/dist/orchestrator/boot.js +515 -0
- package/dist/orchestrator/boot.js.map +1 -0
- package/dist/orchestrator/cli.d.ts +37 -0
- package/dist/orchestrator/cli.d.ts.map +1 -0
- package/dist/orchestrator/cli.js +563 -0
- package/dist/orchestrator/cli.js.map +1 -0
- package/dist/orchestrator/commands.d.ts +46 -0
- package/dist/orchestrator/commands.d.ts.map +1 -0
- package/dist/orchestrator/commands.js +752 -0
- package/dist/orchestrator/commands.js.map +1 -0
- package/dist/orchestrator/compaction.d.ts +21 -0
- package/dist/orchestrator/compaction.d.ts.map +1 -0
- package/dist/orchestrator/compaction.js +93 -0
- package/dist/orchestrator/compaction.js.map +1 -0
- package/dist/orchestrator/drift.d.ts +11 -0
- package/dist/orchestrator/drift.d.ts.map +1 -0
- package/dist/orchestrator/drift.js +181 -0
- package/dist/orchestrator/drift.js.map +1 -0
- package/dist/orchestrator/errors.d.ts +52 -0
- package/dist/orchestrator/errors.d.ts.map +1 -0
- package/dist/orchestrator/errors.js +96 -0
- package/dist/orchestrator/errors.js.map +1 -0
- package/dist/orchestrator/frontmatter.d.ts +6 -0
- package/dist/orchestrator/frontmatter.d.ts.map +1 -0
- package/dist/orchestrator/frontmatter.js +50 -0
- package/dist/orchestrator/frontmatter.js.map +1 -0
- package/dist/orchestrator/fsx.d.ts +45 -0
- package/dist/orchestrator/fsx.d.ts.map +1 -0
- package/dist/orchestrator/fsx.js +295 -0
- package/dist/orchestrator/fsx.js.map +1 -0
- package/dist/orchestrator/handoff.d.ts +8 -0
- package/dist/orchestrator/handoff.d.ts.map +1 -0
- package/dist/orchestrator/handoff.js +246 -0
- package/dist/orchestrator/handoff.js.map +1 -0
- package/dist/orchestrator/hash.d.ts +10 -0
- package/dist/orchestrator/hash.d.ts.map +1 -0
- package/dist/orchestrator/hash.js +65 -0
- package/dist/orchestrator/hash.js.map +1 -0
- package/dist/orchestrator/journal.d.ts +35 -0
- package/dist/orchestrator/journal.d.ts.map +1 -0
- package/dist/orchestrator/journal.js +163 -0
- package/dist/orchestrator/journal.js.map +1 -0
- package/dist/orchestrator/lease.d.ts +31 -0
- package/dist/orchestrator/lease.d.ts.map +1 -0
- package/dist/orchestrator/lease.js +175 -0
- package/dist/orchestrator/lease.js.map +1 -0
- package/dist/orchestrator/plan.d.ts +27 -0
- package/dist/orchestrator/plan.d.ts.map +1 -0
- package/dist/orchestrator/plan.js +240 -0
- package/dist/orchestrator/plan.js.map +1 -0
- package/dist/orchestrator/report.d.ts +49 -0
- package/dist/orchestrator/report.d.ts.map +1 -0
- package/dist/orchestrator/report.js +244 -0
- package/dist/orchestrator/report.js.map +1 -0
- package/dist/orchestrator/state.d.ts +43 -0
- package/dist/orchestrator/state.d.ts.map +1 -0
- package/dist/orchestrator/state.js +369 -0
- package/dist/orchestrator/state.js.map +1 -0
- package/dist/orchestrator/store.d.ts +42 -0
- package/dist/orchestrator/store.d.ts.map +1 -0
- package/dist/orchestrator/store.js +202 -0
- package/dist/orchestrator/store.js.map +1 -0
- package/dist/orchestrator/test-hooks.d.ts +5 -0
- package/dist/orchestrator/test-hooks.d.ts.map +1 -0
- package/dist/orchestrator/test-hooks.js +31 -0
- package/dist/orchestrator/test-hooks.js.map +1 -0
- package/dist/orchestrator/time.d.ts +11 -0
- package/dist/orchestrator/time.d.ts.map +1 -0
- package/dist/orchestrator/time.js +38 -0
- package/dist/orchestrator/time.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +42 -0
- package/dist/paths.js.map +1 -0
- package/dist/pinned-source.d.ts +13 -0
- package/dist/pinned-source.d.ts.map +1 -0
- package/dist/pinned-source.js +238 -0
- package/dist/pinned-source.js.map +1 -0
- package/dist/reconcile/cli.d.ts +17 -0
- package/dist/reconcile/cli.d.ts.map +1 -0
- package/dist/reconcile/cli.js +171 -0
- package/dist/reconcile/cli.js.map +1 -0
- package/dist/reconcile/detectors.d.ts +29 -0
- package/dist/reconcile/detectors.d.ts.map +1 -0
- package/dist/reconcile/detectors.js +294 -0
- package/dist/reconcile/detectors.js.map +1 -0
- package/dist/reconcile/manifest.d.ts +11 -0
- package/dist/reconcile/manifest.d.ts.map +1 -0
- package/dist/reconcile/manifest.js +118 -0
- package/dist/reconcile/manifest.js.map +1 -0
- package/dist/reconcile/queue.d.ts +3 -0
- package/dist/reconcile/queue.d.ts.map +1 -0
- package/dist/reconcile/queue.js +723 -0
- package/dist/reconcile/queue.js.map +1 -0
- package/dist/reconcile/score.d.ts +19 -0
- package/dist/reconcile/score.d.ts.map +1 -0
- package/dist/reconcile/score.js +58 -0
- package/dist/reconcile/score.js.map +1 -0
- package/dist/scripts/check-opencode-config.d.ts +12 -0
- package/dist/scripts/check-opencode-config.d.ts.map +1 -0
- package/dist/scripts/check-opencode-config.js +216 -0
- package/dist/scripts/check-opencode-config.js.map +1 -0
- package/dist/scripts/check-pack.d.ts +3 -0
- package/dist/scripts/check-pack.d.ts.map +1 -0
- package/dist/scripts/check-pack.js +74 -0
- package/dist/scripts/check-pack.js.map +1 -0
- package/dist/scripts/check-pins.d.ts +9 -0
- package/dist/scripts/check-pins.d.ts.map +1 -0
- package/dist/scripts/check-pins.js +65 -0
- package/dist/scripts/check-pins.js.map +1 -0
- package/dist/scripts/check-security.d.ts +3 -0
- package/dist/scripts/check-security.d.ts.map +1 -0
- package/dist/scripts/check-security.js +47 -0
- package/dist/scripts/check-security.js.map +1 -0
- package/dist/scripts/check-skills-lock.d.ts +7 -0
- package/dist/scripts/check-skills-lock.d.ts.map +1 -0
- package/dist/scripts/check-skills-lock.js +36 -0
- package/dist/scripts/check-skills-lock.js.map +1 -0
- package/dist/scripts/check-skills-sync.d.ts +7 -0
- package/dist/scripts/check-skills-sync.d.ts.map +1 -0
- package/dist/scripts/check-skills-sync.js +146 -0
- package/dist/scripts/check-skills-sync.js.map +1 -0
- package/dist/scripts/check-yaml.d.ts +3 -0
- package/dist/scripts/check-yaml.d.ts.map +1 -0
- package/dist/scripts/check-yaml.js +41 -0
- package/dist/scripts/check-yaml.js.map +1 -0
- package/dist/scripts/publish-npm.d.ts +3 -0
- package/dist/scripts/publish-npm.d.ts.map +1 -0
- package/dist/scripts/publish-npm.js +67 -0
- package/dist/scripts/publish-npm.js.map +1 -0
- package/dist/scripts/release-check.d.ts +3 -0
- package/dist/scripts/release-check.d.ts.map +1 -0
- package/dist/scripts/release-check.js +97 -0
- package/dist/scripts/release-check.js.map +1 -0
- package/dist/scripts/support.d.ts +41 -0
- package/dist/scripts/support.d.ts.map +1 -0
- package/dist/scripts/support.js +78 -0
- package/dist/scripts/support.js.map +1 -0
- package/dist/targets/claude.d.ts +4 -0
- package/dist/targets/claude.d.ts.map +1 -0
- package/dist/targets/claude.js +42 -0
- package/dist/targets/claude.js.map +1 -0
- package/dist/targets/cline.d.ts +4 -0
- package/dist/targets/cline.d.ts.map +1 -0
- package/dist/targets/cline.js +39 -0
- package/dist/targets/cline.js.map +1 -0
- package/dist/targets/cursor.d.ts +4 -0
- package/dist/targets/cursor.d.ts.map +1 -0
- package/dist/targets/cursor.js +40 -0
- package/dist/targets/cursor.js.map +1 -0
- package/dist/targets/index.d.ts +4 -0
- package/dist/targets/index.d.ts.map +1 -0
- package/dist/targets/index.js +11 -0
- package/dist/targets/index.js.map +1 -0
- package/dist/targets/opencode.d.ts +4 -0
- package/dist/targets/opencode.d.ts.map +1 -0
- package/dist/targets/opencode.js +48 -0
- package/dist/targets/opencode.js.map +1 -0
- package/dist/targets/windsurf.d.ts +4 -0
- package/dist/targets/windsurf.d.ts.map +1 -0
- package/dist/targets/windsurf.js +41 -0
- package/dist/targets/windsurf.js.map +1 -0
- package/dist/types/common.d.ts +193 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +6 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/design.d.ts +185 -0
- package/dist/types/design.d.ts.map +1 -0
- package/dist/types/design.js +3 -0
- package/dist/types/design.js.map +1 -0
- package/dist/types/guards.d.ts +13 -0
- package/dist/types/guards.d.ts.map +1 -0
- package/dist/types/guards.js +64 -0
- package/dist/types/guards.js.map +1 -0
- package/dist/types/handoff.d.ts +29 -0
- package/dist/types/handoff.d.ts.map +1 -0
- package/dist/types/handoff.js +3 -0
- package/dist/types/handoff.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/orchestrator.d.ts +414 -0
- package/dist/types/orchestrator.d.ts.map +1 -0
- package/dist/types/orchestrator.js +4 -0
- package/dist/types/orchestrator.js.map +1 -0
- package/dist/types/reconcile.d.ts +160 -0
- package/dist/types/reconcile.d.ts.map +1 -0
- package/dist/types/reconcile.js +3 -0
- package/dist/types/reconcile.js.map +1 -0
- package/docs/RECONCILE.md +505 -0
- package/docs/design/_schema.md +506 -0
- package/junamis-skills.yml +328 -0
- package/library/EXTERNAL.md +35 -0
- package/library/HANDOFF.md +93 -0
- package/library/RESUME.md +429 -0
- package/library/SAFETY.md +83 -0
- package/library/agents/context-keeper.md +41 -0
- package/library/agents/frontend.md +43 -0
- package/library/agents/maintainer.md +44 -0
- package/library/agents/nestjs.md +40 -0
- package/library/agents/nextjs.md +40 -0
- package/library/agents/operator.md +42 -0
- package/library/agents/orchestrator.md +313 -0
- package/library/agents/researcher.md +40 -0
- package/library/agents/reviewer.md +40 -0
- package/library/skills/db-migrate/SKILL.md +50 -0
- package/library/skills/decision-record/SKILL.md +74 -0
- package/library/skills/dependency-upgrade/SKILL.md +57 -0
- package/library/skills/deploy-verify/SKILL.md +51 -0
- package/library/skills/document/SKILL.md +51 -0
- package/library/skills/env-doctor/SKILL.md +65 -0
- package/library/skills/frontend/SKILL.md +63 -0
- package/library/skills/handoff/SKILL.md +79 -0
- package/library/skills/incident-response/SKILL.md +69 -0
- package/library/skills/nestjs/SKILL.md +49 -0
- package/library/skills/nextjs/SKILL.md +48 -0
- package/library/skills/perf-budget/SKILL.md +62 -0
- package/library/skills/refactor-safely/SKILL.md +48 -0
- package/library/skills/release-prep/SKILL.md +75 -0
- package/library/skills/research/SKILL.md +66 -0
- package/library/skills/rollback/SKILL.md +49 -0
- package/library/skills/route/SKILL.md +107 -0
- package/library/skills/route-external/SKILL.md +67 -0
- package/library/skills/security-audit/SKILL.md +64 -0
- package/library/skills/skill-author/SKILL.md +49 -0
- package/opencode.json +5906 -0
- package/package.json +88 -4
- package/scripts/design-registry.mjs +7 -0
- package/scripts/orchestrator-state.mjs +7 -0
- package/scripts/reconcile.mjs +7 -0
- package/skills-lock.json +197 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
import { existsSync, lstatSync, readlinkSync } from "node:fs";
|
|
2
|
+
import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { createColors, colorsEnabled } from "./color.js";
|
|
6
|
+
import { PACKAGE_ROOT, GUIDE_NAME, MARKER_PATH, writeGuide } from "./guide.js";
|
|
7
|
+
import { getTarget, targets } from "./targets/index.js";
|
|
8
|
+
import { installExternal, validateAgent, validateInstaller } from "./external.js";
|
|
9
|
+
import { planLibraryInstall, applyLibraryInstall, manifestPath } from "./library-install.js";
|
|
10
|
+
import { configRoot, legacyConfigParent } from "./paths.js";
|
|
11
|
+
import { isOneOf, isRecord, parseJsonUnknown } from "./types/guards.js";
|
|
12
|
+
const HELP = `junamis-skills
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
junamis-skills init [--agent opencode|claude] [--scope global|project] [--dir <path>] [--force] [--dry-run]
|
|
16
|
+
Install everything this package provides:
|
|
17
|
+
1. write ${GUIDE_NAME} into the project;
|
|
18
|
+
2. write opencode.json (OpenCode only) when it is missing, or always with --force;
|
|
19
|
+
3. install the library skills, canonical agents, links, and shared docs;
|
|
20
|
+
4. install every pinned external skill from skills-lock.json.
|
|
21
|
+
Existing config or library files you edited are left unchanged unless --force.
|
|
22
|
+
--dry-run prints the plan without writing or using the network.
|
|
23
|
+
|
|
24
|
+
junamis-skills status [--dir <path>] [--scope global|project|all]
|
|
25
|
+
Report the guide, marker, per-target internal/external skill counts, canonical
|
|
26
|
+
agents and link state, legacy leftovers, library manifests, opencode.json
|
|
27
|
+
validity, external skill coverage, and the SECURITY.md scan record. Exits 1
|
|
28
|
+
only when a detected target's manifest or config is invalid. Default scope:
|
|
29
|
+
global (matching init).
|
|
30
|
+
|
|
31
|
+
junamis-skills help
|
|
32
|
+
|
|
33
|
+
--dir project directory (default: current directory)
|
|
34
|
+
--force overwrite the guide, opencode.json, or edited library files
|
|
35
|
+
--dry-run print the install plan without writing anything
|
|
36
|
+
--agent opencode (default) or claude
|
|
37
|
+
--scope global or project for init; global, project, or all for status
|
|
38
|
+
`;
|
|
39
|
+
const INSTALL_SCOPES = ["global", "project"];
|
|
40
|
+
const ALL_SCOPES = ["global", "project", "all"];
|
|
41
|
+
const INIT_AGENTS = ["opencode", "claude"];
|
|
42
|
+
function parseArgs(argv) {
|
|
43
|
+
const args = {
|
|
44
|
+
command: argv[0] ?? "help",
|
|
45
|
+
force: false,
|
|
46
|
+
dryRun: false,
|
|
47
|
+
dir: process.cwd(),
|
|
48
|
+
agent: "opencode",
|
|
49
|
+
scope: null,
|
|
50
|
+
};
|
|
51
|
+
for (let i = 1; i < argv.length; i++) {
|
|
52
|
+
const a = argv[i];
|
|
53
|
+
if (a === "--force")
|
|
54
|
+
args.force = true;
|
|
55
|
+
else if (a === "--dry-run")
|
|
56
|
+
args.dryRun = true;
|
|
57
|
+
else if (a === "--dir")
|
|
58
|
+
args.dir = resolve(requireValue(argv, ++i, a));
|
|
59
|
+
else if (a === "--agent")
|
|
60
|
+
args.agent = requireValue(argv, ++i, a);
|
|
61
|
+
else if (a === "--scope")
|
|
62
|
+
args.scope = requireValue(argv, ++i, a);
|
|
63
|
+
else
|
|
64
|
+
throw new Error(`unknown option: ${String(a)}`);
|
|
65
|
+
}
|
|
66
|
+
return args;
|
|
67
|
+
}
|
|
68
|
+
function requireValue(argv, i, flag) {
|
|
69
|
+
const v = argv[i];
|
|
70
|
+
if (v === undefined || v.startsWith("--"))
|
|
71
|
+
throw new Error(`${flag} needs a value`);
|
|
72
|
+
return v;
|
|
73
|
+
}
|
|
74
|
+
async function countSkills(dir) {
|
|
75
|
+
if (!existsSync(dir))
|
|
76
|
+
return null;
|
|
77
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
78
|
+
return entries.filter((e) => e.isDirectory()).length;
|
|
79
|
+
}
|
|
80
|
+
async function packageVersion() {
|
|
81
|
+
const parsed = parseJsonUnknown(await readFile(join(PACKAGE_ROOT, "package.json"), "utf8"));
|
|
82
|
+
if (!parsed.ok)
|
|
83
|
+
throw new Error(`cannot read package.json: ${parsed.error.message}`);
|
|
84
|
+
const version = isRecord(parsed.value) ? parsed.value["version"] : undefined;
|
|
85
|
+
if (typeof version !== "string") {
|
|
86
|
+
throw new Error("package.json has no version");
|
|
87
|
+
}
|
|
88
|
+
return version;
|
|
89
|
+
}
|
|
90
|
+
async function lockSkillNames() {
|
|
91
|
+
const parsed = parseJsonUnknown(await readFile(join(PACKAGE_ROOT, "skills-lock.json"), "utf8"));
|
|
92
|
+
if (!parsed.ok)
|
|
93
|
+
throw new Error(`cannot read skills-lock.json: ${parsed.error.message}`);
|
|
94
|
+
const skills = isRecord(parsed.value) ? parsed.value["skills"] : undefined;
|
|
95
|
+
if (!isRecord(skills))
|
|
96
|
+
return [];
|
|
97
|
+
return Object.keys(skills).sort();
|
|
98
|
+
}
|
|
99
|
+
function isPlainObject(value) {
|
|
100
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
101
|
+
}
|
|
102
|
+
// Project files are untrusted. Return a diagnostic instead of throwing so
|
|
103
|
+
// status can report the problem and keep checking other paths.
|
|
104
|
+
async function readJsonObject(path) {
|
|
105
|
+
let raw;
|
|
106
|
+
try {
|
|
107
|
+
raw = await readFile(path, "utf8");
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return { ok: false, error: `cannot read file: ${error instanceof Error ? error.message : String(error)}` };
|
|
111
|
+
}
|
|
112
|
+
const parsed = parseJsonUnknown(raw);
|
|
113
|
+
if (!parsed.ok)
|
|
114
|
+
return { ok: false, error: `invalid JSON: ${parsed.error.message}` };
|
|
115
|
+
if (!isPlainObject(parsed.value))
|
|
116
|
+
return { ok: false, error: "expected a JSON object" };
|
|
117
|
+
return { ok: true, value: parsed.value };
|
|
118
|
+
}
|
|
119
|
+
function describeLibraryManifest(value) {
|
|
120
|
+
const files = value["files"];
|
|
121
|
+
if (!Array.isArray(files))
|
|
122
|
+
return "files must be an array";
|
|
123
|
+
const bad = files.find((entry) => !isPlainObject(entry) || typeof entry["path"] !== "string");
|
|
124
|
+
if (bad !== undefined)
|
|
125
|
+
return "every files entry needs a string path";
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
function resolvedScope(scope, fallback) {
|
|
129
|
+
if (scope === null || scope === undefined)
|
|
130
|
+
return fallback;
|
|
131
|
+
if (!isOneOf(scope, INSTALL_SCOPES)) {
|
|
132
|
+
throw new Error(`unknown scope "${scope}"; expected global or project`);
|
|
133
|
+
}
|
|
134
|
+
return scope;
|
|
135
|
+
}
|
|
136
|
+
// Write or refresh opencode.json for the OpenCode target. No prompts: when the
|
|
137
|
+
// file exists without --force it is left alone and the caller reports why.
|
|
138
|
+
export async function writeOpencodeConfig({ dir = process.cwd(), scope = "global", force = false, dryRun = false, packageRoot = PACKAGE_ROOT, } = {}) {
|
|
139
|
+
if (!isOneOf(scope, INSTALL_SCOPES)) {
|
|
140
|
+
throw new Error(`unknown scope "${scope}"; expected global or project`);
|
|
141
|
+
}
|
|
142
|
+
const targetPath = scope === "global"
|
|
143
|
+
? join(homedir(), ".config", "opencode", "opencode.json")
|
|
144
|
+
: join(dir, "opencode.json");
|
|
145
|
+
let content = await readFile(join(packageRoot, "opencode.json"), "utf8");
|
|
146
|
+
// Project-scope installs live under the project directory, so rewrite the
|
|
147
|
+
// global paths in the template to project-relative ones.
|
|
148
|
+
if (scope === "project") {
|
|
149
|
+
content = content
|
|
150
|
+
.replace(/"\{env:HOME\}\/\.config\/junamis\/skills\/skills"/g, '"./.config/junamis/skills/skills"')
|
|
151
|
+
.replace(/"\{env:HOME\}\/\.config\/junamis\/skills\/\*\.md"/g, '"./.config/junamis/skills/*.md"')
|
|
152
|
+
.replace(/"\{env:HOME\}\/\.agents\/skills"/g, '"./.agents/skills"');
|
|
153
|
+
}
|
|
154
|
+
if (existsSync(targetPath) && !force) {
|
|
155
|
+
const existing = await readFile(targetPath, "utf8");
|
|
156
|
+
return { status: existing === content ? "unchanged" : "kept", path: targetPath };
|
|
157
|
+
}
|
|
158
|
+
if (dryRun) {
|
|
159
|
+
return { status: existsSync(targetPath) ? "would-replace" : "would-write", path: targetPath };
|
|
160
|
+
}
|
|
161
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
162
|
+
await writeFile(targetPath, content, "utf8");
|
|
163
|
+
return { status: "written", path: targetPath };
|
|
164
|
+
}
|
|
165
|
+
function palette() {
|
|
166
|
+
return createColors({ enabled: colorsEnabled() });
|
|
167
|
+
}
|
|
168
|
+
function reportGuide(result, projectDir) {
|
|
169
|
+
const c = palette();
|
|
170
|
+
if (result.status === "created") {
|
|
171
|
+
console.log(`${c.cyan("guide:")} wrote ${c.gray(result.path)}`);
|
|
172
|
+
console.log(`${c.cyan("marker:")} ${c.gray(join(projectDir, MARKER_PATH))}`);
|
|
173
|
+
}
|
|
174
|
+
else if (result.status === "exists") {
|
|
175
|
+
console.log(`${c.cyan("guide:")} ${GUIDE_NAME} already written by junamis-skills ${result.version}; nothing to do.`);
|
|
176
|
+
console.log(c.yellow("guide: use --force to rewrite it."));
|
|
177
|
+
}
|
|
178
|
+
else if (result.status === "kept-user-file") {
|
|
179
|
+
console.log(`${c.cyan("guide:")} ${c.gray(result.path)} exists and was not written by junamis-skills; left unchanged.`);
|
|
180
|
+
console.log(c.yellow("guide: use --force to replace it."));
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log(`${c.cyan("guide:")} ${String(result.status)} (${c.gray(result.path)})`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function reportConfig(result) {
|
|
187
|
+
const c = palette();
|
|
188
|
+
if (result.status === "written")
|
|
189
|
+
console.log(`${c.cyan("config:")} wrote ${c.gray(result.path)}`);
|
|
190
|
+
else if (result.status === "unchanged")
|
|
191
|
+
console.log(`${c.cyan("config:")} unchanged (${c.gray(result.path)})`);
|
|
192
|
+
else if (result.status === "kept")
|
|
193
|
+
console.log(`${c.yellow("config:")} left unchanged; use --force (${c.gray(result.path)})`);
|
|
194
|
+
else if (result.status === "would-write")
|
|
195
|
+
console.log(`${c.cyan("config:")} would write ${c.gray(result.path)}`);
|
|
196
|
+
else if (result.status === "would-replace")
|
|
197
|
+
console.log(`${c.cyan("config:")} would replace ${c.gray(result.path)} (--force)`);
|
|
198
|
+
else
|
|
199
|
+
console.log(`${c.cyan("config:")} ${String(result.status)} (${c.gray(result.path)})`);
|
|
200
|
+
}
|
|
201
|
+
function reportLibrary(args, scope, result, version) {
|
|
202
|
+
const c = palette();
|
|
203
|
+
const counts = {};
|
|
204
|
+
for (const a of [...result.actions, ...(result.linkActions ?? [])]) {
|
|
205
|
+
counts[a.action] = (counts[a.action] ?? 0) + 1;
|
|
206
|
+
}
|
|
207
|
+
const summary = Object.entries(counts).map(([k, v]) => `${v} ${k}`).join(", ") || "nothing";
|
|
208
|
+
console.log(`${c.cyan("library")} for ${args.agent} (junamis-skills ${version}, ${scope}): ${c.gray(summary)}`);
|
|
209
|
+
if (args.dryRun) {
|
|
210
|
+
for (const a of result.actions)
|
|
211
|
+
console.log(` ${a.action.padEnd(24)} ${c.gray(a.path)}`);
|
|
212
|
+
for (const a of result.linkActions ?? [])
|
|
213
|
+
console.log(` ${a.action.padEnd(24)} ${c.gray(a.path)} -> ${c.gray(String(a.target))}`);
|
|
214
|
+
}
|
|
215
|
+
for (const p of result.stale)
|
|
216
|
+
console.log(` ${args.dryRun ? "would remove" : "removed"} stale ${c.gray(p)}`);
|
|
217
|
+
for (const warning of result.warnings ?? [])
|
|
218
|
+
console.warn(c.yellow(` warning: ${warning}`));
|
|
219
|
+
if (!result.ok) {
|
|
220
|
+
console.error(c.red(`\n${result.conflicts.length} library file(s) were edited by you and are not managed by junamis-skills:`));
|
|
221
|
+
for (const p of result.conflicts)
|
|
222
|
+
console.error(c.red(` ${p}`));
|
|
223
|
+
console.error(c.yellow("Review them. Run again with --force to overwrite, or move your copy elsewhere."));
|
|
224
|
+
return 1;
|
|
225
|
+
}
|
|
226
|
+
if (args.dryRun)
|
|
227
|
+
console.log(c.green("library: dry run, nothing was written."));
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Run `init` with injectable dependencies so tests never touch the network.
|
|
232
|
+
* deps may override writeGuide, writeOpencodeConfig, planLibraryInstall,
|
|
233
|
+
* applyLibraryInstall, installExternal, and packageVersion.
|
|
234
|
+
*/
|
|
235
|
+
export async function runInit(args, deps = {}) {
|
|
236
|
+
const d = {
|
|
237
|
+
writeGuide: deps.writeGuide ?? writeGuide,
|
|
238
|
+
writeOpencodeConfig: deps.writeOpencodeConfig ?? writeOpencodeConfig,
|
|
239
|
+
planLibraryInstall: deps.planLibraryInstall ?? planLibraryInstall,
|
|
240
|
+
applyLibraryInstall: deps.applyLibraryInstall ?? applyLibraryInstall,
|
|
241
|
+
installExternal: deps.installExternal ?? installExternal,
|
|
242
|
+
packageVersion: deps.packageVersion ?? packageVersion,
|
|
243
|
+
};
|
|
244
|
+
const agent = args.agent ?? "opencode";
|
|
245
|
+
if (!isOneOf(agent, INIT_AGENTS)) {
|
|
246
|
+
throw new Error(`unknown agent "${agent}"; expected opencode or claude`);
|
|
247
|
+
}
|
|
248
|
+
const scope = resolvedScope(args.scope, "global");
|
|
249
|
+
const c = palette();
|
|
250
|
+
let exitCode = 0;
|
|
251
|
+
// 1. Guide.
|
|
252
|
+
if (args.dryRun) {
|
|
253
|
+
const guidePath = join(args.dir, GUIDE_NAME);
|
|
254
|
+
const exists = existsSync(guidePath);
|
|
255
|
+
console.log(`${c.cyan("guide:")} ${exists && !args.force ? "present, would not rewrite without --force" : `would write ${c.gray(guidePath)}`}`);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
reportGuide(await d.writeGuide({ projectDir: args.dir, force: args.force }), args.dir);
|
|
259
|
+
}
|
|
260
|
+
// 2. opencode.json for OpenCode only.
|
|
261
|
+
if (agent !== "opencode") {
|
|
262
|
+
console.log(`${c.cyan("config:")} skipped (opencode.json is OpenCode only)`);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
reportConfig(await d.writeOpencodeConfig({
|
|
266
|
+
dir: args.dir,
|
|
267
|
+
scope,
|
|
268
|
+
force: args.force,
|
|
269
|
+
dryRun: args.dryRun,
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
// 3. Library.
|
|
273
|
+
const version = await d.packageVersion();
|
|
274
|
+
const files = await d.planLibraryInstall({
|
|
275
|
+
packageRoot: PACKAGE_ROOT,
|
|
276
|
+
agent,
|
|
277
|
+
scope,
|
|
278
|
+
projectDir: args.dir,
|
|
279
|
+
});
|
|
280
|
+
const libraryResult = await d.applyLibraryInstall({
|
|
281
|
+
agent,
|
|
282
|
+
files,
|
|
283
|
+
version,
|
|
284
|
+
force: args.force,
|
|
285
|
+
dryRun: args.dryRun,
|
|
286
|
+
scope,
|
|
287
|
+
projectDir: args.dir,
|
|
288
|
+
});
|
|
289
|
+
exitCode ||= reportLibrary(args, scope, libraryResult, version);
|
|
290
|
+
// 4. Every pinned external skill, non-interactively.
|
|
291
|
+
let external = { groups: 0, installed: 0, skipped: 0, failed: 0, planned: 0 };
|
|
292
|
+
if (args.dryRun) {
|
|
293
|
+
const names = await lockSkillNames();
|
|
294
|
+
external = { ...external, planned: names.length };
|
|
295
|
+
console.log(`${c.cyan("external:")} ${names.length} pinned skills would be installed with skillsio`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
validateInstaller("skillsio");
|
|
299
|
+
validateAgent(agent);
|
|
300
|
+
external = await d.installExternal({
|
|
301
|
+
lockPath: join(PACKAGE_ROOT, "skills-lock.json"),
|
|
302
|
+
agent,
|
|
303
|
+
installer: "skillsio",
|
|
304
|
+
});
|
|
305
|
+
console.log(`${c.cyan("external:")} ${external.installed} installed, ${external.skipped} skipped, ${external.failed} failed`);
|
|
306
|
+
if (external.failed > 0)
|
|
307
|
+
exitCode = 1;
|
|
308
|
+
}
|
|
309
|
+
// 5. Summary.
|
|
310
|
+
console.log(`\n${c.cyan("summary:")}`);
|
|
311
|
+
console.log(` ${c.gray("guide:")} ${args.dryRun ? c.yellow("planned") : c.green("done")}`);
|
|
312
|
+
console.log(` ${c.gray("config:")} ${agent === "opencode" ? (args.dryRun ? c.yellow("planned") : c.green("done")) : "skipped"}`);
|
|
313
|
+
console.log(` ${c.gray("library:")} ${args.dryRun ? c.yellow("planned") : c.green("done")} (${scope})`);
|
|
314
|
+
console.log(` ${c.gray("external:")} ${args.dryRun ? c.yellow(`planned (${String(external.planned)})`) : `${external.installed} installed, ${external.skipped} skipped, ${external.failed} failed`}`);
|
|
315
|
+
console.log(` ${c.gray("exit:")} ${exitCode === 0 ? c.green("ok") : c.yellow("needs attention")}`);
|
|
316
|
+
return { exitCode, scope, external };
|
|
317
|
+
}
|
|
318
|
+
export function statusLocations(agentId, scope = "all", projectDir = process.cwd()) {
|
|
319
|
+
const target = getTarget(agentId);
|
|
320
|
+
if (!target)
|
|
321
|
+
throw new Error(`unknown agent "${agentId}"`);
|
|
322
|
+
if (!isOneOf(scope, ALL_SCOPES)) {
|
|
323
|
+
throw new Error(`unknown scope "${scope}"; expected global, project, or all`);
|
|
324
|
+
}
|
|
325
|
+
const scopes = scope === "all" ? ["global", "project"] : [scope];
|
|
326
|
+
return scopes.map((installScope) => ({
|
|
327
|
+
scope: installScope,
|
|
328
|
+
skillsDir: installScope === "project" ? target.projectSkillsDir(projectDir) : target.globalSkillsDir(),
|
|
329
|
+
librarySkillsDir: installScope === "project" ? target.projectLibrarySkillsDir(projectDir) : target.librarySkillsDir(),
|
|
330
|
+
canonicalAgentsDir: installScope === "project"
|
|
331
|
+
? target.projectLibraryAgentsCanonicalDir(projectDir)
|
|
332
|
+
: target.libraryAgentsCanonicalDir(),
|
|
333
|
+
agentsDir: installScope === "project" ? target.projectAgentsDir(projectDir) : target.libraryAgentsDir(),
|
|
334
|
+
manifestPath: manifestPath(agentId, installScope, projectDir),
|
|
335
|
+
}));
|
|
336
|
+
}
|
|
337
|
+
async function canonicalAgents(dir) {
|
|
338
|
+
if (!existsSync(dir))
|
|
339
|
+
return null;
|
|
340
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
341
|
+
return entries.filter((e) => e.isFile() && e.name.endsWith(".md")).map((e) => e.name).sort();
|
|
342
|
+
}
|
|
343
|
+
function describeAgentLink(canonicalPath, linkPath) {
|
|
344
|
+
let stat;
|
|
345
|
+
try {
|
|
346
|
+
stat = lstatSync(linkPath);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
if (isRecord(error) && error["code"] === "ENOENT")
|
|
350
|
+
return "missing";
|
|
351
|
+
const code = isRecord(error) ? error["code"] : undefined;
|
|
352
|
+
return `unreadable (${typeof code === "string" ? code : "error"})`;
|
|
353
|
+
}
|
|
354
|
+
if (stat.isSymbolicLink()) {
|
|
355
|
+
const current = readlinkSync(linkPath);
|
|
356
|
+
return resolve(dirname(linkPath), current) === resolve(canonicalPath)
|
|
357
|
+
? "linked"
|
|
358
|
+
: `wrong target (${current})`;
|
|
359
|
+
}
|
|
360
|
+
if (stat.isFile())
|
|
361
|
+
return "regular file (not a link)";
|
|
362
|
+
return "not a file";
|
|
363
|
+
}
|
|
364
|
+
// Legacy leftovers from the flat layout. Reported only; never deleted.
|
|
365
|
+
async function legacyLeftovers(scope, projectDir) {
|
|
366
|
+
const parent = legacyConfigParent(scope, projectDir);
|
|
367
|
+
const found = [];
|
|
368
|
+
if (!existsSync(parent))
|
|
369
|
+
return found;
|
|
370
|
+
for (const entry of await readdir(parent, { withFileTypes: true })) {
|
|
371
|
+
if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
372
|
+
found.push(`${join(parent, entry.name)} (legacy shared doc)`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (existsSync(join(parent, "installed"))) {
|
|
376
|
+
found.push(`${join(parent, "installed")} (legacy manifest directory)`);
|
|
377
|
+
}
|
|
378
|
+
const root = configRoot(scope, projectDir);
|
|
379
|
+
if (existsSync(root)) {
|
|
380
|
+
const known = new Set(["skills", "agents", "installed"]);
|
|
381
|
+
for (const entry of await readdir(root, { withFileTypes: true })) {
|
|
382
|
+
if (entry.isDirectory() && !known.has(entry.name)) {
|
|
383
|
+
found.push(`${join(root, entry.name)} (legacy flat skill folder)`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return found;
|
|
388
|
+
}
|
|
389
|
+
async function status(args) {
|
|
390
|
+
const c = palette();
|
|
391
|
+
const scope = args.scope ?? "global";
|
|
392
|
+
if (!isOneOf(scope, ALL_SCOPES)) {
|
|
393
|
+
throw new Error(`unknown scope "${scope}"; expected global, project, or all`);
|
|
394
|
+
}
|
|
395
|
+
const scopes = scope === "all" ? ["global", "project"] : [scope];
|
|
396
|
+
const failures = [];
|
|
397
|
+
const check = (label, pass, detail = "") => {
|
|
398
|
+
console.log(`${pass ? c.green("✔") : c.red("✖")} ${label}${detail ? `: ${c.gray(detail)}` : ""}`);
|
|
399
|
+
if (!pass)
|
|
400
|
+
failures.push(label);
|
|
401
|
+
return pass;
|
|
402
|
+
};
|
|
403
|
+
// Guide and marker describe the project. A missing guide is informational:
|
|
404
|
+
// only a present but malformed marker is a real problem.
|
|
405
|
+
const guidePath = join(args.dir, GUIDE_NAME);
|
|
406
|
+
const guideExists = existsSync(guidePath);
|
|
407
|
+
console.log(`${c.cyan("project:")} ${c.gray(args.dir)}`);
|
|
408
|
+
console.log(`${c.cyan("package:")} ${c.gray(PACKAGE_ROOT)}`);
|
|
409
|
+
console.log(`${c.cyan("guide:")} ${guideExists ? c.green("present") : "missing"} (${GUIDE_NAME})`);
|
|
410
|
+
const markerPath = join(args.dir, MARKER_PATH);
|
|
411
|
+
let marker = null;
|
|
412
|
+
let markerProblem = null;
|
|
413
|
+
if (existsSync(markerPath)) {
|
|
414
|
+
const parsed = await readJsonObject(markerPath);
|
|
415
|
+
if (!parsed.ok) {
|
|
416
|
+
markerProblem = parsed.error;
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
const writtenAt = parsed.value["writtenAt"];
|
|
420
|
+
const version = parsed.value["version"];
|
|
421
|
+
if (typeof writtenAt !== "string" || typeof version !== "string") {
|
|
422
|
+
markerProblem = "writtenAt and version must be strings";
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
const guide = parsed.value["guide"];
|
|
426
|
+
marker = { guide: typeof guide === "string" ? guide : "", writtenAt, version };
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
console.log(`${c.cyan("marker:")} ${marker ? `written ${marker.writtenAt} by ${marker.version}` : "none"}`);
|
|
431
|
+
if (markerProblem) {
|
|
432
|
+
console.error(c.red(`✖ invalid marker ${markerPath}: ${markerProblem}`));
|
|
433
|
+
failures.push("marker");
|
|
434
|
+
}
|
|
435
|
+
// Per-target counts and library manifests. Missing directories and manifests
|
|
436
|
+
// are informational: a target can be detected without this package being
|
|
437
|
+
// installed for it. A present manifest is always validated.
|
|
438
|
+
console.log(c.cyan("agents:"));
|
|
439
|
+
for (const t of targets) {
|
|
440
|
+
const detected = t.detect();
|
|
441
|
+
console.log(` ${t.label.padEnd(12)} ${detected ? c.green("detected") : c.gray("not found")}`);
|
|
442
|
+
for (const location of statusLocations(t.id, scope, args.dir)) {
|
|
443
|
+
const libraryCount = await countSkills(location.librarySkillsDir);
|
|
444
|
+
const externalCount = await countSkills(location.skillsDir);
|
|
445
|
+
const state = (count) => (count === null ? "no skills dir" : `${count} skill folders`);
|
|
446
|
+
console.log(` ${location.scope.padEnd(8)} internal ${location.librarySkillsDir} (${state(libraryCount)})`);
|
|
447
|
+
console.log(` ${location.scope.padEnd(8)} external ${location.skillsDir} (${state(externalCount)})`);
|
|
448
|
+
const agentNames = await canonicalAgents(location.canonicalAgentsDir);
|
|
449
|
+
if (agentNames === null) {
|
|
450
|
+
console.log(` ${location.scope.padEnd(8)} canonical agents ${location.canonicalAgentsDir} (none)`);
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
console.log(` ${location.scope.padEnd(8)} canonical agents ${location.canonicalAgentsDir} (${agentNames.length} agents)`);
|
|
454
|
+
for (const name of agentNames) {
|
|
455
|
+
const linkPath = join(location.agentsDir, name);
|
|
456
|
+
console.log(` agent ${name.replace(/\.md$/, "")}: ${describeAgentLink(join(location.canonicalAgentsDir, name), linkPath)}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
if (!existsSync(location.manifestPath)) {
|
|
460
|
+
console.log(` library not installed in ${location.scope} scope`);
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
const parsed = await readJsonObject(location.manifestPath);
|
|
464
|
+
if (!parsed.ok) {
|
|
465
|
+
console.error(c.red(`✖ library manifest invalid (${location.manifestPath}): ${parsed.error}`));
|
|
466
|
+
failures.push("library manifest");
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
const problem = describeLibraryManifest(parsed.value);
|
|
470
|
+
if (problem) {
|
|
471
|
+
console.error(c.red(`✖ library manifest invalid (${location.manifestPath}): ${problem}`));
|
|
472
|
+
failures.push("library manifest");
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
const manifestFiles = parsed.value["files"];
|
|
476
|
+
const fileCount = Array.isArray(manifestFiles) ? manifestFiles.length : 0;
|
|
477
|
+
console.log(` library ${String(parsed.value["version"])} installed ${String(parsed.value["installedAt"])} (${fileCount} files)`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// Older installs used a flat layout. Report leftovers without failing and
|
|
481
|
+
// without deleting anything; migration is the user's decision.
|
|
482
|
+
for (const installScope of scopes) {
|
|
483
|
+
const legacy = await legacyLeftovers(installScope, args.dir);
|
|
484
|
+
for (const item of legacy)
|
|
485
|
+
console.log(`legacy (${installScope}, informational): ${item}`);
|
|
486
|
+
}
|
|
487
|
+
// opencode.json validity for the selected scopes.
|
|
488
|
+
const candidates = [
|
|
489
|
+
{ scope: "project", path: join(args.dir, "opencode.json") },
|
|
490
|
+
{ scope: "global", path: join(homedir(), ".config", "opencode", "opencode.json") },
|
|
491
|
+
];
|
|
492
|
+
for (const candidate of candidates) {
|
|
493
|
+
if (!scopes.includes(candidate.scope))
|
|
494
|
+
continue;
|
|
495
|
+
if (!existsSync(candidate.path)) {
|
|
496
|
+
console.log(`config (${candidate.scope}): missing (${candidate.path})`);
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
const parsed = await readJsonObject(candidate.path);
|
|
500
|
+
if (!parsed.ok) {
|
|
501
|
+
check(`config (${candidate.scope})`, false, `${candidate.path}: ${parsed.error}`);
|
|
502
|
+
continue;
|
|
503
|
+
}
|
|
504
|
+
const permissions = parsed.value["permissions"];
|
|
505
|
+
const mcp = parsed.value["mcp"];
|
|
506
|
+
const plugins = parsed.value["plugins"];
|
|
507
|
+
const valid = parsed.value["permission"] === undefined
|
|
508
|
+
&& Array.isArray(permissions)
|
|
509
|
+
&& permissions.length > 0
|
|
510
|
+
&& isPlainObject(mcp)
|
|
511
|
+
&& isPlainObject(mcp["servers"])
|
|
512
|
+
&& Array.isArray(plugins);
|
|
513
|
+
check(`config (${candidate.scope})`, valid, valid
|
|
514
|
+
? `${candidate.path} V2 permissions, mcp, and plugins present`
|
|
515
|
+
: `${candidate.path}: expected V2 permissions array, mcp.servers object, and plugins array`);
|
|
516
|
+
}
|
|
517
|
+
// External coverage: every pinned skill is present under the external
|
|
518
|
+
// skills directory used by the OpenCode target. Report only; a missing skill
|
|
519
|
+
// is not a status failure.
|
|
520
|
+
const lockNames = await lockSkillNames();
|
|
521
|
+
const opencode = getTarget("opencode");
|
|
522
|
+
if (!opencode)
|
|
523
|
+
throw new Error('unknown agent "opencode"');
|
|
524
|
+
const externalDir = opencode.globalSkillsDir();
|
|
525
|
+
const missing = lockNames.filter((name) => !existsSync(join(externalDir, name)));
|
|
526
|
+
const coverage = `${lockNames.length - missing.length}/${lockNames.length}`;
|
|
527
|
+
const coverageDetail = missing.length === 0 ? `${coverage} in ${externalDir}` : `${coverage}; missing ${missing.join(", ")}`;
|
|
528
|
+
console.log(`${c.cyan("external coverage:")} ${missing.length === 0 ? c.green(coverageDetail) : c.yellow(coverageDetail)}`);
|
|
529
|
+
// SECURITY.md is the recorded scan vetted at install time. Report its status
|
|
530
|
+
// without failing; the scan record is part of the package, not the install.
|
|
531
|
+
const securityPath = join(PACKAGE_ROOT, "SECURITY.md");
|
|
532
|
+
let securityMonth = null;
|
|
533
|
+
if (existsSync(securityPath)) {
|
|
534
|
+
const text = await readFile(securityPath, "utf8");
|
|
535
|
+
securityMonth = text.match(/^Last external scan:\s*(\d{4}-\d{2})/m)?.[1] ?? null;
|
|
536
|
+
}
|
|
537
|
+
console.log(`${c.cyan("SECURITY.md scan record:")} ${securityMonth ? `${c.gray(securityPath)} (last external scan ${securityMonth})` : c.yellow(`${securityPath} is missing or has no Last external scan line`)}`);
|
|
538
|
+
const passed = failures.length === 0;
|
|
539
|
+
console.log(`\n${c.cyan("status:")} ${passed ? c.green("ok") : c.yellow(`${failures.length} required check(s) failed`)}`);
|
|
540
|
+
if (!passed)
|
|
541
|
+
process.exitCode = 1;
|
|
542
|
+
return passed ? 0 : 1;
|
|
543
|
+
}
|
|
544
|
+
export async function run(argv) {
|
|
545
|
+
const args = parseArgs(argv);
|
|
546
|
+
switch (args.command) {
|
|
547
|
+
case "init": {
|
|
548
|
+
const result = await runInit(args);
|
|
549
|
+
if (result.exitCode)
|
|
550
|
+
process.exitCode = result.exitCode;
|
|
551
|
+
return result;
|
|
552
|
+
}
|
|
553
|
+
case "status":
|
|
554
|
+
return status(args);
|
|
555
|
+
case "help":
|
|
556
|
+
case "--help":
|
|
557
|
+
case "-h":
|
|
558
|
+
console.log(HELP);
|
|
559
|
+
return undefined;
|
|
560
|
+
default:
|
|
561
|
+
throw new Error(`unknown command: ${args.command}. Use "init" or "status".`);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/color.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
declare const ANSI: {
|
|
2
|
+
readonly cyan: 36;
|
|
3
|
+
readonly green: 32;
|
|
4
|
+
readonly yellow: 33;
|
|
5
|
+
readonly red: 31;
|
|
6
|
+
readonly gray: 90;
|
|
7
|
+
readonly bold: 1;
|
|
8
|
+
};
|
|
9
|
+
export type AnsiCode = (typeof ANSI)[keyof typeof ANSI];
|
|
10
|
+
export interface ColorOptions {
|
|
11
|
+
readonly enabled: boolean;
|
|
12
|
+
}
|
|
13
|
+
/** Wrap `text` in an ANSI SGR code, or return it unchanged when disabled. */
|
|
14
|
+
export declare function paint(code: AnsiCode | number, text: string, options: ColorOptions): string;
|
|
15
|
+
export interface Colors {
|
|
16
|
+
readonly cyan: (text: string) => string;
|
|
17
|
+
readonly green: (text: string) => string;
|
|
18
|
+
readonly yellow: (text: string) => string;
|
|
19
|
+
readonly red: (text: string) => string;
|
|
20
|
+
readonly gray: (text: string) => string;
|
|
21
|
+
readonly bold: (text: string) => string;
|
|
22
|
+
}
|
|
23
|
+
/** Build a palette bound to one enabled/disabled decision. */
|
|
24
|
+
export declare function createColors(options: ColorOptions): Colors;
|
|
25
|
+
/** Remove every ANSI SGR sequence from `text`. */
|
|
26
|
+
export declare function stripAnsi(text: string): string;
|
|
27
|
+
/** True when a stream looks like an interactive terminal. */
|
|
28
|
+
export interface TtyStream {
|
|
29
|
+
readonly isTTY?: boolean | undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Decide whether colored output is appropriate.
|
|
33
|
+
*
|
|
34
|
+
* NO_COLOR (any non-empty value) and TERM=dumb force color off. FORCE_COLOR=1
|
|
35
|
+
* forces it on. Otherwise color follows whether the stream is a TTY, so a
|
|
36
|
+
* captured pipe stays plain by default.
|
|
37
|
+
*/
|
|
38
|
+
export declare function colorsEnabled(env?: Readonly<Record<string, string | undefined>>, stream?: TtyStream): boolean;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=color.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,IAAI;aACR,IAAI,EAAE,EAAE;aACR,KAAK,EAAE,EAAE;aACT,MAAM,EAAE,EAAE;aACV,GAAG,EAAE,EAAE;aACP,IAAI,EAAE,EAAE;aACR,IAAI,EAAE,CAAC;CACC,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAG1F;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAU1D;AAID,kDAAkD;AAClD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,EAC/D,MAAM,GAAE,SAA0B,GACjC,OAAO,CAMT"}
|