myaidev-method 0.2.8 → 0.2.10
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/.claude/agents/wordpress-admin.md +271 -0
- package/.env.example +0 -1
- package/PACKAGE_FIXES_SUMMARY.md +319 -0
- package/PAYLOADCMS_AUTH_UPDATE.md +248 -0
- package/USER_GUIDE.md +260 -0
- package/bin/cli.js +70 -0
- package/dist/server/.tsbuildinfo +1 -0
- package/dist/server/auth/controllers/AuthController.d.ts +34 -0
- package/dist/server/auth/controllers/AuthController.d.ts.map +1 -0
- package/dist/server/auth/controllers/AuthController.js +43 -0
- package/dist/server/auth/controllers/AuthController.js.map +1 -0
- package/dist/server/auth/example-usage.d.ts +53 -0
- package/dist/server/auth/example-usage.d.ts.map +1 -0
- package/dist/server/auth/example-usage.js +129 -0
- package/dist/server/auth/example-usage.js.map +1 -0
- package/dist/server/auth/index.d.ts +11 -0
- package/dist/server/auth/index.d.ts.map +1 -0
- package/dist/server/auth/index.js +15 -0
- package/dist/server/auth/index.js.map +1 -0
- package/dist/server/auth/layers.d.ts +19 -0
- package/dist/server/auth/layers.d.ts.map +1 -0
- package/dist/server/auth/layers.js +33 -0
- package/dist/server/auth/layers.js.map +1 -0
- package/dist/server/auth/middleware/authMiddleware.d.ts +24 -0
- package/dist/server/auth/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/server/auth/middleware/authMiddleware.js +65 -0
- package/dist/server/auth/middleware/authMiddleware.js.map +1 -0
- package/dist/server/auth/routes/authRoutes.d.ts +11 -0
- package/dist/server/auth/routes/authRoutes.d.ts.map +1 -0
- package/dist/server/auth/routes/authRoutes.js +213 -0
- package/dist/server/auth/routes/authRoutes.js.map +1 -0
- package/dist/server/auth/services/AuditLogService.d.ts +21 -0
- package/dist/server/auth/services/AuditLogService.d.ts.map +1 -0
- package/dist/server/auth/services/AuditLogService.js +28 -0
- package/dist/server/auth/services/AuditLogService.js.map +1 -0
- package/dist/server/auth/services/AuthService.d.ts +27 -0
- package/dist/server/auth/services/AuthService.d.ts.map +1 -0
- package/dist/server/auth/services/AuthService.js +246 -0
- package/dist/server/auth/services/AuthService.js.map +1 -0
- package/dist/server/auth/services/PasswordService.d.ts +12 -0
- package/dist/server/auth/services/PasswordService.d.ts.map +1 -0
- package/dist/server/auth/services/PasswordService.js +31 -0
- package/dist/server/auth/services/PasswordService.js.map +1 -0
- package/dist/server/auth/services/SessionRepository.d.ts +24 -0
- package/dist/server/auth/services/SessionRepository.d.ts.map +1 -0
- package/dist/server/auth/services/SessionRepository.js +101 -0
- package/dist/server/auth/services/SessionRepository.js.map +1 -0
- package/dist/server/auth/services/TokenService.d.ts +12 -0
- package/dist/server/auth/services/TokenService.d.ts.map +1 -0
- package/dist/server/auth/services/TokenService.js +86 -0
- package/dist/server/auth/services/TokenService.js.map +1 -0
- package/dist/server/auth/services/UserRepository.d.ts +23 -0
- package/dist/server/auth/services/UserRepository.d.ts.map +1 -0
- package/dist/server/auth/services/UserRepository.js +168 -0
- package/dist/server/auth/services/UserRepository.js.map +1 -0
- package/dist/server/auth/services/example.d.ts +26 -0
- package/dist/server/auth/services/example.d.ts.map +1 -0
- package/dist/server/auth/services/example.js +221 -0
- package/dist/server/auth/services/example.js.map +1 -0
- package/dist/server/auth/services/index.d.ts +6 -0
- package/dist/server/auth/services/index.d.ts.map +1 -0
- package/dist/server/auth/services/index.js +7 -0
- package/dist/server/auth/services/index.js.map +1 -0
- package/dist/server/database/db.d.ts +28 -0
- package/dist/server/database/db.d.ts.map +1 -0
- package/dist/server/database/db.js +91 -0
- package/dist/server/database/db.js.map +1 -0
- package/dist/server/database/schema.sql +95 -0
- package/dist/server/hono/app.d.ts +10 -0
- package/dist/server/hono/app.d.ts.map +1 -0
- package/dist/server/hono/app.js +26 -0
- package/dist/server/hono/app.js.map +1 -0
- package/dist/server/hono/routes.d.ts +12 -0
- package/dist/server/hono/routes.d.ts.map +1 -0
- package/dist/server/hono/routes.js +40 -0
- package/dist/server/hono/routes.js.map +1 -0
- package/dist/server/main.d.ts +2 -0
- package/dist/server/main.d.ts.map +1 -0
- package/dist/server/main.js +94 -0
- package/dist/server/main.js.map +1 -0
- package/dist/server/user-management/DirectoryService.d.ts +62 -0
- package/dist/server/user-management/DirectoryService.d.ts.map +1 -0
- package/dist/server/user-management/DirectoryService.js +201 -0
- package/dist/server/user-management/DirectoryService.js.map +1 -0
- package/dist/server/user-management/LinuxUserService.d.ts +71 -0
- package/dist/server/user-management/LinuxUserService.d.ts.map +1 -0
- package/dist/server/user-management/LinuxUserService.js +192 -0
- package/dist/server/user-management/LinuxUserService.js.map +1 -0
- package/dist/server/user-management/QuotaService.d.ts +59 -0
- package/dist/server/user-management/QuotaService.d.ts.map +1 -0
- package/dist/server/user-management/QuotaService.js +148 -0
- package/dist/server/user-management/QuotaService.js.map +1 -0
- package/dist/server/user-management/UserManagementService.d.ts +74 -0
- package/dist/server/user-management/UserManagementService.d.ts.map +1 -0
- package/dist/server/user-management/UserManagementService.js +122 -0
- package/dist/server/user-management/UserManagementService.js.map +1 -0
- package/dist/server/user-management/index.d.ts +26 -0
- package/dist/server/user-management/index.d.ts.map +1 -0
- package/dist/server/user-management/index.js +26 -0
- package/dist/server/user-management/index.js.map +1 -0
- package/dist/server/user-management/layers.d.ts +27 -0
- package/dist/server/user-management/layers.d.ts.map +1 -0
- package/dist/server/user-management/layers.js +37 -0
- package/dist/server/user-management/layers.js.map +1 -0
- package/dist/shared/types.d.ts +94 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +32 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +25 -5
- package/src/lib/payloadcms-utils.js +5 -12
- package/src/server/auth/ARCHITECTURE.md +575 -0
- package/src/server/auth/IMPLEMENTATION_SUMMARY.md +287 -0
- package/src/server/auth/QUICK_START.md +283 -0
- package/src/server/auth/README.md +290 -0
- package/src/server/auth/controllers/AuthController.ts +129 -0
- package/src/server/auth/example-usage.ts +159 -0
- package/src/server/auth/index.ts +19 -0
- package/src/server/auth/layers.ts +57 -0
- package/src/server/auth/middleware/authMiddleware.ts +118 -0
- package/src/server/auth/routes/authRoutes.ts +319 -0
- package/src/server/auth/services/AuditLogService.ts +81 -0
- package/src/server/auth/services/AuthService.ts +408 -0
- package/src/server/auth/services/IMPLEMENTATION_SUMMARY.md +404 -0
- package/src/server/auth/services/PasswordService.ts +85 -0
- package/src/server/auth/services/README.md +361 -0
- package/src/server/auth/services/SessionRepository.ts +227 -0
- package/src/server/auth/services/TokenService.ts +174 -0
- package/src/server/auth/services/UserRepository.ts +318 -0
- package/src/server/auth/services/example.ts +346 -0
- package/src/server/auth/services/index.ts +6 -0
- package/src/server/database/db.ts +161 -0
- package/src/server/database/schema.sql +95 -0
- package/src/server/hono/app.ts +41 -0
- package/src/server/main.ts +115 -0
- package/src/server/user-management/DirectoryService.ts +348 -0
- package/src/server/user-management/LinuxUserService.ts +338 -0
- package/src/server/user-management/QuotaService.ts +256 -0
- package/src/server/user-management/README.md +333 -0
- package/src/server/user-management/UserManagementService.ts +335 -0
- package/src/server/user-management/index.ts +26 -0
- package/src/server/user-management/layers.ts +51 -0
- package/src/shared/types.ts +111 -0
- package/src/templates/claude/agents/coolify-deploy.md +50 -50
- package/src/templates/claude/agents/payloadcms-publish.md +46 -18
- package/src/templates/codex/commands/myai-astro-publish.md +8 -2
- package/src/templates/codex/commands/myai-content-writer.md +8 -2
- package/src/templates/codex/commands/myai-coolify-deploy.md +8 -2
- package/src/templates/codex/commands/myai-dev-architect.md +8 -2
- package/src/templates/codex/commands/myai-dev-code.md +8 -2
- package/src/templates/codex/commands/myai-dev-docs.md +8 -2
- package/src/templates/codex/commands/myai-dev-review.md +8 -2
- package/src/templates/codex/commands/myai-dev-test.md +8 -2
- package/src/templates/codex/commands/myai-docusaurus-publish.md +8 -2
- package/src/templates/codex/commands/myai-mintlify-publish.md +8 -2
- package/src/templates/codex/commands/myai-payloadcms-publish.md +17 -3
- package/src/templates/codex/commands/myai-sparc-workflow.md +8 -2
- package/src/templates/codex/commands/myai-wordpress-admin.md +8 -2
- 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.
|
|
3
|
+
"version": "0.2.10",
|
|
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
|
-
"
|
|
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 ||
|
|
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('
|
|
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();
|