myaidev-method 0.2.8 → 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.
Files changed (157) hide show
  1. package/.claude/agents/wordpress-admin.md +271 -0
  2. package/.env.example +0 -1
  3. package/PACKAGE_FIXES_SUMMARY.md +319 -0
  4. package/PAYLOADCMS_AUTH_UPDATE.md +248 -0
  5. package/USER_GUIDE.md +260 -0
  6. package/bin/cli.js +36 -0
  7. package/dist/server/.tsbuildinfo +1 -0
  8. package/dist/server/auth/controllers/AuthController.d.ts +34 -0
  9. package/dist/server/auth/controllers/AuthController.d.ts.map +1 -0
  10. package/dist/server/auth/controllers/AuthController.js +43 -0
  11. package/dist/server/auth/controllers/AuthController.js.map +1 -0
  12. package/dist/server/auth/example-usage.d.ts +53 -0
  13. package/dist/server/auth/example-usage.d.ts.map +1 -0
  14. package/dist/server/auth/example-usage.js +129 -0
  15. package/dist/server/auth/example-usage.js.map +1 -0
  16. package/dist/server/auth/index.d.ts +11 -0
  17. package/dist/server/auth/index.d.ts.map +1 -0
  18. package/dist/server/auth/index.js +15 -0
  19. package/dist/server/auth/index.js.map +1 -0
  20. package/dist/server/auth/layers.d.ts +19 -0
  21. package/dist/server/auth/layers.d.ts.map +1 -0
  22. package/dist/server/auth/layers.js +33 -0
  23. package/dist/server/auth/layers.js.map +1 -0
  24. package/dist/server/auth/middleware/authMiddleware.d.ts +24 -0
  25. package/dist/server/auth/middleware/authMiddleware.d.ts.map +1 -0
  26. package/dist/server/auth/middleware/authMiddleware.js +65 -0
  27. package/dist/server/auth/middleware/authMiddleware.js.map +1 -0
  28. package/dist/server/auth/routes/authRoutes.d.ts +11 -0
  29. package/dist/server/auth/routes/authRoutes.d.ts.map +1 -0
  30. package/dist/server/auth/routes/authRoutes.js +213 -0
  31. package/dist/server/auth/routes/authRoutes.js.map +1 -0
  32. package/dist/server/auth/services/AuditLogService.d.ts +21 -0
  33. package/dist/server/auth/services/AuditLogService.d.ts.map +1 -0
  34. package/dist/server/auth/services/AuditLogService.js +28 -0
  35. package/dist/server/auth/services/AuditLogService.js.map +1 -0
  36. package/dist/server/auth/services/AuthService.d.ts +27 -0
  37. package/dist/server/auth/services/AuthService.d.ts.map +1 -0
  38. package/dist/server/auth/services/AuthService.js +246 -0
  39. package/dist/server/auth/services/AuthService.js.map +1 -0
  40. package/dist/server/auth/services/PasswordService.d.ts +12 -0
  41. package/dist/server/auth/services/PasswordService.d.ts.map +1 -0
  42. package/dist/server/auth/services/PasswordService.js +31 -0
  43. package/dist/server/auth/services/PasswordService.js.map +1 -0
  44. package/dist/server/auth/services/SessionRepository.d.ts +24 -0
  45. package/dist/server/auth/services/SessionRepository.d.ts.map +1 -0
  46. package/dist/server/auth/services/SessionRepository.js +101 -0
  47. package/dist/server/auth/services/SessionRepository.js.map +1 -0
  48. package/dist/server/auth/services/TokenService.d.ts +12 -0
  49. package/dist/server/auth/services/TokenService.d.ts.map +1 -0
  50. package/dist/server/auth/services/TokenService.js +86 -0
  51. package/dist/server/auth/services/TokenService.js.map +1 -0
  52. package/dist/server/auth/services/UserRepository.d.ts +23 -0
  53. package/dist/server/auth/services/UserRepository.d.ts.map +1 -0
  54. package/dist/server/auth/services/UserRepository.js +168 -0
  55. package/dist/server/auth/services/UserRepository.js.map +1 -0
  56. package/dist/server/auth/services/example.d.ts +26 -0
  57. package/dist/server/auth/services/example.d.ts.map +1 -0
  58. package/dist/server/auth/services/example.js +221 -0
  59. package/dist/server/auth/services/example.js.map +1 -0
  60. package/dist/server/auth/services/index.d.ts +6 -0
  61. package/dist/server/auth/services/index.d.ts.map +1 -0
  62. package/dist/server/auth/services/index.js +7 -0
  63. package/dist/server/auth/services/index.js.map +1 -0
  64. package/dist/server/database/db.d.ts +28 -0
  65. package/dist/server/database/db.d.ts.map +1 -0
  66. package/dist/server/database/db.js +91 -0
  67. package/dist/server/database/db.js.map +1 -0
  68. package/dist/server/database/schema.sql +95 -0
  69. package/dist/server/hono/app.d.ts +10 -0
  70. package/dist/server/hono/app.d.ts.map +1 -0
  71. package/dist/server/hono/app.js +26 -0
  72. package/dist/server/hono/app.js.map +1 -0
  73. package/dist/server/hono/routes.d.ts +12 -0
  74. package/dist/server/hono/routes.d.ts.map +1 -0
  75. package/dist/server/hono/routes.js +40 -0
  76. package/dist/server/hono/routes.js.map +1 -0
  77. package/dist/server/main.d.ts +2 -0
  78. package/dist/server/main.d.ts.map +1 -0
  79. package/dist/server/main.js +94 -0
  80. package/dist/server/main.js.map +1 -0
  81. package/dist/server/user-management/DirectoryService.d.ts +62 -0
  82. package/dist/server/user-management/DirectoryService.d.ts.map +1 -0
  83. package/dist/server/user-management/DirectoryService.js +201 -0
  84. package/dist/server/user-management/DirectoryService.js.map +1 -0
  85. package/dist/server/user-management/LinuxUserService.d.ts +71 -0
  86. package/dist/server/user-management/LinuxUserService.d.ts.map +1 -0
  87. package/dist/server/user-management/LinuxUserService.js +192 -0
  88. package/dist/server/user-management/LinuxUserService.js.map +1 -0
  89. package/dist/server/user-management/QuotaService.d.ts +59 -0
  90. package/dist/server/user-management/QuotaService.d.ts.map +1 -0
  91. package/dist/server/user-management/QuotaService.js +148 -0
  92. package/dist/server/user-management/QuotaService.js.map +1 -0
  93. package/dist/server/user-management/UserManagementService.d.ts +74 -0
  94. package/dist/server/user-management/UserManagementService.d.ts.map +1 -0
  95. package/dist/server/user-management/UserManagementService.js +122 -0
  96. package/dist/server/user-management/UserManagementService.js.map +1 -0
  97. package/dist/server/user-management/index.d.ts +26 -0
  98. package/dist/server/user-management/index.d.ts.map +1 -0
  99. package/dist/server/user-management/index.js +26 -0
  100. package/dist/server/user-management/index.js.map +1 -0
  101. package/dist/server/user-management/layers.d.ts +27 -0
  102. package/dist/server/user-management/layers.d.ts.map +1 -0
  103. package/dist/server/user-management/layers.js +37 -0
  104. package/dist/server/user-management/layers.js.map +1 -0
  105. package/dist/shared/types.d.ts +94 -0
  106. package/dist/shared/types.d.ts.map +1 -0
  107. package/dist/shared/types.js +32 -0
  108. package/dist/shared/types.js.map +1 -0
  109. package/package.json +25 -5
  110. package/src/lib/payloadcms-utils.js +5 -12
  111. package/src/server/auth/ARCHITECTURE.md +575 -0
  112. package/src/server/auth/IMPLEMENTATION_SUMMARY.md +287 -0
  113. package/src/server/auth/QUICK_START.md +283 -0
  114. package/src/server/auth/README.md +290 -0
  115. package/src/server/auth/controllers/AuthController.ts +129 -0
  116. package/src/server/auth/example-usage.ts +159 -0
  117. package/src/server/auth/index.ts +19 -0
  118. package/src/server/auth/layers.ts +57 -0
  119. package/src/server/auth/middleware/authMiddleware.ts +118 -0
  120. package/src/server/auth/routes/authRoutes.ts +319 -0
  121. package/src/server/auth/services/AuditLogService.ts +81 -0
  122. package/src/server/auth/services/AuthService.ts +408 -0
  123. package/src/server/auth/services/IMPLEMENTATION_SUMMARY.md +404 -0
  124. package/src/server/auth/services/PasswordService.ts +85 -0
  125. package/src/server/auth/services/README.md +361 -0
  126. package/src/server/auth/services/SessionRepository.ts +227 -0
  127. package/src/server/auth/services/TokenService.ts +174 -0
  128. package/src/server/auth/services/UserRepository.ts +318 -0
  129. package/src/server/auth/services/example.ts +346 -0
  130. package/src/server/auth/services/index.ts +6 -0
  131. package/src/server/database/db.ts +161 -0
  132. package/src/server/database/schema.sql +95 -0
  133. package/src/server/hono/app.ts +41 -0
  134. package/src/server/main.ts +115 -0
  135. package/src/server/user-management/DirectoryService.ts +348 -0
  136. package/src/server/user-management/LinuxUserService.ts +338 -0
  137. package/src/server/user-management/QuotaService.ts +256 -0
  138. package/src/server/user-management/README.md +333 -0
  139. package/src/server/user-management/UserManagementService.ts +335 -0
  140. package/src/server/user-management/index.ts +26 -0
  141. package/src/server/user-management/layers.ts +51 -0
  142. package/src/shared/types.ts +111 -0
  143. package/src/templates/claude/agents/payloadcms-publish.md +34 -14
  144. package/src/templates/codex/commands/myai-astro-publish.md +8 -2
  145. package/src/templates/codex/commands/myai-content-writer.md +8 -2
  146. package/src/templates/codex/commands/myai-coolify-deploy.md +8 -2
  147. package/src/templates/codex/commands/myai-dev-architect.md +8 -2
  148. package/src/templates/codex/commands/myai-dev-code.md +8 -2
  149. package/src/templates/codex/commands/myai-dev-docs.md +8 -2
  150. package/src/templates/codex/commands/myai-dev-review.md +8 -2
  151. package/src/templates/codex/commands/myai-dev-test.md +8 -2
  152. package/src/templates/codex/commands/myai-docusaurus-publish.md +8 -2
  153. package/src/templates/codex/commands/myai-mintlify-publish.md +8 -2
  154. package/src/templates/codex/commands/myai-payloadcms-publish.md +17 -3
  155. package/src/templates/codex/commands/myai-sparc-workflow.md +8 -2
  156. package/src/templates/codex/commands/myai-wordpress-admin.md +8 -2
  157. package/src/templates/codex/commands/myai-wordpress-publish.md +8 -2
