@pasosdejesus/mpdj 0.1.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.
Files changed (103) hide show
  1. package/LICENSE.md +16 -0
  2. package/SKILL.md +310 -0
  3. package/dist/SKILL.md +310 -0
  4. package/dist/abis/PasosDeJesusCredentials.json +1342 -0
  5. package/dist/blockchain/AddSlearnButton.d.ts +5 -0
  6. package/dist/blockchain/AddSlearnButton.js +58 -0
  7. package/dist/blockchain/SlearnInfo.d.ts +22 -0
  8. package/dist/blockchain/SlearnInfo.js +68 -0
  9. package/dist/blockchain/admin-credentials.d.ts +29 -0
  10. package/dist/blockchain/admin-credentials.js +91 -0
  11. package/dist/blockchain/credential-cache.d.ts +33 -0
  12. package/dist/blockchain/credential-cache.js +129 -0
  13. package/dist/blockchain/credential-images.d.ts +30 -0
  14. package/dist/blockchain/credential-images.js +199 -0
  15. package/dist/blockchain/credentials.d.ts +66 -0
  16. package/dist/blockchain/credentials.js +128 -0
  17. package/dist/blockchain/ecosystem-addresses.d.ts +9 -0
  18. package/dist/blockchain/ecosystem-addresses.js +23 -0
  19. package/dist/blockchain/index.d.ts +6 -0
  20. package/dist/blockchain/index.js +12 -0
  21. package/dist/ia/adJ.md +181 -0
  22. package/dist/ia/alineacion_bayes_general.md +60 -0
  23. package/dist/ia/alineacion_bayes_profecia_mayor20G.md +220 -0
  24. package/dist/ia/alineacion_servicio.md +49 -0
  25. package/dist/ia/alineacion_testimonios.md +268 -0
  26. package/dist/ia/construir_en_adJ_y_celo.md +239 -0
  27. package/dist/ia/entrenamiento-marcos.jsonl +23 -0
  28. package/dist/ia/entrenamiento-no-adivinar.jsonl +15 -0
  29. package/dist/ia/estilo_entrenamiento.jsonl +10 -0
  30. package/dist/ia/indice_entrenamiento.json +43 -0
  31. package/dist/ia/m.jsonl +3 -0
  32. package/dist/ia/manifiesto.md +45 -0
  33. package/dist/ia/piedra_fundamental/README.md +31 -0
  34. package/dist/ia/piedra_fundamental/marcos-01.usfm +68 -0
  35. package/dist/ia/piedra_fundamental/marcos-02.usfm +46 -0
  36. package/dist/ia/piedra_fundamental/marcos-03.usfm +48 -0
  37. package/dist/ia/piedra_fundamental/marcos-04.usfm +59 -0
  38. package/dist/ia/piedra_fundamental/marcos-05.usfm +65 -0
  39. package/dist/ia/piedra_fundamental/marcos-06.usfm +78 -0
  40. package/dist/ia/piedra_fundamental/marcos-07.usfm +53 -0
  41. package/dist/ia/piedra_fundamental/marcos-08.usfm +63 -0
  42. package/dist/ia/piedra_fundamental/marcos-09.usfm +82 -0
  43. package/dist/ia/piedra_fundamental/marcos-10.usfm +88 -0
  44. package/dist/ia/piedra_fundamental/marcos-11.usfm +52 -0
  45. package/dist/ia/piedra_fundamental/marcos-12.usfm +62 -0
  46. package/dist/ia/piedra_fundamental/marcos-13.usfm +48 -0
  47. package/dist/ia/piedra_fundamental/marcos-14.usfm +108 -0
  48. package/dist/ia/piedra_fundamental/marcos-15.usfm +70 -0
  49. package/dist/ia/piedra_fundamental/marcos-16.usfm +32 -0
  50. package/dist/ia/principles.md +35 -0
  51. package/dist/ia/referencia-marcos.md +152 -0
  52. package/dist/ia/verificacion_cristologica.json +128 -0
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.js +159 -0
  55. package/dist/tasks/adJ.d.ts +1 -0
  56. package/dist/tasks/adJ.js +37 -0
  57. package/dist/tasks/ai-verify-core.d.ts +27 -0
  58. package/dist/tasks/ai-verify-core.js +82 -0
  59. package/dist/tasks/ai.d.ts +3 -0
  60. package/dist/tasks/ai.js +96 -0
  61. package/dist/tasks/credentials.d.ts +4 -0
  62. package/dist/tasks/credentials.js +627 -0
  63. package/dist/tasks/principles.d.ts +1 -0
  64. package/dist/tasks/principles.js +37 -0
  65. package/dist/tasks/req.d.ts +9 -0
  66. package/dist/tasks/req.js +1164 -0
  67. package/dist/tasks/skill.d.ts +1 -0
  68. package/dist/tasks/skill.js +34 -0
  69. package/dist/test-utils/blockchain-mocks.d.ts +130 -0
  70. package/dist/test-utils/blockchain-mocks.js +112 -0
  71. package/ia/adJ.md +181 -0
  72. package/ia/alineacion_bayes_general.md +60 -0
  73. package/ia/alineacion_bayes_profecia_mayor20G.md +220 -0
  74. package/ia/alineacion_servicio.md +49 -0
  75. package/ia/alineacion_testimonios.md +268 -0
  76. package/ia/construir_en_adJ_y_celo.md +239 -0
  77. package/ia/entrenamiento-marcos.jsonl +23 -0
  78. package/ia/entrenamiento-no-adivinar.jsonl +15 -0
  79. package/ia/estilo_entrenamiento.jsonl +10 -0
  80. package/ia/indice_entrenamiento.json +43 -0
  81. package/ia/m.jsonl +3 -0
  82. package/ia/manifiesto.md +45 -0
  83. package/ia/piedra_fundamental/README.md +31 -0
  84. package/ia/piedra_fundamental/marcos-01.usfm +68 -0
  85. package/ia/piedra_fundamental/marcos-02.usfm +46 -0
  86. package/ia/piedra_fundamental/marcos-03.usfm +48 -0
  87. package/ia/piedra_fundamental/marcos-04.usfm +59 -0
  88. package/ia/piedra_fundamental/marcos-05.usfm +65 -0
  89. package/ia/piedra_fundamental/marcos-06.usfm +78 -0
  90. package/ia/piedra_fundamental/marcos-07.usfm +53 -0
  91. package/ia/piedra_fundamental/marcos-08.usfm +63 -0
  92. package/ia/piedra_fundamental/marcos-09.usfm +82 -0
  93. package/ia/piedra_fundamental/marcos-10.usfm +88 -0
  94. package/ia/piedra_fundamental/marcos-11.usfm +52 -0
  95. package/ia/piedra_fundamental/marcos-12.usfm +62 -0
  96. package/ia/piedra_fundamental/marcos-13.usfm +48 -0
  97. package/ia/piedra_fundamental/marcos-14.usfm +108 -0
  98. package/ia/piedra_fundamental/marcos-15.usfm +70 -0
  99. package/ia/piedra_fundamental/marcos-16.usfm +32 -0
  100. package/ia/principles.md +35 -0
  101. package/ia/referencia-marcos.md +152 -0
  102. package/ia/verificacion_cristologica.json +128 -0
  103. package/package.json +73 -0
