skilld 0.4.2 → 0.5.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.
@@ -266,6 +266,8 @@ interface AgentTarget {
266
266
  detectProject: (cwd: string) => boolean;
267
267
  /** CLI command name (if agent has a CLI for skill generation) */
268
268
  cli?: string;
269
+ /** Project-level instruction file for always-on rules (e.g. CLAUDE.md, AGENTS.md) */
270
+ instructionFile?: string;
269
271
  /** Required skill filename (always SKILL.md for Agent Skills spec agents) */
270
272
  skillFilename: string;
271
273
  /** Project-level skill directory */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/agent/prompts/optional/types.ts","../../src/agent/prompts/prompt.ts","../../src/agent/prompts/skill.ts","../../src/agent/types.ts","../../src/agent/clis/types.ts","../../src/agent/clis/index.ts","../../src/agent/detect.ts","../../src/agent/detect-imports.ts","../../src/agent/install.ts","../../src/agent/targets/types.ts","../../src/agent/targets/registry.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/agent/prompts/optional/types.ts","../../src/agent/prompts/prompt.ts","../../src/agent/prompts/skill.ts","../../src/agent/types.ts","../../src/agent/clis/types.ts","../../src/agent/clis/index.ts","../../src/agent/detect.ts","../../src/agent/detect-imports.ts","../../src/agent/install.ts","../../src/agent/targets/types.ts","../../src/agent/targets/registry.ts"],"mappings":"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"}
package/dist/cli.mjs CHANGED
@@ -59,6 +59,11 @@ const CONFIG_PATH = join(CONFIG_DIR, "config.yaml");
59
59
  function hasConfig() {
60
60
  return existsSync(CONFIG_PATH);
61
61
  }
62
+ function hasCompletedWizard() {
63
+ if (!existsSync(CONFIG_PATH)) return false;
64
+ const config = readConfig();
65
+ return config.features !== void 0 || config.model !== void 0 || config.skipLlm !== void 0;
66
+ }
62
67
  function readConfig() {
63
68
  if (!existsSync(CONFIG_PATH)) return {};
64
69
  const content = readFileSync(CONFIG_PATH, "utf-8");
@@ -978,6 +983,7 @@ async function syncPackagesParallel(config) {
978
983
  }
979
984
  }
980
985
  await ensureGitignore(getSharedSkillsDir(cwd) ? SHARED_SKILLS_DIR : agent.skillsDir, cwd, config.global);
986
+ await ensureAgentInstructions(config.agent, cwd, config.global);
981
987
  await shutdownWorker();
982
988
  p.outro(`Synced ${successfulPkgs.length}/${packages.length} packages`);
983
989
  }
@@ -1183,6 +1189,30 @@ async function ensureGitignore(skillsDir, cwd, isGlobal) {
1183
1189
  else writeFileSync(gitignorePath, entry);
1184
1190
  p.log.success("Updated .gitignore");
1185
1191
  }
