fix: quote scoped package names in skill frontmatter and update validator (#79)
- Wrapped unquoted @scope/pkg values in double quotes across 19 SKILL.md files. - Added 'package' to ALLOWED_FIELDS in JS validator. - Added YAML validity regression test to test suite. - Updated package-lock.json. Fixes #79 Closes #80
This commit is contained in:
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "antigravity-awesome-skills",
|
"name": "antigravity-awesome-skills",
|
||||||
"version": "5.2.0",
|
"version": "5.3.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "antigravity-awesome-skills",
|
"name": "antigravity-awesome-skills",
|
||||||
"version": "5.2.0",
|
"version": "5.3.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"antigravity-awesome-skills": "bin/install.js"
|
"antigravity-awesome-skills": "bin/install.js"
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
const assert = require('assert');
|
const assert = require("assert");
|
||||||
const { hasUseSection } = require('../validate-skills');
|
const { hasUseSection } = require("../validate-skills");
|
||||||
|
|
||||||
const samples = [
|
const samples = [
|
||||||
['## When to Use', true],
|
["## When to Use", true],
|
||||||
['## Use this skill when', true],
|
["## Use this skill when", true],
|
||||||
['## When to Use This Skill', true],
|
["## When to Use This Skill", true],
|
||||||
['## Overview', false],
|
["## Overview", false],
|
||||||
];
|
];
|
||||||
|
|
||||||
for (const [heading, expected] of samples) {
|
for (const [heading, expected] of samples) {
|
||||||
@@ -13,4 +13,31 @@ for (const [heading, expected] of samples) {
|
|||||||
assert.strictEqual(hasUseSection(content), expected, heading);
|
assert.strictEqual(hasUseSection(content), expected, heading);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('ok');
|
// Regression test for YAML validity in frontmatter (Issue #79)
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const { listSkillIds, parseFrontmatter } = require("../../lib/skill-utils");
|
||||||
|
|
||||||
|
const SKILLS_DIR = path.join(__dirname, "../../skills");
|
||||||
|
const skillIds = listSkillIds(SKILLS_DIR);
|
||||||
|
|
||||||
|
console.log(`Checking YAML validity for ${skillIds.length} skills...`);
|
||||||
|
|
||||||
|
for (const skillId of skillIds) {
|
||||||
|
const skillPath = path.join(SKILLS_DIR, skillId, "SKILL.md");
|
||||||
|
const content = fs.readFileSync(skillPath, "utf8");
|
||||||
|
const { errors, hasFrontmatter } = parseFrontmatter(content);
|
||||||
|
|
||||||
|
if (!hasFrontmatter) {
|
||||||
|
console.warn(`[WARN] No frontmatter in ${skillId}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.strictEqual(
|
||||||
|
errors.length,
|
||||||
|
0,
|
||||||
|
`YAML parse errors in ${skillId}: ${errors.join(", ")}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("ok");
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
* Legacy / alternative validator. For CI and PR checks, use scripts/validate_skills.py.
|
* Legacy / alternative validator. For CI and PR checks, use scripts/validate_skills.py.
|
||||||
* Run: npm run validate (or npm run validate:strict)
|
* Run: npm run validate (or npm run validate:strict)
|
||||||
*/
|
*/
|
||||||
const fs = require('fs');
|
const fs = require("fs");
|
||||||
const path = require('path');
|
const path = require("path");
|
||||||
const { listSkillIds, parseFrontmatter } = require('../lib/skill-utils');
|
const { listSkillIds, parseFrontmatter } = require("../lib/skill-utils");
|
||||||
|
|
||||||
const ROOT = path.resolve(__dirname, '..');
|
const ROOT = path.resolve(__dirname, "..");
|
||||||
const SKILLS_DIR = path.join(ROOT, 'skills');
|
const SKILLS_DIR = path.join(ROOT, "skills");
|
||||||
const BASELINE_PATH = path.join(ROOT, 'validation-baseline.json');
|
const BASELINE_PATH = path.join(ROOT, "validation-baseline.json");
|
||||||
|
|
||||||
const errors = [];
|
const errors = [];
|
||||||
const warnings = [];
|
const warnings = [];
|
||||||
@@ -17,12 +17,14 @@ const missingDoNotUseSection = [];
|
|||||||
const missingInstructionsSection = [];
|
const missingInstructionsSection = [];
|
||||||
const longFiles = [];
|
const longFiles = [];
|
||||||
const unknownFieldSkills = [];
|
const unknownFieldSkills = [];
|
||||||
const isStrict = process.argv.includes('--strict')
|
const isStrict =
|
||||||
|| process.env.STRICT === '1'
|
process.argv.includes("--strict") ||
|
||||||
|| process.env.STRICT === 'true';
|
process.env.STRICT === "1" ||
|
||||||
const writeBaseline = process.argv.includes('--write-baseline')
|
process.env.STRICT === "true";
|
||||||
|| process.env.WRITE_BASELINE === '1'
|
const writeBaseline =
|
||||||
|| process.env.WRITE_BASELINE === 'true';
|
process.argv.includes("--write-baseline") ||
|
||||||
|
process.env.WRITE_BASELINE === "1" ||
|
||||||
|
process.env.WRITE_BASELINE === "true";
|
||||||
|
|
||||||
const NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
const NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
||||||
const MAX_NAME_LENGTH = 64;
|
const MAX_NAME_LENGTH = 64;
|
||||||
@@ -30,14 +32,15 @@ const MAX_DESCRIPTION_LENGTH = 1024;
|
|||||||
const MAX_COMPATIBILITY_LENGTH = 500;
|
const MAX_COMPATIBILITY_LENGTH = 500;
|
||||||
const MAX_SKILL_LINES = 500;
|
const MAX_SKILL_LINES = 500;
|
||||||
const ALLOWED_FIELDS = new Set([
|
const ALLOWED_FIELDS = new Set([
|
||||||
'name',
|
"name",
|
||||||
'description',
|
"description",
|
||||||
'risk',
|
"risk",
|
||||||
'source',
|
"source",
|
||||||
'license',
|
"license",
|
||||||
'compatibility',
|
"compatibility",
|
||||||
'metadata',
|
"metadata",
|
||||||
'allowed-tools',
|
"allowed-tools",
|
||||||
|
"package",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const USE_SECTION_PATTERNS = [
|
const USE_SECTION_PATTERNS = [
|
||||||
@@ -47,15 +50,19 @@ const USE_SECTION_PATTERNS = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
function hasUseSection(content) {
|
function hasUseSection(content) {
|
||||||
return USE_SECTION_PATTERNS.some(pattern => pattern.test(content));
|
return USE_SECTION_PATTERNS.some((pattern) => pattern.test(content));
|
||||||
}
|
}
|
||||||
|
|
||||||
function isPlainObject(value) {
|
function isPlainObject(value) {
|
||||||
return value && typeof value === 'object' && !Array.isArray(value);
|
return value && typeof value === "object" && !Array.isArray(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateStringField(fieldName, value, { min = 1, max = Infinity } = {}) {
|
function validateStringField(
|
||||||
if (typeof value !== 'string') {
|
fieldName,
|
||||||
|
value,
|
||||||
|
{ min = 1, max = Infinity } = {},
|
||||||
|
) {
|
||||||
|
if (typeof value !== "string") {
|
||||||
return `${fieldName} must be a string.`;
|
return `${fieldName} must be a string.`;
|
||||||
}
|
}
|
||||||
const trimmed = value.trim();
|
const trimmed = value.trim();
|
||||||
@@ -90,24 +97,37 @@ function loadBaseline() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const parsed = JSON.parse(fs.readFileSync(BASELINE_PATH, 'utf8'));
|
const parsed = JSON.parse(fs.readFileSync(BASELINE_PATH, "utf8"));
|
||||||
return {
|
return {
|
||||||
useSection: Array.isArray(parsed.useSection) ? parsed.useSection : [],
|
useSection: Array.isArray(parsed.useSection) ? parsed.useSection : [],
|
||||||
doNotUseSection: Array.isArray(parsed.doNotUseSection) ? parsed.doNotUseSection : [],
|
doNotUseSection: Array.isArray(parsed.doNotUseSection)
|
||||||
instructionsSection: Array.isArray(parsed.instructionsSection) ? parsed.instructionsSection : [],
|
? parsed.doNotUseSection
|
||||||
|
: [],
|
||||||
|
instructionsSection: Array.isArray(parsed.instructionsSection)
|
||||||
|
? parsed.instructionsSection
|
||||||
|
: [],
|
||||||
longFile: Array.isArray(parsed.longFile) ? parsed.longFile : [],
|
longFile: Array.isArray(parsed.longFile) ? parsed.longFile : [],
|
||||||
};
|
};
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
addWarning('Failed to parse validation-baseline.json; strict mode may fail.');
|
addWarning(
|
||||||
return { useSection: [], doNotUseSection: [], instructionsSection: [], longFile: [] };
|
"Failed to parse validation-baseline.json; strict mode may fail.",
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
useSection: [],
|
||||||
|
doNotUseSection: [],
|
||||||
|
instructionsSection: [],
|
||||||
|
longFile: [],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addStrictSectionErrors(label, missing, baselineSet) {
|
function addStrictSectionErrors(label, missing, baselineSet) {
|
||||||
if (!isStrict) return;
|
if (!isStrict) return;
|
||||||
const strictMissing = missing.filter(skillId => !baselineSet.has(skillId));
|
const strictMissing = missing.filter((skillId) => !baselineSet.has(skillId));
|
||||||
if (strictMissing.length) {
|
if (strictMissing.length) {
|
||||||
addError(`Missing "${label}" section (strict): ${strictMissing.length} skills (examples: ${strictMissing.slice(0, 5).join(', ')})`);
|
addError(
|
||||||
|
`Missing "${label}" section (strict): ${strictMissing.length} skills (examples: ${strictMissing.slice(0, 5).join(", ")})`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,15 +140,19 @@ function run() {
|
|||||||
const baselineLongFile = new Set(baseline.longFile || []);
|
const baselineLongFile = new Set(baseline.longFile || []);
|
||||||
|
|
||||||
for (const skillId of skillIds) {
|
for (const skillId of skillIds) {
|
||||||
const skillPath = path.join(SKILLS_DIR, skillId, 'SKILL.md');
|
const skillPath = path.join(SKILLS_DIR, skillId, "SKILL.md");
|
||||||
|
|
||||||
if (!fs.existsSync(skillPath)) {
|
if (!fs.existsSync(skillPath)) {
|
||||||
addError(`Missing SKILL.md: ${skillId}`);
|
addError(`Missing SKILL.md: ${skillId}`);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = fs.readFileSync(skillPath, 'utf8');
|
const content = fs.readFileSync(skillPath, "utf8");
|
||||||
const { data, errors: fmErrors, hasFrontmatter } = parseFrontmatter(content);
|
const {
|
||||||
|
data,
|
||||||
|
errors: fmErrors,
|
||||||
|
hasFrontmatter,
|
||||||
|
} = parseFrontmatter(content);
|
||||||
const lineCount = content.split(/\r?\n/).length;
|
const lineCount = content.split(/\r?\n/).length;
|
||||||
|
|
||||||
if (!hasFrontmatter) {
|
if (!hasFrontmatter) {
|
||||||
@@ -136,7 +160,9 @@ function run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fmErrors && fmErrors.length) {
|
if (fmErrors && fmErrors.length) {
|
||||||
fmErrors.forEach(error => addError(`Frontmatter parse error (${skillId}): ${error}`));
|
fmErrors.forEach((error) =>
|
||||||
|
addError(`Frontmatter parse error (${skillId}): ${error}`),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NAME_PATTERN.test(skillId)) {
|
if (!NAME_PATTERN.test(skillId)) {
|
||||||
@@ -144,7 +170,10 @@ function run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data.name !== undefined) {
|
if (data.name !== undefined) {
|
||||||
const nameError = validateStringField('name', data.name, { min: 1, max: MAX_NAME_LENGTH });
|
const nameError = validateStringField("name", data.name, {
|
||||||
|
min: 1,
|
||||||
|
max: MAX_NAME_LENGTH,
|
||||||
|
});
|
||||||
if (nameError) {
|
if (nameError) {
|
||||||
addError(`${nameError} (${skillId})`);
|
addError(`${nameError} (${skillId})`);
|
||||||
} else {
|
} else {
|
||||||
@@ -158,15 +187,22 @@ function run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const descError = data.description === undefined
|
const descError =
|
||||||
? 'description is required.'
|
data.description === undefined
|
||||||
: validateStringField('description', data.description, { min: 1, max: MAX_DESCRIPTION_LENGTH });
|
? "description is required."
|
||||||
|
: validateStringField("description", data.description, {
|
||||||
|
min: 1,
|
||||||
|
max: MAX_DESCRIPTION_LENGTH,
|
||||||
|
});
|
||||||
if (descError) {
|
if (descError) {
|
||||||
addError(`${descError} (${skillId})`);
|
addError(`${descError} (${skillId})`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.license !== undefined) {
|
if (data.license !== undefined) {
|
||||||
const licenseError = validateStringField('license', data.license, { min: 1, max: 128 });
|
const licenseError = validateStringField("license", data.license, {
|
||||||
|
min: 1,
|
||||||
|
max: 128,
|
||||||
|
});
|
||||||
if (licenseError) {
|
if (licenseError) {
|
||||||
addError(`${licenseError} (${skillId})`);
|
addError(`${licenseError} (${skillId})`);
|
||||||
}
|
}
|
||||||
@@ -174,7 +210,7 @@ function run() {
|
|||||||
|
|
||||||
if (data.compatibility !== undefined) {
|
if (data.compatibility !== undefined) {
|
||||||
const compatibilityError = validateStringField(
|
const compatibilityError = validateStringField(
|
||||||
'compatibility',
|
"compatibility",
|
||||||
data.compatibility,
|
data.compatibility,
|
||||||
{ min: 1, max: MAX_COMPATIBILITY_LENGTH },
|
{ min: 1, max: MAX_COMPATIBILITY_LENGTH },
|
||||||
);
|
);
|
||||||
@@ -183,10 +219,12 @@ function run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data['allowed-tools'] !== undefined) {
|
if (data["allowed-tools"] !== undefined) {
|
||||||
if (typeof data['allowed-tools'] !== 'string') {
|
if (typeof data["allowed-tools"] !== "string") {
|
||||||
addError(`allowed-tools must be a space-delimited string. (${skillId})`);
|
addError(
|
||||||
} else if (!data['allowed-tools'].trim()) {
|
`allowed-tools must be a space-delimited string. (${skillId})`,
|
||||||
|
);
|
||||||
|
} else if (!data["allowed-tools"].trim()) {
|
||||||
addError(`allowed-tools cannot be empty. (${skillId})`);
|
addError(`allowed-tools cannot be empty. (${skillId})`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -196,7 +234,7 @@ function run() {
|
|||||||
addError(`metadata must be a string map/object. (${skillId})`);
|
addError(`metadata must be a string map/object. (${skillId})`);
|
||||||
} else {
|
} else {
|
||||||
for (const [key, value] of Object.entries(data.metadata)) {
|
for (const [key, value] of Object.entries(data.metadata)) {
|
||||||
if (typeof value !== 'string') {
|
if (typeof value !== "string") {
|
||||||
addError(`metadata.${key} must be a string. (${skillId})`);
|
addError(`metadata.${key} must be a string. (${skillId})`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -204,10 +242,14 @@ function run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data && Object.keys(data).length) {
|
if (data && Object.keys(data).length) {
|
||||||
const unknownFields = Object.keys(data).filter(key => !ALLOWED_FIELDS.has(key));
|
const unknownFields = Object.keys(data).filter(
|
||||||
|
(key) => !ALLOWED_FIELDS.has(key),
|
||||||
|
);
|
||||||
if (unknownFields.length) {
|
if (unknownFields.length) {
|
||||||
unknownFieldSkills.push(skillId);
|
unknownFieldSkills.push(skillId);
|
||||||
addError(`Unknown frontmatter fields (${skillId}): ${unknownFields.join(', ')}`);
|
addError(
|
||||||
|
`Unknown frontmatter fields (${skillId}): ${unknownFields.join(", ")}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,39 +261,61 @@ function run() {
|
|||||||
missingUseSection.push(skillId);
|
missingUseSection.push(skillId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!content.includes('## Do not use')) {
|
if (!content.includes("## Do not use")) {
|
||||||
missingDoNotUseSection.push(skillId);
|
missingDoNotUseSection.push(skillId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!content.includes('## Instructions')) {
|
if (!content.includes("## Instructions")) {
|
||||||
missingInstructionsSection.push(skillId);
|
missingInstructionsSection.push(skillId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (missingUseSection.length) {
|
if (missingUseSection.length) {
|
||||||
addWarning(`Missing "Use this skill when" section: ${missingUseSection.length} skills (examples: ${missingUseSection.slice(0, 5).join(', ')})`);
|
addWarning(
|
||||||
|
`Missing "Use this skill when" section: ${missingUseSection.length} skills (examples: ${missingUseSection.slice(0, 5).join(", ")})`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (missingDoNotUseSection.length) {
|
if (missingDoNotUseSection.length) {
|
||||||
addWarning(`Missing "Do not use" section: ${missingDoNotUseSection.length} skills (examples: ${missingDoNotUseSection.slice(0, 5).join(', ')})`);
|
addWarning(
|
||||||
|
`Missing "Do not use" section: ${missingDoNotUseSection.length} skills (examples: ${missingDoNotUseSection.slice(0, 5).join(", ")})`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (missingInstructionsSection.length) {
|
if (missingInstructionsSection.length) {
|
||||||
addWarning(`Missing "Instructions" section: ${missingInstructionsSection.length} skills (examples: ${missingInstructionsSection.slice(0, 5).join(', ')})`);
|
addWarning(
|
||||||
|
`Missing "Instructions" section: ${missingInstructionsSection.length} skills (examples: ${missingInstructionsSection.slice(0, 5).join(", ")})`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (longFiles.length) {
|
if (longFiles.length) {
|
||||||
addWarning(`SKILL.md over ${MAX_SKILL_LINES} lines: ${longFiles.length} skills (examples: ${longFiles.slice(0, 5).join(', ')})`);
|
addWarning(
|
||||||
|
`SKILL.md over ${MAX_SKILL_LINES} lines: ${longFiles.length} skills (examples: ${longFiles.slice(0, 5).join(", ")})`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unknownFieldSkills.length) {
|
if (unknownFieldSkills.length) {
|
||||||
addWarning(`Unknown frontmatter fields detected: ${unknownFieldSkills.length} skills (examples: ${unknownFieldSkills.slice(0, 5).join(', ')})`);
|
addWarning(
|
||||||
|
`Unknown frontmatter fields detected: ${unknownFieldSkills.length} skills (examples: ${unknownFieldSkills.slice(0, 5).join(", ")})`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
addStrictSectionErrors('Use this skill when', missingUseSection, baselineUse);
|
addStrictSectionErrors("Use this skill when", missingUseSection, baselineUse);
|
||||||
addStrictSectionErrors('Do not use', missingDoNotUseSection, baselineDoNotUse);
|
addStrictSectionErrors(
|
||||||
addStrictSectionErrors('Instructions', missingInstructionsSection, baselineInstructions);
|
"Do not use",
|
||||||
addStrictSectionErrors(`SKILL.md line count <= ${MAX_SKILL_LINES}`, longFiles, baselineLongFile);
|
missingDoNotUseSection,
|
||||||
|
baselineDoNotUse,
|
||||||
|
);
|
||||||
|
addStrictSectionErrors(
|
||||||
|
"Instructions",
|
||||||
|
missingInstructionsSection,
|
||||||
|
baselineInstructions,
|
||||||
|
);
|
||||||
|
addStrictSectionErrors(
|
||||||
|
`SKILL.md line count <= ${MAX_SKILL_LINES}`,
|
||||||
|
longFiles,
|
||||||
|
baselineLongFile,
|
||||||
|
);
|
||||||
|
|
||||||
if (writeBaseline) {
|
if (writeBaseline) {
|
||||||
const baselineData = {
|
const baselineData = {
|
||||||
@@ -266,14 +330,14 @@ function run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (warnings.length) {
|
if (warnings.length) {
|
||||||
console.warn('Warnings:');
|
console.warn("Warnings:");
|
||||||
for (const warning of warnings) {
|
for (const warning of warnings) {
|
||||||
console.warn(`- ${warning}`);
|
console.warn(`- ${warning}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errors.length) {
|
if (errors.length) {
|
||||||
console.error('\nErrors:');
|
console.error("\nErrors:");
|
||||||
for (const error of errors) {
|
for (const error of errors) {
|
||||||
console.error(`- ${error}`);
|
console.error(`- ${error}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-ai-contentsafety-ts
|
name: azure-ai-contentsafety-ts
|
||||||
description: Analyze text and images for harmful content using Azure AI Content Safety (@azure-rest/ai-content-safety). Use when moderating user-generated content, detecting hate speech, violence, sexual content, or self-harm, or managing custom blocklists.
|
description: Analyze text and images for harmful content using Azure AI Content Safety (@azure-rest/ai-content-safety). Use when moderating user-generated content, detecting hate speech, violence, sexual content, or self-harm, or managing custom blocklists.
|
||||||
package: @azure-rest/ai-content-safety
|
package: "@azure-rest/ai-content-safety"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure AI Content Safety REST SDK for TypeScript
|
# Azure AI Content Safety REST SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-ai-document-intelligence-ts
|
name: azure-ai-document-intelligence-ts
|
||||||
description: Extract text, tables, and structured data from documents using Azure Document Intelligence (@azure-rest/ai-document-intelligence). Use when processing invoices, receipts, IDs, forms, or building custom document models.
|
description: Extract text, tables, and structured data from documents using Azure Document Intelligence (@azure-rest/ai-document-intelligence). Use when processing invoices, receipts, IDs, forms, or building custom document models.
|
||||||
package: @azure-rest/ai-document-intelligence
|
package: "@azure-rest/ai-document-intelligence"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Document Intelligence REST SDK for TypeScript
|
# Azure Document Intelligence REST SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-ai-projects-ts
|
name: azure-ai-projects-ts
|
||||||
description: Build AI applications using Azure AI Projects SDK for JavaScript (@azure/ai-projects). Use when working with Foundry project clients, agents, connections, deployments, datasets, indexes, evaluations, or getting OpenAI clients.
|
description: Build AI applications using Azure AI Projects SDK for JavaScript (@azure/ai-projects). Use when working with Foundry project clients, agents, connections, deployments, datasets, indexes, evaluations, or getting OpenAI clients.
|
||||||
package: @azure/ai-projects
|
package: "@azure/ai-projects"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure AI Projects SDK for TypeScript
|
# Azure AI Projects SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-ai-translation-ts
|
name: azure-ai-translation-ts
|
||||||
description: Build translation applications using Azure Translation SDKs for JavaScript (@azure-rest/ai-translation-text, @azure-rest/ai-translation-document). Use when implementing text translation, transliteration, language detection, or batch document translation.
|
description: Build translation applications using Azure Translation SDKs for JavaScript (@azure-rest/ai-translation-text, @azure-rest/ai-translation-document). Use when implementing text translation, transliteration, language detection, or batch document translation.
|
||||||
package: @azure-rest/ai-translation-text, @azure-rest/ai-translation-document
|
package: "@azure-rest/ai-translation-text, @azure-rest/ai-translation-document"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Translation SDKs for TypeScript
|
# Azure Translation SDKs for TypeScript
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: azure-ai-voicelive-ts
|
name: azure-ai-voicelive-ts
|
||||||
description: |
|
description: |
|
||||||
Azure AI Voice Live SDK for JavaScript/TypeScript. Build real-time voice AI applications with bidirectional WebSocket communication. Use for voice assistants, conversational AI, real-time speech-to-speech, and voice-enabled chatbots in Node.js or browser environments. Triggers: "voice live", "real-time voice", "VoiceLiveClient", "VoiceLiveSession", "voice assistant TypeScript", "bidirectional audio", "speech-to-speech JavaScript".
|
Azure AI Voice Live SDK for JavaScript/TypeScript. Build real-time voice AI applications with bidirectional WebSocket communication. Use for voice assistants, conversational AI, real-time speech-to-speech, and voice-enabled chatbots in Node.js or browser environments. Triggers: "voice live", "real-time voice", "VoiceLiveClient", "VoiceLiveSession", "voice assistant TypeScript", "bidirectional audio", "speech-to-speech JavaScript".
|
||||||
package: @azure/ai-voicelive
|
package: "@azure/ai-voicelive"
|
||||||
---
|
---
|
||||||
|
|
||||||
# @azure/ai-voicelive (JavaScript/TypeScript)
|
# @azure/ai-voicelive (JavaScript/TypeScript)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-appconfiguration-ts
|
name: azure-appconfiguration-ts
|
||||||
description: Build applications using Azure App Configuration SDK for JavaScript (@azure/app-configuration). Use when working with configuration settings, feature flags, Key Vault references, dynamic refresh, or centralized configuration management.
|
description: Build applications using Azure App Configuration SDK for JavaScript (@azure/app-configuration). Use when working with configuration settings, feature flags, Key Vault references, dynamic refresh, or centralized configuration management.
|
||||||
package: @azure/app-configuration
|
package: "@azure/app-configuration"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure App Configuration SDK for TypeScript
|
# Azure App Configuration SDK for TypeScript
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: azure-cosmos-ts
|
name: azure-cosmos-ts
|
||||||
description: |
|
description: |
|
||||||
Azure Cosmos DB JavaScript/TypeScript SDK (@azure/cosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: "Cosmos DB", "@azure/cosmos", "CosmosClient", "document CRUD", "NoSQL queries", "bulk operations", "partition key", "container.items".
|
Azure Cosmos DB JavaScript/TypeScript SDK (@azure/cosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: "Cosmos DB", "@azure/cosmos", "CosmosClient", "document CRUD", "NoSQL queries", "bulk operations", "partition key", "container.items".
|
||||||
package: @azure/cosmos
|
package: "@azure/cosmos"
|
||||||
---
|
---
|
||||||
|
|
||||||
# @azure/cosmos (TypeScript/JavaScript)
|
# @azure/cosmos (TypeScript/JavaScript)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-eventhub-ts
|
name: azure-eventhub-ts
|
||||||
description: Build event streaming applications using Azure Event Hubs SDK for JavaScript (@azure/event-hubs). Use when implementing high-throughput event ingestion, real-time analytics, IoT telemetry, or event-driven architectures with partitioned consumers.
|
description: Build event streaming applications using Azure Event Hubs SDK for JavaScript (@azure/event-hubs). Use when implementing high-throughput event ingestion, real-time analytics, IoT telemetry, or event-driven architectures with partitioned consumers.
|
||||||
package: @azure/event-hubs
|
package: "@azure/event-hubs"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Event Hubs SDK for TypeScript
|
# Azure Event Hubs SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-identity-ts
|
name: azure-identity-ts
|
||||||
description: Authenticate to Azure services using Azure Identity SDK for JavaScript (@azure/identity). Use when configuring authentication with DefaultAzureCredential, managed identity, service principals, or interactive browser login.
|
description: Authenticate to Azure services using Azure Identity SDK for JavaScript (@azure/identity). Use when configuring authentication with DefaultAzureCredential, managed identity, service principals, or interactive browser login.
|
||||||
package: @azure/identity
|
package: "@azure/identity"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Identity SDK for TypeScript
|
# Azure Identity SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-keyvault-keys-ts
|
name: azure-keyvault-keys-ts
|
||||||
description: Manage cryptographic keys using Azure Key Vault Keys SDK for JavaScript (@azure/keyvault-keys). Use when creating, encrypting/decrypting, signing, or rotating keys.
|
description: Manage cryptographic keys using Azure Key Vault Keys SDK for JavaScript (@azure/keyvault-keys). Use when creating, encrypting/decrypting, signing, or rotating keys.
|
||||||
package: @azure/keyvault-keys
|
package: "@azure/keyvault-keys"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Key Vault Keys SDK for TypeScript
|
# Azure Key Vault Keys SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-keyvault-secrets-ts
|
name: azure-keyvault-secrets-ts
|
||||||
description: Manage secrets using Azure Key Vault Secrets SDK for JavaScript (@azure/keyvault-secrets). Use when storing and retrieving application secrets or configuration values.
|
description: Manage secrets using Azure Key Vault Secrets SDK for JavaScript (@azure/keyvault-secrets). Use when storing and retrieving application secrets or configuration values.
|
||||||
package: @azure/keyvault-secrets
|
package: "@azure/keyvault-secrets"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Key Vault Secrets SDK for TypeScript
|
# Azure Key Vault Secrets SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-monitor-opentelemetry-ts
|
name: azure-monitor-opentelemetry-ts
|
||||||
description: Instrument applications with Azure Monitor and OpenTelemetry for JavaScript (@azure/monitor-opentelemetry). Use when adding distributed tracing, metrics, and logs to Node.js applications with Application Insights.
|
description: Instrument applications with Azure Monitor and OpenTelemetry for JavaScript (@azure/monitor-opentelemetry). Use when adding distributed tracing, metrics, and logs to Node.js applications with Application Insights.
|
||||||
package: @azure/monitor-opentelemetry
|
package: "@azure/monitor-opentelemetry"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Monitor OpenTelemetry SDK for TypeScript
|
# Azure Monitor OpenTelemetry SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-search-documents-ts
|
name: azure-search-documents-ts
|
||||||
description: Build search applications using Azure AI Search SDK for JavaScript (@azure/search-documents). Use when creating/managing indexes, implementing vector/hybrid search, semantic ranking, or building agentic retrieval with knowledge bases.
|
description: Build search applications using Azure AI Search SDK for JavaScript (@azure/search-documents). Use when creating/managing indexes, implementing vector/hybrid search, semantic ranking, or building agentic retrieval with knowledge bases.
|
||||||
package: @azure/search-documents
|
package: "@azure/search-documents"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure AI Search SDK for TypeScript
|
# Azure AI Search SDK for TypeScript
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-servicebus-ts
|
name: azure-servicebus-ts
|
||||||
description: Build messaging applications using Azure Service Bus SDK for JavaScript (@azure/service-bus). Use when implementing queues, topics/subscriptions, message sessions, dead-letter handling, or enterprise messaging patterns.
|
description: Build messaging applications using Azure Service Bus SDK for JavaScript (@azure/service-bus). Use when implementing queues, topics/subscriptions, message sessions, dead-letter handling, or enterprise messaging patterns.
|
||||||
package: @azure/service-bus
|
package: "@azure/service-bus"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Service Bus SDK for TypeScript
|
# Azure Service Bus SDK for TypeScript
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: azure-storage-blob-ts
|
name: azure-storage-blob-ts
|
||||||
description: |
|
description: |
|
||||||
Azure Blob Storage JavaScript/TypeScript SDK (@azure/storage-blob) for blob operations. Use for uploading, downloading, listing, and managing blobs and containers. Supports block blobs, append blobs, page blobs, SAS tokens, and streaming. Triggers: "blob storage", "@azure/storage-blob", "BlobServiceClient", "ContainerClient", "upload blob", "download blob", "SAS token", "block blob".
|
Azure Blob Storage JavaScript/TypeScript SDK (@azure/storage-blob) for blob operations. Use for uploading, downloading, listing, and managing blobs and containers. Supports block blobs, append blobs, page blobs, SAS tokens, and streaming. Triggers: "blob storage", "@azure/storage-blob", "BlobServiceClient", "ContainerClient", "upload blob", "download blob", "SAS token", "block blob".
|
||||||
package: @azure/storage-blob
|
package: "@azure/storage-blob"
|
||||||
---
|
---
|
||||||
|
|
||||||
# @azure/storage-blob (TypeScript/JavaScript)
|
# @azure/storage-blob (TypeScript/JavaScript)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: azure-storage-file-share-ts
|
name: azure-storage-file-share-ts
|
||||||
description: |
|
description: |
|
||||||
Azure File Share JavaScript/TypeScript SDK (@azure/storage-file-share) for SMB file share operations. Use for creating shares, managing directories, uploading/downloading files, and handling file metadata. Supports Azure Files SMB protocol scenarios. Triggers: "file share", "@azure/storage-file-share", "ShareServiceClient", "ShareClient", "SMB", "Azure Files".
|
Azure File Share JavaScript/TypeScript SDK (@azure/storage-file-share) for SMB file share operations. Use for creating shares, managing directories, uploading/downloading files, and handling file metadata. Supports Azure Files SMB protocol scenarios. Triggers: "file share", "@azure/storage-file-share", "ShareServiceClient", "ShareClient", "SMB", "Azure Files".
|
||||||
package: @azure/storage-file-share
|
package: "@azure/storage-file-share"
|
||||||
---
|
---
|
||||||
|
|
||||||
# @azure/storage-file-share (TypeScript/JavaScript)
|
# @azure/storage-file-share (TypeScript/JavaScript)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: azure-storage-queue-ts
|
name: azure-storage-queue-ts
|
||||||
description: |
|
description: |
|
||||||
Azure Queue Storage JavaScript/TypeScript SDK (@azure/storage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues. Supports visibility timeout, message encoding, and batch operations. Triggers: "queue storage", "@azure/storage-queue", "QueueServiceClient", "QueueClient", "send message", "receive message", "dequeue", "visibility timeout".
|
Azure Queue Storage JavaScript/TypeScript SDK (@azure/storage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues. Supports visibility timeout, message encoding, and batch operations. Triggers: "queue storage", "@azure/storage-queue", "QueueServiceClient", "QueueClient", "send message", "receive message", "dequeue", "visibility timeout".
|
||||||
package: @azure/storage-queue
|
package: "@azure/storage-queue"
|
||||||
---
|
---
|
||||||
|
|
||||||
# @azure/storage-queue (TypeScript/JavaScript)
|
# @azure/storage-queue (TypeScript/JavaScript)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: azure-web-pubsub-ts
|
name: azure-web-pubsub-ts
|
||||||
description: Build real-time messaging applications using Azure Web PubSub SDKs for JavaScript (@azure/web-pubsub, @azure/web-pubsub-client). Use when implementing WebSocket-based real-time features, pub/sub messaging, group chat, or live notifications.
|
description: Build real-time messaging applications using Azure Web PubSub SDKs for JavaScript (@azure/web-pubsub, @azure/web-pubsub-client). Use when implementing WebSocket-based real-time features, pub/sub messaging, group chat, or live notifications.
|
||||||
package: @azure/web-pubsub, @azure/web-pubsub-client
|
package: "@azure/web-pubsub, @azure/web-pubsub-client"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Azure Web PubSub SDKs for TypeScript
|
# Azure Web PubSub SDKs for TypeScript
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
name: m365-agents-ts
|
name: m365-agents-ts
|
||||||
description: |
|
description: |
|
||||||
Microsoft 365 Agents SDK for TypeScript/Node.js. Build multichannel agents for Teams/M365/Copilot Studio with AgentApplication routing, Express hosting, streaming responses, and Copilot Studio client integration. Triggers: "Microsoft 365 Agents SDK", "@microsoft/agents-hosting", "AgentApplication", "startServer", "streamingResponse", "Copilot Studio client", "@microsoft/agents-copilotstudio-client".
|
Microsoft 365 Agents SDK for TypeScript/Node.js. Build multichannel agents for Teams/M365/Copilot Studio with AgentApplication routing, Express hosting, streaming responses, and Copilot Studio client integration. Triggers: "Microsoft 365 Agents SDK", "@microsoft/agents-hosting", "AgentApplication", "startServer", "streamingResponse", "Copilot Studio client", "@microsoft/agents-copilotstudio-client".
|
||||||
package: @microsoft/agents-hosting, @microsoft/agents-hosting-express, @microsoft/agents-activity, @microsoft/agents-copilotstudio-client
|
package: "@microsoft/agents-hosting, @microsoft/agents-hosting-express, @microsoft/agents-activity, @microsoft/agents-copilotstudio-client"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Microsoft 365 Agents SDK (TypeScript)
|
# Microsoft 365 Agents SDK (TypeScript)
|
||||||
|
|||||||
Reference in New Issue
Block a user