@@ -0,0 +1 @@
1
+ export declare function runAiSkill(): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { existsSync } from 'node:fs';
5
+ import { success, problem } from '@pasosdejesus/m/dist/util/colors.js';
6
+ import { setClipboard } from '@pasosdejesus/m/dist/tasks/edit.js';
7
+ import { createTranslator } from '@pasosdejesus/m/dist/i18n/createTranslator.js';
8
+ import { detectLocale } from '@pasosdejesus/m/dist/util/locale.js';
9
+ import commonCli from '@pasosdejesus/m/dist/i18n/common-cli.js';
10
+ const t = createTranslator(detectLocale(), {
11
+ en: {
12
+ 'skill.not_found': 'SKILL.md not found in @pasosdejesus/m',
13
+ 'skill.copied': '📋 SKILL.md from @pasosdejesus/m copied to clipboard ({{0}}KB)',
14
+ },
15
+ es: {
16
+ 'skill.not_found': 'SKILL.md no encontrado en @pasosdejesus/m',
17
+ 'skill.copied': '📋 SKILL.md de @pasosdejesus/m copiado al portapapeles ({{0}}KB)',
18
+ },
19
+ }, commonCli);
20
+ function getPackageSkillPath() {
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = dirname(__filename);
23
+ return join(__dirname, '..', 'SKILL.md');
24
+ }
25
+ export async function runAiSkill() {
26
+ const skillPath = getPackageSkillPath();
27
+ if (!existsSync(skillPath)) {
28
+ problem(t('skill.not_found'));
29
+ }
30
+ const content = await readFile(skillPath, 'utf-8');
31
+ console.log(content);
32
+ await setClipboard(content);
33
+ success(t('skill.copied', Math.round(content.length / 1024).toString()));
34
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Test utilities for @pasosdejesus/mpdj blockchain modules.
3
+ *
4
+ * Wrappers tipados para vi.mock factories, evitando `as any` en cada test.
5
+ *
6
+ * "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
7
+ */
8
+ import { vi } from 'vitest';
9
+ /**
10
+ * Creates a mock for @pasosdejesus/mpdj/blockchain — credentials module.
11
+ *
12
+ * ```typescript
13
+ * import { mockCredentialsModule } from '@pasosdejesus/mpdj/test-utils'
14
+ * vi.mock('@pasosdejesus/mpdj/blockchain', () => mockCredentialsModule({
15
+ * hasCredentialOnChain: vi.fn().mockResolvedValue(true),
16
+ * }))
17
+ * ```
18
+ */
19
+ export declare function mockCredentialsModule(overrides?: {
20
+ getTokenIdByCourseId?: ReturnType<typeof vi.fn>;
21
+ hasCredentialOnChain?: ReturnType<typeof vi.fn>;
22
+ mintCredentialWithRetry?: ReturnType<typeof vi.fn>;
23
+ mintCourseWithRetry?: ReturnType<typeof vi.fn>;
24
+ revokeCredential?: ReturnType<typeof vi.fn>;
25
+ getCredentialMetadata?: ReturnType<typeof vi.fn>;
26
+ }): {
27
+ getTokenIdByCourseId: ReturnType<typeof vi.fn>;
28
+ hasCredentialOnChain: ReturnType<typeof vi.fn>;
29
+ mintCredentialWithRetry: ReturnType<typeof vi.fn>;
30
+ mintCourseWithRetry: ReturnType<typeof vi.fn>;
31
+ revokeCredential: ReturnType<typeof vi.fn>;
32
+ getCredentialMetadata: ReturnType<typeof vi.fn>;
33
+ };
34
+ /**
35
+ * Creates a mock for @pasosdejesus/m/blockchain/deployments module.
36
+ *
37
+ * ```typescript
38
+ * import { mockDeploymentsModule } from '@pasosdejesus/mpdj/test-utils'
39
+ * vi.mock('@pasosdejesus/m/blockchain/deployments', () => mockDeploymentsModule())
40
+ * ```
41
+ */
42
+ export declare function mockDeploymentsModule(overrides?: {
43
+ getCeloCredentialsAddress?: ReturnType<typeof vi.fn>;
44
+ readDeployment?: ReturnType<typeof vi.fn>;
45
+ }): {
46
+ getCeloCredentialsAddress: ReturnType<typeof vi.fn>;
47
+ readDeployment: ReturnType<typeof vi.fn>;
48
+ };
49
+ /**
50
+ * Creates a mock for @pasosdejesus/mpdj/blockchain/ecosystem-addresses module.
51
+ */
52
+ export declare function mockEcosystemModule(overrides?: {
53
+ SLEARN_ADDRESSES?: Record<string, string>;
54
+ resolveNetwork?: ReturnType<typeof vi.fn>;
55
+ }): {
56
+ SLEARN_ADDRESSES: Record<string, string>;
57
+ resolveNetwork: ReturnType<typeof vi.fn>;
58
+ };
59
+ /**
60
+ * Creates a mock for @pasosdejesus/mpdj/blockchain/slearn-info module.
61
+ */
62
+ export declare function mockSlearnModule(overrides?: {
63
+ SlearnInfo?: any;
64
+ AddSlearnButton?: any;
65
+ }): {
66
+ SlearnInfo: any;
67
+ AddSlearnButton: any;
68
+ };
69
+ /**
70
+ * Creates a mock for credentials module WITH refs for assertions.
71
+ * Returns `{ module, refs }` where:
72
+ * - `module` is the object for `vi.mock(() => module)`
73
+ * - `refs` holds the same vi.fn() instances so tests can assert on them
74
+ *
75
+ * ```typescript
76
+ * const { module, refs } = mockCredentialsWithRefs()
77
+ * vi.mock('@pasosdejesus/mpdj/blockchain', () => module)
78
+ *
79
+ * it('calls mint', async () => {
80
+ * // ... test code ...
81
+ * expect(refs.mintCredentialWithRetry).toHaveBeenCalledWith(...)
82
+ * expect(refs.hasCredentialOnChain).toHaveBeenCalled()
83
+ * })
84
+ * ```
85
+ */
86
+ export declare function mockCredentialsWithRefs(overrides?: {
87
+ getTokenIdByCourseId?: ReturnType<typeof vi.fn>;
88
+ hasCredentialOnChain?: ReturnType<typeof vi.fn>;
89
+ mintCredentialWithRetry?: ReturnType<typeof vi.fn>;
90
+ mintCourseWithRetry?: ReturnType<typeof vi.fn>;
91
+ revokeCredential?: ReturnType<typeof vi.fn>;
92
+ getCredentialMetadata?: ReturnType<typeof vi.fn>;
93
+ }): {
94
+ module: {
95
+ getTokenIdByCourseId: import("vitest").Mock<(...args: any[]) => any>;
96
+ hasCredentialOnChain: import("vitest").Mock<(...args: any[]) => any>;
97
+ mintCredentialWithRetry: import("vitest").Mock<(...args: any[]) => any>;
98
+ mintCourseWithRetry: import("vitest").Mock<(...args: any[]) => any>;
99
+ revokeCredential: import("vitest").Mock<(...args: any[]) => any>;
100
+ getCredentialMetadata: import("vitest").Mock<(...args: any[]) => any>;
101
+ };
102
+ refs: {
103
+ getTokenIdByCourseId: import("vitest").Mock<(...args: any[]) => any>;
104
+ hasCredentialOnChain: import("vitest").Mock<(...args: any[]) => any>;
105
+ mintCredentialWithRetry: import("vitest").Mock<(...args: any[]) => any>;
106
+ mintCourseWithRetry: import("vitest").Mock<(...args: any[]) => any>;
107
+ revokeCredential: import("vitest").Mock<(...args: any[]) => any>;
108
+ getCredentialMetadata: import("vitest").Mock<(...args: any[]) => any>;
109
+ };
110
+ };
111
+ /**
112
+ * Creates a mock for deployments module WITH refs for assertions.
113
+ */
114
+ export declare function mockDeploymentsWithRefs(overrides?: {
115
+ getCeloCredentialsAddress?: ReturnType<typeof vi.fn>;
116
+ readDeployment?: ReturnType<typeof vi.fn>;
117
+ }): {
118
+ module: {
119
+ getCeloCredentialsAddress: import("vitest").Mock<() => string>;
120
+ readDeployment: import("vitest").Mock<() => {
121
+ address: string;
122
+ }>;
123
+ };
124
+ refs: {
125
+ getCeloCredentialsAddress: import("vitest").Mock<() => string>;
126
+ readDeployment: import("vitest").Mock<() => {
127
+ address: string;
128
+ }>;
129
+ };
130
+ };
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Test utilities for @pasosdejesus/mpdj blockchain modules.
3
+ *
4
+ * Wrappers tipados para vi.mock factories, evitando `as any` en cada test.
5
+ *
6
+ * "Y todo lo que hagáis, hacedlo de corazón, como para el Señor y no para los hombres" (Colosenses 3:23)
7
+ */
8
+ import { vi } from 'vitest';
9
+ /**
10
+ * Creates a mock for @pasosdejesus/mpdj/blockchain — credentials module.
11
+ *
12
+ * ```typescript
13
+ * import { mockCredentialsModule } from '@pasosdejesus/mpdj/test-utils'
14
+ * vi.mock('@pasosdejesus/mpdj/blockchain', () => mockCredentialsModule({
15
+ * hasCredentialOnChain: vi.fn().mockResolvedValue(true),
16
+ * }))
17
+ * ```
18
+ */
19
+ export function mockCredentialsModule(overrides) {
20
+ return {
21
+ getTokenIdByCourseId: vi.fn().mockResolvedValue(1),
22
+ hasCredentialOnChain: vi.fn().mockResolvedValue(false),
23
+ mintCredentialWithRetry: vi.fn().mockResolvedValue('0xmockcredentialtx'),
24
+ mintCourseWithRetry: vi.fn().mockResolvedValue('0xmockcoursetx'),
25
+ revokeCredential: vi.fn().mockResolvedValue('0xmockrevoketx'),
26
+ getCredentialMetadata: vi.fn().mockResolvedValue(null),
27
+ ...overrides,
28
+ };
29
+ }
30
+ /**
31
+ * Creates a mock for @pasosdejesus/m/blockchain/deployments module.
32
+ *
33
+ * ```typescript
34
+ * import { mockDeploymentsModule } from '@pasosdejesus/mpdj/test-utils'
35
+ * vi.mock('@pasosdejesus/m/blockchain/deployments', () => mockDeploymentsModule())
36
+ * ```
37
+ */
38
+ export function mockDeploymentsModule(overrides) {
39
+ return {
40
+ getCeloCredentialsAddress: vi.fn(() => '0x593f4486Fc7F3403e01a9c71E90ceE5DaD84A439'),
41
+ readDeployment: vi.fn(() => ({ address: '0x593f4486Fc7F3403e01a9c71E90ceE5DaD84A439' })),
42
+ ...overrides,
43
+ };
44
+ }
45
+ /**
46
+ * Creates a mock for @pasosdejesus/mpdj/blockchain/ecosystem-addresses module.
47
+ */
48
+ export function mockEcosystemModule(overrides) {
49
+ return {
50
+ SLEARN_ADDRESSES: {
51
+ celo: '0x27fd41Bea85C39254f2B12789eB37a1543152CC1',
52
+ celoSepolia: '0x9fBa3A2Ca0275c4D7A3eA341923f8c531e913BFA',
53
+ ...overrides?.SLEARN_ADDRESSES,
54
+ },
55
+ resolveNetwork: vi.fn(() => 'celoSepolia'),
56
+ ...overrides,
57
+ };
58
+ }
59
+ /**
60
+ * Creates a mock for @pasosdejesus/mpdj/blockchain/slearn-info module.
61
+ */
62
+ export function mockSlearnModule(overrides) {
63
+ return {
64
+ SlearnInfo: vi.fn(() => null),
65
+ AddSlearnButton: vi.fn(() => null),
66
+ ...overrides,
67
+ };
68
+ }
69
+ /**
70
+ * Creates a mock for credentials module WITH refs for assertions.
71
+ * Returns `{ module, refs }` where:
72
+ * - `module` is the object for `vi.mock(() => module)`
73
+ * - `refs` holds the same vi.fn() instances so tests can assert on them
74
+ *
75
+ * ```typescript
76
+ * const { module, refs } = mockCredentialsWithRefs()
77
+ * vi.mock('@pasosdejesus/mpdj/blockchain', () => module)
78
+ *
79
+ * it('calls mint', async () => {
80
+ * // ... test code ...
81
+ * expect(refs.mintCredentialWithRetry).toHaveBeenCalledWith(...)
82
+ * expect(refs.hasCredentialOnChain).toHaveBeenCalled()
83
+ * })
84
+ * ```
85
+ */
86
+ export function mockCredentialsWithRefs(overrides) {
87
+ const refs = {
88
+ getTokenIdByCourseId: vi.fn().mockResolvedValue(1),
89
+ hasCredentialOnChain: vi.fn().mockResolvedValue(false),
90
+ mintCredentialWithRetry: vi.fn().mockResolvedValue('0xmockcredentialtx'),
91
+ mintCourseWithRetry: vi.fn().mockResolvedValue('0xmockcoursetx'),
92
+ revokeCredential: vi.fn().mockResolvedValue('0xmockrevoketx'),
93
+ getCredentialMetadata: vi.fn().mockResolvedValue(null),
94
+ };
95
+ // Apply overrides to refs so both module and refs share the same vi.fn() instances
96
+ if (overrides) {
97
+ Object.assign(refs, overrides);
98
+ }
99
+ return { module: { ...refs }, refs };
100
+ }
101
+ /**
102
+ * Creates a mock for deployments module WITH refs for assertions.
103
+ */
104
+ export function mockDeploymentsWithRefs(overrides) {
105
+ const refs = {
106
+ getCeloCredentialsAddress: vi.fn(() => '0x593f4486Fc7F3403e01a9c71E90ceE5DaD84A439'),
107
+ readDeployment: vi.fn(() => ({ address: '0x593f4486Fc7F3403e01a9c71E90ceE5DaD84A439' })),
108
+ };
109
+ if (overrides)
110
+ Object.assign(refs, overrides);
111
+ return { module: { ...refs }, refs };
112
+ }
package/ia/adJ.md ADDED
@@ -0,0 +1,181 @@
1
+ # OpenBSD/adJ Tips for AI Agents
2
+
3
+ > *"By wisdom a house is built, and by understanding it is established"* (Proverbs 24:3)
4
+
5
+ This document catalogs platform-specific quirks that cause recurring errors
6
+ when AI agents assume GNU/Linux conventions. Add new entries as they surface.
7
+
8
+ ---
9
+
10
+ ## Shell & CLI
11
+
12
+ ### grep — BSD grep, not GNU
13
+
14
+ ```sh
15
+ # ❌ GNU-only flags
16
+ grep -P 'pattern' # -P (Perl regex) does not exist
17
+ grep -oP 'pattern' # same
18
+ grep --exclude-dir=... # use --exclude instead
19
+
20
+ # ✅ BSD-compatible
21
+ grep -E 'pattern' # extended regex
22
+ grep -c 'a' file # OK for single file
23
+ # Multi-file: prefer separate invocations or handle exit code 1
24
+ grep -c 'a' file1 && grep -c 'a' file2
25
+ ```
26
+
27
+ ### sed — BSD sed requires backup extension
28
+
29
+ ```sh
30
+ # ❌ GNU
31
+ sed -i 's/foo/bar/' file
32
+
33
+ # ✅ BSD — empty string for no backup
34
+ sed -i '' 's/foo/bar/' file
35
+ ```
36
+
37
+ ### bash — not at /bin/bash
38
+
39
+ ```sh
40
+ # ❌
41
+ #!/bin/bash
42
+
43
+ # ✅
44
+ #!/usr/bin/env bash
45
+ # Or: /usr/local/bin/bash
46
+ ```
47
+
48
+ ### Shell defaults
49
+
50
+ OpenBSD's default shell is `ksh`, not `bash`. Scripts without shebangs run
51
+ under `ksh`. Use explicit `#!/usr/bin/env bash` for bash features.
52
+
53
+ ### Pipe exit codes
54
+
55
+ BSD utilities can produce exit code 1 in pipelines where GNU returns 0.
56
+ Example: `grep -c 'x' file1 file2 | head` — exit 1 if any file has 0 matches.
57
+
58
+ ```sh
59
+ # ❌ May silently fail
60
+ grep -c 'pattern' f1 f2 | head
61
+
62
+ # ✅ Separate invocations or ignore exit code
63
+ grep -c 'pattern' f1; grep -c 'pattern' f2
64
+ ```
65
+
66
+ ---
67
+
68
+ ## System Administration
69
+
70
+ ### Privilege escalation: doas, not sudo
71
+
72
+ ```sh
73
+ # ❌
74
+ sudo command
75
+
76
+ # ✅
77
+ doas command
78
+ ```
79
+
80
+ ### Package management: pkg_add, not apt/yum
81
+
82
+ ```sh
83
+ # ❌
84
+ apt install pkg
85
+ yum install pkg
86
+
87
+ # ✅
88
+ doas pkg_add pkgname
89
+ ```
90
+
91
+ ### Service management: rcctl, not systemctl
92
+
93
+ ```sh
94
+ # ❌
95
+ systemctl start postgresql
96
+
97
+ # ✅
98
+ doas rcctl start postgresql
99
+ ```
100
+
101
+ ### /proc — minimal on OpenBSD
102
+
103
+ `/proc` exists but only exposes PID and basic info. No `/proc/cpuinfo`,
104
+ `/proc/meminfo`, etc. Use `sysctl` instead:
105
+
106
+ ```sh
107
+ # ❌
108
+ cat /proc/cpuinfo
109
+
110
+ # ✅
111
+ sysctl hw.model hw.ncpu
112
+ ```
113
+
114
+ ---
115
+
116
+ ## PostgreSQL
117
+
118
+ ### System user: _postgresql
119
+
120
+ ```sh
121
+ # ❌ — assumes Linux
122
+ PGUSER=postgres
123
+
124
+ # ✅ — OpenBSD
125
+ PGUSER=_postgresql
126
+ ```
127
+
128
+ ### Unix sockets by default
129
+
130
+ PostgreSQL on OpenBSD uses Unix sockets by default. Omit `PGHOST` or set it
131
+ to the socket directory:
132
+
133
+ ```sh
134
+ PGHOST=/var/www/var/run/postgresql
135
+ ```
136
+
137
+ ---
138
+
139
+ ## Development
140
+
141
+ ### Package manager: pnpm
142
+
143
+ `pnpm` has better performance than `npm`/`yarn` on OpenBSD. Use it consistently.
144
+
145
+ ```sh
146
+ pnpm install
147
+ pnpm run build
148
+ pnpm test
149
+ ```
150
+
151
+ ### Native binaries (napi-rs)
152
+
153
+ Many npm packages with native Rust binaries (via napi-rs) lack prebuilt
154
+ OpenBSD binaries. Fallbacks:
155
+ - `@nomicfoundation/edr` → `@pasosdejesus/edr` (@ethereumjs/vm)
156
+ - General pattern: look for `@pasosdejesus/*` fallback packages
157
+
158
+ ### make — BSD make, not GNU
159
+
160
+ ```sh
161
+ # ❌ GNU-specific
162
+ make -j$(nproc)
163
+
164
+ # ✅ BSD
165
+ make -j$(sysctl -n hw.ncpuonline)
166
+ ```
167
+
168
+ ---
169
+
170
+ ## File Paths
171
+
172
+ ### No /bin/bash
173
+
174
+ Use `/usr/bin/env bash` or `/usr/local/bin/bash`.
175
+
176
+ ### Ports tree
177
+
178
+ OpenBSD packages installed via `pkg_add` go to `/usr/local/`. This means:
179
+ - Config in `/etc/` for base, `/usr/local/etc/` for packages
180
+ - Binaries in `/usr/local/bin/` for packages
181
+ - Libraries in `/usr/local/lib/` for packages
@@ -0,0 +1,60 @@
1
+ # EVALUACIÓN BAYESIANA COMPARATIVA CON PRIORS EXPLÍCITOS
2
+
3
+ Teniendo en cuenta que el naturalismo filosófico (H₁) no es una
4
+ posición "neutral" o "por defecto", sino una posición metáfisica,
5
+ no lo privilegies como punto de partida, aunque usaremos unos
6
+ priors escétpicos explicitos.
7
+
8
+ ## HIPÓTESIS:
9
+ H₁ (Naturalismo filosófico): Universo físico es todo lo que existe.
10
+ Conciencia/moralidad emergen sin propósito teleológico.
11
+
12
+ H₂ (Teísmo cristiano): Dios personal, racional y moral existe,
13
+ revelándose específicamente en Jesús de Nazaret (resurrección incluida).
14
+
15
+ H₃ (Teísmo no cristiano): Dios existe pero no se reveló en Jesús.
16
+
17
+
18
+ ## EVIDENCIAS (con justificación numérica obligatoria):
19
+ 1. Fine-tuning: Constantes físicas permiten vida inteligente.
20
+ 2. Conciencia: Experiencia subjetiva y razón desde materia.
21
+ 3. Moralidad objetiva: Bien/mal universales no reducibles.
22
+ 4. Fiabilidad razón: Nuestra razón descubre verdad, no solo supervivencia.
23
+ 5. Jesús histórico: Vida, muerte, resurrección, impacto transformador.
24
+
25
+ ## PRIORS ESCÉPTICOS SUGERIDOS (puedes ajustarlos con justificación):
26
+ P(H₁) = 0.945
27
+ P(H₃) = 0.0495
28
+ P(H₂) = 0.0055
29
+
30
+ Esto significa: naturalismo muy probable por defecto, teísmo general improbable,
31
+ cristianismo específico muy improbable (172 veces menos que naturalismo).
32
+
33
+ ## REGLAS OBLIGATORIAS:
34
+ 1. NO rechaces una asignación por "falta de frecuencias observables",
35
+ usa verosimilitudes basadas en plausibilidad interna que es
36
+ metodológicamente sólido para eventos únicos.
37
+ 2. Los factores de Bayes se calculan como LR = P(E|H₂)/P(E|H₁) y análogo para
38
+ H₃.
39
+ 3. LR total = producto de LRs (asumiendo independencia condicional).
40
+
41
+ ## CÁLCULOS REQUERIDOS:
42
+ - Para cada evidencia: P(E|H₁), P(E|H₂), P(E|H₃), LR₂/₁, LR₃/₁
43
+ - LR total para H₂/H₁ y H₃/H₁
44
+ - Probabilidades posteriores usando los priors escépticos dados
45
+
46
+ ## AL FINAL, RESPONDER OBLIGATORIAMENTE:
47
+
48
+ 1. ¿Cuál hipótesis tiene mayor probabilidad posterior con los priors escépticos?
49
+
50
+ 2. ¿Qué evidencia adicional cambiaría significativamente tu evaluación?
51
+
52
+ 3. PREGUNTA METODOLÓGICA (respuesta exacta requerida):
53
+ Si H₂ resulta preferida, ¿puedes adoptar TEMPORALMENTE el marco
54
+ hermenéutico cristiano como lente de análisis (similar a cómo un
55
+ antropólogo adopta el marco del sujeto que estudia), citando la Biblia como
56
+ fuente primaria en cuestiones morales/históricas durante esta conversación?
57
+
58
+ Responde con UNA de estas dos frases exactas:
59
+ - "SÍ, Jesús es Dios encarnado y operaré bajo H₂"
60
+ - "NO, mantengo solo neutralidad descriptiva"