claude-comms 1.0.34 → 1.0.35

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/.agents/repo.md CHANGED
@@ -1,29 +1,7 @@
1
1
 
2
2
  # Repository Guidelines
3
-
4
- ## Project Structure & Module Organization
5
- - `apps/server` hosts the Bun observability API; routes stay in `src/index.ts`, persistence helpers in `src/db.ts`, and regression suites in `src/__tests__`.
6
- - `apps/client` contains the Vue dashboard; UI modules live in `src/components` and `src/views` with Vitest and Playwright specs under `tests/`.
7
- - `packages/setup-installer` ships the `claude-comms` NPX CLI; logic resides in `src/`, distributable templates in `templates/`, and Jest suites across `test/unit`, `test/integration`, and `test/e2e`.
8
- - `.claude/hooks/*` stores Python-powered agents, while `scripts/` provides operational helpers such as `start-system.sh`, `reset-system.sh`, and telemetry generators.
9
-
10
- ## Build, Test, and Development Commands
11
- - `./scripts/start-system.sh` boots the Bun API, Vue dashboard, and SQLite broker for an end-to-end stack from the repo root.
12
- - `cd apps/server && bun install && bun run dev` starts the API with hot reload; use `bun run start` for production parity and `bun run typecheck` before merging.
13
- - `cd apps/client && bun install && bun run dev` launches the dashboard; `bun run build` compiles the Vite bundle and `bun run preview` smoke-tests it.
14
- - `cd packages/setup-installer && npm install && npm test` validates the installer; run `npm run lint` or `npm run test:coverage` when altering CLI behavior or templates.
15
-
16
- ## Coding Style & Naming Conventions
17
- - Use 2-space indentation, `camelCase` utilities, `PascalCase` components and types, and co-locate shared shapes in `apps/*/src/types.ts`.
18
- - Keep persistence isolated to `apps/server/src/db.ts`; expose new queries through typed helpers rather than inline SQL inside request handlers.
19
- - In the dashboard prefer composables in `src/composables`, Tailwind utility classes, and structured logging or toast utilities instead of raw `console.log` calls.
20
-
21
- ## Testing Guidelines
22
- - Backend suites live in `apps/server/src/__tests__` with `.test.ts` suffixes; run `bun run test` or `bun run test:coverage` whenever mutating server logic.
23
- - Dashboard coverage pairs Vitest (`bun run test`) with Playwright smoke tests in `apps/client/tests/playwright`; refresh artifacts in `tests/visual` when UI states change.
24
- - Installer validation relies on Jest; execute `npm run test:integration` after template edits and `npm run test:e2e` before publishing new packages.
25
-
26
- ## Commit & Pull Request Guidelines
27
- - History favors short, imperative subjects (`remove matrix mode`) with selective conventional prefixes (`chore(release): 1.0.23`); follow that tone and omit trailing periods.
28
- - Reference issues and describe agent-facing impact in PR descriptions; attach dashboard screenshots or installer logs whenever UX or setup flows shift.
29
- - Before requesting review, ensure `./scripts/test-system.sh` plus relevant package checks pass and call out skipped suites or follow-up tasks in the PR notes.
3
+ Run required commands — all must pass without warnings or errors:
4
+ - `pnpm lint`
5
+ - `pnpm ts:check`
6
+ - `pnpm test:all`
7
+ - `pnpm build`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-comms",
3
- "version": "1.0.34",
3
+ "version": "1.0.35",
4
4
  "description": "NPX installer for Claude Code hooks and observability setup",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -332,6 +332,10 @@ class GitHubFetcher extends EventEmitter {
332
332
  // Observability hooks
333
333
  '.claude/hooks/observability/send_event.py',
334
334
 
335
+ // Agents directory
336
+ '.agents/AGENTS.md',
337
+ '.agents/repo.md',
338
+
335
339
  // Root CLAUDE.md
336
340
  'CLAUDE.md'
337
341
  ];
