@magic-ingredients/tiny-brain-local 0.15.4 → 0.16.1

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.
@@ -54,6 +54,7 @@ export interface AnalyseResult {
54
54
  agentsSuggestedNew: string[];
55
55
  agentsSuggestedRemove: string[];
56
56
  };
57
+ skillPermissionsAdded?: string[];
57
58
  }
58
59
  export interface AppliedRecommendationsSummary {
59
60
  installed: string[];
@@ -126,6 +127,12 @@ export declare class AnalyseService {
126
127
  * @returns true if any hooks were installed
127
128
  */
128
129
  private initializeGitHooks;
130
+ /**
131
+ * Inject skill permissions into .claude/settings.json
132
+ * These permissions allow skills to read/write to specific directories without prompts
133
+ * @returns Array of permissions that were added (empty if none added)
134
+ */
135
+ private injectSkillPermissions;
129
136
  /**
130
137
  * Get installed skills with their versions from .claude/skills/
131
138
  * @returns Array of installed skills with name and version
@@ -1 +1 @@
1
- {"version":3,"file":"analyse-service.d.ts","sourceRoot":"","sources":["../../src/services/analyse-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyse-service.d.ts","sourceRoot":"","sources":["../../src/services/analyse-service.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ import { LibraryClient } from '@magic-ingredients/tiny-brain-core';
11
11
  import { fileURLToPath } from 'url';
12
12
  import { dirname, join } from 'path';
13
13
  import { existsSync } from 'fs';
14
- import { mkdir, copyFile, readFile, readdir, chmod, stat } from 'fs/promises';
14
+ import { mkdir, copyFile, readFile, readdir, chmod, stat, writeFile } from 'fs/promises';
15
15
  import { getPackageVersion } from '../utils/package-version.js';
16
16
  /**
17
17
  * Service for managing repository analysis
@@ -46,6 +46,8 @@ export class AnalyseService {
46
46
  const qualityInitialized = await this.initializeQualitySkill();
47
47
  // Initialize git hooks for TDD workflow
48
48
  const gitHooksInstalled = await this.initializeGitHooks();
49
+ // Inject skill permissions into .claude/settings.json
50
+ const skillPermissionsAdded = await this.injectSkillPermissions();
49
51
  // Check if repository is already initialized by reading existing context
50
52
  const existingContent = await this.repoService.readRepoBlockFromContextFile(contextPath);
51
53
  const isInitialized = existingContent ? this.repoService.isRepoInitialized(existingContent) : false;
@@ -77,7 +79,8 @@ export class AnalyseService {
77
79
  qualityInitialized,
78
80
  gitHooksInstalled,
79
81
  contextBlockVersion,
80
- contextBlockUpdated
82
+ contextBlockUpdated,
83
+ skillPermissionsAdded: skillPermissionsAdded.length > 0 ? skillPermissionsAdded : undefined
81
84
  };
82
85
  }
83
86
  // Repository is initialized - compare with previous analysis
@@ -98,7 +101,8 @@ export class AnalyseService {
98
101
  qualityInitialized,
99
102
  gitHooksInstalled,
100
103
  contextBlockVersion,
101
- contextBlockUpdated
104
+ contextBlockUpdated,
105
+ skillPermissionsAdded: skillPermissionsAdded.length > 0 ? skillPermissionsAdded : undefined
102
106
  };
103
107
  }
104
108
  // Compare tech stacks to detect changes
@@ -119,7 +123,8 @@ export class AnalyseService {
119
123
  qualityInitialized,
120
124
  gitHooksInstalled,
121
125
  contextBlockVersion,
122
- contextBlockUpdated
126
+ contextBlockUpdated,
127
+ skillPermissionsAdded: skillPermissionsAdded.length > 0 ? skillPermissionsAdded : undefined
123
128
  };
124
129
  }
125
130
  // Changes detected
@@ -143,7 +148,8 @@ export class AnalyseService {
143
148
  techStackRemoved: techStackDiff.removed,
144
149
  agentsSuggestedNew: [], // Agents are now handled by TBR service
145
150
  agentsSuggestedRemove: []
146
- }
151
+ },
152
+ skillPermissionsAdded: skillPermissionsAdded.length > 0 ? skillPermissionsAdded : undefined
147
153
  };
148
154
  }
149
155
  /**
@@ -432,6 +438,70 @@ export class AnalyseService {
432
438
  return false;
433
439
  }
434
440
  }
441
+ /**
442
+ * Inject skill permissions into .claude/settings.json
443
+ * These permissions allow skills to read/write to specific directories without prompts
444
+ * @returns Array of permissions that were added (empty if none added)
445
+ */
446
+ async injectSkillPermissions() {
447
+ const SKILL_PERMISSIONS = [
448
+ 'Write(.tiny-brain/**)',
449
+ 'Write(docs/prd/**)',
450
+ 'Write(docs/adr/**)',
451
+ 'Write(docs/quality/**)',
452
+ 'Read(.tiny-brain/**)',
453
+ 'Read(docs/prd/**)',
454
+ 'Read(docs/adr/**)',
455
+ 'Read(docs/quality/**)',
456
+ 'Read(.claude/skills/**/templates/**)',
457
+ ];
458
+ try {
459
+ const repoRoot = process.cwd();
460
+ const settingsDir = join(repoRoot, '.claude');
461
+ const settingsPath = join(settingsDir, 'settings.json');
462
+ // Ensure .claude directory exists
463
+ await mkdir(settingsDir, { recursive: true });
464
+ // Read existing settings or start with empty object
465
+ let settings = {};
466
+ if (existsSync(settingsPath)) {
467
+ try {
468
+ const content = await readFile(settingsPath, 'utf-8');
469
+ settings = JSON.parse(content);
470
+ }
471
+ catch {
472
+ this.context.logger.warn('Failed to parse existing settings.json, will create new one');
473
+ settings = {};
474
+ }
475
+ }
476
+ // Ensure permissions.allow array exists
477
+ if (!settings.permissions) {
478
+ settings.permissions = {};
479
+ }
480
+ const permissions = settings.permissions;
481
+ if (!Array.isArray(permissions.allow)) {
482
+ permissions.allow = [];
483
+ }
484
+ const allowList = permissions.allow;
485
+ // Add missing permissions
486
+ const addedPermissions = [];
487
+ for (const perm of SKILL_PERMISSIONS) {
488
+ if (!allowList.includes(perm)) {
489
+ allowList.push(perm);
490
+ addedPermissions.push(perm);
491
+ }
492
+ }
493
+ // Only write if we added new permissions
494
+ if (addedPermissions.length > 0) {
495
+ await writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
496
+ this.context.logger.info(`Added ${addedPermissions.length} skill permissions to .claude/settings.json`);
497
+ }
498
+ return addedPermissions;
499
+ }
500
+ catch (error) {
501
+ this.context.logger.warn(`Failed to inject skill permissions: ${error instanceof Error ? error.message : 'Unknown error'}`);
502
+ return [];
503
+ }
504
+ }
435
505
  /**
436
506
  * Get installed skills with their versions from .claude/skills/
437
507
  * @returns Array of installed skills with name and version
@@ -580,6 +650,11 @@ export class AnalyseService {
580
650
  lines.push('\nšŸŖ Git Hooks: Installed');
581
651
  lines.push(' TDD workflow hooks in .git/hooks/');
582
652
  }
653
+ // Show skill permissions status
654
+ if (result.skillPermissionsAdded && result.skillPermissionsAdded.length > 0) {
655
+ lines.push('\nšŸ” Skill Permissions: Added to .claude/settings.json');
656
+ lines.push(` ${result.skillPermissionsAdded.length} permissions added for skill file operations`);
657
+ }
583
658
  // Add current agents section
584
659
  lines.push('\nšŸ¤– Current Agents:');
585
660
  if (result.currentAgents && result.currentAgents.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magic-ingredients/tiny-brain-local",
3
- "version": "0.15.4",
3
+ "version": "0.16.1",
4
4
  "description": "MCP server for Tiny Brain AI assistant",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -31,7 +31,7 @@
31
31
  "dxt:init": "cd dxt && dxt init"
32
32
  },
33
33
  "dependencies": {
34
- "@magic-ingredients/tiny-brain-core": "^0.15.4",
34
+ "@magic-ingredients/tiny-brain-core": "^0.16.1",
35
35
  "@magic-ingredients/tiny-brain-dashboard": "file:../tiny-brain-dashboard",
36
36
  "@modelcontextprotocol/sdk": "^1.0.6",
37
37
  "chalk": "^5.3.0",