@@ -0,0 +1,122 @@
1
+ import { Effect, Context, Layer } from "effect";
2
+ import { LinuxUserService } from "./LinuxUserService";
3
+ import { DirectoryService } from "./DirectoryService";
4
+ import { QuotaService } from "./QuotaService";
5
+ const UserManagementError = (message, cause) => ({
6
+ _tag: "UserManagementError",
7
+ message,
8
+ cause,
9
+ });
10
+ export class UserManagementService extends Context.Tag("UserManagementService")() {
11
+ static Live = Layer.effect(this, Effect.gen(function* () {
12
+ const linuxUserService = yield* LinuxUserService;
13
+ const directoryService = yield* DirectoryService;
14
+ const quotaService = yield* QuotaService;
15
+ return {
16
+ createUser: (request) => Effect.gen(function* () {
17
+ const { username, claudeApiKey, diskQuotaMB = 2048, shell = "/bin/rbash", } = request;
18
+ // Step 1: Sanitize username for Linux compatibility
19
+ const linuxUsername = yield* linuxUserService
20
+ .sanitizeUsername(username)
21
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to sanitize username: ${err.message}`, err)));
22
+ // Step 2: Check if user already exists
23
+ const exists = yield* linuxUserService.userExists(linuxUsername).pipe(Effect.mapError((err) => UserManagementError(`Failed to check user existence: ${err.message}`, err)));
24
+ if (exists) {
25
+ return yield* Effect.fail(UserManagementError(`Linux user ${linuxUsername} already exists`));
26
+ }
27
+ // Step 3: Create Linux user
28
+ const linuxUser = yield* linuxUserService
29
+ .createUser({
30
+ username: linuxUsername,
31
+ shell,
32
+ createHome: true,
33
+ groups: ["myaidev"], // Optional: create this group for MyAIDev users
34
+ })
35
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to create Linux user: ${err.message}`, err)));
36
+ // Step 4: Set up home directory structure
37
+ const claudeConfig = {
38
+ apiKey: claudeApiKey || "",
39
+ model: "claude-sonnet-4-20250514",
40
+ maxTokens: 8192,
41
+ temperature: 1.0,
42
+ };
43
+ yield* directoryService
44
+ .setupHomeDirectory({
45
+ username: linuxUsername,
46
+ homeDir: linuxUser.homeDir,
47
+ uid: linuxUser.uid,
48
+ gid: linuxUser.gid,
49
+ claudeConfig,
50
+ })
51
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to setup home directory: ${err.message}`, err)));
52
+ // Step 5: Apply resource limits
53
+ yield* linuxUserService
54
+ .setResourceLimits(linuxUsername, {
55
+ maxOpenFiles: 1024,
56
+ maxProcesses: 256,
57
+ maxMemoryKB: 2097152, // 2GB
58
+ maxCPUTime: 120, // 2 minutes per process
59
+ })
60
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to set resource limits: ${err.message}`, err)));
61
+ // Step 6: Try to apply disk quotas (optional - may not be available)
62
+ const quotaAvailable = yield* quotaService
63
+ .isQuotaAvailable()
64
+ .pipe(Effect.orElseSucceed(() => false));
65
+ let quotaApplied = false;
66
+ if (quotaAvailable) {
67
+ yield* quotaService
68
+ .setDiskQuota(linuxUsername, {
69
+ softLimitMB: diskQuotaMB,
70
+ hardLimitMB: diskQuotaMB * 1.5, // 50% buffer
71
+ })
72
+ .pipe(Effect.catchAll(() => Effect.succeed(void 0)) // Don't fail if quota setup fails
73
+ );
74
+ quotaApplied = true;
75
+ }
76
+ // Return complete setup information
77
+ return {
78
+ linuxUser,
79
+ homeDir: linuxUser.homeDir,
80
+ claudeConfigPath: `${linuxUser.homeDir}/.claude`,
81
+ workspacePath: `${linuxUser.homeDir}/workspace`,
82
+ quotaApplied,
83
+ limitsApplied: true,
84
+ };
85
+ }),
86
+ deleteUser: (username) => Effect.gen(function* () {
87
+ // Get user info first
88
+ const userInfo = yield* linuxUserService.getUserInfo(username).pipe(Effect.mapError((err) => UserManagementError(`Failed to get user info: ${err.message}`, err)));
89
+ // Clean up directories
90
+ yield* directoryService
91
+ .cleanupDirectories(userInfo.homeDir)
92
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to cleanup directories: ${err.message}`, err)));
93
+ // Delete Linux user
94
+ yield* linuxUserService.deleteUser(username, true).pipe(Effect.mapError((err) => UserManagementError(`Failed to delete user: ${err.message}`, err)));
95
+ // Remove resource limits file
96
+ yield* Effect.tryPromise({
97
+ try: async () => {
98
+ const { execSync } = await import("child_process");
99
+ execSync(`sudo rm -f /etc/security/limits.d/${username}.conf`, {
100
+ stdio: "pipe",
101
+ });
102
+ },
103
+ catch: () => UserManagementError("Failed to remove limits configuration"),
104
+ });
105
+ }),
106
+ getUserInfo: (username) => linuxUserService.getUserInfo(username).pipe(Effect.mapError((err) => UserManagementError(`Failed to get user info: ${err.message}`, err))),
107
+ updateQuota: (username, quota) => quotaService.setDiskQuota(username, quota).pipe(Effect.mapError((err) => UserManagementError(`Failed to update quota: ${err.message}`, err))),
108
+ isUsernameAvailable: (username) => Effect.gen(function* () {
109
+ // Sanitize username first
110
+ const linuxUsername = yield* linuxUserService
111
+ .sanitizeUsername(username)
112
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to sanitize username: ${err.message}`, err)));
113
+ // Check if exists
114
+ const exists = yield* linuxUserService
115
+ .userExists(linuxUsername)
116
+ .pipe(Effect.mapError((err) => UserManagementError(`Failed to check availability: ${err.message}`, err)));
117
+ return !exists;
118
+ }),
119
+ };
120
+ }));
121
+ }
122
+ //# sourceMappingURL=UserManagementService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserManagementService.js","sourceRoot":"","sources":["../../../src/server/user-management/UserManagementService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * User Management Module
3
+ *
4
+ * Provides Linux user management capabilities for multi-user MyAIDev Method deployment.
5
+ *
6
+ * Features:
7
+ * - Create and delete Linux system users
8
+ * - Set up isolated home directories
9
+ * - Configure Claude Code environments
10
+ * - Apply disk quotas and resource limits
11
+ * - Clean up user resources
12
+ *
13
+ * Services:
14
+ * - LinuxUserService: Low-level Linux user operations
15
+ * - DirectoryService: Home directory and config management
16
+ * - QuotaService: Disk quota and storage limits
17
+ * - UserManagementService: High-level orchestration
18
+ *
19
+ * @module user-management
20
+ */
21
+ export * from "./LinuxUserService";
22
+ export * from "./DirectoryService";
23
+ export * from "./QuotaService";
24
+ export * from "./UserManagementService";
25
+ export * from "./layers";
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/user-management/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * User Management Module
3
+ *
4
+ * Provides Linux user management capabilities for multi-user MyAIDev Method deployment.
5
+ *
6
+ * Features:
7
+ * - Create and delete Linux system users
8
+ * - Set up isolated home directories
9
+ * - Configure Claude Code environments
10
+ * - Apply disk quotas and resource limits
11
+ * - Clean up user resources
12
+ *
13
+ * Services:
14
+ * - LinuxUserService: Low-level Linux user operations
15
+ * - DirectoryService: Home directory and config management
16
+ * - QuotaService: Disk quota and storage limits
17
+ * - UserManagementService: High-level orchestration
18
+ *
19
+ * @module user-management
20
+ */
21
+ export * from "./LinuxUserService";
22
+ export * from "./DirectoryService";
23
+ export * from "./QuotaService";
24
+ export * from "./UserManagementService";
25
+ export * from "./layers";
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/user-management/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,UAAU,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Layer } from "effect";
2
+ import { LinuxUserService } from "./LinuxUserService";
3
+ import { DirectoryService } from "./DirectoryService";
4
+ import { QuotaService } from "./QuotaService";
5
+ import { UserManagementService } from "./UserManagementService";
6
+ export declare const UserManagementLayer: Layer.Layer<LinuxUserService | DirectoryService | QuotaService | UserManagementService, never, never>;
7
+ /**
8
+ * Create a complete user management layer
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * const layer = createUserManagementLayer();
13
+ * const runtime = ManagedRuntime.make(layer);
14
+ *
15
+ * const result = await runtime.runPromise(
16
+ * Effect.gen(function* () {
17
+ * const userMgmt = yield* UserManagementService;
18
+ * return yield* userMgmt.createUser({
19
+ * username: "john",
20
+ * email: "john@example.com",
21
+ * });
22
+ * })
23
+ * );
24
+ * ```
25
+ */
26
+ export declare const createUserManagementLayer: () => Layer.Layer<LinuxUserService | DirectoryService | QuotaService | UserManagementService, never, never>;
27
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../../src/server/user-management/layers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAsBhE,eAAO,MAAM,mBAAmB,uGAG/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,yBAAyB,6GAA4B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { Layer } from "effect";
2
+ import { LinuxUserService } from "./LinuxUserService";
3
+ import { DirectoryService } from "./DirectoryService";
4
+ import { QuotaService } from "./QuotaService";
5
+ import { UserManagementService } from "./UserManagementService";
6
+ /**
7
+ * User Management Layer Composition
8
+ *
9
+ * Provides Effect-TS layers for dependency injection of user management services.
10
+ */
11
+ // Independent services (no dependencies)
12
+ const IndependentServices = Layer.mergeAll(LinuxUserService.Live, DirectoryService.Live, QuotaService.Live);
13
+ // User management service depends on all base services
14
+ const UserManagementWithDeps = Layer.provide(UserManagementService.Live, IndependentServices);
15
+ // Complete layer with all services
16
+ export const UserManagementLayer = Layer.mergeAll(IndependentServices, UserManagementWithDeps);
17
+ /**
18
+ * Create a complete user management layer
19
+ *
20
+ * Usage:
21
+ * ```typescript
22
+ * const layer = createUserManagementLayer();
23
+ * const runtime = ManagedRuntime.make(layer);
24
+ *
25
+ * const result = await runtime.runPromise(
26
+ * Effect.gen(function* () {
27
+ * const userMgmt = yield* UserManagementService;
28
+ * return yield* userMgmt.createUser({
29
+ * username: "john",
30
+ * email: "john@example.com",
31
+ * });
32
+ * })
33
+ * );
34
+ * ```
35
+ */
36
+ export const createUserManagementLayer = () => UserManagementLayer;
37
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../../src/server/user-management/layers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;;;GAIG;AAEH,yCAAyC;AACzC,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CACxC,gBAAgB,CAAC,IAAI,EACrB,gBAAgB,CAAC,IAAI,EACrB,YAAY,CAAC,IAAI,CAClB,CAAC;AAEF,uDAAuD;AACvD,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAC1C,qBAAqB,CAAC,IAAI,EAC1B,mBAAmB,CACpB,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,CAAC,QAAQ,CAC/C,mBAAmB,EACnB,sBAAsB,CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC"}
@@ -0,0 +1,94 @@
1
+ export interface User {
2
+ id: string;
3
+ username: string;
4
+ email: string;
5
+ passwordHash: string | null;
6
+ linuxUsername: string;
7
+ createdAt: number;
8
+ updatedAt: number;
9
+ isActive: boolean;
10
+ emailVerified: boolean;
11
+ failedLoginAttempts: number;
12
+ lastLoginAt: number | null;
13
+ }
14
+ export interface Session {
15
+ id: string;
16
+ userId: string;
17
+ tokenHash: string;
18
+ ipAddress: string | null;
19
+ userAgent: string | null;
20
+ createdAt: number;
21
+ expiresAt: number;
22
+ isRevoked: boolean;
23
+ revokedAt: number | null;
24
+ }
25
+ export interface OAuth2Provider {
26
+ id: string;
27
+ userId: string;
28
+ provider: "google" | "github" | "microsoft";
29
+ providerUserId: string;
30
+ providerEmail: string | null;
31
+ accessToken: string | null;
32
+ refreshToken: string | null;
33
+ tokenExpiresAt: number | null;
34
+ createdAt: number;
35
+ updatedAt: number;
36
+ }
37
+ export interface AuditLog {
38
+ id: string;
39
+ userId: string | null;
40
+ action: string;
41
+ resourceType: string | null;
42
+ resourceId: string | null;
43
+ ipAddress: string | null;
44
+ userAgent: string | null;
45
+ details: string | null;
46
+ createdAt: number;
47
+ }
48
+ export interface JWTPayload {
49
+ sub: string;
50
+ username: string;
51
+ email: string;
52
+ iat: number;
53
+ exp: number;
54
+ jti: string;
55
+ [key: string]: unknown;
56
+ }
57
+ export interface RegisterRequest {
58
+ username: string;
59
+ email: string;
60
+ password: string;
61
+ }
62
+ export interface LoginRequest {
63
+ email: string;
64
+ password: string;
65
+ }
66
+ export interface AuthResponse {
67
+ user: {
68
+ id: string;
69
+ username: string;
70
+ email: string;
71
+ emailVerified: boolean;
72
+ };
73
+ token: string;
74
+ }
75
+ export declare class AuthError {
76
+ readonly code: string;
77
+ readonly message: string;
78
+ readonly cause?: unknown | undefined;
79
+ readonly _tag = "AuthError";
80
+ constructor(code: string, message: string, cause?: unknown | undefined);
81
+ }
82
+ export declare class ValidationError {
83
+ readonly field: string;
84
+ readonly message: string;
85
+ readonly _tag = "ValidationError";
86
+ constructor(field: string, message: string);
87
+ }
88
+ export declare class DatabaseError {
89
+ readonly message: string;
90
+ readonly cause?: unknown | undefined;
91
+ readonly _tag = "DatabaseError";
92
+ constructor(message: string, cause?: unknown | undefined);
93
+ }
94
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ // Shared types for MyAIDev Method Web Server
2
+ // Error types
3
+ export class AuthError {
4
+ code;
5
+ message;
6
+ cause;
7
+ _tag = "AuthError";
8
+ constructor(code, message, cause) {
9
+ this.code = code;
10
+ this.message = message;
11
+ this.cause = cause;
12
+ }
13
+ }
14
+ export class ValidationError {
15
+ field;
16
+ message;
17
+ _tag = "ValidationError";
18
+ constructor(field, message) {
19
+ this.field = field;
20
+ this.message = message;
21
+ }
22
+ }
23
+ export class DatabaseError {
24
+ message;
25
+ cause;
26
+ _tag = "DatabaseError";
27
+ constructor(message, cause) {
28
+ this.message = message;
29
+ this.cause = cause;
30
+ }
31
+ }
32
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAsF7C,cAAc;AACd,MAAM,OAAO,SAAS;IAGT;IACA;IACA;IAJF,IAAI,GAAG,WAAW,CAAC;IAC5B,YACW,IAAY,EACZ,OAAe,EACf,KAAe;QAFf,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAU;IACvB,CAAC;CACL;AAED,MAAM,OAAO,eAAe;IAGf;IACA;IAHF,IAAI,GAAG,iBAAiB,CAAC;IAClC,YACW,KAAa,EACb,OAAe;QADf,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;IACvB,CAAC;CACL;AAED,MAAM,OAAO,aAAa;IAGb;IACA;IAHF,IAAI,GAAG,eAAe,CAAC;IAChC,YACW,OAAe,EACf,KAAe;QADf,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAU;IACvB,CAAC;CACL"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myaidev-method",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "Comprehensive development framework with SPARC methodology for AI-assisted software development, multi-platform publishing (WordPress, PayloadCMS, Astro, Docusaurus, Mintlify), and Coolify deployment",
5
5
  "mcpName": "io.github.myaione/myaidev-method",