1192
+ const SKILLD_MARKER_START = "<!-- skilld -->";
1193
+ const SKILLD_MARKER_END = "<!-- /skilld -->";
1194
+ const SKILLD_INSTRUCTIONS = `${SKILLD_MARKER_START}
1195
+ Before modifying code, evaluate each installed skill against the current task.
1196
+ For each skill, determine YES/NO relevance and invoke all YES skills before proceeding.
1197
+ ${SKILLD_MARKER_END}`;
1198
+ async function ensureAgentInstructions(agent, cwd, isGlobal) {
1199
+ if (isGlobal) return;
1200
+ const agentConfig = targets[agent];
1201
+ if (!agentConfig.instructionFile) return;
1202
+ const filePath = join(cwd, agentConfig.instructionFile);
1203
+ if (existsSync(filePath)) {
1204
+ if (readFileSync(filePath, "utf-8").includes(SKILLD_MARKER_START)) return;
1205
+ }
1206
+ p.note(SKILLD_INSTRUCTIONS, `Will be added to ${agentConfig.instructionFile}`);
1207
+ const add = await p.confirm({
1208
+ message: `Add skill activation instructions to ${agentConfig.instructionFile}?`,
1209
+ initialValue: true
1210
+ });
1211
+ if (p.isCancel(add) || !add) return;
1212
+ if (existsSync(filePath)) appendFileSync(filePath, `${readFileSync(filePath, "utf-8").endsWith("\n") ? "" : "\n"}\n${SKILLD_INSTRUCTIONS}\n`);
1213
+ else writeFileSync(filePath, `${SKILLD_INSTRUCTIONS}\n`);
1214
+ p.log.success(`Updated ${agentConfig.instructionFile}`);
1215
+ }
1186
1216
  async function syncCommand(state, opts) {
1187
1217
  if (opts.packages && opts.packages.length > 0) {
1188
1218
  if (opts.packages.length > 1) return syncPackagesParallel({
@@ -1577,6 +1607,7 @@ async function syncSinglePackage(packageName, config) {
1577
1607
  if (shared) linkSkillToAgents(skillDirName, shared, cwd);
1578
1608
  if (!config.global) registerProject(cwd);
1579
1609
  await ensureGitignore(shared ? SHARED_SKILLS_DIR : targets[config.agent].skillsDir, cwd, config.global);
1610
+ await ensureAgentInstructions(config.agent, cwd, config.global);
1580
1611
  await shutdownWorker();
1581
1612
  p.outro(`Synced ${packageName} to ${relative(cwd, skillDir)}`);
1582
1613
  }
@@ -2755,6 +2786,23 @@ async function statusCommand(opts = {}) {
2755
2786
  const total = localPkgs.size + globalPkgs.size;
2756
2787
  p.log.info(`${total} package${total !== 1 ? "s" : ""}`);
2757
2788
  }
2789
+ function removeAgentInstructions(agent, projectPath) {
2790
+ const agentConfig = targets[agent];
2791
+ if (!agentConfig.instructionFile) return false;
2792
+ const filePath = join(projectPath, agentConfig.instructionFile);
2793
+ if (!existsSync(filePath)) return false;
2794
+ const content = readFileSync(filePath, "utf-8");
2795
+ const startIdx = content.indexOf(SKILLD_MARKER_START);
2796
+ if (startIdx === -1) return false;
2797
+ const endIdx = content.indexOf(SKILLD_MARKER_END, startIdx);
2798
+ if (endIdx === -1) return false;
2799
+ const before = content.slice(0, startIdx).replace(/\n+$/, "");
2800
+ const after = content.slice(endIdx + 16).replace(/^\n+/, "");
2801
+ const updated = before + (before && after ? "\n" : "") + after;
2802
+ if (updated.trim() === "") rmSync(filePath);
2803
+ else writeFileSync(filePath, updated.endsWith("\n") ? updated : `${updated}\n`);
2804
+ return true;
2805
+ }
2758
2806
  async function uninstallCommand(opts) {
2759
2807
  let scope = opts.scope;
2760
2808
  const registeredProjects = getRegisteredProjects();
@@ -2895,6 +2943,11 @@ async function uninstallCommand(opts) {
2895
2943
  force: true
2896
2944
  });
2897
2945
  for (const [prefix, items] of groups) p.log.success(`Removed ${prefix}: ${formatGroup(items)}`);
2946
+ const agentTypes = agentFilter || Object.keys(targets);
2947
+ for (const proj of projectsToUnregister) for (const agent of agentTypes) if (removeAgentInstructions(agent, proj)) {
2948
+ const file = targets[agent].instructionFile;
2949
+ p.log.success(`Cleaned ${file}`);
2950
+ }
2898
2951
  if (scope !== "all") for (const proj of projectsToUnregister) unregisterProject(proj);
2899
2952
  p.outro("skilld uninstalled");
2900
2953
  }
@@ -3619,7 +3672,7 @@ runMain(defineCommand({
3619
3672
  p.note(`\x1B[90m${version}\x1B[0m → \x1B[1m\x1B[32m${selfUpdate.latest}\x1B[0m${released}\n\x1B[36m${cmd}\x1B[0m`, "\x1B[33mUpdate available\x1B[0m");
3620
3673
  }
3621
3674
  if (state.skills.length === 0) {
3622
- if (!hasConfig()) await runWizard();
3675
+ if (!hasCompletedWizard()) await runWizard();
3623
3676
  const pkgJsonPath = join(cwd, "package.json");
3624
3677
  const hasPkgJson = existsSync(pkgJsonPath);
3625
3678
  const projectName = hasPkgJson ? JSON.parse(readFileSync(pkgJsonPath, "utf-8")).name : void 0;