create-vue-component — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited create-vue-component (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Read @.ai/Component/Javascript/CONTEXT.md for the Vue integration overview.
This is NOT the default pattern. Most admin pages use initComponents() with standard PS components. Only use Vue when a page section requires complex interactivity that standard form types and JS components cannot provide.When NOT to use Vue: simple forms, standard CRUD, toggle switches, translatable fields — all handled by initComponents.
Vue components are mounted on one section of a Symfony page, not the entire page. The rest of the page remains standard Symfony/Twig + PS components.
admin-dev/themes/new-theme/js/pages/{domain}/components/{ComponentName}.vueStandard Vue 3 SFC with <script setup>, <template>, <style>. Use Composition API.
// admin-dev/themes/new-theme/js/pages/{domain}/components/init{ComponentName}.ts
import {createApp} from 'vue';
import {createI18n} from 'vue-i18n';
import ComponentName from './ComponentName.vue';
export default function initComponentName(
selector: string,
eventEmitter: typeof EventEmitter,
initialData: SomeType,
): void {
const container = document.querySelector(selector);
if (!container) return;
const translations = JSON.parse(container.dataset.translations || '{}');
const i18n = createI18n({locale: 'en', messages: {en: translations}});
const app = createApp(ComponentName, {
eventEmitter,
initialData,
});
app.use(i18n);
app.mount(selector);
}// In form/index.ts or edit/index.ts
import initComponentName from './components/initComponentName';
$(() => {
// Standard components first
window.prestashop.component.initComponents(['TranslatableInput']);
// Vue section
const eventEmitter = window.prestashop.instance.eventEmitter;
initComponentName('#vue-mount-point', eventEmitter, initialData);
});The Twig template provides the mount point with initial data as data-* attributes:
<div id="vue-mount-point"
data-translations="{{ translations|json_encode }}"
data-initial="{{ initialData|json_encode }}">
</div>A dedicated FormType can bridge PHP form data to the Vue component via hidden fields and data-* attributes.
Reference: admin-dev/themes/new-theme/js/pages/product/combination/ — combination listing with filters, generator modal, bulk actions
EventEmitter for events between Vue and non-Vue sectionseventEmitter as a propConventions (Composition API required, vue-i18n setup, hidden form field sync, EventEmitter as prop) are in Javascript/CONTEXT.md. Skill-specific reminders:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.