6
6
  "main": "src/index.js",
@@ -23,7 +23,12 @@
23
23
  "mcp:status": "node src/mcp/mcp-launcher.js status",
24
24
  "mcp:health": "node src/mcp/mcp-launcher.js health",
25
25
  "build:mcp": "mkdir -p dist/mcp && cp .claude/mcp/*.js .claude/mcp/*.json dist/mcp/",
26
- "prepublishOnly": "npm install && npm test && npm run build:mcp",
26
+ "build:server": "tsc -p tsconfig.server.json && mkdir -p dist/server/database && cp src/server/database/schema.sql dist/server/database/",
27
+ "build": "npm run build:mcp && npm run build:server",
28
+ "dev:server": "tsx watch src/server/main.ts",
29
+ "typecheck:server": "tsc -p tsconfig.server.json --noEmit",
30
+ "typecheck": "npm run typecheck:server",
31
+ "prepublishOnly": "npm install && npm test && npm run build",
27
32
  "postinstall": "echo \"MyAIDev Method installed successfully! Run 'npx myaidev-method@latest init --claude' to get started.\"",
28
33
  "dev:architect": "node src/scripts/dev-architect.js",
29
34
  "dev:code": "node src/scripts/dev-code.js",
@@ -84,13 +89,21 @@
84
89
  "license": "MIT",
