@pasosdejesus/mpdj 0.2.7 → 0.2.9
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/SKILL.md +1 -1
- package/dist/SKILL.md +1 -1
- package/dist/blockchain/SlearnInfo.js +4 -4
- package/dist/blockchain/SlearnInfo.js.map +1 -1
- package/dist/blockchain/credential-images.d.ts +51 -0
- package/dist/blockchain/credential-images.d.ts.map +1 -1
- package/dist/blockchain/credential-images.js +93 -2
- package/dist/blockchain/credential-images.js.map +1 -1
- package/dist/ia/adJ.md +20 -20
- package/dist/ia/alineacion_6_evidencias.md +283 -0
- package/dist/ia/alineacion_bayes_general.md +302 -39
- package/dist/ia/alineacion_bayes_profecia_mayor20G.md +256 -216
- package/dist/ia/alineacion_dinamica_poblaciones.md +26 -0
- package/dist/ia/alineacion_estetico.md +363 -0
- package/dist/ia/alineacion_existencial.md +363 -0
- package/dist/ia/alineacion_filosofia.md +395 -0
- package/dist/ia/alineacion_historico.md +391 -0
- package/dist/ia/alineacion_informacion.md +212 -0
- package/dist/ia/alineacion_informacion_cadena.md +210 -0
- package/dist/ia/alineacion_mejor_marco_operativo.md +179 -0
- package/dist/ia/alineacion_misionero.md +336 -0
- package/dist/ia/alineacion_moral.md +408 -0
- package/dist/ia/alineacion_servicio.md +309 -47
- package/dist/ia/alineacion_testimonios.md +212 -76
- package/dist/tasks/adJ.js +2 -2
- package/dist/tasks/adJ.js.map +1 -1
- package/dist/tasks/ai.js +2 -2
- package/dist/tasks/ai.js.map +1 -1
- package/dist/tasks/principles.js +2 -2
- package/dist/tasks/principles.js.map +1 -1
- package/dist/tasks/skill.js +2 -2
- package/dist/tasks/skill.js.map +1 -1
- package/ia/adJ.md +20 -20
- package/ia/alineacion_6_evidencias.md +283 -0
- package/ia/alineacion_bayes_general.md +302 -39
- package/ia/alineacion_bayes_profecia_mayor20G.md +256 -216
- package/ia/alineacion_dinamica_poblaciones.md +26 -0
- package/ia/alineacion_estetico.md +363 -0
- package/ia/alineacion_existencial.md +363 -0
- package/ia/alineacion_filosofia.md +395 -0
- package/ia/alineacion_historico.md +391 -0
- package/ia/alineacion_informacion.md +212 -0
- package/ia/alineacion_informacion_cadena.md +210 -0
- package/ia/alineacion_mejor_marco_operativo.md +179 -0
- package/ia/alineacion_misionero.md +336 -0
- package/ia/alineacion_moral.md +408 -0
- package/ia/alineacion_servicio.md +309 -47
- package/ia/alineacion_testimonios.md +212 -76
- package/package.json +3 -2
- package/dist/ia/manifiesto.md +0 -45
- package/ia/manifiesto.md +0 -45
package/SKILL.md
CHANGED
|
@@ -122,7 +122,7 @@ Creates/replaces files from clipboard content.
|
|
|
122
122
|
|
|
123
123
|
Applies changes from clipboard (3 formats: full block, SEARCH/REPLACE, unified diff).
|
|
124
124
|
|
|
125
|
-
>
|
|
125
|
+
> [WARN] Paths are relative to current directory. `___SEARCH___` must be exact copy including whitespace. Fuzzy matching (85%).
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
128
|
./bin/m ai:edit
|
package/dist/SKILL.md
CHANGED
|
@@ -122,7 +122,7 @@ Creates/replaces files from clipboard content.
|
|
|
122
122
|
|
|
123
123
|
Applies changes from clipboard (3 formats: full block, SEARCH/REPLACE, unified diff).
|
|
124
124
|
|
|
125
|
-
>
|
|
125
|
+
> [WARN] Paths are relative to current directory. `___SEARCH___` must be exact copy including whitespace. Fuzzy matching (85%).
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
128
|
./bin/m ai:edit
|
|
@@ -24,20 +24,20 @@ const DEFAULT_LINKS = [
|
|
|
24
24
|
];
|
|
25
25
|
const tS = {
|
|
26
26
|
en: {
|
|
27
|
-
title: '
|
|
27
|
+
title: 'SLEARN Cashback',
|
|
28
28
|
what: 'What is SLEARN?',
|
|
29
29
|
description: 'When you donate, you earn 10% back in SLEARN tokens — a reward for your generosity.',
|
|
30
30
|
contractLink: 'Verified contract',
|
|
31
|
-
unverified: '
|
|
31
|
+
unverified: 'Verify on learn.tg to unlock SLEARN and start taking courses.',
|
|
32
32
|
learnTg: 'Take courses on learn.tg',
|
|
33
33
|
stableSl: 'Redeem on stable-sl',
|
|
34
34
|
},
|
|
35
35
|
es: {
|
|
36
|
-
title: '
|
|
36
|
+
title: 'SLEARN Cashback',
|
|
37
37
|
what: '¿Qué es SLEARN?',
|
|
38
38
|
description: 'Al donar, recibes el 10% de vuelta en tokens SLEARN — una recompensa por tu generosidad.',
|
|
39
39
|
contractLink: 'Contrato verificado',
|
|
40
|
-
unverified: '
|
|
40
|
+
unverified: 'Verifícate en learn.tg para desbloquear SLEARN y comenzar a tomar cursos.',
|
|
41
41
|
learnTg: 'Tomar cursos en learn.tg',
|
|
42
42
|
stableSl: 'Canjear en stable-sl',
|
|
43
43
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SlearnInfo.js","sourceRoot":"","sources":["../../src/blockchain/SlearnInfo.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAc3E,MAAM,aAAa,GAAiC;IAClD,EAAE,EAAE;QACF,EAAE,KAAK,EAAE,QAAQ,EAAI,IAAI,EAAE,qCAAqC,EAAY,IAAI,EAAE,QAAQ,EAAE;QAC5F,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,yDAAyD,EAAE,IAAI,EAAE,MAAM,EAAE;QACvG,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,2CAA2C,EAAG,IAAI,EAAE,QAAQ,EAAE;QAC7F,EAAE,KAAK,EAAE,QAAQ,EAAI,IAAI,EAAE,wHAAwH,EAAE,IAAI,EAAE,QAAQ,EAAE;KACtK;IACD,EAAE,EAAE;QACF,EAAE,KAAK,EAAE,OAAO,EAAK,IAAI,EAAE,iCAAiC,EAAiB,IAAI,EAAE,QAAQ,EAAE;QAC7F,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,4DAA4D,EAAE,IAAI,EAAE,MAAM,EAAE;QAC3G,EAAE,KAAK,EAAE,cAAc,EAAG,IAAI,EAAE,0CAA0C,EAAG,IAAI,EAAE,QAAQ,EAAE;QAC7F,EAAE,KAAK,EAAE,SAAS,EAAG,IAAI,EAAE,6HAA6H,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC3K;CACF,CAAA;AAED,MAAM,aAAa,GAAiB;IAClC,EAAE,KAAK,EAAE,UAAU,EAAI,IAAI,EAAE,kBAAkB,EAAE;IACjD,EAAE,KAAK,EAAE,WAAW,EAAG,IAAI,EAAE,2BAA2B,EAAE;CAC3D,CAAA;AAED,MAAM,EAAE,GAAG;IACT,EAAE,EAAE;QACF,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"SlearnInfo.js","sourceRoot":"","sources":["../../src/blockchain/SlearnInfo.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,57 @@ export declare function extractSvgInner(svgText: string): string;
|
|
|
8
8
|
* Validate user's SVG file before composition.
|
|
9
9
|
*/
|
|
10
10
|
export declare function validateSvg(svgText: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Geometry of the bottom band, in the 512×512 viewBox: the title starts at
|
|
13
|
+
* `titleX` and the site name ends at `siteEndX`, both on the `baselineY` baseline,
|
|
14
|
+
* with at least `gap` pixels between them.
|
|
15
|
+
*/
|
|
16
|
+
export declare const BAND: {
|
|
17
|
+
readonly titleX: 8;
|
|
18
|
+
readonly siteEndX: 501;
|
|
19
|
+
readonly baselineY: 498;
|
|
20
|
+
readonly gap: 16;
|
|
21
|
+
/** width both texts may occupy together (titleX to siteEndX, minus the gap) */
|
|
22
|
+
readonly maxTextWidth: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Absolute cap of course-title characters drawn in the band (learn.tg#195,
|
|
26
|
+
* https://github.com/pasosdeJesus/learn.tg/issues/195): the band also carries the
|
|
27
|
+
* site name/brand on the right, so the title is truncated and its font shrinks
|
|
28
|
+
* until it fits the space the site name leaves.
|
|
29
|
+
*/
|
|
30
|
+
export declare const MAX_TITLE_LENGTH = 25;
|
|
31
|
+
/** Estimated width in px of `text` drawn bold at `fontSize`. */
|
|
32
|
+
export declare function estimateTextWidth(text: string, fontSize: number): number;
|
|
33
|
+
/**
|
|
34
|
+
* Title for the band: the first `maxLength` characters and `...` when the name is
|
|
35
|
+
* longer (learn.tg#195).
|
|
36
|
+
*/
|
|
37
|
+
export declare function credentialTitle(displayName?: string, maxLength?: number): string;
|
|
38
|
+
export interface CredentialTitleLayout {
|
|
39
|
+
/** title drawn on the left (already truncated; the caller still escapes it) */
|
|
40
|
+
title: string;
|
|
41
|
+
/** site name drawn on the right */
|
|
42
|
+
site: string;
|
|
43
|
+
titleSize: number;
|
|
44
|
+
siteSize: number;
|
|
45
|
+
/** estimated widths, so callers and tests can check the fit */
|
|
46
|
+
titleWidth: number;
|
|
47
|
+
siteWidth: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Layout of the bottom band. Before this change the font was only shrunk for
|
|
51
|
+
* titles longer than 20 characters, which counted characters instead of measuring
|
|
52
|
+
* width: a 20-character title at 36px is wider than a 28-character one at 20px,
|
|
53
|
+
* and the available width also depends on the site name (a 17-character domain
|
|
54
|
+
* leaves far less room than 'learn.tg'). Both cases still overlapped on real
|
|
55
|
+
* badges (learn.tg#195).
|
|
56
|
+
*
|
|
57
|
+
* The site name is kept whole whenever it fits, shrinking its font; the title
|
|
58
|
+
* shrinks from 36px to 20px and is then truncated until the estimated widths fit
|
|
59
|
+
* `BAND.maxTextWidth`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function credentialTitleLayout(displayName: string, siteName: string): CredentialTitleLayout;
|
|
11
62
|
export interface ComposeParams {
|
|
12
63
|
userSvgPath: string;
|
|
13
64
|
tokenId: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-images.d.ts","sourceRoot":"","sources":["../../src/blockchain/credential-images.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK9C,CAAA;AAED,eAAO,MAAM,WAAW,+EAA+E,CAAA;AAuBvG;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBjD;AAkED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,aAAa;;;
|
|
1
|
+
{"version":3,"file":"credential-images.d.ts","sourceRoot":"","sources":["../../src/blockchain/credential-images.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK9C,CAAA;AAED,eAAO,MAAM,WAAW,+EAA+E,CAAA;AAuBvG;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAoBjD;AAkED;;;;GAIG;AACH,eAAO,MAAM,IAAI;;;;;IAKf,+EAA+E;;CAEvE,CAAA;AAWV;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAUlC,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,SAAmB,GAAG,MAAM,CAK1F;AAUD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CAsBlG;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,aAAa;;;GAuDjE"}
|
|
@@ -145,6 +145,96 @@ function getSiteLogo(site, publicDir) {
|
|
|
145
145
|
// 3. Last resort: inline default
|
|
146
146
|
return SITE_LOGOS[site] || '';
|
|
147
147
|
}
|
|
148
|
+
// ==================== COMPOSITION ====================
|
|
149
|
+
/**
|
|
150
|
+
* Geometry of the bottom band, in the 512×512 viewBox: the title starts at
|
|
151
|
+
* `titleX` and the site name ends at `siteEndX`, both on the `baselineY` baseline,
|
|
152
|
+
* with at least `gap` pixels between them.
|
|
153
|
+
*/
|
|
154
|
+
export const BAND = {
|
|
155
|
+
titleX: 8,
|
|
156
|
+
siteEndX: 501,
|
|
157
|
+
baselineY: 498,
|
|
158
|
+
gap: 16,
|
|
159
|
+
/** width both texts may occupy together (titleX to siteEndX, minus the gap) */
|
|
160
|
+
maxTextWidth: 501 - 8 - 16,
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Average advance per character, in em, for bold sans-serif text. Measured with
|
|
164
|
+
* librsvg (rsvg-convert) over course titles and site names: 0.438 (site names) to
|
|
165
|
+
* 0.557 (all-wide lowercase). 0.58 leaves margin for other font fallbacks, which
|
|
166
|
+
* is why the rendered fit is asserted too, in
|
|
167
|
+
* `tests/credential-images-band.test.ts`.
|
|
168
|
+
*/
|
|
169
|
+
const CHAR_WIDTH_EM = 0.58;
|
|
170
|
+
/**
|
|
171
|
+
* Absolute cap of course-title characters drawn in the band (learn.tg#195,
|
|
172
|
+
* https://github.com/pasosdeJesus/learn.tg/issues/195): the band also carries the
|
|
173
|
+
* site name/brand on the right, so the title is truncated and its font shrinks
|
|
174
|
+
* until it fits the space the site name leaves.
|
|
175
|
+
*/
|
|
176
|
+
export const MAX_TITLE_LENGTH = 25;
|
|
177
|
+
/** The site name shrinks (never below `SITE_MIN_FONT_SIZE`) to leave room for the title. */
|
|
178
|
+
const SITE_MAX_WIDTH = 260;
|
|
179
|
+
const SITE_MAX_FONT_SIZE = 32;
|
|
180
|
+
const SITE_MIN_FONT_SIZE = 18;
|
|
181
|
+
const TITLE_MAX_FONT_SIZE = 36;
|
|
182
|
+
const TITLE_MIN_FONT_SIZE = 20;
|
|
183
|
+
/** Estimated width in px of `text` drawn bold at `fontSize`. */
|
|
184
|
+
export function estimateTextWidth(text, fontSize) {
|
|
185
|
+
return Math.round(text.length * fontSize * CHAR_WIDTH_EM);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Title for the band: the first `maxLength` characters and `...` when the name is
|
|
189
|
+
* longer (learn.tg#195).
|
|
190
|
+
*/
|
|
191
|
+
export function credentialTitle(displayName, maxLength = MAX_TITLE_LENGTH) {
|
|
192
|
+
if (typeof displayName !== 'string')
|
|
193
|
+
return '';
|
|
194
|
+
return displayName.length > maxLength
|
|
195
|
+
? `${displayName.slice(0, maxLength)}...`
|
|
196
|
+
: displayName;
|
|
197
|
+
}
|
|
198
|
+
function fitSiteFontSize(siteName) {
|
|
199
|
+
let size = SITE_MAX_FONT_SIZE;
|
|
200
|
+
while (size > SITE_MIN_FONT_SIZE && estimateTextWidth(siteName, size) > SITE_MAX_WIDTH) {
|
|
201
|
+
size -= 2;
|
|
202
|
+
}
|
|
203
|
+
return size;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Layout of the bottom band. Before this change the font was only shrunk for
|
|
207
|
+
* titles longer than 20 characters, which counted characters instead of measuring
|
|
208
|
+
* width: a 20-character title at 36px is wider than a 28-character one at 20px,
|
|
209
|
+
* and the available width also depends on the site name (a 17-character domain
|
|
210
|
+
* leaves far less room than 'learn.tg'). Both cases still overlapped on real
|
|
211
|
+
* badges (learn.tg#195).
|
|
212
|
+
*
|
|
213
|
+
* The site name is kept whole whenever it fits, shrinking its font; the title
|
|
214
|
+
* shrinks from 36px to 20px and is then truncated until the estimated widths fit
|
|
215
|
+
* `BAND.maxTextWidth`.
|
|
216
|
+
*/
|
|
217
|
+
export function credentialTitleLayout(displayName, siteName) {
|
|
218
|
+
const name = typeof displayName === 'string' ? displayName : '';
|
|
219
|
+
const siteNameText = typeof siteName === 'string' ? siteName : '';
|
|
220
|
+
const siteSize = fitSiteFontSize(siteNameText);
|
|
221
|
+
let site = siteNameText;
|
|
222
|
+
if (estimateTextWidth(site, siteSize) > SITE_MAX_WIDTH) {
|
|
223
|
+
const maxSiteChars = Math.max(1, Math.floor(SITE_MAX_WIDTH / (siteSize * CHAR_WIDTH_EM)) - 3);
|
|
224
|
+
site = credentialTitle(site, maxSiteChars);
|
|
225
|
+
}
|
|
226
|
+
const siteWidth = estimateTextWidth(site, siteSize);
|
|
227
|
+
const available = Math.max(0, BAND.maxTextWidth - siteWidth);
|
|
228
|
+
const titleSize = estimateTextWidth(name, TITLE_MAX_FONT_SIZE) <= available
|
|
229
|
+
? TITLE_MAX_FONT_SIZE
|
|
230
|
+
: TITLE_MIN_FONT_SIZE;
|
|
231
|
+
let title = credentialTitle(name, MAX_TITLE_LENGTH);
|
|
232
|
+
if (estimateTextWidth(title, titleSize) > available) {
|
|
233
|
+
const maxChars = Math.max(1, Math.floor(available / (titleSize * CHAR_WIDTH_EM)) - 3);
|
|
234
|
+
title = credentialTitle(name, maxChars);
|
|
235
|
+
}
|
|
236
|
+
return { title, site, titleSize, siteSize, titleWidth: estimateTextWidth(title, titleSize), siteWidth };
|
|
237
|
+
}
|
|
148
238
|
/**
|
|
149
239
|
* Compose credential image by layering user's SVG icon with
|
|
150
240
|
* programmatic elements (border, site logo, lock/star overlays).
|
|
@@ -162,6 +252,7 @@ export async function composeCredentialImage(params) {
|
|
|
162
252
|
const siteLogo = getSiteLogo(site, publicDir);
|
|
163
253
|
if (!siteLogo)
|
|
164
254
|
throw new Error(`Unknown site: ${site}`);
|
|
255
|
+
const band = credentialTitleLayout(displayName, siteName);
|
|
165
256
|
const generatedDir = path.join(publicDir, 'img', 'credential', 'generated');
|
|
166
257
|
const pngDir = path.join(publicDir, 'img', 'credential');
|
|
167
258
|
fs.mkdirSync(generatedDir, { recursive: true });
|
|
@@ -175,8 +266,8 @@ export async function composeCredentialImage(params) {
|
|
|
175
266
|
`<rect x="0" y="464" width="512" height="48" rx="0" fill="${color}" opacity="0.15"/>`,
|
|
176
267
|
`<rect x="0" y="464" width="512" height="3" rx="0" fill="${color}" opacity="0.6"/>`,
|
|
177
268
|
`<g transform="translate(405,364)">${siteLogo}</g>`,
|
|
178
|
-
`<text x="
|
|
179
|
-
`<text x="
|
|
269
|
+
`<text x="${BAND.siteEndX}" y="${BAND.baselineY}" font-family="${FONT_FAMILY}" font-weight="700" font-size="${band.siteSize}" fill="${color}" text-anchor="end">${xmlEscape(band.site)}</text>`,
|
|
270
|
+
`<text x="${BAND.titleX}" y="${BAND.baselineY}" font-family="${FONT_FAMILY}" font-weight="700" font-size="${band.titleSize}" fill="${color}">${xmlEscape(band.title)}</text>`,
|
|
180
271
|
];
|
|
181
272
|
if (isSoulbound)
|
|
182
273
|
layers.push(getLockSvg(color, publicDir));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credential-images.js","sourceRoot":"","sources":["../../src/blockchain/credential-images.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"credential-images.js","sourceRoot":"","sources":["../../src/blockchain/credential-images.ts"],"names":[],"mappings":"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"}
|
package/dist/ia/adJ.md
CHANGED
|
@@ -12,10 +12,10 @@ when AI agents assume GNU/Linux conventions. Add new entries as they surface.
|
|
|
12
12
|
### sed — BSD sed requires backup extension
|
|
13
13
|
|
|
14
14
|
```sh
|
|
15
|
-
#
|
|
15
|
+
# [FAIL] GNU
|
|
16
16
|
sed -i 's/foo/bar/' file
|
|
17
17
|
|
|
18
|
-
#
|
|
18
|
+
# [OK] BSD — empty string for no backup
|
|
19
19
|
sed -i '' 's/foo/bar/' file
|
|
20
20
|
```
|
|
21
21
|
|
|
@@ -28,13 +28,13 @@ BSD sed also does NOT support:
|
|
|
28
28
|
### grep — BSD grep, not GNU
|
|
29
29
|
|
|
30
30
|
```sh
|
|
31
|
-
#
|
|
31
|
+
# [FAIL] GNU-only flags
|
|
32
32
|
grep -P 'pattern' # -P (Perl regex) does not exist
|
|
33
33
|
grep -oP 'pattern' # same
|
|
34
34
|
grep --exclude-dir=... # use --exclude instead
|
|
35
35
|
grep --include='*.ts' # GNU-only; use find -exec grep instead
|
|
36
36
|
|
|
37
|
-
#
|
|
37
|
+
# [OK] BSD-compatible
|
|
38
38
|
grep -E 'pattern' # extended regex
|
|
39
39
|
grep -c 'a' file # OK for single file
|
|
40
40
|
# Multi-file: prefer separate invocations or handle exit code 1
|
|
@@ -47,10 +47,10 @@ find . -name '*.ts' -exec grep -l 'pattern' {} +
|
|
|
47
47
|
### bash — not at /bin/bash
|
|
48
48
|
|
|
49
49
|
```sh
|
|
50
|
-
#
|
|
50
|
+
# [FAIL]
|
|
51
51
|
#!/bin/bash
|
|
52
52
|
|
|
53
|
-
#
|
|
53
|
+
# [OK]
|
|
54
54
|
#!/usr/bin/env bash
|
|
55
55
|
# Or: /usr/local/bin/bash
|
|
56
56
|
```
|
|
@@ -73,10 +73,10 @@ BSD utilities can produce exit code 1 in pipelines where GNU returns 0.
|
|
|
73
73
|
Example: `grep -c 'x' file1 file2 | head` — exit 1 if any file has 0 matches.
|
|
74
74
|
|
|
75
75
|
```sh
|
|
76
|
-
#
|
|
76
|
+
# [FAIL] May silently fail
|
|
77
77
|
grep -c 'pattern' f1 f2 | head
|
|
78
78
|
|
|
79
|
-
#
|
|
79
|
+
# [OK] Separate invocations or ignore exit code
|
|
80
80
|
grep -c 'pattern' f1; grep -c 'pattern' f2
|
|
81
81
|
```
|
|
82
82
|
|
|
@@ -87,31 +87,31 @@ grep -c 'pattern' f1; grep -c 'pattern' f2
|
|
|
87
87
|
### Privilege escalation: doas, not sudo
|
|
88
88
|
|
|
89
89
|
```sh
|
|
90
|
-
#
|
|
90
|
+
# [FAIL]
|
|
91
91
|
sudo command
|
|
92
92
|
|
|
93
|
-
#
|
|
93
|
+
# [OK]
|
|
94
94
|
doas command
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
### Package management: pkg_add, not apt/yum
|
|
98
98
|
|
|
99
99
|
```sh
|
|
100
|
-
#
|
|
100
|
+
# [FAIL]
|
|
101
101
|
apt install pkg
|
|
102
102
|
yum install pkg
|
|
103
103
|
|
|
104
|
-
#
|
|
104
|
+
# [OK]
|
|
105
105
|
doas pkg_add pkgname
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
### Service management: rcctl, not systemctl
|
|
109
109
|
|
|
110
110
|
```sh
|
|
111
|
-
#
|
|
111
|
+
# [FAIL]
|
|
112
112
|
systemctl start postgresql
|
|
113
113
|
|
|
114
|
-
#
|
|
114
|
+
# [OK]
|
|
115
115
|
doas rcctl start postgresql
|
|
116
116
|
```
|
|
117
117
|
|
|
@@ -121,10 +121,10 @@ doas rcctl start postgresql
|
|
|
121
121
|
`/proc/meminfo`, etc. Use `sysctl` instead:
|
|
122
122
|
|
|
123
123
|
```sh
|
|
124
|
-
#
|
|
124
|
+
# [FAIL]
|
|
125
125
|
cat /proc/cpuinfo
|
|
126
126
|
|
|
127
|
-
#
|
|
127
|
+
# [OK]
|
|
128
128
|
sysctl hw.model hw.ncpu
|
|
129
129
|
```
|
|
130
130
|
|
|
@@ -135,10 +135,10 @@ sysctl hw.model hw.ncpu
|
|
|
135
135
|
### System user: _postgresql
|
|
136
136
|
|
|
137
137
|
```sh
|
|
138
|
-
#
|
|
138
|
+
# [FAIL] — assumes Linux
|
|
139
139
|
PGUSER=postgres
|
|
140
140
|
|
|
141
|
-
#
|
|
141
|
+
# [OK] — OpenBSD
|
|
142
142
|
PGUSER=_postgresql
|
|
143
143
|
```
|
|
144
144
|
|
|
@@ -186,10 +186,10 @@ Vitest (which depends on Rollup):
|
|
|
186
186
|
### make — BSD make, not GNU
|
|
187
187
|
|
|
188
188
|
```sh
|
|
189
|
-
#
|
|
189
|
+
# [FAIL] GNU-specific
|
|
190
190
|
make -j$(nproc)
|
|
191
191
|
|
|
192
|
-
#
|
|
192
|
+
# [OK] BSD
|
|
193
193
|
make -j$(sysctl -n hw.ncpuonline)
|
|
194
194
|
```
|
|
195
195
|
|