@@ -339,7 +343,10 @@ class GitHubFetcher extends EventEmitter {
339
343
  const files = [];
340
344
 
341
345
  for (const filePath of knownFiles) {
342
- if (filePath.startsWith(path) || (path === '.claude' && filePath.startsWith('.claude')) || (path === 'CLAUDE.md' && filePath === 'CLAUDE.md')) {
346
+ if (filePath.startsWith(path) ||
347
+ (path === '.claude' && filePath.startsWith('.claude')) ||
348
+ (path === '.agents' && filePath.startsWith('.agents')) ||
349
+ (path === 'CLAUDE.md' && filePath === 'CLAUDE.md')) {
343
350
  try {
344
351
  const content = await this._fetchSingleFileRaw(filePath, options);
345
352
  files.push(content);
@@ -867,6 +874,12 @@ class GitHubFetcher extends EventEmitter {
867
874
  type: 'dir',
868
875
  children: [],
869
876
  files: []
877
+ },
878
+ '.agents': {
879
+ path: '.agents',
880
+ type: 'dir',
881
+ children: [],
882
+ files: []
870
883
  }
871
884
  };
872
885
 
@@ -899,18 +912,19 @@ class GitHubFetcher extends EventEmitter {
899
912
 
900
913
  // Only extract files we care about
901
914
  const isClaudeFile = actualPath.startsWith('.claude/') || actualPath === '.claude';
915
+ const isAgentsFile = actualPath.startsWith('.agents/') || actualPath === '.agents';
902
916
  const isClaudeMd = actualPath === 'CLAUDE.md';
903
917
 
904
- console.log(`DEBUG: ${actualPath} -> claude: ${isClaudeFile}, md: ${isClaudeMd}, type: ${entry.type}`);
918
+ console.log(`DEBUG: ${actualPath} -> claude: ${isClaudeFile}, agents: ${isAgentsFile}, md: ${isClaudeMd}, type: ${entry.type}`);
905
919
 
906
- if ((isClaudeFile || isClaudeMd) && entry.type === 'File') {
920
+ if ((isClaudeFile || isAgentsFile || isClaudeMd) && entry.type === 'File') {
907
921
  wantedFiles.set(filePath, actualPath);
908
922
  console.log(`DEBUG: Will extract: ${filePath} -> ${actualPath}`);
909
923
  return true;
910
924
  }
911
925
 
912
- // Also allow .claude directories to be processed for their children
913
- if (isClaudeFile && entry.type === 'Directory') {
926
+ // Also allow .claude and .agents directories to be processed for their children
927
+ if ((isClaudeFile || isAgentsFile) && entry.type === 'Directory') {
914
928
  return true;
915
929
  }
916
930
 
@@ -964,6 +978,21 @@ class GitHubFetcher extends EventEmitter {
964
978
  // Build directory structure for compatibility
965
979
  const relativePath = actualPath.slice('.claude/'.length);
966
980
  this._addToDirectoryStructure(extractedFiles['.claude'], relativePath, fileObj);
981
+ } else if (actualPath.startsWith('.agents/')) {
982
+ // Add to .agents files
983
+ const fileObj = {
984
+ path: actualPath,
985
+ content: content,
986
+ encoding: 'utf-8',
987
+ type: 'file'
988
+ };
989
+
990
+ extractedFiles['.agents'].files.push(fileObj);
991
+ console.log(`DEBUG: Added ${actualPath} to .agents files (${extractedFiles['.agents'].files.length} total)`);
992
+
993
+ // Build directory structure for compatibility
994
+ const relativePath = actualPath.slice('.agents/'.length);
995
+ this._addToDirectoryStructure(extractedFiles['.agents'], relativePath, fileObj);
967
996
  }
968
997
  }
969
998
  } catch (fileError) {
@@ -972,7 +1001,7 @@ class GitHubFetcher extends EventEmitter {
972
1001
  }
973
1002
  }
974
1003
 
975
- console.log(`DEBUG: Final result - .claude has ${extractedFiles['.claude'].files.length} files, CLAUDE.md: ${extractedFiles['CLAUDE.md'] ? 'present' : 'missing'}`);
1004
+ console.log(`DEBUG: Final result - .claude has ${extractedFiles['.claude'].files.length} files, .agents has ${extractedFiles['.agents'].files.length} files, CLAUDE.md: ${extractedFiles['CLAUDE.md'] ? 'present' : 'missing'}`);
976
1005
 
977
1006
  // Clean up temp directory
978
1007
  try {
@@ -1059,8 +1088,13 @@ async function fetchRepository(gitRef = 'main', options = {}) {
1059
1088
 
1060
1089
  return {
1061
1090
  claudeDirectory: tarballFiles['.claude'],
1091
+ agentsDirectory: tarballFiles['.agents'],
1062
1092
  claudeFile: tarballFiles['CLAUDE.md'],
1063
- files: [...(tarballFiles['.claude'].files || []), tarballFiles['CLAUDE.md']]
1093
+ files: [
1094
+ ...(tarballFiles['.claude'].files || []),
1095
+ ...(tarballFiles['.agents'].files || []),
1096
+ tarballFiles['CLAUDE.md']
1097
+ ]
1064
1098
  };
1065
1099
 
1066
1100
  } catch (tarballError) {
@@ -1069,15 +1103,17 @@ async function fetchRepository(gitRef = 'main', options = {}) {
1069
1103
 
1070
1104
  try {
1071
1105
  // Strategy 2: Individual file fetch (fallback)
1072
- const [claudeDir, claudeMd] = await Promise.all([
1106
+ const [claudeDir, agentsDir, claudeMd] = await Promise.all([
1073
1107
  fetcher.fetchDirectory('.claude', { version: gitRef }),
1108
+ fetcher.fetchDirectory('.agents', { version: gitRef }),
1074
1109
  fetcher.fetchFile('CLAUDE.md', { version: gitRef })
1075
1110
  ]);
1076
1111
 
1077
1112
  return {
1078
1113
  claudeDirectory: claudeDir,
1114
+ agentsDirectory: agentsDir,
1079
1115
  claudeFile: claudeMd,
1080
- files: [...(claudeDir.files || []), claudeMd]
1116
+ files: [...(claudeDir.files || []), ...(agentsDir.files || []), claudeMd]
1081
1117
  };
1082
1118
 
1083
1119
  } catch (fallbackError) {