@wix/web50-cli 0.1.0 → 0.1.1
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/dist/cjs/auth/deviceFlow.js +99 -13
- package/dist/cjs/auth/deviceFlow.js.map +1 -1
- package/dist/cjs/auth/index.js +65 -12
- package/dist/cjs/auth/index.js.map +1 -1
- package/dist/cjs/auth/secretStore.js.map +1 -1
- package/dist/cjs/cli.js +29 -1
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/commands/bundle.js +95 -0
- package/dist/cjs/commands/bundle.js.map +1 -0
- package/dist/cjs/commands/conversation.js +50 -0
- package/dist/cjs/commands/conversation.js.map +1 -0
- package/dist/cjs/commands/conversationWizard.js +526 -0
- package/dist/cjs/commands/conversationWizard.js.map +1 -0
- package/dist/cjs/commands/deploy.js +192 -0
- package/dist/cjs/commands/deploy.js.map +1 -0
- package/dist/cjs/commands/embed.js +118 -0
- package/dist/cjs/commands/embed.js.map +1 -0
- package/dist/cjs/commands/getClientId.js +60 -0
- package/dist/cjs/commands/getClientId.js.map +1 -0
- package/dist/cjs/commands/init.js +31 -26
- package/dist/cjs/commands/init.js.map +1 -1
- package/dist/cjs/commands/instructions.js +360 -0
- package/dist/cjs/commands/instructions.js.map +1 -0
- package/dist/cjs/commands/login.js +59 -4
- package/dist/cjs/commands/login.js.map +1 -1
- package/dist/cjs/commands/logout.js +16 -0
- package/dist/cjs/commands/logout.js.map +1 -0
- package/dist/cjs/commands/serve.js +122 -0
- package/dist/cjs/commands/serve.js.map +1 -0
- package/dist/cjs/commands/storybook.js +102 -0
- package/dist/cjs/commands/storybook.js.map +1 -0
- package/dist/cjs/commands/validate.js +266 -18
- package/dist/cjs/commands/validate.js.map +1 -1
- package/dist/cjs/commands/whoami.js +48 -0
- package/dist/cjs/commands/whoami.js.map +1 -0
- package/dist/cjs/utils/print.js +12 -0
- package/dist/cjs/utils/print.js.map +1 -1
- package/dist/cjs/utils/project.js +11 -0
- package/dist/cjs/utils/project.js.map +1 -1
- package/dist/cjs/utils/wixApi.js +55 -0
- package/dist/cjs/utils/wixApi.js.map +1 -0
- package/dist/esm/auth/deviceFlow.js +106 -13
- package/dist/esm/auth/deviceFlow.js.map +1 -1
- package/dist/esm/auth/index.js +71 -13
- package/dist/esm/auth/index.js.map +1 -1
- package/dist/esm/auth/secretStore.js.map +1 -1
- package/dist/esm/cli.js +29 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/commands/bundle.js +92 -0
- package/dist/esm/commands/bundle.js.map +1 -0
- package/dist/esm/commands/conversation.js +44 -0
- package/dist/esm/commands/conversation.js.map +1 -0
- package/dist/esm/commands/conversationWizard.js +527 -0
- package/dist/esm/commands/conversationWizard.js.map +1 -0
- package/dist/esm/commands/deploy.js +194 -0
- package/dist/esm/commands/deploy.js.map +1 -0
- package/dist/esm/commands/embed.js +112 -0
- package/dist/esm/commands/embed.js.map +1 -0
- package/dist/esm/commands/getClientId.js +56 -0
- package/dist/esm/commands/getClientId.js.map +1 -0
- package/dist/esm/commands/init.js +32 -27
- package/dist/esm/commands/init.js.map +1 -1
- package/dist/esm/commands/instructions.js +360 -0
- package/dist/esm/commands/instructions.js.map +1 -0
- package/dist/esm/commands/login.js +62 -6
- package/dist/esm/commands/login.js.map +1 -1
- package/dist/esm/commands/logout.js +12 -0
- package/dist/esm/commands/logout.js.map +1 -0
- package/dist/esm/commands/serve.js +117 -0
- package/dist/esm/commands/serve.js.map +1 -0
- package/dist/esm/commands/storybook.js +97 -0
- package/dist/esm/commands/storybook.js.map +1 -0
- package/dist/esm/commands/validate.js +269 -19
- package/dist/esm/commands/validate.js.map +1 -1
- package/dist/esm/commands/whoami.js +44 -0
- package/dist/esm/commands/whoami.js.map +1 -0
- package/dist/esm/utils/print.js +10 -0
- package/dist/esm/utils/print.js.map +1 -1
- package/dist/esm/utils/project.js +8 -0
- package/dist/esm/utils/project.js.map +1 -1
- package/dist/esm/utils/wixApi.js +51 -0
- package/dist/esm/utils/wixApi.js.map +1 -0
- package/dist/types/auth/deviceFlow.d.ts +3 -1
- package/dist/types/auth/deviceFlow.d.ts.map +1 -1
- package/dist/types/auth/index.d.ts +5 -1
- package/dist/types/auth/index.d.ts.map +1 -1
- package/dist/types/auth/secretStore.d.ts +2 -0
- package/dist/types/auth/secretStore.d.ts.map +1 -1
- package/dist/types/commands/bundle.d.ts +10 -0
- package/dist/types/commands/bundle.d.ts.map +1 -0
- package/dist/types/commands/conversation.d.ts +3 -0
- package/dist/types/commands/conversation.d.ts.map +1 -0
- package/dist/types/commands/conversationWizard.d.ts +3 -0
- package/dist/types/commands/conversationWizard.d.ts.map +1 -0
- package/dist/types/commands/deploy.d.ts +3 -0
- package/dist/types/commands/deploy.d.ts.map +1 -0
- package/dist/types/commands/embed.d.ts +3 -0
- package/dist/types/commands/embed.d.ts.map +1 -0
- package/dist/types/commands/getClientId.d.ts +3 -0
- package/dist/types/commands/getClientId.d.ts.map +1 -0
- package/dist/types/commands/init.d.ts.map +1 -1
- package/dist/types/commands/instructions.d.ts +3 -0
- package/dist/types/commands/instructions.d.ts.map +1 -0
- package/dist/types/commands/login.d.ts.map +1 -1
- package/dist/types/commands/logout.d.ts +3 -0
- package/dist/types/commands/logout.d.ts.map +1 -0
- package/dist/types/commands/serve.d.ts +3 -0
- package/dist/types/commands/serve.d.ts.map +1 -0
- package/dist/types/commands/storybook.d.ts +3 -0
- package/dist/types/commands/storybook.d.ts.map +1 -0
- package/dist/types/commands/validate.d.ts +5 -0
- package/dist/types/commands/validate.d.ts.map +1 -1
- package/dist/types/commands/whoami.d.ts +3 -0
- package/dist/types/commands/whoami.d.ts.map +1 -0
- package/dist/types/utils/print.d.ts +3 -0
- package/dist/types/utils/print.d.ts.map +1 -1
- package/dist/types/utils/project.d.ts +10 -0
- package/dist/types/utils/project.d.ts.map +1 -1
- package/dist/types/utils/wixApi.d.ts +9 -0
- package/dist/types/utils/wixApi.d.ts.map +1 -0
- package/package.json +5 -5
- package/defaults/package.json +0 -42
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
exports.__esModule = true;
|
|
5
|
+
exports.runValidation = runValidation;
|
|
5
6
|
exports.validateCommand = void 0;
|
|
6
7
|
var _commander = require("commander");
|
|
7
8
|
var _2 = _interopRequireDefault(require("ajv/dist/2020"));
|
|
@@ -668,27 +669,21 @@ function buildActionsDomain(root) {
|
|
|
668
669
|
};
|
|
669
670
|
}
|
|
670
671
|
|
|
671
|
-
// ──
|
|
672
|
+
// ── Rendering ─────────────────────────────────────────────────────────────────
|
|
672
673
|
|
|
673
|
-
|
|
674
|
-
const
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
process.exit(1);
|
|
678
|
-
}
|
|
679
|
-
(0, _print.info)(`Project root: ${root}`);
|
|
680
|
-
console.log('');
|
|
681
|
-
const domains = [buildAiInstructionsDomain(root), buildCmsSchemaDomain(root), buildActionsDomain(root)];
|
|
682
|
-
let hasErrors = false;
|
|
683
|
-
for (const domain of domains) {
|
|
674
|
+
function printDomain(domain, results, verbose) {
|
|
675
|
+
const failed = results.filter(r => !r.result.ok);
|
|
676
|
+
const domainOk = failed.length === 0;
|
|
677
|
+
if (verbose) {
|
|
684
678
|
console.log(domain.name);
|
|
685
|
-
for (const
|
|
686
|
-
|
|
679
|
+
for (const {
|
|
680
|
+
label,
|
|
681
|
+
result
|
|
682
|
+
} of results) {
|
|
687
683
|
if (result.ok) {
|
|
688
|
-
console.log(_chalk.default.green(` \u2714 ${
|
|
684
|
+
console.log(_chalk.default.green(` \u2714 ${label}`));
|
|
689
685
|
} else {
|
|
690
|
-
|
|
691
|
-
process.stderr.write(_chalk.default.red(` \u2716 ${check.label}\n`));
|
|
686
|
+
process.stderr.write(_chalk.default.red(` \u2716 ${label}\n`));
|
|
692
687
|
for (const e_ of result.errors) {
|
|
693
688
|
process.stderr.write(` ${e_.message}\n`);
|
|
694
689
|
if (e_.fix) {
|
|
@@ -698,9 +693,262 @@ const validateCommand = exports.validateCommand = new _commander.Command('valida
|
|
|
698
693
|
}
|
|
699
694
|
}
|
|
700
695
|
console.log('');
|
|
696
|
+
return domainOk;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Slim mode
|
|
700
|
+
if (domainOk) {
|
|
701
|
+
console.log(_chalk.default.green(`\u2714 ${domain.name} — valid`));
|
|
702
|
+
return true;
|
|
703
|
+
}
|
|
704
|
+
console.log(domain.name);
|
|
705
|
+
for (const {
|
|
706
|
+
label,
|
|
707
|
+
result
|
|
708
|
+
} of failed) {
|
|
709
|
+
process.stderr.write(_chalk.default.red(` \u2716 ${label}\n`));
|
|
710
|
+
for (const e_ of result.errors) {
|
|
711
|
+
process.stderr.write(` ${e_.message}\n`);
|
|
712
|
+
if (e_.fix) {
|
|
713
|
+
process.stderr.write(` Fix: ${e_.fix}\n`);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
console.log('');
|
|
718
|
+
return false;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// ── JSON output ───────────────────────────────────────────────────────────────
|
|
722
|
+
|
|
723
|
+
function collectDomainJson(domain, results) {
|
|
724
|
+
return {
|
|
725
|
+
name: domain.name,
|
|
726
|
+
ok: results.every(r => r.result.ok),
|
|
727
|
+
checks: results.map(({
|
|
728
|
+
label,
|
|
729
|
+
result
|
|
730
|
+
}) => ({
|
|
731
|
+
label,
|
|
732
|
+
ok: result.ok,
|
|
733
|
+
errors: result.errors
|
|
734
|
+
}))
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
// ── Build scripts domain ──────────────────────────────────────────────────────
|
|
739
|
+
|
|
740
|
+
function buildScriptsDomain(root) {
|
|
741
|
+
const pkgPath = path.join(root, 'package.json');
|
|
742
|
+
let pkg = {};
|
|
743
|
+
let fileExists = false;
|
|
744
|
+
return {
|
|
745
|
+
name: 'Build Scripts',
|
|
746
|
+
checks: [{
|
|
747
|
+
label: 'package.json — file exists',
|
|
748
|
+
run() {
|
|
749
|
+
fileExists = (0, _fs.existsSync)(pkgPath);
|
|
750
|
+
if (!fileExists) {
|
|
751
|
+
return {
|
|
752
|
+
ok: false,
|
|
753
|
+
errors: [{
|
|
754
|
+
message: `File not found: ${pkgPath}`,
|
|
755
|
+
fix: `Create a 'package.json' at the root of your project.`
|
|
756
|
+
}]
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
try {
|
|
760
|
+
pkg = JSON.parse((0, _fs.readFileSync)(pkgPath, 'utf8'));
|
|
761
|
+
} catch (e) {
|
|
762
|
+
fileExists = false;
|
|
763
|
+
return {
|
|
764
|
+
ok: false,
|
|
765
|
+
errors: [{
|
|
766
|
+
message: `Failed to parse package.json: ${e instanceof Error ? e.message : String(e)}`,
|
|
767
|
+
fix: `Fix the JSON syntax in your package.json.`
|
|
768
|
+
}]
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
return {
|
|
772
|
+
ok: true,
|
|
773
|
+
errors: []
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
}, {
|
|
777
|
+
label: 'package.json — bundle script defined',
|
|
778
|
+
run() {
|
|
779
|
+
var _pkg$scripts;
|
|
780
|
+
if (!fileExists) {
|
|
781
|
+
return {
|
|
782
|
+
ok: false,
|
|
783
|
+
errors: [{
|
|
784
|
+
message: 'skipped — package.json not readable'
|
|
785
|
+
}]
|
|
786
|
+
};
|
|
787
|
+
}
|
|
788
|
+
if (typeof ((_pkg$scripts = pkg.scripts) == null ? void 0 : _pkg$scripts.bundle) === 'string' && pkg.scripts.bundle.length > 0) {
|
|
789
|
+
return {
|
|
790
|
+
ok: true,
|
|
791
|
+
errors: []
|
|
792
|
+
};
|
|
793
|
+
}
|
|
794
|
+
return {
|
|
795
|
+
ok: false,
|
|
796
|
+
errors: [{
|
|
797
|
+
message: `Missing 'bundle' script in package.json`,
|
|
798
|
+
fix: `Add a 'bundle' script to your package.json scripts, e.g.:\n "bundle": "vite build --config src/vite.cdn.config.ts"`
|
|
799
|
+
}]
|
|
800
|
+
};
|
|
801
|
+
}
|
|
802
|
+
}, {
|
|
803
|
+
label: 'package.json — build script defined',
|
|
804
|
+
run() {
|
|
805
|
+
var _pkg$scripts2;
|
|
806
|
+
if (!fileExists) {
|
|
807
|
+
return {
|
|
808
|
+
ok: false,
|
|
809
|
+
errors: [{
|
|
810
|
+
message: 'skipped — package.json not readable'
|
|
811
|
+
}]
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
if (typeof ((_pkg$scripts2 = pkg.scripts) == null ? void 0 : _pkg$scripts2.build) === 'string' && pkg.scripts.build.length > 0) {
|
|
815
|
+
return {
|
|
816
|
+
ok: true,
|
|
817
|
+
errors: []
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
return {
|
|
821
|
+
ok: false,
|
|
822
|
+
errors: [{
|
|
823
|
+
message: `Missing 'build' script in package.json`,
|
|
824
|
+
fix: `Add a 'build' script to your package.json scripts, e.g.:\n "build": "tsc"`
|
|
825
|
+
}]
|
|
826
|
+
};
|
|
827
|
+
}
|
|
828
|
+
}]
|
|
829
|
+
};
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// ── Domain selection ──────────────────────────────────────────────────────────
|
|
833
|
+
|
|
834
|
+
function selectDomains(root, filter) {
|
|
835
|
+
const all = [buildAiInstructionsDomain(root), buildCmsSchemaDomain(root), buildActionsDomain(root), buildScriptsDomain(root)];
|
|
836
|
+
if (!filter) return all;
|
|
837
|
+
const map = {
|
|
838
|
+
ai: 'AI Instructions',
|
|
839
|
+
cms: 'CMS Schema',
|
|
840
|
+
scripts: 'Build Scripts',
|
|
841
|
+
actions: 'Actions'
|
|
842
|
+
};
|
|
843
|
+
return all.filter(d => d.name === map[filter]);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
// ── Core runner ───────────────────────────────────────────────────────────────
|
|
847
|
+
|
|
848
|
+
function runDomains(domains, verbose, format) {
|
|
849
|
+
let hasErrors = false;
|
|
850
|
+
const jsonResults = [];
|
|
851
|
+
for (const domain of domains) {
|
|
852
|
+
const results = domain.checks.map(check => ({
|
|
853
|
+
label: check.label,
|
|
854
|
+
result: check.run()
|
|
855
|
+
}));
|
|
856
|
+
let domainOk;
|
|
857
|
+
if (format === 'json') {
|
|
858
|
+
const jr = collectDomainJson(domain, results);
|
|
859
|
+
jsonResults.push(jr);
|
|
860
|
+
domainOk = jr.ok;
|
|
861
|
+
} else {
|
|
862
|
+
domainOk = printDomain(domain, results, verbose);
|
|
863
|
+
}
|
|
864
|
+
if (!domainOk) hasErrors = true;
|
|
865
|
+
}
|
|
866
|
+
return {
|
|
867
|
+
ok: !hasErrors,
|
|
868
|
+
jsonResults
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// ── Programmatic API ─────────────────────────────────────────────────────────
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* Runs all validation domains against the given project root.
|
|
876
|
+
* Prints results in slim mode and returns true if everything passes.
|
|
877
|
+
*/
|
|
878
|
+
function runValidation(root) {
|
|
879
|
+
const domains = selectDomains(root);
|
|
880
|
+
const {
|
|
881
|
+
ok
|
|
882
|
+
} = runDomains(domains, false, 'text');
|
|
883
|
+
return ok;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
// ── Watch mode ────────────────────────────────────────────────────────────────
|
|
887
|
+
|
|
888
|
+
function startWatch(root, run) {
|
|
889
|
+
const watchDirs = [path.join(root, 'src', 'configuration'), path.join(root, 'src', 'actions')].filter(d => (0, _fs.existsSync)(d));
|
|
890
|
+
if (watchDirs.length === 0) {
|
|
891
|
+
(0, _print.error)('No directories to watch found.');
|
|
892
|
+
return;
|
|
893
|
+
}
|
|
894
|
+
let debounce = null;
|
|
895
|
+
const trigger = () => {
|
|
896
|
+
if (debounce) clearTimeout(debounce);
|
|
897
|
+
debounce = setTimeout(() => {
|
|
898
|
+
console.clear();
|
|
899
|
+
(0, _print.info)(`[${new Date().toLocaleTimeString()}] Re-validating...`);
|
|
900
|
+
console.log('');
|
|
901
|
+
run();
|
|
902
|
+
}, 200);
|
|
903
|
+
};
|
|
904
|
+
for (const dir of watchDirs) {
|
|
905
|
+
(0, _fs.watch)(dir, {
|
|
906
|
+
recursive: true
|
|
907
|
+
}, trigger);
|
|
701
908
|
}
|
|
702
|
-
|
|
909
|
+
(0, _print.info)(`Watching for changes in ${watchDirs.map(d => path.relative(root, d)).join(', ')}...`);
|
|
910
|
+
(0, _print.info)('Press Ctrl+C to stop.');
|
|
911
|
+
console.log('');
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
// ── Command ───────────────────────────────────────────────────────────────────
|
|
915
|
+
|
|
916
|
+
const validateCommand = exports.validateCommand = new _commander.Command('validate').description('Validate project config files against their schemas').option('--verbose', 'Show all checks, including passing ones').option('--domain <domain>', 'Only validate one domain: ai, cms, actions, or scripts').option('--format <format>', 'Output format: text (default) or json', 'text').option('--watch', 'Re-validate on file changes (TTY only)').option('--strict', 'Exit with error even on warnings').option('--project <path>', 'Explicit project root (overrides cwd auto-detection)').action(opts => {
|
|
917
|
+
const verbose = Boolean(opts.verbose);
|
|
918
|
+
const format = opts.format ?? 'text';
|
|
919
|
+
const domainFilter = opts.domain;
|
|
920
|
+
const root = opts.project ? path.resolve(opts.project) : findProjectRoot(process.cwd());
|
|
921
|
+
if (!root) {
|
|
922
|
+
(0, _print.error)('No web5.config.json found — run this command from inside a Web5 project');
|
|
703
923
|
process.exit(1);
|
|
704
924
|
}
|
|
925
|
+
if (format === 'text') {
|
|
926
|
+
(0, _print.info)(`Project root: ${root}`);
|
|
927
|
+
console.log('');
|
|
928
|
+
}
|
|
929
|
+
const run = () => {
|
|
930
|
+
const domains = selectDomains(root, domainFilter);
|
|
931
|
+
const {
|
|
932
|
+
ok,
|
|
933
|
+
jsonResults
|
|
934
|
+
} = runDomains(domains, verbose, format);
|
|
935
|
+
if (format === 'json') {
|
|
936
|
+
console.log(JSON.stringify({
|
|
937
|
+
ok,
|
|
938
|
+
domains: jsonResults
|
|
939
|
+
}, null, 2));
|
|
940
|
+
}
|
|
941
|
+
if (!ok && !opts.watch) {
|
|
942
|
+
process.exit(1);
|
|
943
|
+
}
|
|
944
|
+
};
|
|
945
|
+
run();
|
|
946
|
+
if (opts.watch) {
|
|
947
|
+
if (!process.stdout.isTTY) {
|
|
948
|
+
(0, _print.error)('--watch requires a TTY (interactive terminal).');
|
|
949
|
+
process.exit(1);
|
|
950
|
+
}
|
|
951
|
+
startWatch(root, run);
|
|
952
|
+
}
|
|
705
953
|
});
|
|
706
954
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_commander","require","_2","_interopRequireDefault","_jsYaml","_fs","path","_interopRequireWildcard","_chalk","_print","_cmsSchemaSchema","_aiInstructionsSchema","_actionYamlSchema","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SCHEMAS","yamlLoad","cmsSchemaSchemaTemplate","aiInstructionsSchemaTemplate","actionYamlSchemaTemplate","findProjectRoot","startDir","current","parent","dirname","existsSync","join","tryParseYaml","filePath","data","readFileSync","err","Error","message","String","readText","kebabToCamel","s","replace","_","c","toUpperCase","camelToSnake","toLowerCase","formatAjvError","hints","loc","instancePath","keyword","missing","params","missingProperty","hint","fix","expected","type","field","min","limit","extra","additionalProperty","AI_INSTRUCTIONS_HINTS","rules","instructions","semantics","tone","ACTION_YAML_HINTS","name","buildAiInstructionsDomain","root","fileName","ajv","Ajv","allErrors","strict","schema","parsed","fileExists","yamlOk","checks","label","run","ok","errors","result","undefined","validate","compile","map","buildCmsSchemaDomain","buildActionsDomain","actionsDir","registryPath","indexPath","yamlFiles","readdirSync","filter","endsWith","length","actionSchema","yamlFile","yamlPath","yamlData","schemaOk","actionName","basename","extname","push","getNames","camel","handler","snake","handlerFile","handlerPath","content","includes","declaredParams","Set","p","param","match","usedParams","split","trim","startsWith","undeclared","validateCommand","exports","Command","description","action","process","cwd","error","exit","info","console","log","domains","hasErrors","domain","check","chalk","green","stderr","write","red","e_"],"sources":["../../../src/commands/validate.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Ajv from 'ajv/dist/2020';\nimport type { ErrorObject } from 'ajv';\nimport { load as yamlLoad } from 'js-yaml';\nimport { readFileSync, existsSync, readdirSync } from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { error, info } from '../utils/print';\nimport { cmsSchemaSchemaTemplate } from '../templates/cmsSchemaSchema';\nimport { aiInstructionsSchemaTemplate } from '../templates/aiInstructionsSchema';\nimport { actionYamlSchemaTemplate } from '../templates/actionYamlSchema';\n\n// ── Bundled schemas (never exposed to user's project) ────────────────────────\n\nconst SCHEMAS: Record<string, object> = {\n 'cms-schema.yaml': yamlLoad(cmsSchemaSchemaTemplate()) as object,\n 'prompt-instructions.yaml': yamlLoad(\n aiInstructionsSchemaTemplate(),\n ) as object,\n 'action.yaml': yamlLoad(actionYamlSchemaTemplate()) as object,\n};\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface CheckError {\n message: string;\n fix?: string;\n}\n\ninterface CheckResult {\n ok: boolean;\n errors: CheckError[];\n}\n\ninterface Check {\n label: string;\n run: () => CheckResult;\n}\n\ninterface Domain {\n name: string;\n checks: Check[];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findProjectRoot(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n current = parent;\n parent = path.dirname(current);\n }\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n return null;\n}\n\nfunction tryParseYaml(\n filePath: string,\n): { data: unknown; err?: undefined } | { data?: undefined; err: string } {\n try {\n return { data: yamlLoad(readFileSync(filePath, 'utf8')) };\n } catch (e) {\n return { err: e instanceof Error ? e.message : String(e) };\n }\n}\n\nfunction readText(filePath: string): string {\n return readFileSync(filePath, 'utf8');\n}\n\n/** kebab-case → camelCase e.g. book-demo → bookDemo */\nfunction kebabToCamel(s: string): string {\n return s.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/** camelCase → snake_case e.g. bookDemo → book_demo */\nfunction camelToSnake(s: string): string {\n return s.replace(/([A-Z])/g, '_$1').toLowerCase();\n}\n\n// ── AJV error formatter ───────────────────────────────────────────────────────\n\n// hints: field-name → indented YAML example of the full expected structure\nfunction formatAjvError(\n e: ErrorObject,\n hints: Record<string, string> = {},\n): CheckError {\n const loc = e.instancePath || '(root)';\n\n if (e.keyword === 'required') {\n const missing = (e.params as { missingProperty: string }).missingProperty;\n const parent =\n loc === '(root)' ? 'top level' : `'${loc.replace(/^\\//, '')}'`;\n const hint = hints[missing];\n return {\n message: `[${loc}] missing required property '${missing}'`,\n fix: hint\n ? `Add '${missing}:' under ${parent}. Expected structure:\\n${hint}`\n : `Add '${missing}:' under ${parent}.`,\n };\n }\n\n if (e.keyword === 'type') {\n const expected = (e.params as { type: string }).type;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must be ${expected}`,\n fix: hint\n ? `Replace the current value of '${field}' with:\\n${hint}`\n : `Change '${field}' to a ${expected}.`,\n };\n }\n\n if (e.keyword === 'minItems') {\n const min = (e.params as { limit: number }).limit;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must have at least ${min} item${min === 1 ? '' : 's'}`,\n fix: hint\n ? `Add at least ${min} entry under '${field}':\\n${hint}`\n : `Add at least ${min} entry under '${field}'.`,\n };\n }\n\n if (e.keyword === 'additionalProperties') {\n const extra = (e.params as { additionalProperty: string })\n .additionalProperty;\n return {\n message: `[${loc}] unknown property '${extra}'`,\n fix: `Remove '${extra}' — it is not a recognised field.`,\n };\n }\n\n return { message: `[${loc}] ${e.message ?? e.keyword}` };\n}\n\n// ── Structural hints ──────────────────────────────────────────────────────────\n\nconst AI_INSTRUCTIONS_HINTS: Record<string, string> = {\n rules: [\n ' rules:',\n \" - Always respond in the language of the user's prompt\",\n ' - Do not hallucinate or fabricate information',\n ' - Refuse requests that are harmful, illegal, or unethical',\n ].join('\\n'),\n instructions: [\n ' instructions: >',\n ' Structure prompts clearly and specifically. Provide relevant',\n ' context and set output expectations (format, length, style).',\n ].join('\\n'),\n semantics: [\n ' semantics:',\n \" PROX: The user's natural language request or structured prompt\",\n ' VERIFY: A response aligned with the detected intent',\n ' SUB-ACTION: Background information or metadata alongside the prompt',\n ].join('\\n'),\n tone: [\n ' tone:',\n ' style: concise',\n ' voice: \"clear and direct — avoid filler phrases\"',\n ].join('\\n'),\n};\n\nconst ACTION_YAML_HINTS: Record<string, string> = {\n name: [' name: my-action'].join('\\n'),\n params: [\n ' params:',\n ' - param: exampleParam',\n ' values:',\n ' - value1',\n ' - value2',\n ' - param: optionalParam',\n ' optional: true',\n ' values:',\n ' - valueA',\n ].join('\\n'),\n};\n\n// ── Domain builders ───────────────────────────────────────────────────────────\n\nfunction buildAiInstructionsDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n );\n const fileName = 'prompt-instructions.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'AI Instructions',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/ai/prompt-instructions.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, AI_INSTRUCTIONS_HINTS),\n ),\n };\n },\n },\n ],\n };\n}\n\nfunction buildCmsSchemaDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'cms',\n 'cms-schema.yaml',\n );\n const fileName = 'cms-schema.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'CMS Schema',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/cms/cms-schema.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) => formatAjvError(e)),\n };\n },\n },\n ],\n };\n}\n\nfunction buildActionsDomain(root: string): Domain {\n const actionsDir = path.join(root, 'src', 'actions');\n const registryPath = path.join(root, 'src', 'createRegistry.ts');\n const indexPath = path.join(actionsDir, 'index.ts');\n\n // If the actions directory is missing, report it and stop\n if (!existsSync(actionsDir)) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — directory exists',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'src/actions/ directory not found',\n fix: 'Create the src/actions/ directory and add at least one action YAML + handler.',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const yamlFiles = readdirSync(actionsDir).filter(\n (f) => f.endsWith('.yaml') || f.endsWith('.yml'),\n );\n\n if (yamlFiles.length === 0) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — at least one action defined',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'No action YAML files found in src/actions/',\n fix: 'Add an action YAML file, e.g. src/actions/my-action.yaml',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n const actionSchema = SCHEMAS['action.yaml'];\n const checks: Check[] = [];\n\n for (const yamlFile of yamlFiles) {\n const yamlPath = path.join(actionsDir, yamlFile);\n\n // Mutable state shared across this action's checks (captured by closures)\n let yamlData: Record<string, unknown> = {};\n let yamlOk = false;\n let schemaOk = false;\n let actionName = path.basename(yamlFile, path.extname(yamlFile));\n\n // ── Check 1: valid YAML ────────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — valid YAML`,\n run(): CheckResult {\n const result = tryParseYaml(yamlPath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n { message: result.err, fix: 'Fix the YAML syntax error.' },\n ],\n };\n }\n yamlData = result.data as Record<string, unknown>;\n yamlOk = true;\n if (typeof yamlData.name === 'string') {\n actionName = yamlData.name;\n }\n return { ok: true, errors: [] };\n },\n });\n\n // ── Check 2: schema valid ─────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(actionSchema);\n if (validate(yamlData)) {\n schemaOk = true;\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, ACTION_YAML_HINTS),\n ),\n };\n },\n });\n\n // Derive names — evaluated lazily inside each check closure after\n // yamlOk sets actionName correctly\n const getNames = () => {\n const camel = kebabToCamel(actionName);\n return {\n camel,\n handler: `${camel}Action`,\n snake: camelToSnake(camel),\n handlerFile: `${camel}Action.ts`,\n handlerPath: path.join(actionsDir, `${camel}Action.ts`),\n };\n };\n\n // ── Check 3: handler file exists ──────────────────────────────────────\n checks.push({\n label: `${yamlFile} — handler file exists`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (existsSync(handlerPath)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Handler not found: src/actions/${handlerFile}`,\n fix: `Create src/actions/${handlerFile} exporting 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 4: handler exports correct name ─────────────────────────────\n checks.push({\n label: `${yamlFile} — handler exports correct name`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n const content = readText(handlerPath);\n if (content.includes(`export const ${handler}`)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'export const ${handler}' not found in ${handlerFile}`,\n fix: `Rename the export to 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 5: handler params ⊆ YAML params ────────────────────────────\n checks.push({\n label: `${yamlFile} — handler params declared in YAML`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n\n const declaredParams = new Set(\n ((yamlData.params as { param: string }[]) ?? []).map((p) => p.param),\n );\n\n const content = readText(handlerPath);\n const match = content.match(/const\\s*\\{([^}]+)\\}\\s*=\\s*params/);\n if (!match) {\n return { ok: true, errors: [] }; // No destructure — nothing to check\n }\n\n const usedParams = match[1]\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0 && !s.startsWith('...'))\n .map((s) => s.split(':')[0].trim()); // handle aliased: { foo: bar }\n\n const undeclared = usedParams.filter((p) => !declaredParams.has(p));\n if (undeclared.length === 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: undeclared.map((p) => ({\n message: `Handler uses param '${p}' not declared in ${yamlFile}`,\n fix: `Add to ${yamlFile}:\\n params:\\n - param: ${p}\\n values: [...]`,\n })),\n };\n },\n });\n\n // ── Check 6: index.ts exports handler ─────────────────────────────────\n checks.push({\n label: `${yamlFile} — exported from src/actions/index.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler } = getNames();\n if (!existsSync(indexPath)) {\n return {\n ok: false,\n errors: [\n {\n message: 'src/actions/index.ts not found',\n fix: `Create src/actions/index.ts and add:\\nexport { ${handler} } from './${handler}';`,\n },\n ],\n };\n }\n const content = readText(indexPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not found in src/actions/index.ts`,\n fix: `Add: export { ${handler} } from './${handler}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 7: createRegistry.ts imports handler ────────────────────────\n checks.push({\n label: `${yamlFile} — imported in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not imported in src/createRegistry.ts`,\n fix: `Add: import { ${handler} } from './actions/${handlerFile.replace(\n '.ts',\n '',\n )}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 8: createRegistry.ts registers the action ──────────────────\n checks.push({\n label: `${yamlFile} — registered in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, snake } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (\n content.includes(`registerAction('${snake}'`) ||\n content.includes(`registerAction(\"${snake}\"`)\n ) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'.registerAction('${snake}', ...)' not found in src/createRegistry.ts`,\n fix: `Add to the registry chain:\\n .registerAction('${snake}', ${handler})`,\n },\n ],\n };\n },\n });\n }\n\n return { name: 'Actions', checks };\n}\n\n// ── Command ───────────────────────────────────────────────────────────────────\n\nexport const validateCommand = new Command('validate')\n .description('Validate project config files against their schemas')\n .action(() => {\n const root = findProjectRoot(process.cwd());\n if (!root) {\n error(\n 'No web5.config.json found — run this command from inside a Web5 project',\n );\n process.exit(1);\n }\n\n info(`Project root: ${root}`);\n console.log('');\n\n const domains: Domain[] = [\n buildAiInstructionsDomain(root),\n buildCmsSchemaDomain(root),\n buildActionsDomain(root),\n ];\n\n let hasErrors = false;\n\n for (const domain of domains) {\n console.log(domain.name);\n\n for (const check of domain.checks) {\n const result = check.run();\n\n if (result.ok) {\n console.log(chalk.green(` \\u2714 ${check.label}`));\n } else {\n hasErrors = true;\n process.stderr.write(chalk.red(` \\u2716 ${check.label}\\n`));\n for (const e_ of result.errors) {\n process.stderr.write(` ${e_.message}\\n`);\n if (e_.fix) {\n process.stderr.write(` Fix: ${e_.fix}\\n`);\n }\n }\n }\n }\n\n console.log('');\n }\n\n if (hasErrors) {\n process.exit(1);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_commander","require","_2","_interopRequireDefault","_jsYaml","_fs","path","_interopRequireWildcard","_chalk","_print","_cmsSchemaSchema","_aiInstructionsSchema","_actionYamlSchema","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SCHEMAS","yamlLoad","cmsSchemaSchemaTemplate","aiInstructionsSchemaTemplate","actionYamlSchemaTemplate","findProjectRoot","startDir","current","parent","dirname","existsSync","join","tryParseYaml","filePath","data","readFileSync","err","Error","message","String","readText","kebabToCamel","s","replace","_","c","toUpperCase","camelToSnake","toLowerCase","formatAjvError","hints","loc","instancePath","keyword","missing","params","missingProperty","hint","fix","expected","type","field","min","limit","extra","additionalProperty","AI_INSTRUCTIONS_HINTS","rules","instructions","semantics","tone","ACTION_YAML_HINTS","name","buildAiInstructionsDomain","root","fileName","ajv","Ajv","allErrors","strict","schema","parsed","fileExists","yamlOk","checks","label","run","ok","errors","result","undefined","validate","compile","map","buildCmsSchemaDomain","buildActionsDomain","actionsDir","registryPath","indexPath","yamlFiles","readdirSync","filter","endsWith","length","actionSchema","yamlFile","yamlPath","yamlData","schemaOk","actionName","basename","extname","push","getNames","camel","handler","snake","handlerFile","handlerPath","content","includes","declaredParams","Set","p","param","match","usedParams","split","trim","startsWith","undeclared","printDomain","domain","results","verbose","failed","domainOk","console","log","chalk","green","process","stderr","write","red","e_","collectDomainJson","every","buildScriptsDomain","pkgPath","pkg","JSON","parse","_pkg$scripts","scripts","bundle","_pkg$scripts2","build","selectDomains","all","ai","cms","actions","d","runDomains","domains","format","hasErrors","jsonResults","check","jr","runValidation","startWatch","watchDirs","error","debounce","trigger","clearTimeout","setTimeout","clear","info","Date","toLocaleTimeString","dir","fsWatch","recursive","relative","validateCommand","exports","Command","description","option","action","opts","Boolean","domainFilter","project","resolve","cwd","exit","stringify","watch","stdout","isTTY"],"sources":["../../../src/commands/validate.ts"],"sourcesContent":["import { Command } from 'commander';\nimport Ajv from 'ajv/dist/2020';\nimport type { ErrorObject } from 'ajv';\nimport { load as yamlLoad } from 'js-yaml';\nimport { readFileSync, existsSync, readdirSync, watch as fsWatch } from 'fs';\nimport * as path from 'path';\nimport chalk from 'chalk';\nimport { error, info } from '../utils/print';\n\ntype OutputFormat = 'text' | 'json';\ntype DomainFilter = 'ai' | 'cms' | 'actions' | 'scripts';\nimport { cmsSchemaSchemaTemplate } from '../templates/cmsSchemaSchema';\nimport { aiInstructionsSchemaTemplate } from '../templates/aiInstructionsSchema';\nimport { actionYamlSchemaTemplate } from '../templates/actionYamlSchema';\n\n// ── Bundled schemas (never exposed to user's project) ────────────────────────\n\nconst SCHEMAS: Record<string, object> = {\n 'cms-schema.yaml': yamlLoad(cmsSchemaSchemaTemplate()) as object,\n 'prompt-instructions.yaml': yamlLoad(\n aiInstructionsSchemaTemplate(),\n ) as object,\n 'action.yaml': yamlLoad(actionYamlSchemaTemplate()) as object,\n};\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\ninterface CheckError {\n message: string;\n fix?: string;\n}\n\ninterface CheckResult {\n ok: boolean;\n errors: CheckError[];\n}\n\ninterface Check {\n label: string;\n run: () => CheckResult;\n}\n\ninterface Domain {\n name: string;\n checks: Check[];\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findProjectRoot(startDir: string): string | null {\n let current = startDir;\n let parent = path.dirname(current);\n while (current !== parent) {\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n current = parent;\n parent = path.dirname(current);\n }\n if (existsSync(path.join(current, 'web5.config.json'))) {\n return current;\n }\n return null;\n}\n\nfunction tryParseYaml(\n filePath: string,\n): { data: unknown; err?: undefined } | { data?: undefined; err: string } {\n try {\n return { data: yamlLoad(readFileSync(filePath, 'utf8')) };\n } catch (e) {\n return { err: e instanceof Error ? e.message : String(e) };\n }\n}\n\nfunction readText(filePath: string): string {\n return readFileSync(filePath, 'utf8');\n}\n\n/** kebab-case → camelCase e.g. book-demo → bookDemo */\nfunction kebabToCamel(s: string): string {\n return s.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/** camelCase → snake_case e.g. bookDemo → book_demo */\nfunction camelToSnake(s: string): string {\n return s.replace(/([A-Z])/g, '_$1').toLowerCase();\n}\n\n// ── AJV error formatter ───────────────────────────────────────────────────────\n\n// hints: field-name → indented YAML example of the full expected structure\nfunction formatAjvError(\n e: ErrorObject,\n hints: Record<string, string> = {},\n): CheckError {\n const loc = e.instancePath || '(root)';\n\n if (e.keyword === 'required') {\n const missing = (e.params as { missingProperty: string }).missingProperty;\n const parent =\n loc === '(root)' ? 'top level' : `'${loc.replace(/^\\//, '')}'`;\n const hint = hints[missing];\n return {\n message: `[${loc}] missing required property '${missing}'`,\n fix: hint\n ? `Add '${missing}:' under ${parent}. Expected structure:\\n${hint}`\n : `Add '${missing}:' under ${parent}.`,\n };\n }\n\n if (e.keyword === 'type') {\n const expected = (e.params as { type: string }).type;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must be ${expected}`,\n fix: hint\n ? `Replace the current value of '${field}' with:\\n${hint}`\n : `Change '${field}' to a ${expected}.`,\n };\n }\n\n if (e.keyword === 'minItems') {\n const min = (e.params as { limit: number }).limit;\n const field = loc.replace(/^\\//, '');\n const hint = hints[field];\n return {\n message: `[${loc}] must have at least ${min} item${min === 1 ? '' : 's'}`,\n fix: hint\n ? `Add at least ${min} entry under '${field}':\\n${hint}`\n : `Add at least ${min} entry under '${field}'.`,\n };\n }\n\n if (e.keyword === 'additionalProperties') {\n const extra = (e.params as { additionalProperty: string })\n .additionalProperty;\n return {\n message: `[${loc}] unknown property '${extra}'`,\n fix: `Remove '${extra}' — it is not a recognised field.`,\n };\n }\n\n return { message: `[${loc}] ${e.message ?? e.keyword}` };\n}\n\n// ── Structural hints ──────────────────────────────────────────────────────────\n\nconst AI_INSTRUCTIONS_HINTS: Record<string, string> = {\n rules: [\n ' rules:',\n \" - Always respond in the language of the user's prompt\",\n ' - Do not hallucinate or fabricate information',\n ' - Refuse requests that are harmful, illegal, or unethical',\n ].join('\\n'),\n instructions: [\n ' instructions: >',\n ' Structure prompts clearly and specifically. Provide relevant',\n ' context and set output expectations (format, length, style).',\n ].join('\\n'),\n semantics: [\n ' semantics:',\n \" PROX: The user's natural language request or structured prompt\",\n ' VERIFY: A response aligned with the detected intent',\n ' SUB-ACTION: Background information or metadata alongside the prompt',\n ].join('\\n'),\n tone: [\n ' tone:',\n ' style: concise',\n ' voice: \"clear and direct — avoid filler phrases\"',\n ].join('\\n'),\n};\n\nconst ACTION_YAML_HINTS: Record<string, string> = {\n name: [' name: my-action'].join('\\n'),\n params: [\n ' params:',\n ' - param: exampleParam',\n ' values:',\n ' - value1',\n ' - value2',\n ' - param: optionalParam',\n ' optional: true',\n ' values:',\n ' - valueA',\n ].join('\\n'),\n};\n\n// ── Domain builders ───────────────────────────────────────────────────────────\n\nfunction buildAiInstructionsDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'ai',\n 'prompt-instructions.yaml',\n );\n const fileName = 'prompt-instructions.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'AI Instructions',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/ai/prompt-instructions.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, AI_INSTRUCTIONS_HINTS),\n ),\n };\n },\n },\n ],\n };\n}\n\nfunction buildCmsSchemaDomain(root: string): Domain {\n const filePath = path.join(\n root,\n 'src',\n 'configuration',\n 'cms',\n 'cms-schema.yaml',\n );\n const fileName = 'cms-schema.yaml';\n const ajv = new Ajv({ allErrors: true, strict: false });\n const schema = SCHEMAS[fileName];\n\n let parsed: unknown;\n let fileExists = false;\n let yamlOk = false;\n\n return {\n name: 'CMS Schema',\n checks: [\n {\n label: `${fileName} — file exists`,\n run(): CheckResult {\n fileExists = existsSync(filePath);\n if (fileExists) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${filePath}`,\n fix: `Create 'src/configuration/cms/cms-schema.yaml' in your project.`,\n },\n ],\n };\n },\n },\n {\n label: `${fileName} — valid YAML`,\n run(): CheckResult {\n if (!fileExists) {\n return {\n ok: false,\n errors: [{ message: 'skipped — file does not exist' }],\n };\n }\n const result = tryParseYaml(filePath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n {\n message: result.err,\n fix: 'Fix the YAML syntax error above.',\n },\n ],\n };\n }\n parsed = result.data;\n yamlOk = true;\n return { ok: true, errors: [] };\n },\n },\n {\n label: `${fileName} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(schema);\n if (validate(parsed)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) => formatAjvError(e)),\n };\n },\n },\n ],\n };\n}\n\nfunction buildActionsDomain(root: string): Domain {\n const actionsDir = path.join(root, 'src', 'actions');\n const registryPath = path.join(root, 'src', 'createRegistry.ts');\n const indexPath = path.join(actionsDir, 'index.ts');\n\n // If the actions directory is missing, report it and stop\n if (!existsSync(actionsDir)) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — directory exists',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'src/actions/ directory not found',\n fix: 'Create the src/actions/ directory and add at least one action YAML + handler.',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const yamlFiles = readdirSync(actionsDir).filter(\n (f) => f.endsWith('.yaml') || f.endsWith('.yml'),\n );\n\n if (yamlFiles.length === 0) {\n return {\n name: 'Actions',\n checks: [\n {\n label: 'src/actions/ — at least one action defined',\n run: () => ({\n ok: false,\n errors: [\n {\n message: 'No action YAML files found in src/actions/',\n fix: 'Add an action YAML file, e.g. src/actions/my-action.yaml',\n },\n ],\n }),\n },\n ],\n };\n }\n\n const ajv = new Ajv({ allErrors: true, strict: false });\n const actionSchema = SCHEMAS['action.yaml'];\n const checks: Check[] = [];\n\n for (const yamlFile of yamlFiles) {\n const yamlPath = path.join(actionsDir, yamlFile);\n\n // Mutable state shared across this action's checks (captured by closures)\n let yamlData: Record<string, unknown> = {};\n let yamlOk = false;\n let schemaOk = false;\n let actionName = path.basename(yamlFile, path.extname(yamlFile));\n\n // ── Check 1: valid YAML ────────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — valid YAML`,\n run(): CheckResult {\n const result = tryParseYaml(yamlPath);\n if (result.err !== undefined) {\n return {\n ok: false,\n errors: [\n { message: result.err, fix: 'Fix the YAML syntax error.' },\n ],\n };\n }\n yamlData = result.data as Record<string, unknown>;\n yamlOk = true;\n if (typeof yamlData.name === 'string') {\n actionName = yamlData.name;\n }\n return { ok: true, errors: [] };\n },\n });\n\n // ── Check 2: schema valid ─────────────────────────────────────────────\n checks.push({\n label: `${yamlFile} — schema valid`,\n run(): CheckResult {\n if (!yamlOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML parse failed' }],\n };\n }\n const validate = ajv.compile(actionSchema);\n if (validate(yamlData)) {\n schemaOk = true;\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: (validate.errors ?? []).map((e) =>\n formatAjvError(e, ACTION_YAML_HINTS),\n ),\n };\n },\n });\n\n // Derive names — evaluated lazily inside each check closure after\n // yamlOk sets actionName correctly\n const getNames = () => {\n const camel = kebabToCamel(actionName);\n return {\n camel,\n handler: `${camel}Action`,\n snake: camelToSnake(camel),\n handlerFile: `${camel}Action.ts`,\n handlerPath: path.join(actionsDir, `${camel}Action.ts`),\n };\n };\n\n // ── Check 3: handler file exists ──────────────────────────────────────\n checks.push({\n label: `${yamlFile} — handler file exists`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (existsSync(handlerPath)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Handler not found: src/actions/${handlerFile}`,\n fix: `Create src/actions/${handlerFile} exporting 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 4: handler exports correct name ─────────────────────────────\n checks.push({\n label: `${yamlFile} — handler exports correct name`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile, handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n const content = readText(handlerPath);\n if (content.includes(`export const ${handler}`)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'export const ${handler}' not found in ${handlerFile}`,\n fix: `Rename the export to 'export const ${handler}: ActionHandler = ...'`,\n },\n ],\n };\n },\n });\n\n // ── Check 5: handler params ⊆ YAML params ────────────────────────────\n checks.push({\n label: `${yamlFile} — handler params declared in YAML`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handlerPath } = getNames();\n if (!existsSync(handlerPath)) {\n return {\n ok: false,\n errors: [{ message: 'skipped — handler file missing' }],\n };\n }\n\n const declaredParams = new Set(\n ((yamlData.params as { param: string }[]) ?? []).map((p) => p.param),\n );\n\n const content = readText(handlerPath);\n const match = content.match(/const\\s*\\{([^}]+)\\}\\s*=\\s*params/);\n if (!match) {\n return { ok: true, errors: [] }; // No destructure — nothing to check\n }\n\n const usedParams = match[1]\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0 && !s.startsWith('...'))\n .map((s) => s.split(':')[0].trim()); // handle aliased: { foo: bar }\n\n const undeclared = usedParams.filter((p) => !declaredParams.has(p));\n if (undeclared.length === 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: undeclared.map((p) => ({\n message: `Handler uses param '${p}' not declared in ${yamlFile}`,\n fix: `Add to ${yamlFile}:\\n params:\\n - param: ${p}\\n values: [...]`,\n })),\n };\n },\n });\n\n // ── Check 6: index.ts exports handler ─────────────────────────────────\n checks.push({\n label: `${yamlFile} — exported from src/actions/index.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler } = getNames();\n if (!existsSync(indexPath)) {\n return {\n ok: false,\n errors: [\n {\n message: 'src/actions/index.ts not found',\n fix: `Create src/actions/index.ts and add:\\nexport { ${handler} } from './${handler}';`,\n },\n ],\n };\n }\n const content = readText(indexPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not found in src/actions/index.ts`,\n fix: `Add: export { ${handler} } from './${handler}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 7: createRegistry.ts imports handler ────────────────────────\n checks.push({\n label: `${yamlFile} — imported in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, handlerFile } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (content.includes(handler)) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'${handler}' not imported in src/createRegistry.ts`,\n fix: `Add: import { ${handler} } from './actions/${handlerFile.replace(\n '.ts',\n '',\n )}';`,\n },\n ],\n };\n },\n });\n\n // ── Check 8: createRegistry.ts registers the action ──────────────────\n checks.push({\n label: `${yamlFile} — registered in src/createRegistry.ts`,\n run(): CheckResult {\n if (!schemaOk) {\n return {\n ok: false,\n errors: [{ message: 'skipped — YAML schema invalid' }],\n };\n }\n const { handler, snake } = getNames();\n if (!existsSync(registryPath)) {\n return {\n ok: false,\n errors: [{ message: 'src/createRegistry.ts not found' }],\n };\n }\n const content = readText(registryPath);\n if (\n content.includes(`registerAction('${snake}'`) ||\n content.includes(`registerAction(\"${snake}\"`)\n ) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `'.registerAction('${snake}', ...)' not found in src/createRegistry.ts`,\n fix: `Add to the registry chain:\\n .registerAction('${snake}', ${handler})`,\n },\n ],\n };\n },\n });\n }\n\n return { name: 'Actions', checks };\n}\n\n// ── Rendering ─────────────────────────────────────────────────────────────────\n\ninterface CheckResultWithLabel {\n label: string;\n result: CheckResult;\n}\n\nfunction printDomain(\n domain: Domain,\n results: CheckResultWithLabel[],\n verbose: boolean,\n): boolean {\n const failed = results.filter((r) => !r.result.ok);\n const domainOk = failed.length === 0;\n\n if (verbose) {\n console.log(domain.name);\n for (const { label, result } of results) {\n if (result.ok) {\n console.log(chalk.green(` \\u2714 ${label}`));\n } else {\n process.stderr.write(chalk.red(` \\u2716 ${label}\\n`));\n for (const e_ of result.errors) {\n process.stderr.write(` ${e_.message}\\n`);\n if (e_.fix) {\n process.stderr.write(` Fix: ${e_.fix}\\n`);\n }\n }\n }\n }\n console.log('');\n return domainOk;\n }\n\n // Slim mode\n if (domainOk) {\n console.log(chalk.green(`\\u2714 ${domain.name} — valid`));\n return true;\n }\n\n console.log(domain.name);\n for (const { label, result } of failed) {\n process.stderr.write(chalk.red(` \\u2716 ${label}\\n`));\n for (const e_ of result.errors) {\n process.stderr.write(` ${e_.message}\\n`);\n if (e_.fix) {\n process.stderr.write(` Fix: ${e_.fix}\\n`);\n }\n }\n }\n console.log('');\n return false;\n}\n\n// ── JSON output ───────────────────────────────────────────────────────────────\n\ninterface JsonDomainResult {\n name: string;\n ok: boolean;\n checks: { label: string; ok: boolean; errors: CheckError[] }[];\n}\n\nfunction collectDomainJson(\n domain: Domain,\n results: CheckResultWithLabel[],\n): JsonDomainResult {\n return {\n name: domain.name,\n ok: results.every((r) => r.result.ok),\n checks: results.map(({ label, result }) => ({\n label,\n ok: result.ok,\n errors: result.errors,\n })),\n };\n}\n\n// ── Build scripts domain ──────────────────────────────────────────────────────\n\nfunction buildScriptsDomain(root: string): Domain {\n const pkgPath = path.join(root, 'package.json');\n let pkg: { scripts?: Record<string, string> } = {};\n let fileExists = false;\n\n return {\n name: 'Build Scripts',\n checks: [\n {\n label: 'package.json — file exists',\n run(): CheckResult {\n fileExists = existsSync(pkgPath);\n if (!fileExists) {\n return {\n ok: false,\n errors: [\n {\n message: `File not found: ${pkgPath}`,\n fix: `Create a 'package.json' at the root of your project.`,\n },\n ],\n };\n }\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as typeof pkg;\n } catch (e) {\n fileExists = false;\n return {\n ok: false,\n errors: [\n {\n message: `Failed to parse package.json: ${e instanceof Error ? e.message : String(e)}`,\n fix: `Fix the JSON syntax in your package.json.`,\n },\n ],\n };\n }\n return { ok: true, errors: [] };\n },\n },\n {\n label: 'package.json — bundle script defined',\n run(): CheckResult {\n if (!fileExists) {\n return { ok: false, errors: [{ message: 'skipped — package.json not readable' }] };\n }\n if (typeof pkg.scripts?.bundle === 'string' && pkg.scripts.bundle.length > 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Missing 'bundle' script in package.json`,\n fix: `Add a 'bundle' script to your package.json scripts, e.g.:\\n \"bundle\": \"vite build --config src/vite.cdn.config.ts\"`,\n },\n ],\n };\n },\n },\n {\n label: 'package.json — build script defined',\n run(): CheckResult {\n if (!fileExists) {\n return { ok: false, errors: [{ message: 'skipped — package.json not readable' }] };\n }\n if (typeof pkg.scripts?.build === 'string' && pkg.scripts.build.length > 0) {\n return { ok: true, errors: [] };\n }\n return {\n ok: false,\n errors: [\n {\n message: `Missing 'build' script in package.json`,\n fix: `Add a 'build' script to your package.json scripts, e.g.:\\n \"build\": \"tsc\"`,\n },\n ],\n };\n },\n },\n ],\n };\n}\n\n// ── Domain selection ──────────────────────────────────────────────────────────\n\nfunction selectDomains(root: string, filter?: DomainFilter): Domain[] {\n const all: Domain[] = [\n buildAiInstructionsDomain(root),\n buildCmsSchemaDomain(root),\n buildActionsDomain(root),\n buildScriptsDomain(root),\n ];\n if (!filter) return all;\n const map: Record<DomainFilter, string> = {\n ai: 'AI Instructions',\n cms: 'CMS Schema',\n scripts: 'Build Scripts',\n actions: 'Actions',\n };\n return all.filter((d) => d.name === map[filter]);\n}\n\n// ── Core runner ───────────────────────────────────────────────────────────────\n\nfunction runDomains(\n domains: Domain[],\n verbose: boolean,\n format: OutputFormat,\n): { ok: boolean; jsonResults?: JsonDomainResult[] } {\n let hasErrors = false;\n const jsonResults: JsonDomainResult[] = [];\n\n for (const domain of domains) {\n const results: CheckResultWithLabel[] = domain.checks.map((check) => ({\n label: check.label,\n result: check.run(),\n }));\n\n let domainOk: boolean;\n if (format === 'json') {\n const jr = collectDomainJson(domain, results);\n jsonResults.push(jr);\n domainOk = jr.ok;\n } else {\n domainOk = printDomain(domain, results, verbose);\n }\n\n if (!domainOk) hasErrors = true;\n }\n\n return { ok: !hasErrors, jsonResults };\n}\n\n// ── Programmatic API ─────────────────────────────────────────────────────────\n\n/**\n * Runs all validation domains against the given project root.\n * Prints results in slim mode and returns true if everything passes.\n */\nexport function runValidation(root: string): boolean {\n const domains = selectDomains(root);\n const { ok } = runDomains(domains, false, 'text');\n return ok;\n}\n\n// ── Watch mode ────────────────────────────────────────────────────────────────\n\nfunction startWatch(\n root: string,\n run: () => void,\n): void {\n const watchDirs = [\n path.join(root, 'src', 'configuration'),\n path.join(root, 'src', 'actions'),\n ].filter((d) => existsSync(d));\n\n if (watchDirs.length === 0) {\n error('No directories to watch found.');\n return;\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const trigger = () => {\n if (debounce) clearTimeout(debounce);\n debounce = setTimeout(() => {\n console.clear();\n info(`[${new Date().toLocaleTimeString()}] Re-validating...`);\n console.log('');\n run();\n }, 200);\n };\n\n for (const dir of watchDirs) {\n fsWatch(dir, { recursive: true }, trigger);\n }\n\n info(`Watching for changes in ${watchDirs.map((d) => path.relative(root, d)).join(', ')}...`);\n info('Press Ctrl+C to stop.');\n console.log('');\n}\n\n// ── Command ───────────────────────────────────────────────────────────────────\n\nexport const validateCommand = new Command('validate')\n .description('Validate project config files against their schemas')\n .option('--verbose', 'Show all checks, including passing ones')\n .option('--domain <domain>', 'Only validate one domain: ai, cms, actions, or scripts')\n .option('--format <format>', 'Output format: text (default) or json', 'text')\n .option('--watch', 'Re-validate on file changes (TTY only)')\n .option('--strict', 'Exit with error even on warnings')\n .option('--project <path>', 'Explicit project root (overrides cwd auto-detection)')\n .action((opts: {\n verbose?: boolean;\n domain?: string;\n format?: string;\n watch?: boolean;\n strict?: boolean;\n project?: string;\n }) => {\n const verbose = Boolean(opts.verbose);\n const format = (opts.format ?? 'text') as OutputFormat;\n const domainFilter = opts.domain as DomainFilter | undefined;\n\n const root = opts.project\n ? path.resolve(opts.project)\n : findProjectRoot(process.cwd());\n\n if (!root) {\n error(\n 'No web5.config.json found — run this command from inside a Web5 project',\n );\n process.exit(1);\n }\n\n if (format === 'text') {\n info(`Project root: ${root}`);\n console.log('');\n }\n\n const run = () => {\n const domains = selectDomains(root, domainFilter);\n const { ok, jsonResults } = runDomains(domains, verbose, format);\n\n if (format === 'json') {\n console.log(JSON.stringify({ ok, domains: jsonResults }, null, 2));\n }\n\n if (!ok && !opts.watch) {\n process.exit(1);\n }\n };\n\n run();\n\n if (opts.watch) {\n if (!process.stdout.isTTY) {\n error('--watch requires a TTY (interactive terminal).');\n process.exit(1);\n }\n startWatch(root, run);\n }\n });\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.whoamiCommand = void 0;
|
|
5
|
+
var _commander = require("commander");
|
|
6
|
+
var _secretStore = require("../auth/secretStore");
|
|
7
|
+
var _print = require("../utils/print");
|
|
8
|
+
const whoamiCommand = exports.whoamiCommand = new _commander.Command('whoami').description('Show current authentication status and identity').action(async () => {
|
|
9
|
+
try {
|
|
10
|
+
const creds = await (0, _secretStore.readCredentials)();
|
|
11
|
+
if (!creds) {
|
|
12
|
+
if ((0, _print.isJsonMode)()) {
|
|
13
|
+
console.log(JSON.stringify({
|
|
14
|
+
authenticated: false
|
|
15
|
+
}));
|
|
16
|
+
} else {
|
|
17
|
+
(0, _print.info)('Not authenticated. Run `web5 login` to sign in.');
|
|
18
|
+
}
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const authMethod = creds.api_key ? 'api-key' : 'device-flow';
|
|
22
|
+
const siteId = creds.site_id ?? null;
|
|
23
|
+
const expiresAt = creds.expires_at ? new Date(creds.expires_at).toISOString() : null;
|
|
24
|
+
const expired = creds.expires_at ? creds.expires_at < Date.now() : false;
|
|
25
|
+
if ((0, _print.isJsonMode)()) {
|
|
26
|
+
console.log(JSON.stringify({
|
|
27
|
+
authenticated: true,
|
|
28
|
+
authMethod,
|
|
29
|
+
siteId,
|
|
30
|
+
expiresAt,
|
|
31
|
+
expired
|
|
32
|
+
}));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
(0, _print.success)('Authenticated');
|
|
36
|
+
(0, _print.info)(`Method: ${authMethod}`);
|
|
37
|
+
if (siteId) {
|
|
38
|
+
(0, _print.info)(`Site ID: ${siteId}`);
|
|
39
|
+
}
|
|
40
|
+
if (expiresAt) {
|
|
41
|
+
(0, _print.info)(`Expires: ${expiresAt}${expired ? ' (expired)' : ''}`);
|
|
42
|
+
}
|
|
43
|
+
} catch (err_) {
|
|
44
|
+
(0, _print.error)(err_ instanceof Error ? err_.message : String(err_));
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_commander","require","_secretStore","_print","whoamiCommand","exports","Command","description","action","creds","readCredentials","isJsonMode","console","log","JSON","stringify","authenticated","info","authMethod","api_key","siteId","site_id","expiresAt","expires_at","Date","toISOString","expired","now","success","err_","error","Error","message","String","process","exit"],"sources":["../../../src/commands/whoami.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readCredentials } from '../auth/secretStore';\nimport { success, error, info, isJsonMode } from '../utils/print';\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current authentication status and identity')\n .action(async () => {\n try {\n const creds = await readCredentials();\n\n if (!creds) {\n if (isJsonMode()) {\n console.log(JSON.stringify({ authenticated: false }));\n } else {\n info('Not authenticated. Run `web5 login` to sign in.');\n }\n return;\n }\n\n const authMethod = creds.api_key ? 'api-key' : 'device-flow';\n const siteId = creds.site_id ?? null;\n const expiresAt = creds.expires_at\n ? new Date(creds.expires_at).toISOString()\n : null;\n const expired = creds.expires_at ? creds.expires_at < Date.now() : false;\n\n if (isJsonMode()) {\n console.log(\n JSON.stringify({ authenticated: true, authMethod, siteId, expiresAt, expired }),\n );\n return;\n }\n\n success('Authenticated');\n info(`Method: ${authMethod}`);\n if (siteId) {\n info(`Site ID: ${siteId}`);\n }\n if (expiresAt) {\n info(`Expires: ${expiresAt}${expired ? ' (expired)' : ''}`);\n }\n } catch (err_) {\n error(err_ instanceof Error ? err_.message : String(err_));\n process.exit(1);\n }\n });\n"],"mappings":";;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEO,MAAMG,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG,IAAIE,kBAAO,CAAC,QAAQ,CAAC,CAC/CC,WAAW,CAAC,iDAAiD,CAAC,CAC9DC,MAAM,CAAC,YAAY;EAClB,IAAI;IACF,MAAMC,KAAK,GAAG,MAAM,IAAAC,4BAAe,EAAC,CAAC;IAErC,IAAI,CAACD,KAAK,EAAE;MACV,IAAI,IAAAE,iBAAU,EAAC,CAAC,EAAE;QAChBC,OAAO,CAACC,GAAG,CAACC,IAAI,CAACC,SAAS,CAAC;UAAEC,aAAa,EAAE;QAAM,CAAC,CAAC,CAAC;MACvD,CAAC,MAAM;QACL,IAAAC,WAAI,EAAC,iDAAiD,CAAC;MACzD;MACA;IACF;IAEA,MAAMC,UAAU,GAAGT,KAAK,CAACU,OAAO,GAAG,SAAS,GAAG,aAAa;IAC5D,MAAMC,MAAM,GAAGX,KAAK,CAACY,OAAO,IAAI,IAAI;IACpC,MAAMC,SAAS,GAAGb,KAAK,CAACc,UAAU,GAC9B,IAAIC,IAAI,CAACf,KAAK,CAACc,UAAU,CAAC,CAACE,WAAW,CAAC,CAAC,GACxC,IAAI;IACR,MAAMC,OAAO,GAAGjB,KAAK,CAACc,UAAU,GAAGd,KAAK,CAACc,UAAU,GAAGC,IAAI,CAACG,GAAG,CAAC,CAAC,GAAG,KAAK;IAExE,IAAI,IAAAhB,iBAAU,EAAC,CAAC,EAAE;MAChBC,OAAO,CAACC,GAAG,CACTC,IAAI,CAACC,SAAS,CAAC;QAAEC,aAAa,EAAE,IAAI;QAAEE,UAAU;QAAEE,MAAM;QAAEE,SAAS;QAAEI;MAAQ,CAAC,CAChF,CAAC;MACD;IACF;IAEA,IAAAE,cAAO,EAAC,eAAe,CAAC;IACxB,IAAAX,WAAI,EAAC,aAAaC,UAAU,EAAE,CAAC;IAC/B,IAAIE,MAAM,EAAE;MACV,IAAAH,WAAI,EAAC,aAAaG,MAAM,EAAE,CAAC;IAC7B;IACA,IAAIE,SAAS,EAAE;MACb,IAAAL,WAAI,EAAC,aAAaK,SAAS,GAAGI,OAAO,GAAG,aAAa,GAAG,EAAE,EAAE,CAAC;IAC/D;EACF,CAAC,CAAC,OAAOG,IAAI,EAAE;IACb,IAAAC,YAAK,EAACD,IAAI,YAAYE,KAAK,GAAGF,IAAI,CAACG,OAAO,GAAGC,MAAM,CAACJ,IAAI,CAAC,CAAC;IAC1DK,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;EACjB;AACF,CAAC,CAAC","ignoreList":[]}
|