@hasna/skills 0.1.31 → 0.1.33

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.
Files changed (82) hide show
  1. package/README.md +35 -30
  2. package/bin/index.js +577 -282
  3. package/bin/mcp.js +102 -39
  4. package/dist/cli/commands/runtime.d.ts +1 -1
  5. package/dist/cli/onboarding.d.ts +13 -0
  6. package/dist/index.js +88 -26
  7. package/dist/lib/config.d.ts +1 -1
  8. package/dist/lib/skill-validation.d.ts +2 -0
  9. package/package.json +1 -1
  10. package/skills/ad-creative-pack/package.json +4 -7
  11. package/skills/api-docs-portal/package.json +5 -3
  12. package/skills/audio/package.json +4 -22
  13. package/skills/audio-transcript-pack/package.json +3 -2
  14. package/skills/blog-article/package.json +5 -21
  15. package/skills/brand-kit/package.json +4 -7
  16. package/skills/brand-photo-shoot/package.json +3 -2
  17. package/skills/browse/package.json +4 -33
  18. package/skills/contract-review-report/package.json +3 -2
  19. package/skills/customer-feedback-report/package.json +3 -2
  20. package/skills/deepresearch/package.json +4 -37
  21. package/skills/domainpurchase/SKILL.md +14 -31
  22. package/skills/domainpurchase/package.json +3 -8
  23. package/skills/email-sequence/package.json +4 -7
  24. package/skills/generate-book-cover/package.json +5 -23
  25. package/skills/icon-pack/package.json +4 -22
  26. package/skills/image/package.json +4 -22
  27. package/skills/invoice-reconciliation/package.json +3 -2
  28. package/skills/landing-page-pack/package.json +4 -7
  29. package/skills/logo-design/package.json +4 -2
  30. package/skills/managemcp/CLAUDE.md +9 -43
  31. package/skills/managemcp/README.md +12 -198
  32. package/skills/managemcp/package.json +2 -10
  33. package/skills/managemcp/tsconfig.json +1 -3
  34. package/skills/market-research-report/package.json +5 -4
  35. package/skills/meeting-pack/package.json +3 -2
  36. package/skills/migration-plan-pack/package.json +3 -2
  37. package/skills/music/package.json +4 -20
  38. package/skills/music-album/package.json +3 -2
  39. package/skills/one-page-website/package.json +3 -2
  40. package/skills/pdf-read/package.json +5 -23
  41. package/skills/pdf-to-dataset/package.json +5 -4
  42. package/skills/pdf-to-markdown/package.json +5 -4
  43. package/skills/performance-audit-report/package.json +3 -2
  44. package/skills/photo-album/package.json +4 -2
  45. package/skills/pitch-deck/package.json +5 -3
  46. package/skills/playlist-maker/package.json +4 -2
  47. package/skills/product-mockup/package.json +3 -2
  48. package/skills/proposal-pack/package.json +5 -4
  49. package/skills/read-pdf/package.json +4 -29
  50. package/skills/remove-background/package.json +5 -21
  51. package/skills/repo-onboarding-report/package.json +3 -2
  52. package/skills/sdk-generator/package.json +3 -2
  53. package/skills/security-audit-report/package.json +5 -4
  54. package/skills/seo-content-pack/package.json +5 -3
  55. package/skills/short-video-pack/package.json +3 -2
  56. package/skills/slide-deck-generator/package.json +3 -2
  57. package/skills/sms/README.md +18 -56
  58. package/skills/sms/package.json +1 -3
  59. package/skills/sms/tsconfig.json +1 -2
  60. package/skills/social-content-calendar/package.json +4 -7
  61. package/skills/test-suite-generator/package.json +5 -4
  62. package/skills/transcript/package.json +4 -23
  63. package/skills/video/package.json +4 -24
  64. package/skills/video-highlight-pack/package.json +3 -2
  65. package/skills/voiceover-jingle-pack/package.json +3 -2
  66. package/skills/webcrawling/package.json +4 -32
  67. package/skills/domainpurchase/.env.example +0 -7
  68. package/skills/domainpurchase/src/lib/api-client.ts +0 -571
  69. package/skills/domainpurchase/src/lib/config.ts +0 -209
  70. package/skills/domainpurchase/src/lib/installer.ts +0 -165
  71. package/skills/managemcp/.env.example +0 -16
  72. package/skills/managemcp/scripts/migrate.ts +0 -57
  73. package/skills/managemcp/scripts/seed.ts +0 -58
  74. package/skills/managemcp/src/db/index.ts +0 -37
  75. package/skills/managemcp/src/lib/api-client.ts +0 -108
  76. package/skills/managemcp/src/lib/config.ts +0 -34
  77. package/skills/managemcp/src/lib/installer.ts +0 -140
  78. package/skills/managemcp/src/lib/service-dir.ts +0 -119
  79. package/skills/sms/scripts/buy-number.ts +0 -63
  80. package/skills/sms/scripts/test-send.ts +0 -67
  81. package/skills/sms/src/server.ts +0 -351
  82. package/skills/sms/src/sse-server.ts +0 -279
