Codeman maintainer
f496e35d71
feat(multiuser): phase 1, user store, mode plumbing, CLI
Opt-in multi-user foundation (off by default; no behavior change without
CODEMAN_MULTIUSER/--multiuser):
- src/config/multiuser.ts: isMultiUserMode(), getUserSpacesDir()/userCasesDir(),
maxUsers(), maxSessionsPerUser() (per-user fairness cap = global/2).
- src/types/user.ts: UserRecord/PasswordHash/AuthUser/PublicUser/UserRole.
- src/user-store.ts: ~/.codeman/users.json (atomic tmp+rename, mode 0600, short
TTL cache). scrypt hashing with per-record params + timingSafeEqual verify plus
rehash detection; createUser/setPassword/updateUser/deleteUser with last-admin
invariants; guarded deleteUserSpace (symlink + realpath confinement, section 8);
pure section-6.3 resolvers (resolveClaudeModeForUser downgrades bypass to auto
for non-granted users; canRunPrivilegedCommands); bootstrapInitialAdmin.
- src/cli.ts: "codeman users add|passwd|list|rm" (hidden prompt or
--password-stdin) operating directly on users.json; a --multiuser flag on the
web command.
Tests: test/user-store.test.ts (29 tests: hashing/verify/rehash, username
validation, atomic 0600 write, last-admin invariants, 6.3 resolvers,
delete-space guards, bootstrap).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 02:58:51 +02:00
..
2026-07-20 02:58:51 +02:00
2026-07-12 19:25:42 +02:00
2026-06-10 18:06:45 +02:00
2026-07-12 12:19:10 -04:00
2026-06-10 18:06:45 +02:00
2026-07-20 02:58:51 +02:00
2026-07-16 09:33:39 +02:00
2026-07-20 02:48:14 +02:00
2026-03-27 01:43:59 +01:00
2026-04-23 11:57:00 +02:00
2026-05-31 05:17:07 +02:00
2026-07-12 17:50:21 +02:00
2026-07-10 20:54:41 -04:00
2026-04-23 11:57:00 +02:00
2026-07-20 02:58:51 +02:00
2026-07-19 17:38:01 +02:00
2026-07-20 01:36:21 +02:00
2026-06-14 08:43:57 +02:00
2026-06-14 08:43:57 +02:00
2026-07-12 17:50:21 +02:00
2026-06-09 20:02:17 +02:00
2026-07-12 17:50:21 +02:00
2026-06-14 22:35:29 +02:00
2026-06-12 09:09:14 -04:00
2026-07-09 11:47:38 -04:00
2026-02-18 12:51:35 +01:00
2026-07-19 15:09:48 +02:00
2026-04-23 11:57:00 +02:00
2026-03-21 07:20:18 +01:00
2026-03-27 01:43:59 +01:00
2026-04-23 11:57:00 +02:00
2026-06-06 03:53:54 +02:00
2026-04-23 11:57:00 +02:00
2026-03-01 04:04:35 +01:00
2026-04-23 11:57:00 +02:00
2026-03-01 04:04:35 +01:00
2026-03-07 07:33:44 +01:00
2026-03-26 22:50:25 +01:00
2026-06-25 00:26:06 +02:00
2026-07-12 19:49:58 +02:00
2026-03-01 17:26:31 +01:00
2026-06-10 20:41:34 +02:00
2026-03-01 04:04:35 +01:00
2026-03-01 04:04:35 +01:00
2026-03-01 04:04:35 +01:00
2026-03-07 07:33:44 +01:00
2026-06-19 12:35:16 -04:00
2026-06-14 09:05:17 +02:00
2026-06-10 20:41:34 +02:00
2026-07-20 02:48:14 +02:00
2026-06-06 03:53:54 +02:00
2026-04-24 09:49:52 +08:00
2026-07-09 11:49:23 -04:00
2026-03-01 04:04:35 +01:00
2026-07-20 02:48:14 +02:00
2026-06-29 11:35:56 +05:30
2026-06-15 01:43:15 +02:00
2026-04-23 11:57:00 +02:00
2026-04-23 11:57:00 +02:00
2026-01-24 04:36:18 +01:00
2026-03-12 15:50:40 +01:00
2026-07-20 02:48:14 +02:00
2026-04-23 11:57:00 +02:00
2026-04-23 11:57:00 +02:00
2026-03-03 22:40:18 +01:00
2026-06-10 20:41:34 +02:00
2026-06-14 07:33:52 +02:00
2026-07-20 02:58:51 +02:00
2026-06-18 10:00:04 +02:00