@magic-ingredients/tiny-brain-local 0.16.0 ā 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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,aAAa,EAInB,MAAM,oCAAoC,CAAC;AAW5C,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACpC,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,eAAe,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,qBAAqB,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;
|
|
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.16.
|
|
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.16.
|
|
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",
|