📦 deps(thirdparty): update snapshots
This commit is contained in:
+50
@@ -83,6 +83,17 @@ function createTarGzip(entries) {
|
||||
return zlib.gzipSync(Buffer.concat(blocks));
|
||||
}
|
||||
|
||||
function createPaxRecord(key, value) {
|
||||
let record = ` ${key}=${value}\n`;
|
||||
let length = Buffer.byteLength(record);
|
||||
while (true) {
|
||||
const next = `${length}${record}`;
|
||||
const nextLength = Buffer.byteLength(next);
|
||||
if (nextLength === length) return next;
|
||||
length = nextLength;
|
||||
}
|
||||
}
|
||||
|
||||
async function loadRefreshHandler() {
|
||||
const { default: refreshSkillsPlugin } = await import('../../refresh-skills-plugin.js');
|
||||
const registrations = [];
|
||||
@@ -382,4 +393,43 @@ describe('refresh-skills plugin security', () => {
|
||||
fs.rmSync(tempDir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
it('prefers PAX tar paths over GNU long names before validation', async () => {
|
||||
const {
|
||||
assertSafeArchiveEntries,
|
||||
readTarGzipEntries,
|
||||
} = await import('../../refresh-skills-plugin.js');
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'archive-pax-test-'));
|
||||
const archivePath = path.join(tempDir, 'pax.tar.gz');
|
||||
|
||||
try {
|
||||
fs.writeFileSync(
|
||||
archivePath,
|
||||
createTarGzip([
|
||||
{
|
||||
name: 'pax-header',
|
||||
type: 'x',
|
||||
data: createPaxRecord('path', '../outside'),
|
||||
},
|
||||
{
|
||||
name: '././@LongLink',
|
||||
type: 'L',
|
||||
data: 'antigravity-awesome-skills-main/skills/demo/SKILL.md\0',
|
||||
},
|
||||
{
|
||||
name: 'antigravity-awesome-skills-main/skills/demo/SKILL.md',
|
||||
data: 'demo',
|
||||
},
|
||||
]),
|
||||
);
|
||||
const entries = readTarGzipEntries(archivePath);
|
||||
|
||||
expect(entries[0].name).toBe('../outside');
|
||||
expect(() => assertSafeArchiveEntries(entries, { rejectLinks: true })).toThrow(
|
||||
'Unsafe archive entry path',
|
||||
);
|
||||
} finally {
|
||||
fs.rmSync(tempDir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -128,6 +128,6 @@ export const specializedPlugins: SpecializedPlugin[] = [
|
||||
priority: 'tier-2',
|
||||
audience: 'Mobile teams shipping Expo, React Native, Flutter, and iOS apps.',
|
||||
why: 'Covers architecture, Expo routes, distribution, CI, native platforms, and store optimization.',
|
||||
skills: ['expo-api-routes', 'expo-dev-client', 'expo-deployment', 'expo-cicd-workflows', 'react-native-patterns', 'mobile-design', 'flutter-expert', 'ios-developer', 'app-store-optimization'],
|
||||
skills: ['mobile-developer', 'react-native-architecture', 'expo-api-routes', 'expo-dev-client', 'expo-deployment', 'expo-cicd-workflows', 'mobile-design', 'flutter-expert', 'ios-developer', 'app-store-optimization'],
|
||||
},
|
||||
];
|
||||
|
||||
@@ -13,6 +13,10 @@ function pluginDocUrl(): string {
|
||||
return `${repoBaseUrl}/blob/main/docs/users/plugins.md`;
|
||||
}
|
||||
|
||||
function bundleDocUrl(): string {
|
||||
return `${repoBaseUrl}/blob/main/docs/users/bundles.md`;
|
||||
}
|
||||
|
||||
export function Plugins(): React.ReactElement {
|
||||
usePageMeta(buildPluginsMeta(specializedPlugins.length));
|
||||
|
||||
@@ -32,7 +36,7 @@ export function Plugins(): React.ReactElement {
|
||||
Choose the focused AAS plugin for your AI coding workflow
|
||||
</h1>
|
||||
<p className="mt-4 max-w-4xl text-sm leading-relaxed text-slate-600 sm:text-base dark:text-slate-300">
|
||||
AAS specialized plugins are focused, domain-specific distributions of the 1,520+ skill library.
|
||||
AAS specialized plugins are focused, domain-specific distributions of the 1,525+ skill library.
|
||||
Start here when you know the job: web apps, security, data analytics, documents, DevOps, QA,
|
||||
OSS maintenance, mobile apps, automation, or agent and MCP systems.
|
||||
</p>
|
||||
@@ -148,7 +152,7 @@ function PluginSection({
|
||||
View plugin folder
|
||||
</a>
|
||||
<a
|
||||
href={`${repoBaseUrl}/blob/main/docs/users/bundles.md#${plugin.id}`}
|
||||
href={bundleDocUrl()}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="inline-flex items-center justify-center rounded-lg border border-slate-300 px-3 py-2 text-sm font-semibold text-slate-800 transition-colors hover:bg-slate-100 dark:border-slate-700 dark:text-slate-200 dark:hover:bg-slate-800"
|
||||
|
||||
@@ -10,7 +10,7 @@ const FAQ_ITEMS = [
|
||||
{
|
||||
question: 'What is Antigravity Awesome Skills?',
|
||||
answer:
|
||||
'Antigravity Awesome Skills is an installable GitHub library of 1,520+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
|
||||
'Antigravity Awesome Skills is an installable GitHub library of 1,525+ reusable SKILL.md playbooks for AI coding assistants. It supports Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and related hosts through direct skill installs, specialized plugins, bundles, workflows, and a searchable catalog.',
|
||||
},
|
||||
{
|
||||
question: 'How do I install Antigravity Awesome Skills?',
|
||||
|
||||
Reference in New Issue
Block a user