85
90
  "type": "module",
86
91
  "dependencies": {
92
+ "@effect/platform-node": "^0.98.4",
93
+ "@hono/node-server": "^1.19.5",
87
94
  "@modelcontextprotocol/sdk": "^1.18.0",
95
+ "@tsconfig/strictest": "^2.0.5",
96
+ "bcrypt": "^5.1.1",
97
+ "better-sqlite3": "^11.0.0",
88
98
  "chalk": "^5.3.0",
89
99
  "commander": "^12.0.0",
90
100
  "dotenv": "^16.4.1",
101
+ "effect": "^3.18.4",
91
102
  "fs-extra": "^11.2.0",
92
103
  "gray-matter": "^4.0.3",
104
+ "hono": "^4.10.3",
93
105
  "inquirer": "^9.2.15",
106
+ "jose": "^5.2.2",
94
107
  "marked": "^11.0.0",
95
108
  "node-fetch": "^3.3.2",
96
109
  "ora": "^8.0.1",
@@ -98,6 +111,13 @@
98
111
  "ssh2": "^1.15.0",
99
112
  "zod": "^3.23.8"
100
113
  },
114
+ "devDependencies": {
115
+ "@types/bcrypt": "^5.0.2",
116
+ "@types/better-sqlite3": "^7.6.11",
117
+ "@types/node": "^20.11.17",
118
+ "tsx": "^4.7.1",
119
+ "typescript": "^5.3.3"
120
+ },
101
121
  "repository": {
102
122
  "type": "git",
103
123
  "url": "git+https://github.com/myaione/myaidev-method.git"
@@ -119,10 +139,10 @@
119
139
  "MCP_INTEGRATION.md",
120
140
  "WORDPRESS_ADMIN_SCRIPTS.md",
121
141
  "COOLIFY_DEPLOYMENT.md",
122
- "PAYLOADCMS_PUBLISHING.md",
123
- "STATIC_SITE_PUBLISHING.md",
124
142
  "PUBLISHING_GUIDE.md",
125
- "TECHNICAL_ARCHITECTURE.md"
143
+ "TECHNICAL_ARCHITECTURE.md",
144
+ "PACKAGE_FIXES_SUMMARY.md",
145
+ "PAYLOADCMS_AUTH_UPDATE.md"
126
146
  ],
