fraim-framework 2.0.166 → 2.0.168
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/dist/src/ai-hub/catalog.js +43 -36
- package/dist/src/ai-hub/server.js +28 -5
- package/dist/src/cli/commands/init-project.js +1 -98
- package/dist/src/cli/commands/manager.js +40 -0
- package/dist/src/cli/commands/sync.js +17 -21
- package/dist/src/cli/fraim.js +2 -0
- package/dist/src/cli/utils/github-workflow-sync.js +12 -146
- package/dist/src/cli/utils/manager-pack-sync.js +188 -0
- package/dist/src/cli/utils/manager-publish.js +76 -0
- package/dist/src/cli/utils/user-config.js +20 -0
- package/dist/src/core/config-loader.js +9 -5
- package/dist/src/core/fraim-config-schema.generated.js +85 -31
- package/dist/src/core/manager-pack.js +26 -0
- package/dist/src/core/utils/local-registry-resolver.js +8 -1
- package/dist/src/first-run/install-state.js +1 -0
- package/dist/src/first-run/server.js +9 -0
- package/dist/src/first-run/session-service.js +117 -23
- package/dist/src/first-run/types.js +2 -5
- package/dist/src/local-mcp-server/learning-context-builder.js +45 -8
- package/dist/src/local-mcp-server/stdio-server.js +28 -0
- package/index.js +1 -1
- package/package.json +4 -1
- package/public/ai-hub/powerpoint-taskpane/index.html +236 -236
- package/public/ai-hub/powerpoint-taskpane/manifest.xml +29 -29
- package/public/ai-hub/review.css +13 -0
- package/public/ai-hub/script.js +199 -5
- package/public/ai-hub/styles.css +28 -0
- package/public/first-run/index.html +1 -1
- package/public/first-run/script.js +459 -530
- package/public/first-run/styles.css +288 -73
- package/public/portfolio/ashley.html +523 -0
- package/public/portfolio/auditya.html +83 -0
- package/public/portfolio/banke.html +83 -0
- package/public/portfolio/beza.html +659 -0
- package/public/portfolio/careena.html +632 -0
- package/public/portfolio/casey.html +568 -0
- package/public/portfolio/celia.html +490 -0
- package/public/portfolio/deidre.html +642 -0
- package/public/portfolio/gautam.html +597 -0
- package/public/portfolio/hari.html +469 -0
- package/public/portfolio/huxley.html +1354 -0
- package/public/portfolio/index.html +741 -0
- package/public/portfolio/maestro.html +518 -0
- package/public/portfolio/mandy.html +590 -0
- package/public/portfolio/mona.html +597 -0
- package/public/portfolio/pam.html +887 -0
- package/public/portfolio/procella.html +107 -0
- package/public/portfolio/qasm.html +569 -0
- package/public/portfolio/ricardo.html +489 -0
- package/public/portfolio/sade.html +560 -0
- package/public/portfolio/sam.html +654 -0
- package/public/portfolio/sechar.html +580 -0
- package/public/portfolio/sreya.html +599 -0
- package/public/portfolio/swen.html +601 -0
- package/dist/src/ai-hub/word-sideload.js +0 -95
- package/dist/src/cli/commands/test-mcp.js +0 -171
- package/dist/src/cli/setup/first-run.js +0 -242
- package/dist/src/core/config-writer.js +0 -75
- package/dist/src/core/utils/job-aliases.js +0 -47
- package/dist/src/core/utils/workflow-parser.js +0 -174
|
@@ -47,10 +47,12 @@ function getLearningRoots(workspaceRoot) {
|
|
|
47
47
|
return {
|
|
48
48
|
globalPersonalBase: (0, project_fraim_paths_1.getConfiguredPortableLearningsDir)(workspaceRoot),
|
|
49
49
|
globalPersonalDisplayBase: (0, project_fraim_paths_1.getConfiguredPortableLearningsDisplayPath)(workspaceRoot),
|
|
50
|
+
managerCacheBase: (0, path_1.join)((0, project_fraim_paths_1.getUserFraimDirPath)(), 'manager', 'learnings'),
|
|
51
|
+
managerCacheDisplayBase: (0, project_fraim_paths_1.getUserFraimDisplayPath)('manager/learnings'),
|
|
50
52
|
repoLearningsBase: (0, project_fraim_paths_1.getWorkspaceLearningsDir)(workspaceRoot)
|
|
51
53
|
};
|
|
52
54
|
}
|
|
53
|
-
function resolvePersonalLearningFile(repoBase, globalBase, globalDisplayBase, fileName) {
|
|
55
|
+
function resolvePersonalLearningFile(repoBase, managerCacheBase, managerCacheDisplayBase, globalBase, globalDisplayBase, fileName) {
|
|
54
56
|
const repoPath = (0, path_1.join)(repoBase, fileName);
|
|
55
57
|
if ((0, fs_1.existsSync)(repoPath)) {
|
|
56
58
|
return {
|
|
@@ -67,6 +69,14 @@ function resolvePersonalLearningFile(repoBase, globalBase, globalDisplayBase, fi
|
|
|
67
69
|
displayPath: `${globalDisplayBase.replace(/\/$/, '')}/${fileName}`
|
|
68
70
|
};
|
|
69
71
|
}
|
|
72
|
+
const managerCachePath = (0, path_1.join)(managerCacheBase, fileName);
|
|
73
|
+
if ((0, fs_1.existsSync)(managerCachePath)) {
|
|
74
|
+
return {
|
|
75
|
+
present: true,
|
|
76
|
+
path: managerCachePath,
|
|
77
|
+
displayPath: `${managerCacheDisplayBase.replace(/\/$/, '')}/${fileName}`
|
|
78
|
+
};
|
|
79
|
+
}
|
|
70
80
|
return { present: false, path: globalPath, displayPath: `${globalDisplayBase.replace(/\/$/, '')}/${fileName}` };
|
|
71
81
|
}
|
|
72
82
|
function buildUserIdCandidates(userId) {
|
|
@@ -132,6 +142,10 @@ function resolveLearningUserId(workspaceRoot, userId, roots) {
|
|
|
132
142
|
((0, fs_1.existsSync)((0, path_1.join)(roots.globalPersonalBase, `${candidate}-manager-coaching.md`)) ? 1 : 0) +
|
|
133
143
|
((0, fs_1.existsSync)((0, path_1.join)(roots.globalPersonalBase, `${candidate}-mistake-patterns.md`)) ? 1 : 0) +
|
|
134
144
|
((0, fs_1.existsSync)((0, path_1.join)(roots.globalPersonalBase, `${candidate}-validated-patterns.md`)) ? 1 : 0) +
|
|
145
|
+
((0, fs_1.existsSync)((0, path_1.join)(roots.managerCacheBase, `${candidate}-preferences.md`)) ? 1 : 0) +
|
|
146
|
+
((0, fs_1.existsSync)((0, path_1.join)(roots.managerCacheBase, `${candidate}-manager-coaching.md`)) ? 1 : 0) +
|
|
147
|
+
((0, fs_1.existsSync)((0, path_1.join)(roots.managerCacheBase, `${candidate}-mistake-patterns.md`)) ? 1 : 0) +
|
|
148
|
+
((0, fs_1.existsSync)((0, path_1.join)(roots.managerCacheBase, `${candidate}-validated-patterns.md`)) ? 1 : 0) +
|
|
135
149
|
((0, fs_1.existsSync)((0, path_1.join)(roots.repoLearningsBase, `${candidate}-preferences.md`)) ? 1 : 0) +
|
|
136
150
|
((0, fs_1.existsSync)((0, path_1.join)(roots.repoLearningsBase, `${candidate}-manager-coaching.md`)) ? 1 : 0) +
|
|
137
151
|
((0, fs_1.existsSync)((0, path_1.join)(roots.repoLearningsBase, `${candidate}-mistake-patterns.md`)) ? 1 : 0) +
|
|
@@ -145,7 +159,7 @@ function resolveLearningUserId(workspaceRoot, userId, roots) {
|
|
|
145
159
|
}
|
|
146
160
|
if (bestScore > 0)
|
|
147
161
|
return bestCandidate;
|
|
148
|
-
const availablePrefixes = collectAvailableUserPrefixes(workspaceRoot, [roots.repoLearningsBase, roots.globalPersonalBase]);
|
|
162
|
+
const availablePrefixes = collectAvailableUserPrefixes(workspaceRoot, [roots.repoLearningsBase, roots.managerCacheBase, roots.globalPersonalBase]);
|
|
149
163
|
if (availablePrefixes.size === 1) {
|
|
150
164
|
return Array.from(availablePrefixes)[0];
|
|
151
165
|
}
|
|
@@ -375,10 +389,10 @@ function buildLearningContextSection(workspaceRoot, userId, forJob) {
|
|
|
375
389
|
const l2ValidatedPresent = l2Validated.present;
|
|
376
390
|
const l2MistakeStats = l2MistakePresent ? scanMistakePatternFile(l2Mistake.path, threshold, 'mistake-patterns') : null;
|
|
377
391
|
const l2ValidatedStats = l2ValidatedPresent ? scanMistakePatternFile(l2Validated.path, threshold, 'validated-patterns') : null;
|
|
378
|
-
const l1Mistake = resolvePersonalLearningFile(roots.repoLearningsBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-mistake-patterns.md`);
|
|
379
|
-
const l1Pref = resolvePersonalLearningFile(roots.repoLearningsBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-preferences.md`);
|
|
380
|
-
const l1Coach = resolvePersonalLearningFile(roots.repoLearningsBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-manager-coaching.md`);
|
|
381
|
-
const l1Validated = resolvePersonalLearningFile(roots.repoLearningsBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-validated-patterns.md`);
|
|
392
|
+
const l1Mistake = resolvePersonalLearningFile(roots.repoLearningsBase, roots.managerCacheBase, roots.managerCacheDisplayBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-mistake-patterns.md`);
|
|
393
|
+
const l1Pref = resolvePersonalLearningFile(roots.repoLearningsBase, roots.managerCacheBase, roots.managerCacheDisplayBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-preferences.md`);
|
|
394
|
+
const l1Coach = resolvePersonalLearningFile(roots.repoLearningsBase, roots.managerCacheBase, roots.managerCacheDisplayBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-manager-coaching.md`);
|
|
395
|
+
const l1Validated = resolvePersonalLearningFile(roots.repoLearningsBase, roots.managerCacheBase, roots.managerCacheDisplayBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, `${resolvedUserId}-validated-patterns.md`);
|
|
382
396
|
const l1MistakeStats = l1Mistake.present ? scanMistakePatternFile(l1Mistake.path, threshold, 'mistake-patterns') : null;
|
|
383
397
|
const l1ValidatedStats = l1Validated.present ? scanMistakePatternFile(l1Validated.path, threshold, 'validated-patterns') : null;
|
|
384
398
|
let l0CoachingCount = 0;
|
|
@@ -509,6 +523,15 @@ function resolveOrgContextFile(workspaceRoot, relativePath, orgCacheEligible = t
|
|
|
509
523
|
};
|
|
510
524
|
}
|
|
511
525
|
}
|
|
526
|
+
if (!orgCacheEligible) {
|
|
527
|
+
const managerCachePath = (0, path_1.join)((0, project_fraim_paths_1.getUserFraimDirPath)(), 'manager', relativePath);
|
|
528
|
+
if ((0, fs_1.existsSync)(managerCachePath)) {
|
|
529
|
+
return {
|
|
530
|
+
present: true,
|
|
531
|
+
displayPath: (0, project_fraim_paths_1.getUserFraimDisplayPath)(`manager/${relativePath}`)
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
512
535
|
const userPath = (0, path_1.join)((0, project_fraim_paths_1.getUserFraimDirPath)(), 'personalized-employee', relativePath);
|
|
513
536
|
if ((0, fs_1.existsSync)(userPath)) {
|
|
514
537
|
return {
|
|
@@ -675,6 +698,19 @@ function resolveTeamContextFile(workspaceRoot, key) {
|
|
|
675
698
|
};
|
|
676
699
|
}
|
|
677
700
|
}
|
|
701
|
+
if (key === 'manager' || key === 'managerRules') {
|
|
702
|
+
const managerCachePath = (0, path_1.join)((0, project_fraim_paths_1.getUserFraimDirPath)(), 'manager', relativePath);
|
|
703
|
+
if ((0, fs_1.existsSync)(managerCachePath)) {
|
|
704
|
+
return {
|
|
705
|
+
present: true,
|
|
706
|
+
readPath: managerCachePath,
|
|
707
|
+
writePath: '',
|
|
708
|
+
displayPath: (0, project_fraim_paths_1.getUserFraimDisplayPath)(`manager/${relativePath}`),
|
|
709
|
+
scope,
|
|
710
|
+
managedByManagerSync: true
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
}
|
|
678
714
|
const userPath = (0, path_1.join)((0, project_fraim_paths_1.getUserFraimDirPath)(), 'personalized-employee', relativePath);
|
|
679
715
|
const userDisplay = (0, project_fraim_paths_1.getUserFraimDisplayPath)(`personalized-employee/${relativePath}`);
|
|
680
716
|
return {
|
|
@@ -728,7 +764,7 @@ function countPreservedLearnings(workspaceRoot, userId) {
|
|
|
728
764
|
countLearningEntries(resolveOrgLearningFile(roots.repoLearningsBase, 'org-preferences.md').path) +
|
|
729
765
|
countLearningEntries(resolveOrgLearningFile(roots.repoLearningsBase, 'org-manager-coaching.md').path) +
|
|
730
766
|
countLearningEntries(resolveOrgLearningFile(roots.repoLearningsBase, 'org-validated-patterns.md').path);
|
|
731
|
-
const resolve = (fileName) => resolvePersonalLearningFile(roots.repoLearningsBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, fileName);
|
|
767
|
+
const resolve = (fileName) => resolvePersonalLearningFile(roots.repoLearningsBase, roots.managerCacheBase, roots.managerCacheDisplayBase, roots.globalPersonalBase, roots.globalPersonalDisplayBase, fileName);
|
|
732
768
|
// L1 manager-facing reverse-mentoring file.
|
|
733
769
|
const manager = countLearningEntries(resolve(`${resolvedUserId}-manager-coaching.md`).path);
|
|
734
770
|
// L1 personal work patterns (project scope).
|
|
@@ -818,8 +854,9 @@ function parseLearningEntries(filePath, displayPath, category, level) {
|
|
|
818
854
|
return out;
|
|
819
855
|
}
|
|
820
856
|
function levelDir(roots, level) {
|
|
821
|
-
if (level === 'machine')
|
|
857
|
+
if (level === 'machine') {
|
|
822
858
|
return { dir: roots.globalPersonalBase, displayBase: roots.globalPersonalDisplayBase.replace(/\/$/, '') };
|
|
859
|
+
}
|
|
823
860
|
return { dir: roots.repoLearningsBase, displayBase: REPO_LEARNINGS_REL };
|
|
824
861
|
}
|
|
825
862
|
function readPreservedLearnings(workspaceRoot, userId, scope, level = 'machine') {
|
|
@@ -416,6 +416,7 @@ class FraimLocalMCPServer {
|
|
|
416
416
|
this.connectSyncInFlight = null;
|
|
417
417
|
this.latestConnectSyncWarning = null;
|
|
418
418
|
this.orgCacheRefreshInFlight = false;
|
|
419
|
+
this.managerCacheRefreshInFlight = false;
|
|
419
420
|
this.writer = writer || process.stdout.write.bind(process.stdout);
|
|
420
421
|
this.remoteUrl = process.env.FRAIM_REMOTE_URL || 'https://fraim.wellnessatwork.me';
|
|
421
422
|
this.apiKey = this.loadApiKey();
|
|
@@ -750,6 +751,7 @@ class FraimLocalMCPServer {
|
|
|
750
751
|
this.connectSyncInFlight = null;
|
|
751
752
|
}
|
|
752
753
|
this.maybeRefreshOrgCache(String(requestId));
|
|
754
|
+
this.maybeRefreshManagerCache(String(requestId));
|
|
753
755
|
}
|
|
754
756
|
/**
|
|
755
757
|
* Issue #563 (R4.2): opportunistically refresh the managed org cache
|
|
@@ -779,6 +781,32 @@ class FraimLocalMCPServer {
|
|
|
779
781
|
this.orgCacheRefreshInFlight = false;
|
|
780
782
|
});
|
|
781
783
|
}
|
|
784
|
+
/**
|
|
785
|
+
* Issue #580: opportunistically refresh the managed manager cache
|
|
786
|
+
* (~/.fraim/manager/) at session bootstrap when it is missing or older than
|
|
787
|
+
* 24 hours. Fire-and-forget; a failed refresh leaves existing cache available.
|
|
788
|
+
*/
|
|
789
|
+
maybeRefreshManagerCache(requestId) {
|
|
790
|
+
if (this.managerCacheRefreshInFlight)
|
|
791
|
+
return;
|
|
792
|
+
this.managerCacheRefreshInFlight = true;
|
|
793
|
+
void Promise.resolve().then(() => __importStar(require('../cli/utils/manager-pack-sync'))).then(async ({ getManagerCacheAgeHours, syncManagerCache }) => {
|
|
794
|
+
const ageHours = getManagerCacheAgeHours();
|
|
795
|
+
if (ageHours !== null && ageHours < 24)
|
|
796
|
+
return;
|
|
797
|
+
const outcome = await syncManagerCache();
|
|
798
|
+
if (outcome.status !== 'disabled') {
|
|
799
|
+
const version = outcome.metadata ? ` (version ${outcome.metadata.version.slice(0, 12)})` : '';
|
|
800
|
+
this.log(`[req:${requestId}] Manager cache refresh at connect: ${outcome.status}${version}`);
|
|
801
|
+
}
|
|
802
|
+
})
|
|
803
|
+
.catch((error) => {
|
|
804
|
+
this.logError(`[req:${requestId}] Manager cache refresh failed: ${error?.message || error}`);
|
|
805
|
+
})
|
|
806
|
+
.finally(() => {
|
|
807
|
+
this.managerCacheRefreshInFlight = false;
|
|
808
|
+
});
|
|
809
|
+
}
|
|
782
810
|
/**
|
|
783
811
|
* Automatically detect machine information
|
|
784
812
|
*/
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fraim-framework",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.168",
|
|
4
4
|
"description": "FRAIM: AI Workforce Infrastructure — the organizational capability that turns AI agents into an accountable workforce, their operators into capable AI managers, and executives into leaders with clear optics on AI proficiency.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -100,12 +100,14 @@
|
|
|
100
100
|
"@types/cors": "^2.8.19",
|
|
101
101
|
"@types/express": "^5.0.6",
|
|
102
102
|
"@types/node": "^20.0.0",
|
|
103
|
+
"@types/node-cron": "^3.0.11",
|
|
103
104
|
"@types/node-fetch": "^2.6.13",
|
|
104
105
|
"@types/prompts": "^2.4.9",
|
|
105
106
|
"@types/semver": "^7.7.1",
|
|
106
107
|
"fast-glob": "^3.3.3",
|
|
107
108
|
"markdown-it": "^14.1.1",
|
|
108
109
|
"markdown-it-highlightjs": "^4.3.0",
|
|
110
|
+
"node-cron": "^4.2.1",
|
|
109
111
|
"playwright": "^1.58.2",
|
|
110
112
|
"pptxgenjs": "^4.0.1",
|
|
111
113
|
"puppeteer": "^24.36.1",
|
|
@@ -124,6 +126,7 @@
|
|
|
124
126
|
"bin/fraim-mcp.js",
|
|
125
127
|
"public/ai-hub/",
|
|
126
128
|
"public/first-run/",
|
|
129
|
+
"public/portfolio/",
|
|
127
130
|
"index.js",
|
|
128
131
|
"README.md",
|
|
129
132
|
"CHANGELOG.md",
|