@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.
- package/README.md +35 -30
- package/bin/index.js +577 -282
- package/bin/mcp.js +102 -39
- package/dist/cli/commands/runtime.d.ts +1 -1
- package/dist/cli/onboarding.d.ts +13 -0
- package/dist/index.js +88 -26
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/skill-validation.d.ts +2 -0
- package/package.json +1 -1
- package/skills/ad-creative-pack/package.json +4 -7
- package/skills/api-docs-portal/package.json +5 -3
- package/skills/audio/package.json +4 -22
- package/skills/audio-transcript-pack/package.json +3 -2
- package/skills/blog-article/package.json +5 -21
- package/skills/brand-kit/package.json +4 -7
- package/skills/brand-photo-shoot/package.json +3 -2
- package/skills/browse/package.json +4 -33
- package/skills/contract-review-report/package.json +3 -2
- package/skills/customer-feedback-report/package.json +3 -2
- package/skills/deepresearch/package.json +4 -37
- package/skills/domainpurchase/SKILL.md +14 -31
- package/skills/domainpurchase/package.json +3 -8
- package/skills/email-sequence/package.json +4 -7
- package/skills/generate-book-cover/package.json +5 -23
- package/skills/icon-pack/package.json +4 -22
- package/skills/image/package.json +4 -22
- package/skills/invoice-reconciliation/package.json +3 -2
- package/skills/landing-page-pack/package.json +4 -7
- package/skills/logo-design/package.json +4 -2
- package/skills/managemcp/CLAUDE.md +9 -43
- package/skills/managemcp/README.md +12 -198
- package/skills/managemcp/package.json +2 -10
- package/skills/managemcp/tsconfig.json +1 -3
- package/skills/market-research-report/package.json +5 -4
- package/skills/meeting-pack/package.json +3 -2
- package/skills/migration-plan-pack/package.json +3 -2
- package/skills/music/package.json +4 -20
- package/skills/music-album/package.json +3 -2
- package/skills/one-page-website/package.json +3 -2
- package/skills/pdf-read/package.json +5 -23
- package/skills/pdf-to-dataset/package.json +5 -4
- package/skills/pdf-to-markdown/package.json +5 -4
- package/skills/performance-audit-report/package.json +3 -2
- package/skills/photo-album/package.json +4 -2
- package/skills/pitch-deck/package.json +5 -3
- package/skills/playlist-maker/package.json +4 -2
- package/skills/product-mockup/package.json +3 -2
- package/skills/proposal-pack/package.json +5 -4
- package/skills/read-pdf/package.json +4 -29
- package/skills/remove-background/package.json +5 -21
- package/skills/repo-onboarding-report/package.json +3 -2
- package/skills/sdk-generator/package.json +3 -2
- package/skills/security-audit-report/package.json +5 -4
- package/skills/seo-content-pack/package.json +5 -3
- package/skills/short-video-pack/package.json +3 -2
- package/skills/slide-deck-generator/package.json +3 -2
- package/skills/sms/README.md +18 -56
- package/skills/sms/package.json +1 -3
- package/skills/sms/tsconfig.json +1 -2
- package/skills/social-content-calendar/package.json +4 -7
- package/skills/test-suite-generator/package.json +5 -4
- package/skills/transcript/package.json +4 -23
- package/skills/video/package.json +4 -24
- package/skills/video-highlight-pack/package.json +3 -2
- package/skills/voiceover-jingle-pack/package.json +3 -2
- package/skills/webcrawling/package.json +4 -32
- package/skills/domainpurchase/.env.example +0 -7
- package/skills/domainpurchase/src/lib/api-client.ts +0 -571
- package/skills/domainpurchase/src/lib/config.ts +0 -209
- package/skills/domainpurchase/src/lib/installer.ts +0 -165
- package/skills/managemcp/.env.example +0 -16
- package/skills/managemcp/scripts/migrate.ts +0 -57
- package/skills/managemcp/scripts/seed.ts +0 -58
- package/skills/managemcp/src/db/index.ts +0 -37
- package/skills/managemcp/src/lib/api-client.ts +0 -108
- package/skills/managemcp/src/lib/config.ts +0 -34
- package/skills/managemcp/src/lib/installer.ts +0 -140
- package/skills/managemcp/src/lib/service-dir.ts +0 -119
- package/skills/sms/scripts/buy-number.ts +0 -63
- package/skills/sms/scripts/test-send.ts +0 -67
- package/skills/sms/src/server.ts +0 -351
- 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 [
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 (
|
|
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 (!
|
|
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
|
|
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 (!
|
|
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 (
|
|
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 (
|
|
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 (!
|
|
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
|
-
|
|
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 (!
|
|
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 (
|
|
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 (!
|
|
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 =
|
|
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 =
|
|
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.
|
|
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
|
|
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 (!
|
|
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");
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Values from the project config override global config.
|
|
10
10
|
*/
|
|
11
11
|
export interface SkillsConfig {
|
|
12
|
-
mode?: "local" | "
|
|
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,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
|
-
"
|
|
7
|
-
"
|
|
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
|
-
"
|
|
7
|
-
|
|
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
|
-
"
|
|
8
|
-
"
|
|
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
|
}
|
|
@@ -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
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
"
|
|
7
|
-
"
|
|
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,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
|
-
"
|
|
7
|
-
|
|
8
|
-
"
|
|
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
|
}
|
|
@@ -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
|
-
"
|
|
7
|
-
|
|
8
|
-
"
|
|
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:
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
28
|
+
Provider credentials and cloud secret names must not be stored in this OSS
|
|
29
|
+
skill package.
|