package/dist/index.js CHANGED
@@ -3094,7 +3094,13 @@ function formatCost(cents) {
3094
3094
  return `$${(cents / 100).toFixed(2)}`;
3095
3095
  }
3096
3096
  function getAllPremiumSlugs() {
3097
- return [...PREMIUM_SKILLS.map((s) => s.slug), ARTICLE_GENERATION_SLUG];
3097
+ return [
3098
+ ...new Set([
3099
+ ...PREMIUM_SKILLS.map((skill) => skill.slug),
3100
+ ...MEDIA_GENERATION_PRICES.map((price) => price.slug),
3101
+ ARTICLE_GENERATION_SLUG
3102
+ ])
3103
+ ].sort();
3098
3104
  }
3099
3105
 
3100
3106
  // src/lib/skillinfo.ts
@@ -3395,19 +3401,34 @@ import { existsSync as existsSync6, readFileSync as readFileSync6, writeFileSync
3395
3401
  import { join as join6, dirname as dirname2 } from "path";
3396
3402
  import { homedir as homedir3 } from "os";
3397
3403
  var ENUM_KEYS = {
3398
- mode: ["local", "skills.md"],
3399
3404
  defaultAgent: ["claude", "codex", "gemini", "pi", "opencode", "all"],
3400
3405
  defaultScope: ["global", "project"],
3401
3406
  format: ["compact", "json", "csv"]
3402
3407
  };
3403
3408
  var STRING_KEYS = ["apiUrl"];
3409
+ var MODE_VALUES = ["local", "hosted"];
3410
+ var MODE_ALIASES = {
3411
+ local: "local",
3412
+ offline: "local",
3413
+ hosted: "hosted",
3414
+ remote: "hosted",
3415
+ "skills.md": "hosted",
3416
+ skillsmd: "hosted"
3417
+ };
3404
3418
  function validKeys() {
3405
- return [...Object.keys(ENUM_KEYS), ...STRING_KEYS];
3419
+ return ["mode", ...Object.keys(ENUM_KEYS), ...STRING_KEYS];
3420
+ }
3421
+ function allowedValues(key) {
3422
+ if (key === "mode")
3423
+ return MODE_VALUES;
3424
+ return ENUM_KEYS[key];
3406
3425
  }
3407
3426
  function normalizeConfigValue(key, value) {
3408
3427
  if (typeof value !== "string")
3409
3428
  return;
3410
- const allowed = ENUM_KEYS[key];
3429
+ if (key === "mode")
3430
+ return MODE_ALIASES[value.trim().toLowerCase()];
3431
+ const allowed = allowedValues(key);
3411
3432
  if (allowed)
3412
3433
  return allowed.includes(value) ? value : undefined;
3413
3434
  if (key === "apiUrl") {
@@ -3471,7 +3492,7 @@ function saveConfig(key, value, scope = "project") {
3471
3492
  }
3472
3493
  const normalized = normalizeConfigValue(key, value);
3473
3494
  if (normalized === undefined) {
3474
- const allowed = ENUM_KEYS[key];
3495
+ const allowed = allowedValues(key);
3475
3496
  throw new Error(allowed ? `Invalid value '${value}' for ${key}. Allowed: ${allowed.join(", ")}` : `Invalid value '${value}' for ${key}. Expected an http(s) URL`);
3476
3497
  }
3477
3498
  const filePath = getConfigPath(scope);
@@ -17028,17 +17049,18 @@ function date4(params) {
17028
17049
  // node_modules/zod/v4/classic/external.js
17029
17050
  config(en_default());
17030
17051
  // src/lib/auth-store.ts
17031
- import { mkdirSync as mkdirSync4, readFileSync as readFileSync7, writeFileSync as writeFileSync4, unlinkSync } from "fs";
17052
+ import { existsSync as existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync7, writeFileSync as writeFileSync4, unlinkSync } from "fs";
17032
17053
  import { join as join7 } from "path";
17033
17054
  import { homedir as homedir4 } from "os";
17034
- var AUTH_DIR = join7(homedir4(), ".skills");
17055
+ var AUTH_DIR = join7(homedir4(), ".hasna", "skills");
17035
17056
  var AUTH_FILE = join7(AUTH_DIR, "auth.json");
17057
+ var LEGACY_AUTH_FILE = join7(homedir4(), ".skills", "auth.json");
17036
17058
  var cachedConfig;
17037
17059
  function getAuthConfig() {
17038
17060
  if (cachedConfig !== undefined)
17039
17061
  return cachedConfig;
17040
17062
  try {
17041
- const raw = readFileSync7(AUTH_FILE, "utf-8");
17063
+ const raw = readFileSync7(existsSync7(AUTH_FILE) ? AUTH_FILE : LEGACY_AUTH_FILE, "utf-8");
17042
17064
  const config2 = JSON.parse(raw);
17043
17065
  if (!config2.apiKey || !config2.email) {
17044
17066
  cachedConfig = null;
@@ -17472,14 +17494,14 @@ function createRemoteSkillsClient() {
17472
17494
  return new RemoteSkillsClient(apiKey);
17473
17495
  }
17474
17496
  // src/lib/scheduler.ts
17475
- import { existsSync as existsSync7, readFileSync as readFileSync8, writeFileSync as writeFileSync5, mkdirSync as mkdirSync5 } from "fs";
17497
+ import { existsSync as existsSync8, readFileSync as readFileSync8, writeFileSync as writeFileSync5, mkdirSync as mkdirSync5 } from "fs";
17476
17498
  import { join as join8 } from "path";
17477
17499
  function getSchedulesPath(targetDir = process.cwd()) {
17478
17500
  return join8(targetDir, ".skills", "schedules.json");
17479
17501
  }
17480
17502
  function loadSchedules(targetDir = process.cwd()) {
17481
17503
  const path = getSchedulesPath(targetDir);
17482
- if (existsSync7(path)) {
17504
+ if (existsSync8(path)) {
17483
17505
  try {
17484
17506
  return JSON.parse(readFileSync8(path, "utf-8"));
17485
17507
  } catch {}
@@ -17489,7 +17511,7 @@ function loadSchedules(targetDir = process.cwd()) {
17489
17511
  function saveSchedules(data, targetDir = process.cwd()) {
17490
17512
  const path = getSchedulesPath(targetDir);
17491
17513
  const dir = join8(targetDir, ".skills");
17492
- if (!existsSync7(dir))
17514
+ if (!existsSync8(dir))
17493
17515
  mkdirSync5(dir, { recursive: true });
17494
17516
  writeFileSync5(path, JSON.stringify(data, null, 2));
17495
17517
  }
@@ -17676,7 +17698,7 @@ function recordScheduleRun(id, status, targetDir) {
17676
17698
  saveSchedules(data, targetDir);
17677
17699
  }
17678
17700
  // src/lib/skill-validation.ts
17679
- import { existsSync as existsSync8, lstatSync, readFileSync as readFileSync9, readdirSync as readdirSync3, statSync as statSync2 } from "fs";
17701
+ import { existsSync as existsSync9, lstatSync, readFileSync as readFileSync9, readdirSync as readdirSync3, statSync as statSync2 } from "fs";
17680
17702
  import { isAbsolute, join as join9, normalize } from "path";
17681
17703
  var DOC_FILES = ["SKILL.md", "README.md", "CLAUDE.md"];
17682
17704
  var RESERVED_SKILL_ENTRIES = new Set([
@@ -17740,6 +17762,25 @@ function isSafeRelativePath(value) {
17740
17762
  const normalized = normalize(value).replace(/\\/g, "/");
17741
17763
  return normalized !== ".." && !normalized.startsWith("../") && !normalized.includes("/../");
17742
17764
  }
17765
+ function isHostedPackageMetadata(pkg) {
17766
+ const skills = asRecord(pkg.skills);
17767
+ if (!skills)
17768
+ return false;
17769
+ const runtime = typeof skills.runtime === "string" ? skills.runtime.trim().toLowerCase() : "";
17770
+ const source = typeof skills.source === "string" ? skills.source.trim().toLowerCase() : "";
17771
+ return runtime === "hosted" || source === "remote" || source === "private-hosted";
17772
+ }
17773
+ function isHostedMetadataSkill(skillName, frontmatter, registryMeta, packageDeclaresHosted) {
17774
+ if (packageDeclaresHosted)
17775
+ return true;
17776
+ if (isPremiumSkill(skillName))
17777
+ return true;
17778
+ if (frontmatter?.source === "private-hosted")
17779
+ return true;
17780
+ if (frontmatter?.source === "remote" && !registryMeta?.tags.includes("local"))
17781
+ return true;
17782
+ return false;
17783
+ }
17743
17784
  function parseSkillFrontmatter(content) {
17744
17785
  const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
17745
17786
  if (!match)
@@ -17789,11 +17830,13 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17789
17830
  const bareName = name;
17790
17831
  const issues = [];
17791
17832
  const warnings = [];
17833
+ let packageDeclaresHosted = false;
17834
+ let packageSkillSource;
17792
17835
  const metadata = {
17793
17836
  binCommands: [],
17794
17837
  docFiles: []
17795
17838
  };
17796
- if (!existsSync8(skillPath)) {
17839
+ if (!existsSync9(skillPath)) {
17797
17840
  add(issues, "skill.dir_missing", `Skill directory not found: ${skillPath}`);
17798
17841
  return {
17799
17842
  name: bareName,
@@ -17820,14 +17863,14 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17820
17863
  }
17821
17864
  }
17822
17865
  for (const docFile of DOC_FILES) {
17823
- if (existsSync8(join9(skillPath, docFile)))
17866
+ if (existsSync9(join9(skillPath, docFile)))
17824
17867
  metadata.docFiles.push(docFile);
17825
17868
  }
17826
17869
  if (metadata.docFiles.length === 0) {
17827
17870
  add(issues, "skill.docs_missing", "Missing documentation file: expected SKILL.md, README.md, or CLAUDE.md");
17828
17871
  }
17829
17872
  const skillMdPath = join9(skillPath, "SKILL.md");
17830
- if (existsSync8(skillMdPath)) {
17873
+ if (existsSync9(skillMdPath)) {
17831
17874
  const frontmatter = parseSkillFrontmatter(readFileSync9(skillMdPath, "utf-8"));
17832
17875
  if (!frontmatter) {
17833
17876
  add(warnings, "skill.frontmatter_missing", "SKILL.md has no YAML frontmatter");
@@ -17862,7 +17905,7 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17862
17905
  add(warnings, "skill.skill_md_missing", "Missing SKILL.md; registry docs may need generated agent-facing instructions");
17863
17906
  }
17864
17907
  const pkgPath = join9(skillPath, "package.json");
17865
- if (!existsSync8(pkgPath)) {
17908
+ if (!existsSync9(pkgPath)) {
17866
17909
  add(issues, "package.missing", "Missing package.json");
17867
17910
  } else {
17868
17911
  try {
@@ -17871,6 +17914,13 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17871
17914
  if (!packageRecord) {
17872
17915
  add(issues, "package.invalid_shape", "package.json must be an object");
17873
17916
  } else {
17917
+ packageDeclaresHosted = isHostedPackageMetadata(pkg);
17918
+ const skillsRecord = asRecord(pkg.skills);
17919
+ if (skillsRecord && typeof skillsRecord.source === "string") {
17920
+ packageSkillSource = skillsRecord.source;
17921
+ }
17922
+ const hostedMetadata2 = isHostedMetadataSkill(bareName, metadata.skillMdFrontmatter, registryMeta, packageDeclaresHosted);
17923
+ metadata.runtime = hostedMetadata2 ? "hosted" : "local";
17874
17924
  if (typeof pkg.name === "string") {
17875
17925
  metadata.packageName = pkg.name;
17876
17926
  if (pkg.name !== bareName) {
@@ -17887,12 +17937,18 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17887
17937
  ...metadata.provenance ?? { directoryName: bareName },
17888
17938
  ...typeof pkg.name === "string" ? { packageName: pkg.name } : {},
17889
17939
  ...typeof pkg.version === "string" && pkg.version.trim() ? { packageVersion: pkg.version } : {},
17890
- ...registryMeta?.source ? { registrySource: registryMeta.source } : {}
17940
+ ...registryMeta?.source ? { registrySource: registryMeta.source } : {},
17941
+ ...packageSkillSource ? { packageSkillSource } : {}
17891
17942
  };
17892
17943
  const binRecord = asRecord(pkg.bin);
17893
17944
  if (!binRecord || Object.keys(binRecord).length === 0) {
17894
- add(issues, "package.bin_missing", "package.json missing non-empty bin object");
17945
+ if (!hostedMetadata2) {
17946
+ add(issues, "package.bin_missing", "package.json missing non-empty bin object");
17947
+ }
17895
17948
  } else {
17949
+ if (hostedMetadata2) {
17950
+ add(issues, "package.hosted_bin_forbidden", "Hosted metadata packages must not expose a local bin entry");
17951
+ }
17896
17952
  for (const [command, target] of Object.entries(binRecord)) {
17897
17953
  if (!VALID_BIN_COMMAND.test(command)) {
17898
17954
  add(issues, "package.bin_command_invalid", `package.json bin command '${command}' must use lowercase letters, numbers, dots, underscores, or hyphens`);
@@ -17907,7 +17963,7 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17907
17963
  continue;
17908
17964
  }
17909
17965
  const targetPath = join9(skillPath, target);
17910
- if (!existsSync8(targetPath)) {
17966
+ if (!existsSync9(targetPath)) {
17911
17967
  add(warnings, "package.bin_target_missing", `package.json bin '${command}' target '${target}' is not present before build`);
17912
17968
  } else if (statSync2(targetPath).isDirectory()) {
17913
17969
  add(issues, "package.bin_target_directory", `package.json bin '${command}' target '${target}' must point to a file, not a directory`);
@@ -17919,13 +17975,19 @@ function validateSkillDirectory(name, skillPath, registryMeta) {
17919
17975
  add(issues, "package.invalid_json", `package.json is invalid JSON: ${error48.message}`);
17920
17976
  }
17921
17977
  }
17978
+ const hostedMetadata = isHostedMetadataSkill(bareName, metadata.skillMdFrontmatter, registryMeta, packageDeclaresHosted);
17979
+ metadata.runtime = hostedMetadata ? "hosted" : "local";
17922
17980
  const srcDir = join9(skillPath, "src");
17923
- if (!existsSync8(srcDir)) {
17981
+ if (hostedMetadata) {
17982
+ if (existsSync9(srcDir)) {
17983
+ add(issues, "skill.hosted_source_forbidden", "Hosted metadata skills must not include local implementation source");
17984
+ }
17985
+ } else if (!existsSync9(srcDir)) {
17924
17986
  add(issues, "skill.src_missing", "Missing src/ directory");
17925
- } else if (!existsSync8(join9(srcDir, "index.ts")) && !existsSync8(join9(srcDir, "index.js"))) {
17987
+ } else if (!existsSync9(join9(srcDir, "index.ts")) && !existsSync9(join9(srcDir, "index.js"))) {
17926
17988
  add(issues, "skill.src_index_missing", "Missing src/index.ts or src/index.js");
17927
17989
  } else {
17928
- const indexPath = existsSync8(join9(srcDir, "index.ts")) ? join9(srcDir, "index.ts") : join9(srcDir, "index.js");
17990
+ const indexPath = existsSync9(join9(srcDir, "index.ts")) ? join9(srcDir, "index.ts") : join9(srcDir, "index.js");
17929
17991
  const size = statSync2(indexPath).size;
17930
17992
  if (size < 50)
17931
17993
  add(warnings, "skill.src_index_minimal", `Source entry point is very small (${size}B)`);
@@ -17948,7 +18010,7 @@ function validateRegistryConsistency(registry2, skillsDir) {
17948
18010
  seen.add(name);
17949
18011
  return false;
17950
18012
  })));
17951
- const skillDirs = existsSync8(skillsDir) ? readdirSync3(skillsDir).filter((entry) => {
18013
+ const skillDirs = existsSync9(skillsDir) ? readdirSync3(skillsDir).filter((entry) => {
17952
18014
  const fullPath = join9(skillsDir, entry);
17953
18015
  return !entry.startsWith(".") && entry !== "_common" && statSync2(fullPath).isDirectory();
17954
18016
  }) : [];
@@ -17969,7 +18031,7 @@ import { dirname as dirname3, relative as relative2 } from "path";
17969
18031
  // package.json
17970
18032
  var package_default = {
17971
18033
  name: "@hasna/skills",
17972
- version: "0.1.31",
18034
+ version: "0.1.33",
17973
18035
  description: "Skills library for AI coding agents",
17974
18036
  type: "module",
17975
18037
  bin: {
@@ -18763,7 +18825,7 @@ function clone2(value) {
18763
18825
  return JSON.parse(JSON.stringify(value));
18764
18826
  }
18765
18827
  // src/lib/feedback.ts
18766
- import { existsSync as existsSync9, mkdirSync as mkdirSync7 } from "fs";
18828
+ import { existsSync as existsSync10, mkdirSync as mkdirSync7 } from "fs";
18767
18829
  import { homedir as homedir5 } from "os";
18768
18830
  import { dirname as dirname4, join as join10 } from "path";
18769
18831
  import { Database } from "bun:sqlite";
@@ -18773,7 +18835,7 @@ function getFeedbackDbPath() {
18773
18835
  function getFeedbackDb() {
18774
18836
  const dbPath = getFeedbackDbPath();
18775
18837
  const dir = dirname4(dbPath);
18776
- if (!existsSync9(dir))
18838
+ if (!existsSync10(dir))
18777
18839
  mkdirSync7(dir, { recursive: true });
18778
18840
  const db = new Database(dbPath);
18779
18841
  db.exec("PRAGMA journal_mode = WAL");
@@ -9,7 +9,7 @@
9
9
  * Values from the project config override global config.
10
10
  */
11
11
  export interface SkillsConfig {
12
- mode?: "local" | "skills.md";
12
+ mode?: "local" | "hosted";
13
13
  defaultAgent?: "claude" | "codex" | "gemini" | "pi" | "opencode" | "all";
14
14
  defaultScope?: "global" | "project";
15
15
  format?: "compact" | "json" | "csv";
@@ -16,6 +16,7 @@ export interface SkillValidationResult {
16
16
  docFiles: string[];
17
17
  skillMdFrontmatter?: SkillFrontmatter;
18
18
  provenance?: SkillValidationProvenance;
19
+ runtime?: "local" | "hosted";
19
20
  };
20
21
  }
21
22
  export interface RegistryConsistencyResult {
@@ -39,6 +40,7 @@ export interface SkillValidationProvenance {
39
40
  packageVersion?: string;
40
41
  frontmatterSource?: string;
41
42
  registrySource?: string;
43
+ packageSkillSource?: string;
42
44
  }
43
45
  export declare function parseSkillFrontmatter(content: string): SkillFrontmatter | null;
44
46
  export declare function validateSkillDirectory(name: string, skillPath: string, registryMeta?: SkillMeta): SkillValidationResult;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/skills",
3
- "version": "0.1.31",
3
+ "version": "0.1.33",
4
4
  "description": "Skills library for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,14 +1,11 @@
1
1
  {
2
2
  "name": "ad-creative-pack",
3
3
  "version": "0.1.0",
4
+ "private": true,
4
5
  "description": "Hosted premium paid ad creative artifact generator",
5
6
  "type": "module",
6
- "bin": {
7
- "ad-creative-pack": "./src/index.ts"
8
- },
9
- "dependencies": {},
10
- "devDependencies": {
11
- "@types/bun": "latest",
12
- "typescript": "^5.7.0"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
13
10
  }
14
11
  }
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "api-docs-portal",
3
3
  "version": "0.1.0",
4
- "type": "module",
5
4
  "private": true,
6
- "bin": {
7
- "api-docs-portal": "src/index.ts"
5
+ "description": "Hosted skill metadata for api-docs-portal",
6
+ "type": "module",
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
8
10
  }
9
11
  }
@@ -1,29 +1,11 @@
1
1
  {
2
2
  "name": "audio",
3
3
  "version": "1.0.0",
4
+ "private": true,
4
5
  "description": "Generate speech and audio using provider-cost AI backends",
5
- "main": "src/index.ts",
6
6
  "type": "module",
7
- "bin": {
8
- "audio": "src/index.ts"
9
- },
10
- "scripts": {
11
- "start": "bun run src/index.ts",
12
- "generate": "bun run src/index.ts generate"
13
- },
14
- "keywords": [
15
- "audio-generation",
16
- "speech",
17
- "tts",
18
- "ai",
19
- "openai",
20
- "minimax",
21
- "gemini"
22
- ],
23
- "devDependencies": {
24
- "@types/bun": "latest"
25
- },
26
- "peerDependencies": {
27
- "typescript": "^5.0.0"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
28
10
  }
29
11
  }
@@ -4,7 +4,8 @@
4
4
  "private": true,
5
5
  "description": "Hosted premium audio transcript package generator",
6
6
  "type": "module",
7
- "bin": {
8
- "audio-transcript-pack": "./src/index.ts"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
9
10
  }
10
11
  }
@@ -1,27 +1,11 @@
1
1
  {
2
2
  "name": "blog-article",
3
3
  "version": "0.1.0",
4
+ "private": true,
4
5
  "description": "Hosted premium blog article artifact generator",
5
6
  "type": "module",
6
- "bin": {
7
- "blog-article": "./src/index.ts"
8
- },
9
- "scripts": {
10
- "dev": "bun run src/index.ts",
11
- "build": "bun build src/index.ts --outdir dist --target node",
12
- "typecheck": "tsc --noEmit"
13
- },
14
- "dependencies": {},
15
- "devDependencies": {
16
- "@types/bun": "latest",
17
- "typescript": "^5.7.0"
18
- },
19
- "publishConfig": {
20
- "access": "restricted",
21
- "registry": "https://registry.npmjs.org/"
22
- },
23
- "files": [
24
- "src",
25
- "tsconfig.json"
26
- ]
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
10
+ }
27
11
  }
@@ -1,14 +1,11 @@
1
1
  {
2
2
  "name": "brand-kit",
3
3
  "version": "0.1.0",
4
+ "private": true,
4
5
  "description": "Hosted premium brand kit artifact generator",
5
6
  "type": "module",
6
- "bin": {
7
- "brand-kit": "./src/index.ts"
8
- },
9
- "dependencies": {},
10
- "devDependencies": {
11
- "@types/bun": "latest",
12
- "typescript": "^5.7.0"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
13
10
  }
14
11
  }
@@ -4,7 +4,8 @@
4
4
  "private": true,
5
5
  "description": "Hosted premium brand photo shoot package generator",
6
6
  "type": "module",
7
- "bin": {
8
- "brand-photo-shoot": "./src/index.ts"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
9
10
  }
10
11
  }
@@ -1,40 +1,11 @@
1
1
  {
2
2
  "name": "browse",
3
3
  "version": "1.0.0",
4
+ "private": true,
4
5
  "description": "MCP Browse server for AI agents - Browser automation using Browser-Use Cloud API",
5
6
  "type": "module",
6
- "main": "src/index.ts",
7
- "bin": {
8
- "browse": "src/index.ts"
9
- },
10
- "scripts": {
11
- "start": "bun run src/index.ts",
12
- "dev": "bun run --watch src/index.ts",
13
- "sse": "bun run src/sse-server.ts",
14
- "sse:dev": "bun run --watch src/sse-server.ts"
15
- },
16
- "keywords": [
17
- "browser",
18
- "automation",
19
- "scraping",
20
- "web",
21
- "ai-agent",
22
- "browser-use",
23
- "mcp"
24
- ],
25
- "author": "",
26
- "dependencies": {
27
- "@modelcontextprotocol/sdk": "^1.0.0",
28
- "cors": "^2.8.5",
29
- "express": "^4.21.0",
30
- "zod": "^3.23.8"
31
- },
32
- "devDependencies": {
33
- "@types/bun": "latest",
34
- "@types/cors": "^2.8.17",
35
- "@types/express": "^4.17.21"
36
- },
37
- "peerDependencies": {
38
- "typescript": "^5.0.0"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
39
10
  }
40
11
  }
@@ -4,7 +4,8 @@
4
4
  "private": true,
5
5
  "description": "Hosted premium contract review report generator",
6
6
  "type": "module",
7
- "bin": {
8
- "contract-review-report": "./src/index.ts"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
9
10
  }
10
11
  }
@@ -4,7 +4,8 @@
4
4
  "private": true,
5
5
  "description": "Hosted premium customer feedback report generator",
6
6
  "type": "module",
7
- "bin": {
8
- "customer-feedback-report": "./src/index.ts"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
9
10
  }
10
11
  }
@@ -1,44 +1,11 @@
1
1
  {
2
2
  "name": "deepresearch",
3
3
  "version": "0.1.3",
4
+ "private": true,
4
5
  "description": "Agentic deep research skill using Exa.ai for search and Claude/OpenAI for synthesis",
5
6
  "type": "module",
6
- "main": "src/index.ts",
7
- "bin": {
8
- "deepresearch": "src/index.ts"
9
- },
10
- "files": [
11
- "src",
12
- "README.md",
13
- "SKILL.md"
14
- ],
15
- "publishConfig": {
16
- "access": "restricted"
17
- },
18
- "keywords": [
19
- "research",
20
- "ai",
21
- "exa",
22
- "claude",
23
- "openai",
24
- "rag",
25
- "deep-research"
26
- ],
27
- "scripts": {
28
- "start": "bun run src/index.ts",
29
- "dev": "bun --watch src/index.ts",
30
- "typecheck": "tsc --noEmit"
31
- },
32
- "dependencies": {
33
- "@anthropic-ai/sdk": "^0.30.0",
34
- "chalk": "^5.3.0",
35
- "commander": "^12.1.0",
36
- "exa-js": "^1.0.12",
37
- "openai": "^4.0.0",
38
- "ora": "^8.0.1"
39
- },
40
- "devDependencies": {
41
- "@types/bun": "latest",
42
- "typescript": "^5.7.0"
7
+ "skills": {
8
+ "runtime": "hosted",
9
+ "source": "remote"
43
10
  }
44
11
  }
@@ -1,46 +1,29 @@
1
1
  ---
2
2
  name: domainpurchase
3
- description: Purchase and manage domains via GoDaddy API with CLI and HTTP server
3
+ description: Public contract for domain purchase workflows through hosted or external registrar connectors.
4
4
  ---
5
5
 
6
6
  # Domain Purchase
7
7
 
8
- Purchase and manage domains via the GoDaddy API. Provides both a CLI tool and an HTTP server for domain purchasing workflows.
9
-
10
- ## Features
11
-
12
- - Purchase domains through GoDaddy API
13
- - Manage domain configurations and settings
14
- - HTTP server mode for API-driven purchases
15
- - AWS Secrets Manager integration for credential storage
16
- - Remote server proxy mode for centralized domain management
8
+ This public skill describes domain purchase and management workflows for agents.
9
+ The OSS package intentionally does not ship registrar purchasing logic, remote
10
+ server proxy code, or cloud secret-store integration.
17
11
 
18
12
  ## Usage
19
13
 
20
14
  ```bash
21
- # Run the CLI
22
- domainpurchase
23
-
24
- # Start the HTTP server
25
- bun run start
26
-
27
- # Development mode with watch
28
- bun run dev
15
+ skills run domainpurchase --help
29
16
  ```
30
17
 
31
- ## Environment Variables
18
+ For production domain purchase workflows, route execution through a hosted or
19
+ external connector that owns registrar credentials, audit logs, payment
20
+ approval, and account-specific policy.
32
21
 
33
- | Variable | Description |
34
- |----------|-------------|
35
- | `DOMAIN_API_KEY` | GoDaddy API key |
36
- | `DOMAIN_API_SECRET` | GoDaddy API secret |
37
- | `DOMAIN_CUSTOMER_ID` | GoDaddy customer ID |
38
- | `DOMAIN_API_URL` | API base URL (default: `https://api.godaddy.com`) |
39
- | `DOMAIN_USE_REMOTE_SERVER` | Use remote server proxy (`true`/`false`) |
40
- | `DOMAIN_REMOTE_SERVER_URL` | Remote server URL |
41
- | `DOMAIN_REMOTE_API_KEY` | Remote server API key |
42
- | `AWS_SECRET_NAME` | AWS Secrets Manager secret name for credentials |
22
+ ## Boundary
43
23
 
44
- ## Configuration
24
+ - Local package: skill metadata, docs, and a CLI stub.
25
+ - Hosted or external connector: registrar API calls, credentials, approvals,
26
+ purchase records, and billing-sensitive workflows.
45
27
 
46
- Config is stored at `~/.config/service-domainpurchase/config.json`. Environment variables take priority over the config file. AWS Secrets Manager is also supported as a credential source.
28
+ Provider credentials and cloud secret names must not be stored in this OSS
29
+ skill package.