mirror of
https://github.com/twentyhq/twenty.git
synced 2026-06-11 17:37:18 -04:00
@martmull v2.0 ;) --------- Co-authored-by: martmull <martmull@hotmail.fr> Co-authored-by: bosiraphael <raphael.bosi@gmail.com>
100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
|
|
const { PLUGIN_ROOT, readText } = require('./lib');
|
|
|
|
const REQUIRED_REFERENCES = [
|
|
'references/design/front-component-ui.md',
|
|
'references/develop-app/app-structure.md',
|
|
'references/develop-app/data-model.md',
|
|
'references/develop-app/front-components.md',
|
|
'references/develop-app/logic.md',
|
|
'references/develop-app/layout.md',
|
|
'references/develop-app/standalone-pages.md',
|
|
'references/develop-app/tests.md',
|
|
'references/develop-app/workflows.md',
|
|
'references/manage-app/cli-and-sync.md',
|
|
'references/publish-app/prepare-for-app-store.md',
|
|
'references/concepts/how-apps-work.md',
|
|
'references/use-twenty-mcp/setup.md',
|
|
'references/use-twenty-mcp/result-formatting.md',
|
|
];
|
|
|
|
const assertReferences = (fail) => {
|
|
for (const relativePath of REQUIRED_REFERENCES) {
|
|
const absolutePath = path.join(PLUGIN_ROOT, relativePath);
|
|
|
|
if (!fs.existsSync(absolutePath)) {
|
|
fail(`required reference is missing: ${relativePath}`);
|
|
}
|
|
}
|
|
};
|
|
|
|
const assertHowAppsWork = (fail) => {
|
|
const howAppsWorkPath = path.join(PLUGIN_ROOT, 'references/concepts/how-apps-work.md');
|
|
|
|
if (!fs.existsSync(howAppsWorkPath)) {
|
|
fail('required reference is missing: references/concepts/how-apps-work.md');
|
|
return;
|
|
}
|
|
|
|
const howAppsWork = readText(howAppsWorkPath);
|
|
|
|
const requiredFragments = [
|
|
'# How Twenty Apps Work',
|
|
'## What Is A Twenty App',
|
|
'standalone npm package',
|
|
'## SDK Packages',
|
|
'twenty-sdk',
|
|
'twenty-client-sdk',
|
|
'## Twenty Instances And Remotes',
|
|
'## Local Development Environment',
|
|
'## App Lifecycle',
|
|
'create-twenty-app',
|
|
'## Front Component Rendering',
|
|
'Remote DOM',
|
|
'## App File Structure',
|
|
'application-config.ts',
|
|
'## Sharing An App',
|
|
'## Key Concepts',
|
|
'Universal identifiers',
|
|
];
|
|
|
|
for (const fragment of requiredFragments) {
|
|
if (!howAppsWork.includes(fragment)) {
|
|
fail(`how-apps-work.md is missing foundational guidance: ${fragment}`);
|
|
}
|
|
}
|
|
|
|
// use-twenty-mcp is intentionally excluded: it covers consuming the Twenty MCP
|
|
// server to retrieve and present workspace records, not building apps, so the
|
|
// app-foundations doc (how-apps-work.md) is not a relevant prerequisite for it.
|
|
const skillsToCheck = [
|
|
'skills/create-app/SKILL.md',
|
|
'skills/develop-app/SKILL.md',
|
|
'skills/manage-app/SKILL.md',
|
|
'skills/publish-app/SKILL.md',
|
|
];
|
|
|
|
for (const skillRelPath of skillsToCheck) {
|
|
const skillPath = path.join(PLUGIN_ROOT, skillRelPath);
|
|
|
|
if (!fs.existsSync(skillPath)) {
|
|
fail(`required skill is missing: ${skillRelPath}`);
|
|
continue;
|
|
}
|
|
|
|
const skill = readText(skillPath);
|
|
|
|
if (!skill.includes('references/concepts/how-apps-work.md')) {
|
|
fail(`${skillRelPath} must reference how-apps-work.md`);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
REQUIRED_REFERENCES,
|
|
assertReferences,
|
|
assertHowAppsWork,
|
|
};
|