@bonginkan/maria-ext 0.0.0

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/README.md ADDED
@@ -0,0 +1,21 @@
1
+ @bonginkan/maria-ext
2
+ ===================
3
+
4
+ Enterprise extension packs installer for `@bonginkan/maria-lite`.
5
+
6
+ ## Install
7
+
8
+ ```shell
9
+ npm install @bonginkan/maria-ext --pack "{pack name}" --email "{authorized_email}";
10
+ ```
11
+
12
+ ## Update
13
+
14
+ ```shell
15
+ npm update @bonginkan/maria-ext --pack "{pack name}" --email "{authorized_email}";
16
+ ```
17
+
18
+ Notes:
19
+ - `--pack` and `--email` can be passed via argv or npm config env vars (`npm_config_pack`, `npm_config_email`) to postinstall.
20
+ - The installer writes a deterministic manifest under `~/.maria/lite-ext/packs/` (or `MARIA_CONFIG_DIR`).
21
+
@@ -0,0 +1,44 @@
1
+ ##########################################+++++++#######++######################
2
+ #####################################+..-.....------++..----.###################
3
+ ##################################-................---....-----#################
4
+ ################################-..........--..--....-.....-----################
5
+ ###############################. .... .....--+-..-........-.----###############
6
+ ##############################... .......-------....-........----##############
7
+ #############################. ......-------.---..-...........-.-##############
8
+ ############################+ .....----.--.....--......... ..-.-+#############
9
+ ############################- .. .-...........--........ ...+.#############
10
+ ############################..... ......-+.... ............ ...#.+############
11
+ ###########################+ .. ..-##+.........+--.. .-.+-+############
12
+ ###########################++ .+....-..++-..-....+.++. .----.############
13
+ ###########################++. ........--+.-....+...+-++.-. ...-----############
14
+ ###########################+-.. ..-..-++-###++#-+.--+++..-.....----+-###########
15
+ ##########################+----.-.-+--+#+++++++#+......#-- ...--.+-###########
16
+ ########################+-+++--+.----++#########-..-.-##--. ...--++-###########
17
+ ######################----++--+. ...############+.-+--+#-# .....----###########
18
+ #####################++-.#-+.--..+ -#+##+++####-..-#-#+#+#.......----###########
19
+ #####################-##+---+-+-.+.+###++###+---..##--+##+.-.....--.-###########
20
+ #####################-##+++##+#-.+.+#####+..--+---##++#-#+.-.-...--.-+##########
21
+ #####################-+##+#++##-++-###-+++---+++-#++###+##.+........--##########
22
+ ####################-+++++-###+.-...---+++..-++-+######.-++-.. .--.--+#########
23
+ ##################..++++++###......-++++.---+-+-######------......-..--+########
24
+ #################---++++--#+. .--#+-+++++.++-####+---.--++-.......-.########
25
+ ###############+..++----.#-.. ..---++#+-+##+--##-----.-----.---...-.-#######
26
+ ##############+...-++-...........-+---+##++##++#-..-......---.------...#--######
27
+ #############............ ....-++++++#+-+++###-.-----..-.....-----. .--#+.#####
28
+ ############-.. .. .... ..---######---+######-.------.-......----.. .--#+-####
29
+ ###########-. .... ...--########++#######-.-----..........----.. ...--#++###
30
+ ##########-. ... .-########++#######-------...........---... .. .--#-###
31
+ ++######+.. ... . .########+########+.----..-.... ..--.. . .. .-#+##
32
+ +###-###... ...-.... . -####+##-+#######+-----.---.... ...--.......... ..-##
33
+ -+-####+....---..- .. ++++++#-########-----..-..... .......-.. .......##
34
+ .++-#######-...... ..---+++-+++++++++.--.....-.. . ...... .. ...-#
35
+ .-++###########......+#..-++-+++-++--+++.......... . .......... ....+-.+..#
36
+ #.-++#------######-+###...-+-+++-+-+-++... .. .. .......-. .. ...+-.#++.
37
+ #-------------+#####+#-...--++++-+--+-. ... .... ...... .-..##+-
38
+ ##...-....-------######--.---+++-+++-- . . ..--.-.....+-.. .....-##--
39
+ #####--.......---+++-+#+-+++#+-+++-++. .. .. .........--..-#-... ...##+--
40
+ ##########-.. ....--+++++---++##+++-. .. ......----. ---.... ..##++-
41
+ ##############...----...----++####-........ ...-............++#..--#+.. ..##.#-
42
+ ##############+.....--++###########+++.-------..-............##-+..-.... ..#-#++
43
+ ###############+..---.----++++++++++-##.----.. ..-........-###-##. -+. .-#-##
44
+ ####################- ..-+++++++++--++-... ... .....-##-+##..-#. .-.-####
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var fsp = require('fs/promises');
4
+ var path = require('path');
5
+
6
+ function _interopNamespace(e) {
7
+ if (e && e.__esModule) return e;
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var fsp__namespace = /*#__PURE__*/_interopNamespace(fsp);
25
+ var path__namespace = /*#__PURE__*/_interopNamespace(path);
26
+
27
+ // packs/aa-test/entry.ts
28
+ async function readAaTxtFromPackAssets() {
29
+ const abs = path__namespace.join(__dirname, "aa.txt");
30
+ return await fsp__namespace.readFile(abs, "utf8");
31
+ }
32
+ function createAaField(api) {
33
+ class AaWorker extends api.LiteWorkerAgent {
34
+ commandId = "aa";
35
+ help = {
36
+ command: "/aa",
37
+ description: "Enterprise extension sample: prints Hello and shows @docs/ssot/aa.txt",
38
+ usage: "/aa [--json]",
39
+ runOnEmpty: true
40
+ };
41
+ steps = [
42
+ {
43
+ id: "aa.print",
44
+ title: "Print hello and aa.txt",
45
+ async run(ctx) {
46
+ const wantsJson = ctx.parsed.flags.includes("json") || ctx.parsed.options.json === "true";
47
+ const content = await readAaTxtFromPackAssets().catch(() => "");
48
+ const text = ["Hello, I'm Maria", "", content || "(missing: aa.txt in extension pack)"].join("\n");
49
+ return wantsJson ? { text, json: { ok: true, text } } : { text };
50
+ }
51
+ }
52
+ ];
53
+ }
54
+ class AaChecker extends api.LiteCheckerAgent {
55
+ commandId = "aa";
56
+ async check(_ctx, input) {
57
+ const t = String(input.output?.text || "").trim();
58
+ if (!t) return { outcome: "STOP", reasons: ["empty_output"] };
59
+ return { outcome: "PASS", reasons: ["non_empty_output"] };
60
+ }
61
+ }
62
+ return { commandId: "aa", worker: new AaWorker(), checker: new AaChecker() };
63
+ }
64
+ function createLiteExtensionPack(api) {
65
+ return {
66
+ packId: "aa-test",
67
+ packName: "aa test",
68
+ createFields: () => [createAaField(api)]
69
+ };
70
+ }
71
+
72
+ exports.createAaField = createAaField;
73
+ exports.createLiteExtensionPack = createLiteExtensionPack;
74
+ //# sourceMappingURL=entry.cjs.map
75
+ //# sourceMappingURL=entry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packs/aa-test/entry.ts"],"names":["path","fsp"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,eAAe,uBAAA,GAA2C;AAExD,EAAA,MAAM,GAAA,GAAWA,eAAA,CAAA,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AACzC,EAAA,OAAO,MAAUC,cAAA,CAAA,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA;AACvC;AAIO,SAAS,cAAc,GAAA,EAA4B;AAAA,EACxD,MAAM,QAAA,SAAiB,GAAA,CAAI,eAAA,CAAgB;AAAA,IACzB,SAAA,GAAY,IAAA;AAAA,IACZ,IAAA,GAAO;AAAA,MACrB,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,uEAAA;AAAA,MACb,KAAA,EAAO,cAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,IACgB,KAAA,GAAQ;AAAA,MACtB;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QACJ,KAAA,EAAO,wBAAA;AAAA,QACP,MAAM,IAAI,GAAA,EAAwB;AAChC,UAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,KAAS,MAAA;AACnF,UAAA,MAAM,UAAU,MAAM,uBAAA,EAAwB,CAAE,KAAA,CAAM,MAAc,EAAE,CAAA;AACtE,UAAA,MAAM,IAAA,GAAO,CAAC,kBAAA,EAAoB,EAAA,EAAI,WAAW,qCAAqC,CAAA,CAAE,KAAK,IAAI,CAAA;AACjG,UAAA,OAAO,SAAA,GAAY,EAAE,IAAA,EAAM,IAAA,EAAM,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK,EAAE,GAAI,EAAE,IAAA,EAAK;AAAA,QACjE;AAAA;AACF,KACF;AAAA;AACF,EAEA,MAAM,SAAA,SAAkB,GAAA,CAAI,gBAAA,CAAiB;AAAA,IAC3B,SAAA,GAAY,IAAA;AAAA,IAC5B,MAAa,KAAA,CAAM,IAAA,EAAW,KAAA,EAAsE;AAClG,MAAA,MAAM,IAAI,MAAA,CAAO,KAAA,CAAM,QAAQ,IAAA,IAAQ,EAAE,EAAE,IAAA,EAAK;AAChD,MAAA,IAAI,CAAC,GAAG,OAAO,EAAE,SAAS,MAAA,EAAQ,OAAA,EAAS,CAAC,cAAc,CAAA,EAAE;AAC5D,MAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,CAAC,kBAAkB,CAAA,EAAE;AAAA,IAC1D;AAAA;AAGF,EAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,IAAI,UAAS,EAAG,OAAA,EAAS,IAAI,SAAA,EAAU,EAAE;AAC7E;AAEO,SAAS,wBAAwB,GAAA,EAA4B;AAClE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,YAAA,EAAc,MAAM,CAAC,aAAA,CAAc,GAAG,CAAC;AAAA,GACzC;AACF","file":"entry.cjs","sourcesContent":["import * as fsp from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nasync function readAaTxtFromPackAssets(): Promise<string> {\n // When published, `aa.txt` is shipped alongside this entry (copied to dist/).\n const abs = path.join(__dirname, \"aa.txt\");\n return await fsp.readFile(abs, \"utf8\");\n}\n\ntype LiteExtensionApi = { LiteWorkerAgent: new () => any; LiteCheckerAgent: new () => any };\n\nexport function createAaField(api: LiteExtensionApi): any {\n class AaWorker extends api.LiteWorkerAgent {\n public readonly commandId = \"aa\";\n public readonly help = {\n command: \"/aa\",\n description: \"Enterprise extension sample: prints Hello and shows @docs/ssot/aa.txt\",\n usage: \"/aa [--json]\",\n runOnEmpty: true,\n };\n public readonly steps = [\n {\n id: \"aa.print\",\n title: \"Print hello and aa.txt\",\n async run(ctx: any): Promise<any> {\n const wantsJson = ctx.parsed.flags.includes(\"json\") || ctx.parsed.options.json === \"true\";\n const content = await readAaTxtFromPackAssets().catch((): string => \"\");\n const text = [\"Hello, I'm Maria\", \"\", content || \"(missing: aa.txt in extension pack)\"].join(\"\\n\");\n return wantsJson ? { text, json: { ok: true, text } } : { text };\n },\n },\n ];\n }\n\n class AaChecker extends api.LiteCheckerAgent {\n public readonly commandId = \"aa\";\n public async check(_ctx: any, input: { output: any }): Promise<{ outcome: any; reasons: string[] }> {\n const t = String(input.output?.text || \"\").trim();\n if (!t) return { outcome: \"STOP\", reasons: [\"empty_output\"] };\n return { outcome: \"PASS\", reasons: [\"non_empty_output\"] };\n }\n }\n\n return { commandId: \"aa\", worker: new AaWorker(), checker: new AaChecker() };\n}\n\nexport function createLiteExtensionPack(api: LiteExtensionApi): any {\n return {\n packId: \"aa-test\",\n packName: \"aa test\",\n createFields: () => [createAaField(api)],\n };\n}\n\n"]}
@@ -0,0 +1,200 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs');
4
+ var fsp = require('fs/promises');
5
+ var os = require('os');
6
+ var path = require('path');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
27
+ var fsp__namespace = /*#__PURE__*/_interopNamespace(fsp);
28
+ var os__namespace = /*#__PURE__*/_interopNamespace(os);
29
+ var path__namespace = /*#__PURE__*/_interopNamespace(path);
30
+
31
+ var __getOwnPropNames = Object.getOwnPropertyNames;
32
+ var __commonJS = (cb, mod) => function __require() {
33
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
34
+ };
35
+ var require_postinstall = __commonJS({
36
+ "src/postinstall.ts"() {
37
+ function slugifyPackName(raw) {
38
+ const s0 = String(raw || "").trim().toLowerCase();
39
+ const s1 = s0.replace(/[^a-z0-9-]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
40
+ return s1 || "pack";
41
+ }
42
+ function resolveConfigDir() {
43
+ const env = String(process.env.MARIA_CONFIG_DIR || "").trim();
44
+ if (env) return env;
45
+ return path__namespace.join(os__namespace.homedir(), ".maria");
46
+ }
47
+ function normalizeEmail(s) {
48
+ return String(s || "").trim().toLowerCase();
49
+ }
50
+ function normalizePattern(p) {
51
+ return String(p || "").trim().toLowerCase();
52
+ }
53
+ function readArgValue(argv, flag) {
54
+ const f = String(flag || "").trim();
55
+ if (!f) return "";
56
+ for (let i = 0; i < argv.length; i++) {
57
+ const a = String(argv[i] || "");
58
+ if (a === f) {
59
+ const v = i + 1 < argv.length ? String(argv[i + 1] || "") : "";
60
+ return v.trim();
61
+ }
62
+ if (a.startsWith(`${f}=`)) {
63
+ return a.slice(f.length + 1).trim();
64
+ }
65
+ }
66
+ return "";
67
+ }
68
+ function normalizeEmailPatterns(raw) {
69
+ const out = [];
70
+ const seen = /* @__PURE__ */ new Set();
71
+ for (const p of raw) {
72
+ const n = normalizePattern(p);
73
+ if (!n) continue;
74
+ if (seen.has(n)) continue;
75
+ seen.add(n);
76
+ out.push(n);
77
+ }
78
+ return out.sort((a, b) => a.localeCompare(b));
79
+ }
80
+ function isEmailAllowed(emailRaw, patterns) {
81
+ const email = normalizeEmail(emailRaw);
82
+ if (!email) return false;
83
+ const pats = normalizeEmailPatterns(patterns);
84
+ for (const p of pats) {
85
+ if (!p) continue;
86
+ if (p.includes("*")) {
87
+ if (!p.startsWith("*@")) continue;
88
+ const suffix = p.slice(1);
89
+ if (suffix && email.endsWith(suffix)) return true;
90
+ continue;
91
+ }
92
+ if (email === p) return true;
93
+ }
94
+ return false;
95
+ }
96
+ async function loadPackConfigsFromDir(absDir) {
97
+ const ents = await fsp__namespace.readdir(absDir, { withFileTypes: true }).catch(() => []);
98
+ const packJsonAbs = [];
99
+ for (const e of ents) {
100
+ if (!e.isDirectory()) continue;
101
+ packJsonAbs.push(path__namespace.join(absDir, e.name, "pack.json"));
102
+ }
103
+ packJsonAbs.sort((a, b) => a.localeCompare(b));
104
+ const out = [];
105
+ for (const abs of packJsonAbs) {
106
+ const raw = await fsp__namespace.readFile(abs, "utf8").catch(() => "");
107
+ if (!raw.trim()) continue;
108
+ let obj = null;
109
+ try {
110
+ obj = JSON.parse(raw);
111
+ } catch {
112
+ obj = null;
113
+ }
114
+ const rec = obj && typeof obj === "object" ? obj : {};
115
+ const packId = String(rec.packId || "").trim();
116
+ const packName = String(rec.packName || "").trim();
117
+ const entryRelPath = String(rec.entryRelPath || "").trim();
118
+ const allowedEmailPatterns = Array.isArray(rec.allowedEmailPatterns) ? rec.allowedEmailPatterns.map((x) => String(x)) : [];
119
+ if (!packId || !packName || !entryRelPath) continue;
120
+ out.push({
121
+ packId,
122
+ packName,
123
+ entryRelPath,
124
+ allowedEmailPatterns: normalizeEmailPatterns(allowedEmailPatterns)
125
+ });
126
+ }
127
+ return out;
128
+ }
129
+ async function ensureFileMode600(abs) {
130
+ try {
131
+ if (process.platform === "win32") return;
132
+ await fsp__namespace.chmod(abs, 384);
133
+ } catch {
134
+ }
135
+ }
136
+ async function main() {
137
+ const argv = process.argv.slice(2);
138
+ const packNameRaw = readArgValue(argv, "--pack") || String(process.env.npm_config_pack || "").trim();
139
+ const emailRaw = readArgValue(argv, "--email") || String(process.env.npm_config_email || "").trim();
140
+ if (!packNameRaw) {
141
+ console.log("[maria-ext] Skipping: missing --pack");
142
+ return;
143
+ }
144
+ if (!emailRaw) {
145
+ console.log("[maria-ext] Skipping: missing --email");
146
+ return;
147
+ }
148
+ if (/[,\s]/.test(emailRaw)) {
149
+ console.log("[maria-ext] Invalid --email: must be a single email address (no spaces/commas)");
150
+ return;
151
+ }
152
+ const packName = packNameRaw;
153
+ const packIdFromName = slugifyPackName(packName);
154
+ const pkgRoot = path__namespace.join(__dirname, "..");
155
+ const packsDir = path__namespace.join(pkgRoot, "packs");
156
+ const configs = await loadPackConfigsFromDir(packsDir);
157
+ const pick = configs.find((p) => p.packId === packIdFromName) || configs.find((p) => p.packName.toLowerCase() === packName.toLowerCase());
158
+ if (!pick) {
159
+ console.log(`[maria-ext] Unknown pack: '${packName}'. Available: ${configs.map((c) => c.packName).join(", ")}`);
160
+ return;
161
+ }
162
+ if (!isEmailAllowed(emailRaw, pick.allowedEmailPatterns)) {
163
+ console.log(`[maria-ext] Not authorized for pack '${pick.packName}' with email '${emailRaw}'`);
164
+ return;
165
+ }
166
+ const entryAbsPath = path__namespace.join(pkgRoot, pick.entryRelPath);
167
+ if (!fs__namespace.existsSync(entryAbsPath)) {
168
+ console.log(`[maria-ext] Pack entry missing (build required): ${entryAbsPath}`);
169
+ return;
170
+ }
171
+ const cfg = resolveConfigDir();
172
+ const manifestsDir = path__namespace.join(cfg, "lite-ext", "packs");
173
+ await fsp__namespace.mkdir(manifestsDir, { recursive: true });
174
+ const manifest = {
175
+ packId: pick.packId,
176
+ packName: pick.packName,
177
+ entryAbsPath,
178
+ allowedEmailPatterns: pick.allowedEmailPatterns,
179
+ installedAt: (/* @__PURE__ */ new Date()).toISOString()
180
+ };
181
+ const manifestAbs = path__namespace.join(manifestsDir, `${pick.packId}.json`);
182
+ const tmp = `${manifestAbs}.tmp`;
183
+ await fsp__namespace.writeFile(tmp, JSON.stringify(manifest, null, 2) + "\n", "utf8");
184
+ await ensureFileMode600(tmp);
185
+ await fsp__namespace.rename(tmp, manifestAbs);
186
+ await ensureFileMode600(manifestAbs);
187
+ console.log(`[maria-ext] Installed pack '${manifest.packName}' (packId=${manifest.packId})`);
188
+ console.log(`[maria-ext] Authorized email: ${emailRaw}`);
189
+ console.log(`[maria-ext] Manifest: ${manifestAbs}`);
190
+ }
191
+ main().catch((e) => {
192
+ console.log("[maria-ext] postinstall failed:", e instanceof Error ? e.message : String(e));
193
+ });
194
+ }
195
+ });
196
+ var postinstall = require_postinstall();
197
+
198
+ module.exports = postinstall;
199
+ //# sourceMappingURL=postinstall.cjs.map
200
+ //# sourceMappingURL=postinstall.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/postinstall.ts"],"names":["path","os","fsp","fs"],"mappings":"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","file":"postinstall.cjs","sourcesContent":["/* eslint-disable no-console */\nimport * as fs from \"node:fs\";\nimport * as fsp from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\ntype PackConfig = {\n packId: string;\n packName: string;\n entryRelPath: string;\n allowedEmailPatterns: string[];\n};\n\nfunction slugifyPackName(raw: string): string {\n const s0 = String(raw || \"\").trim().toLowerCase();\n const s1 = s0\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s1 || \"pack\";\n}\n\nfunction resolveConfigDir(): string {\n const env = String(process.env.MARIA_CONFIG_DIR || \"\").trim();\n if (env) return env;\n return path.join(os.homedir(), \".maria\");\n}\n\nfunction normalizeEmail(s: string): string {\n return String(s || \"\").trim().toLowerCase();\n}\n\nfunction normalizePattern(p: string): string {\n return String(p || \"\").trim().toLowerCase();\n}\n\nfunction readArgValue(argv: string[], flag: string): string {\n const f = String(flag || \"\").trim();\n if (!f) return \"\";\n for (let i = 0; i < argv.length; i++) {\n const a = String(argv[i] || \"\");\n if (a === f) {\n const v = i + 1 < argv.length ? String(argv[i + 1] || \"\") : \"\";\n return v.trim();\n }\n if (a.startsWith(`${f}=`)) {\n return a.slice(f.length + 1).trim();\n }\n }\n return \"\";\n}\n\nfunction normalizeEmailPatterns(raw: string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const p of raw) {\n const n = normalizePattern(p);\n if (!n) continue;\n if (seen.has(n)) continue;\n seen.add(n);\n out.push(n);\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nfunction isEmailAllowed(emailRaw: string, patterns: string[]): boolean {\n const email = normalizeEmail(emailRaw);\n if (!email) return false;\n const pats = normalizeEmailPatterns(patterns);\n for (const p of pats) {\n if (!p) continue;\n if (p.includes(\"*\")) {\n // Only support \"*@domain\" suffix wildcard.\n if (!p.startsWith(\"*@\")) continue;\n const suffix = p.slice(1); // \"@domain\"\n if (suffix && email.endsWith(suffix)) return true;\n continue;\n }\n if (email === p) return true;\n }\n return false;\n}\n\nasync function loadPackConfigsFromDir(absDir: string): Promise<PackConfig[]> {\n const ents = await fsp.readdir(absDir, { withFileTypes: true }).catch((): any[] => []);\n const packJsonAbs: string[] = [];\n for (const e of ents) {\n if (!e.isDirectory()) continue;\n packJsonAbs.push(path.join(absDir, e.name, \"pack.json\"));\n }\n packJsonAbs.sort((a, b) => a.localeCompare(b));\n\n const out: PackConfig[] = [];\n for (const abs of packJsonAbs) {\n const raw = await fsp.readFile(abs, \"utf8\").catch((): string => \"\");\n if (!raw.trim()) continue;\n let obj: unknown = null;\n try {\n obj = JSON.parse(raw) as unknown;\n } catch {\n obj = null;\n }\n const rec = obj && typeof obj === \"object\" ? (obj as Record<string, unknown>) : {};\n const packId = String(rec.packId || \"\").trim();\n const packName = String(rec.packName || \"\").trim();\n const entryRelPath = String(rec.entryRelPath || \"\").trim();\n const allowedEmailPatterns = Array.isArray(rec.allowedEmailPatterns) ? rec.allowedEmailPatterns.map((x) => String(x)) : [];\n if (!packId || !packName || !entryRelPath) continue;\n out.push({\n packId,\n packName,\n entryRelPath,\n allowedEmailPatterns: normalizeEmailPatterns(allowedEmailPatterns),\n });\n }\n return out;\n}\n\nasync function ensureFileMode600(abs: string): Promise<void> {\n try {\n if (process.platform === \"win32\") return;\n await fsp.chmod(abs, 0o600);\n } catch {\n // ignore\n }\n}\n\nasync function main(): Promise<void> {\n // Source precedence:\n // - argv (developer/local invocation): node dist/postinstall.cjs --pack \"aa test\" --email \"user@...\"\n // - npm_config_* (npm postinstall): npm install ... --pack \"aa test\" --email \"user@...\"\n const argv = process.argv.slice(2);\n const packNameRaw = readArgValue(argv, \"--pack\") || String(process.env.npm_config_pack || \"\").trim();\n const emailRaw = readArgValue(argv, \"--email\") || String(process.env.npm_config_email || \"\").trim();\n\n if (!packNameRaw) {\n console.log(\"[maria-ext] Skipping: missing --pack\");\n return;\n }\n if (!emailRaw) {\n console.log(\"[maria-ext] Skipping: missing --email\");\n return;\n }\n // IMPORTANT: `--email` is a single email value (not a list).\n if (/[,\\s]/.test(emailRaw)) {\n console.log(\"[maria-ext] Invalid --email: must be a single email address (no spaces/commas)\");\n return;\n }\n\n const packName = packNameRaw;\n const packIdFromName = slugifyPackName(packName);\n\n const pkgRoot = path.join(__dirname, \"..\"); // dist/ -> package root\n const packsDir = path.join(pkgRoot, \"packs\");\n const configs = await loadPackConfigsFromDir(packsDir);\n const pick =\n configs.find((p) => p.packId === packIdFromName) ||\n configs.find((p) => p.packName.toLowerCase() === packName.toLowerCase());\n if (!pick) {\n console.log(`[maria-ext] Unknown pack: '${packName}'. Available: ${configs.map((c) => c.packName).join(\", \")}`);\n return;\n }\n\n if (!isEmailAllowed(emailRaw, pick.allowedEmailPatterns)) {\n console.log(`[maria-ext] Not authorized for pack '${pick.packName}' with email '${emailRaw}'`);\n return;\n }\n\n const entryAbsPath = path.join(pkgRoot, pick.entryRelPath);\n if (!fs.existsSync(entryAbsPath)) {\n console.log(`[maria-ext] Pack entry missing (build required): ${entryAbsPath}`);\n return;\n }\n\n const cfg = resolveConfigDir();\n const manifestsDir = path.join(cfg, \"lite-ext\", \"packs\");\n await fsp.mkdir(manifestsDir, { recursive: true });\n\n const manifest = {\n packId: pick.packId,\n packName: pick.packName,\n entryAbsPath,\n allowedEmailPatterns: pick.allowedEmailPatterns,\n installedAt: new Date().toISOString(),\n };\n\n const manifestAbs = path.join(manifestsDir, `${pick.packId}.json`);\n const tmp = `${manifestAbs}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(manifest, null, 2) + \"\\n\", \"utf8\");\n await ensureFileMode600(tmp);\n await fsp.rename(tmp, manifestAbs);\n await ensureFileMode600(manifestAbs);\n\n console.log(`[maria-ext] Installed pack '${manifest.packName}' (packId=${manifest.packId})`);\n console.log(`[maria-ext] Authorized email: ${emailRaw}`);\n console.log(`[maria-ext] Manifest: ${manifestAbs}`);\n}\n\nmain().catch((e: unknown) => {\n console.log(\"[maria-ext] postinstall failed:\", e instanceof Error ? e.message : String(e));\n});\n\n"]}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@bonginkan/maria-ext",
3
+ "version": "0.0.0",
4
+ "description": "MARIA-LITE extension installer and packs (enterprise/custom).",
5
+ "license": "SEE LICENSE IN LICENSE",
6
+ "author": "Bonginkan Inc.",
7
+ "type": "commonjs",
8
+ "files": [
9
+ "dist",
10
+ "packs",
11
+ "LICENSE",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsup && node scripts/postbuild-copy-pack-assets.cjs",
16
+ "prepack": "pnpm -s build",
17
+ "postinstall": "node dist/postinstall.cjs"
18
+ },
19
+ "dependencies": {
20
+ "@bonginkan/maria-lite": "^1.1.1"
21
+ },
22
+ "devDependencies": {
23
+ "tsup": "^8.5.1",
24
+ "typescript": "^5.9.3"
25
+ }
26
+ }
@@ -0,0 +1,44 @@
1
+ ##########################################+++++++#######++######################
2
+ #####################################+..-.....------++..----.###################
3
+ ##################################-................---....-----#################
4
+ ################################-..........--..--....-.....-----################
5
+ ###############################. .... .....--+-..-........-.----###############
6
+ ##############################... .......-------....-........----##############
7
+ #############################. ......-------.---..-...........-.-##############
8
+ ############################+ .....----.--.....--......... ..-.-+#############
9
+ ############################- .. .-...........--........ ...+.#############
10
+ ############################..... ......-+.... ............ ...#.+############
11
+ ###########################+ .. ..-##+.........+--.. .-.+-+############
12
+ ###########################++ .+....-..++-..-....+.++. .----.############
13
+ ###########################++. ........--+.-....+...+-++.-. ...-----############
14
+ ###########################+-.. ..-..-++-###++#-+.--+++..-.....----+-###########
15
+ ##########################+----.-.-+--+#+++++++#+......#-- ...--.+-###########
16
+ ########################+-+++--+.----++#########-..-.-##--. ...--++-###########
17
+ ######################----++--+. ...############+.-+--+#-# .....----###########
18
+ #####################++-.#-+.--..+ -#+##+++####-..-#-#+#+#.......----###########
19
+ #####################-##+---+-+-.+.+###++###+---..##--+##+.-.....--.-###########
20
+ #####################-##+++##+#-.+.+#####+..--+---##++#-#+.-.-...--.-+##########
21
+ #####################-+##+#++##-++-###-+++---+++-#++###+##.+........--##########
22
+ ####################-+++++-###+.-...---+++..-++-+######.-++-.. .--.--+#########
23
+ ##################..++++++###......-++++.---+-+-######------......-..--+########
24
+ #################---++++--#+. .--#+-+++++.++-####+---.--++-.......-.########
25
+ ###############+..++----.#-.. ..---++#+-+##+--##-----.-----.---...-.-#######
26
+ ##############+...-++-...........-+---+##++##++#-..-......---.------...#--######
27
+ #############............ ....-++++++#+-+++###-.-----..-.....-----. .--#+.#####
28
+ ############-.. .. .... ..---######---+######-.------.-......----.. .--#+-####
29
+ ###########-. .... ...--########++#######-.-----..........----.. ...--#++###
30
+ ##########-. ... .-########++#######-------...........---... .. .--#-###
31
+ ++######+.. ... . .########+########+.----..-.... ..--.. . .. .-#+##
32
+ +###-###... ...-.... . -####+##-+#######+-----.---.... ...--.......... ..-##
33
+ -+-####+....---..- .. ++++++#-########-----..-..... .......-.. .......##
34
+ .++-#######-...... ..---+++-+++++++++.--.....-.. . ...... .. ...-#
35
+ .-++###########......+#..-++-+++-++--+++.......... . .......... ....+-.+..#
36
+ #.-++#------######-+###...-+-+++-+-+-++... .. .. .......-. .. ...+-.#++.
37
+ #-------------+#####+#-...--++++-+--+-. ... .... ...... .-..##+-
38
+ ##...-....-------######--.---+++-+++-- . . ..--.-.....+-.. .....-##--
39
+ #####--.......---+++-+#+-+++#+-+++-++. .. .. .........--..-#-... ...##+--
40
+ ##########-.. ....--+++++---++##+++-. .. ......----. ---.... ..##++-
41
+ ##############...----...----++####-........ ...-............++#..--#+.. ..##.#-
42
+ ##############+.....--++###########+++.-------..-............##-+..-.... ..#-#++
43
+ ###############+..---.----++++++++++-##.----.. ..-........-###-##. -+. .-#-##
44
+ ####################- ..-+++++++++--++-... ... .....-##-+##..-#. .-.-####
@@ -0,0 +1,54 @@
1
+ import * as fsp from "node:fs/promises";
2
+ import * as path from "node:path";
3
+
4
+ async function readAaTxtFromPackAssets(): Promise<string> {
5
+ // When published, `aa.txt` is shipped alongside this entry (copied to dist/).
6
+ const abs = path.join(__dirname, "aa.txt");
7
+ return await fsp.readFile(abs, "utf8");
8
+ }
9
+
10
+ type LiteExtensionApi = { LiteWorkerAgent: new () => any; LiteCheckerAgent: new () => any };
11
+
12
+ export function createAaField(api: LiteExtensionApi): any {
13
+ class AaWorker extends api.LiteWorkerAgent {
14
+ public readonly commandId = "aa";
15
+ public readonly help = {
16
+ command: "/aa",
17
+ description: "Enterprise extension sample: prints Hello and shows @docs/ssot/aa.txt",
18
+ usage: "/aa [--json]",
19
+ runOnEmpty: true,
20
+ };
21
+ public readonly steps = [
22
+ {
23
+ id: "aa.print",
24
+ title: "Print hello and aa.txt",
25
+ async run(ctx: any): Promise<any> {
26
+ const wantsJson = ctx.parsed.flags.includes("json") || ctx.parsed.options.json === "true";
27
+ const content = await readAaTxtFromPackAssets().catch((): string => "");
28
+ const text = ["Hello, I'm Maria", "", content || "(missing: aa.txt in extension pack)"].join("\n");
29
+ return wantsJson ? { text, json: { ok: true, text } } : { text };
30
+ },
31
+ },
32
+ ];
33
+ }
34
+
35
+ class AaChecker extends api.LiteCheckerAgent {
36
+ public readonly commandId = "aa";
37
+ public async check(_ctx: any, input: { output: any }): Promise<{ outcome: any; reasons: string[] }> {
38
+ const t = String(input.output?.text || "").trim();
39
+ if (!t) return { outcome: "STOP", reasons: ["empty_output"] };
40
+ return { outcome: "PASS", reasons: ["non_empty_output"] };
41
+ }
42
+ }
43
+
44
+ return { commandId: "aa", worker: new AaWorker(), checker: new AaChecker() };
45
+ }
46
+
47
+ export function createLiteExtensionPack(api: LiteExtensionApi): any {
48
+ return {
49
+ packId: "aa-test",
50
+ packName: "aa test",
51
+ createFields: () => [createAaField(api)],
52
+ };
53
+ }
54
+
@@ -0,0 +1,7 @@
1
+ {
2
+ "packId": "aa-test",
3
+ "packName": "aa test",
4
+ "entryRelPath": "dist/packs/aa-test/entry.cjs",
5
+ "allowedEmailPatterns": ["l@myth-ai.one", "*@bonginkan.ai"]
6
+ }
7
+