127
147
  "engines": {
128
148
  "node": ">=18.0.0"
@@ -12,7 +12,7 @@ import { marked } from 'marked';
12
12
  export class PayloadCMSUtils {
13
13
  constructor(config = {}) {
14
14
  // Load config from .env if not provided
15
- if (!config.url || (!config.email && !config.apiKey)) {
15
+ if (!config.url || !config.email) {
16
16
  const envConfig = this.loadEnvConfig();
17
17
  config = { ...envConfig, ...config };
18
18
  }
@@ -20,7 +20,6 @@ export class PayloadCMSUtils {
20
20
  this.url = config.url?.replace(/\/$/, '');
21
21
  this.email = config.email;
22
22
  this.password = config.password;
23
- this.apiKey = config.apiKey;
24
23
  this.token = null;
25
24
  }
26
25
 
@@ -33,8 +32,7 @@ export class PayloadCMSUtils {
33
32
  return {
34
33
  url: parsed.PAYLOADCMS_URL,
35
34
  email: parsed.PAYLOADCMS_EMAIL,
36
- password: parsed.PAYLOADCMS_PASSWORD,
37
- apiKey: parsed.PAYLOADCMS_API_KEY
35
+ password: parsed.PAYLOADCMS_PASSWORD
38
36
  };
39
37
  } catch (error) {
40
38
  throw new Error(`Failed to load PayloadCMS configuration: ${error.message}`);
@@ -43,16 +41,11 @@ export class PayloadCMSUtils {
43
41
 
44
42
  /**
45
43
  * Authenticate with PayloadCMS and get JWT token
44
+ * Uses email/password to obtain a JWT token that is used for all API requests
46
45
  */
47
46
  async authenticate() {
48
- // If API key is provided, use that instead
49
- if (this.apiKey) {
50
- this.token = this.apiKey;
51
- return { success: true, method: 'api-key' };
52
- }
53
-
54
47
  if (!this.email || !this.password) {
55
- throw new Error('Email and password required for authentication');
48
+ throw new Error('PAYLOADCMS_EMAIL and PAYLOADCMS_PASSWORD required for authentication');
56
49
  }
57
50
 
58
51
  try {
@@ -69,7 +62,7 @@ export class PayloadCMSUtils {
69
62
 
70
63
  if (!response.ok) {
71
64
  const error = await response.text();
72
- throw new Error(`Authentication failed: ${error}`);
65
+ throw new Error(`Authentication failed (${response.status}): ${error}`);
73
66
  }
74
67
 
75
68
  const data = await response.json();