fraim-framework 2.0.122 → 2.0.124

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.
@@ -20,29 +20,25 @@
20
20
  * seekMentoring handler (e.g., when the local AIMentor errors).
21
21
  */
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.REQUIRED_QUALITY_FIELDS = exports.ALL_STAGE_CATEGORIES = exports.STAGE_DISPLAY_NAMES = exports.STAGE_CATEGORY_MAP = exports.QUALITY_PRODUCING_JOBS = exports.QUALITY_REGISTRY = void 0;
23
+ exports.REQUIRED_QUALITY_FIELDS = exports.ALL_STAGE_CATEGORIES = exports.STAGE_DISPLAY_NAMES = exports.STAGE_CATEGORY_MAP = exports.QUALITY_GATE_JOBS = exports.QUALITY_SCORE_JOBS = exports.QUALITY_PRODUCING_JOBS = exports.QUALITY_REGISTRY = void 0;
24
24
  exports.getRequiredFieldsForJob = getRequiredFieldsForJob;
25
25
  exports.validateQualityEvidence = validateQualityEvidence;
26
26
  exports.buildQualityRejectionMessage = buildQualityRejectionMessage;
27
- /**
28
- * Central registry of FRAIM jobs that interact with the quality telemetry system.
29
- * This is the SINGLE SOURCE OF TRUTH for:
30
- * 1. Stage mapping (where it appears on the dashboard).
31
- * 2. Enforcement (whether it MUST emit a quality score to complete).
32
- */
33
27
  exports.QUALITY_REGISTRY = {
34
28
  // Customer Development
35
- 'process-interview-notes': { stage: 'customer-development', enforced: true },
36
- 'triage-customer-needs': { stage: 'customer-development', enforced: true },
29
+ 'process-interview-notes': { stage: 'customer-development', enforced: true, telemetryKind: 'score' },
30
+ 'triage-customer-needs': { stage: 'customer-development', enforced: true, telemetryKind: 'gate' },
37
31
  'interview-preparation': { stage: 'customer-discovery', enforced: false },
38
32
  // Business Strategy
39
- 'review-business-strategy': { stage: 'business-strategy', enforced: true },
33
+ 'review-business-strategy': { stage: 'business-strategy', enforced: true, telemetryKind: 'score' },
40
34
  'business-plan-creation': { stage: 'business-strategy', enforced: false },
41
- 'branding-quality-audit': { stage: 'branding', enforced: true },
35
+ 'branding-quality-audit': { stage: 'branding', enforced: true, telemetryKind: 'score' },
42
36
  // Product Quality
43
- 'code-quality-assessment': { stage: 'product-quality', enforced: true },
37
+ 'code-quality-assessment': { stage: 'product-quality', enforced: true, telemetryKind: 'score' },
44
38
  // Test Quality
45
- 'test-quality-assessment': { stage: 'test-quality', enforced: true },
39
+ 'test-quality-assessment': { stage: 'test-quality', enforced: true, telemetryKind: 'score' },
40
+ // Security
41
+ 'security-review': { stage: 'security', enforced: true, telemetryKind: 'score' },
46
42
  // Fundraising
47
43
  'investor-pitch-preparation': { stage: 'fundraising', enforced: false },
48
44
  // Go-to-Market
@@ -53,6 +49,15 @@ exports.QUALITY_REGISTRY = {
53
49
  * Derived enforcement list for backward compatibility.
54
50
  */
55
51
  exports.QUALITY_PRODUCING_JOBS = Object.keys(exports.QUALITY_REGISTRY).filter((job) => exports.QUALITY_REGISTRY[job].enforced);
52
+ /**
53
+ * Jobs that write scored review rows used by the Quality tab scorecards.
54
+ * Gate-only telemetry jobs (for example `triage-customer-needs`) are excluded.
55
+ */
56
+ exports.QUALITY_SCORE_JOBS = Object.keys(exports.QUALITY_REGISTRY).filter((job) => exports.QUALITY_REGISTRY[job].enforced && exports.QUALITY_REGISTRY[job].telemetryKind !== 'gate');
57
+ /**
58
+ * Jobs that emit gate-style telemetry without a composite score.
59
+ */
60
+ exports.QUALITY_GATE_JOBS = Object.keys(exports.QUALITY_REGISTRY).filter((job) => exports.QUALITY_REGISTRY[job].enforced && exports.QUALITY_REGISTRY[job].telemetryKind === 'gate');
56
61
  /**
57
62
  * @deprecated Use QUALITY_REGISTRY for new code.
58
63
  * Derived stage mappings for backward compatibility.
@@ -67,6 +72,7 @@ exports.STAGE_DISPLAY_NAMES = {
67
72
  'branding': 'Branding',
68
73
  'product-quality': 'Product Quality',
69
74
  'test-quality': 'Test Quality',
75
+ 'security': 'Security',
70
76
  'fundraising': 'Fundraising',
71
77
  'go-to-market': 'Go-to-Market',
72
78
  };
@@ -79,6 +85,7 @@ exports.ALL_STAGE_CATEGORIES = [
79
85
  'branding',
80
86
  'product-quality',
81
87
  'test-quality',
88
+ 'security',
82
89
  'fundraising',
83
90
  'go-to-market',
84
91
  ];
@@ -93,6 +100,12 @@ const CUSTOMER_DEV_REQUIRED_FIELDS = [
93
100
  { path: 'participant.authority', type: 'number' },
94
101
  { path: 'evidence.quoteSpecificityAvg', type: 'number' }
95
102
  ];
103
+ /**
104
+ * Gate-only customer development jobs emit a decision without a composite score.
105
+ */
106
+ const GATE_REQUIRED_FIELDS = [
107
+ { path: 'gateDecision', type: 'string' }
108
+ ];
96
109
  /**
97
110
  * Required fields for all other quality-producing jobs.
98
111
  * Only composite and coaching are universally required — sub-dimensions
@@ -108,6 +121,9 @@ const UNIVERSAL_REQUIRED_FIELDS = [
108
121
  */
109
122
  function getRequiredFieldsForJob(jobName) {
110
123
  const entry = exports.QUALITY_REGISTRY[jobName];
124
+ if (entry?.telemetryKind === 'gate') {
125
+ return GATE_REQUIRED_FIELDS;
126
+ }
111
127
  if (entry?.stage === 'customer-development') {
112
128
  return CUSTOMER_DEV_REQUIRED_FIELDS;
113
129
  }
@@ -170,38 +186,53 @@ function validateQualityEvidence(quality, jobName) {
170
186
  function buildQualityRejectionMessage(jobName, currentPhase, errors) {
171
187
  const errorBullets = errors.map(e => `- ${e}`).join('\n');
172
188
  const entry = exports.QUALITY_REGISTRY[jobName];
189
+ const isGateOnly = entry?.telemetryKind === 'gate';
173
190
  const isCustomerDev = entry?.stage === 'customer-development';
174
- const schemaExample = isCustomerDev
191
+ const schemaExample = isGateOnly
175
192
  ? [
176
193
  '```javascript',
177
194
  'evidence: {',
178
195
  ' quality: {',
179
- ' composite: <number 0-10>,',
180
- ' participant: { fit: <number 1-10>, urgency: <number 1-10>, authority: <number 1-10> },',
181
- ' evidence: {',
182
- ' quoteSpecificityAvg: <number 1-10>',
183
- ' // other fields are allowed and encouraged but not required',
184
- ' },',
185
- ' coaching: "<actionable recommendation>",',
186
- ' interviewee: "<name>",',
187
- ' company: "<company>"',
196
+ ' gateDecision: "<pass|flag|fail>",',
197
+ ' interviewsAnalyzed: <number>,',
198
+ ' distinctPainPatterns: <number>,',
199
+ ' gaps: ["<gap summary>"],',
200
+ ' coaching: "<actionable recommendation>"',
188
201
  ' }',
189
202
  '}',
190
203
  '```'
191
204
  ]
192
- : [
193
- '```javascript',
194
- 'evidence: {',
195
- ' quality: {',
196
- ' composite: <number 0-10>,',
197
- ' coaching: "<actionable recommendation>",',
198
- ' marketEvidence: { score: <number>, rationale: "<string>" }, // flat, NO "dimensions" wrapper',
199
- ' unitEconomics: { score: <number>, rationale: "<string>" },',
200
- ' // add other sub-scores as direct properties',
201
- ' }',
202
- '}',
203
- '```'
204
- ];
205
+ : isCustomerDev
206
+ ? [
207
+ '```javascript',
208
+ 'evidence: {',
209
+ ' quality: {',
210
+ ' composite: <number 0-10>,',
211
+ ' participant: { fit: <number 1-10>, urgency: <number 1-10>, authority: <number 1-10> },',
212
+ ' evidence: {',
213
+ ' quoteSpecificityAvg: <number 1-10>',
214
+ ' // other fields are allowed and encouraged but not required',
215
+ ' },',
216
+ ' coaching: "<actionable recommendation>",',
217
+ ' interviewee: "<name>",',
218
+ ' company: "<company>"',
219
+ ' }',
220
+ '}',
221
+ '```'
222
+ ]
223
+ : [
224
+ '```javascript',
225
+ 'evidence: {',
226
+ ' quality: {',
227
+ ' composite: <number 0-10>,',
228
+ ' coaching: "<actionable recommendation>",',
229
+ ' marketEvidence: { score: <number>, rationale: "<string>" }, // flat, NO "dimensions" wrapper',
230
+ ' unitEconomics: { score: <number>, rationale: "<string>" },',
231
+ ' // add other sub-scores as direct properties',
232
+ ' }',
233
+ '}',
234
+ '```'
235
+ ];
205
236
  const importantNote = [
206
237
  '',
207
238
  '> [!IMPORTANT]',
@@ -1689,12 +1689,21 @@ class FraimLocalMCPServer {
1689
1689
  return await this.finalizeLocalToolTextResponse(request, requestSessionId, requestId, rejection);
1690
1690
  }
1691
1691
  // Valid payload. Emit to the remote asynchronously.
1692
+ if (!this.repoInfo) {
1693
+ this.detectRepoInfo();
1694
+ }
1692
1695
  this.emitQualityScoreToRemote({
1693
1696
  jobName: args.jobName,
1694
1697
  jobId: args.jobId,
1695
1698
  sessionId: requestSessionId || args.sessionId || 'unknown',
1696
1699
  quality: args.evidence.quality,
1697
- artifactPath: args.evidence.quality.artifactPath
1700
+ artifactPath: args.evidence.quality.artifactPath,
1701
+ repoIdentifier: args.evidence?.reviewContext?.repoIdentifier || this.repoInfo?.url,
1702
+ reviewContext: {
1703
+ ...(args.evidence?.reviewContext || {}),
1704
+ repoIdentifier: args.evidence?.reviewContext?.repoIdentifier || this.repoInfo?.url,
1705
+ branchRef: args.evidence?.reviewContext?.branchRef || this.repoInfo?.branch
1706
+ }
1698
1707
  }).catch((err) => {
1699
1708
  // Best-effort: log but never fail the user-facing response.
1700
1709
  this.log(`⚠️ Quality score emission failed: ${err?.message || err}`);
package/package.json CHANGED
@@ -1,146 +1,150 @@
1
- {
2
- "name": "fraim-framework",
3
- "version": "2.0.122",
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
- "main": "index.js",
6
- "bin": {
7
- "fraim": "./index.js",
8
- "fraim-framework": "./index.js"
9
- },
10
- "scripts": {
11
- "dev": "tsx --watch src/fraim-mcp-server.ts > server.log 2>&1",
12
- "dev:prod": "npm run build && node dist/src/fraim-mcp-server.js > server.log 2>&1",
13
- "build": "tsc && npm run build:stubs && npm run build:fraim-brain && node scripts/copy-registry.js && node -e \"require('fs').copyFileSync('src/core/types.ts', 'registry/templates/manager/fraim-config-schema.ts')\" && npm run validate:registry && npm run validate:fraim-pro-assets && tsx scripts/validate-purity.ts",
14
- "build:stubs": "tsx scripts/build-stub-registry.ts",
15
- "build:fraim-brain": "node scripts/generate-fraim-brain.js",
16
- "test-all": "npm run test && npm run test:isolated && npm run test:ui",
17
- "test": "node scripts/test-with-server.js",
18
- "test:isolated": "npx tsx --test --test-reporter=spec tests/isolated/test-*.ts",
19
- "test:smoke": "node scripts/test-with-server.js --tags=smoke",
20
- "test:coverage": "node scripts/test-with-server.js --tags=smoke --coverage",
21
- "test:stripe": "node scripts/test-with-server.js tests/test-stripe-payment-complete.ts",
22
- "test:stripe:ui": "playwright test tests/ui/test-payment-ui.spec.ts",
23
- "test:perf": "node scripts/test-with-server.js tests/performance/analytics-perf.ts",
24
- "test:ui": "playwright test",
25
- "test:ui:headed": "playwright test --headed",
26
- "start:fraim": "tsx src/fraim-mcp-server.ts",
27
- "dev:fraim": "tsx --watch src/fraim-mcp-server.ts",
28
- "serve:website": "node fraim-pro/serve.js",
29
- "watch:fraimlogs": "tsx scripts/watch-fraim-logs.ts > prodlogs.log 2>&1",
30
- "manage-keys": "tsx scripts/fraim/manage-keys.ts",
31
- "manage-teams": "tsx scripts/fraim/manage-teams.ts",
32
- "partner-discounts": "tsx scripts/fraim/manage-partner-discounts.ts",
33
- "fix-key": "tsx scripts/fraim/fix-expired-key.ts",
34
- "setup-stripe-webhook": "tsx scripts/fraim/setup-stripe-webhook.ts",
35
- "view-signups": "tsx scripts/view-signups.ts",
36
- "fraim:init": "npm run build && node index.js init",
37
- "fraim:sync": "node index.js sync --local",
38
- "postinstall": "fraim sync --skip-updates || echo 'FRAIM setup skipped.'",
39
- "prepublishOnly": "npm run build",
40
- "release": "npm version patch && npm run publish-both",
41
- "publish-both": "node scripts/publish-both.js",
42
- "publish-fraim-only": "node scripts/publish-fraim.js",
43
- "publish-both-manual": "node scripts/publish-both.js",
44
- "validate:registry": "tsx scripts/verify-registry-paths.ts && npm run validate:jobs && npm run validate:skills && npm run validate:registry-references && npm run validate:platform-agnostic && npm run validate:template-namespaces && npm run validate:config-fallbacks && npm run validate:bootstrap-config-coverage && npm run validate:provider-action-mappings && npm run validate:fidelity && npm run validate:config-tokens && npm run validate:brain-mapping && npm run validate:template-syntax",
45
- "validate:registry-references": "tsx scripts/validate-registry-references.ts",
46
- "validate:brain-mapping": "tsx scripts/validate-brain-mapping.ts",
47
- "validate:fraim-pro-assets": "tsx scripts/validate-fraim-pro-assets.ts",
48
- "validate:jobs": "tsx scripts/validate-jobs.ts",
49
- "validate:platform-agnostic": "tsx scripts/validate-platform-agnostic.ts",
50
- "validate:skills": "tsx scripts/validate-skills.ts",
51
- "validate:template-namespaces": "tsx scripts/validate-template-namespaces.ts",
52
- "validate:config-fallbacks": "tsx scripts/validate-config-fallbacks.ts",
53
- "validate:bootstrap-config-coverage": "tsx scripts/validate-bootstrap-config-coverage.ts",
54
- "validate:provider-action-mappings": "tsx scripts/validate-provider-action-mappings.ts",
55
- "validate:fidelity": "tsx scripts/validate-fidelity.ts",
56
- "validate:config-tokens": "tsx scripts/validate-config-tokens.ts",
57
- "validate:template-syntax": "tsx scripts/validate-template-syntax.ts",
58
- "validate:backup": "bash scripts/backup/validate-pitr-restore.sh"
59
- },
60
- "repository": {
61
- "type": "git",
62
- "url": "git+https://github.com/mathursrus/FRAIM.git"
63
- },
64
- "keywords": [
65
- "fraim",
66
- "ai-management",
67
- "ai-coordination",
68
- "ai-agents",
69
- "multi-agent",
70
- "github",
71
- "automation",
72
- "gitops",
73
- "cursor",
74
- "claude",
75
- "windsurf",
76
- "rigor",
77
- "enterprise",
78
- "framework",
79
- "ai-managers"
80
- ],
81
- "author": "Sid Mathur <sid.mathur@gmail.com>",
82
- "license": "MIT",
83
- "bugs": {
84
- "url": "https://github.com/mathursrus/FRAIM/issues"
85
- },
86
- "homepage": "https://github.com/mathursrus/FRAIM#readme",
87
- "engines": {
88
- "node": ">=16.0.0"
89
- },
90
- "devDependencies": {
91
- "@playwright/test": "^1.58.2",
92
- "@types/adm-zip": "^0.5.7",
93
- "@types/cors": "^2.8.19",
94
- "@types/express": "^5.0.6",
95
- "@types/node": "^20.0.0",
96
- "@types/node-fetch": "^2.6.13",
97
- "@types/prompts": "^2.4.9",
98
- "@types/semver": "^7.7.1",
99
- "fast-glob": "^3.3.3",
100
- "html-to-docx": "^1.8.0",
101
- "markdown-it": "^14.1.1",
102
- "markdown-it-highlightjs": "^4.3.0",
103
- "playwright": "^1.58.2",
104
- "pptxgenjs": "^4.0.1",
105
- "puppeteer": "^24.36.1",
106
- "qrcode": "^1.5.4",
107
- "sharp": "^0.34.5",
108
- "tsx": "^4.0.0",
109
- "typescript": "^5.0.0"
110
- },
111
- "files": [
112
- "dist/src/local-mcp-server/",
113
- "dist/src/cli/",
114
- "dist/src/core/",
115
- "bin/fraim.js",
116
- "bin/fraim-mcp.js",
117
- "index.js",
118
- "README.md",
119
- "CHANGELOG.md",
120
- "LICENSE",
121
- "package.json"
122
- ],
123
- "publishConfig": {
124
- "access": "public"
125
- },
126
- "dependencies": {
127
- "@octokit/rest": "^22.0.1",
128
- "adm-zip": "^0.5.16",
129
- "axios": "^1.7.0",
130
- "chalk": "4.1.2",
131
- "commander": "^14.0.2",
132
- "cors": "^2.8.5",
133
- "dotenv": "^16.4.7",
134
- "express": "^5.2.1",
135
- "mongodb": "^7.0.0",
136
- "node-edge-tts": "^1.2.10",
137
- "nodemailer": "^8.0.3",
138
- "prompts": "^2.4.2",
139
- "resend": "^6.9.3",
140
- "semver": "^7.7.4",
141
- "stripe": "^20.3.1",
142
- "toml": "^3.0.0",
143
- "tree-kill": "^1.2.2",
144
- "xml2js": "^0.6.2"
145
- }
146
- }
1
+ {
2
+ "name": "fraim-framework",
3
+ "version": "2.0.124",
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
+ "main": "index.js",
6
+ "bin": {
7
+ "fraim": "./index.js",
8
+ "fraim-framework": "./index.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "tsx --watch src/fraim-mcp-server.ts > server.log 2>&1",
12
+ "dev:prod": "npm run build && node dist/src/fraim-mcp-server.js > server.log 2>&1",
13
+ "build": "tsc && npm run build:stubs && npm run build:fraim-brain && node scripts/copy-registry.js && node -e \"require('fs').copyFileSync('src/core/types.ts', 'registry/templates/manager/fraim-config-schema.ts')\" && npm run validate:registry && npm run validate:fraim-pro-assets && tsx scripts/validate-purity.ts",
14
+ "build:stubs": "tsx scripts/build-stub-registry.ts",
15
+ "build:fraim-brain": "node scripts/generate-fraim-brain.js",
16
+ "test-all": "npm run test && npm run test:isolated && npm run test:ui",
17
+ "test": "node scripts/test-with-server.js",
18
+ "test:isolated": "npx tsx --test --test-reporter=spec tests/isolated/test-*.ts",
19
+ "test:smoke": "node scripts/test-with-server.js --tags=smoke",
20
+ "test:coverage": "node scripts/test-with-server.js --tags=smoke --coverage",
21
+ "test:stripe": "node scripts/test-with-server.js tests/test-stripe-payment-complete.ts",
22
+ "test:stripe:ui": "playwright test tests/ui/test-payment-ui.spec.ts",
23
+ "test:perf": "node scripts/test-with-server.js tests/performance/analytics-perf.ts",
24
+ "test:ui": "playwright test",
25
+ "test:ui:headed": "playwright test --headed",
26
+ "hub:desktop": "npm run build && electron dist/src/ai-hub/desktop-main.js",
27
+ "start:fraim": "tsx src/fraim-mcp-server.ts",
28
+ "dev:fraim": "tsx --watch src/fraim-mcp-server.ts",
29
+ "serve:website": "node fraim-pro/serve.js",
30
+ "watch:fraimlogs": "tsx scripts/watch-fraim-logs.ts > prodlogs.log 2>&1",
31
+ "manage-keys": "tsx scripts/fraim/manage-keys.ts",
32
+ "manage-teams": "tsx scripts/fraim/manage-teams.ts",
33
+ "partner-discounts": "tsx scripts/fraim/manage-partner-discounts.ts",
34
+ "fix-key": "tsx scripts/fraim/fix-expired-key.ts",
35
+ "setup-stripe-webhook": "tsx scripts/fraim/setup-stripe-webhook.ts",
36
+ "view-signups": "tsx scripts/view-signups.ts",
37
+ "fraim:init": "npm run build && node index.js init",
38
+ "fraim:sync": "node index.js sync --local",
39
+ "postinstall": "fraim sync --skip-updates || echo 'FRAIM setup skipped.'",
40
+ "prepublishOnly": "npm run build",
41
+ "release": "npm version patch && npm run publish-both",
42
+ "publish-both": "node scripts/publish-both.js",
43
+ "publish-fraim-only": "node scripts/publish-fraim.js",
44
+ "publish-both-manual": "node scripts/publish-both.js",
45
+ "validate:registry": "tsx scripts/verify-registry-paths.ts && npm run validate:jobs && npm run validate:skills && npm run validate:registry-references && npm run validate:platform-agnostic && npm run validate:template-namespaces && npm run validate:config-fallbacks && npm run validate:bootstrap-config-coverage && npm run validate:provider-action-mappings && npm run validate:fidelity && npm run validate:config-tokens && npm run validate:brain-mapping && npm run validate:template-syntax",
46
+ "validate:registry-references": "tsx scripts/validate-registry-references.ts",
47
+ "validate:brain-mapping": "tsx scripts/validate-brain-mapping.ts",
48
+ "validate:fraim-pro-assets": "tsx scripts/validate-fraim-pro-assets.ts",
49
+ "validate:jobs": "tsx scripts/validate-jobs.ts",
50
+ "validate:platform-agnostic": "tsx scripts/validate-platform-agnostic.ts",
51
+ "validate:skills": "tsx scripts/validate-skills.ts",
52
+ "validate:template-namespaces": "tsx scripts/validate-template-namespaces.ts",
53
+ "validate:config-fallbacks": "tsx scripts/validate-config-fallbacks.ts",
54
+ "validate:bootstrap-config-coverage": "tsx scripts/validate-bootstrap-config-coverage.ts",
55
+ "validate:provider-action-mappings": "tsx scripts/validate-provider-action-mappings.ts",
56
+ "validate:fidelity": "tsx scripts/validate-fidelity.ts",
57
+ "validate:config-tokens": "tsx scripts/validate-config-tokens.ts",
58
+ "validate:template-syntax": "tsx scripts/validate-template-syntax.ts",
59
+ "validate:backup": "bash scripts/backup/validate-pitr-restore.sh"
60
+ },
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "git+https://github.com/mathursrus/FRAIM.git"
64
+ },
65
+ "keywords": [
66
+ "fraim",
67
+ "ai-management",
68
+ "ai-coordination",
69
+ "ai-agents",
70
+ "multi-agent",
71
+ "github",
72
+ "automation",
73
+ "gitops",
74
+ "cursor",
75
+ "claude",
76
+ "windsurf",
77
+ "rigor",
78
+ "enterprise",
79
+ "framework",
80
+ "ai-managers"
81
+ ],
82
+ "author": "Sid Mathur <sid.mathur@gmail.com>",
83
+ "license": "MIT",
84
+ "bugs": {
85
+ "url": "https://github.com/mathursrus/FRAIM/issues"
86
+ },
87
+ "homepage": "https://github.com/mathursrus/FRAIM#readme",
88
+ "engines": {
89
+ "node": ">=16.0.0"
90
+ },
91
+ "devDependencies": {
92
+ "@playwright/test": "^1.58.2",
93
+ "@types/adm-zip": "^0.5.7",
94
+ "@types/cors": "^2.8.19",
95
+ "@types/express": "^5.0.6",
96
+ "@types/node": "^20.0.0",
97
+ "@types/node-fetch": "^2.6.13",
98
+ "@types/prompts": "^2.4.9",
99
+ "@types/semver": "^7.7.1",
100
+ "fast-glob": "^3.3.3",
101
+ "html-to-docx": "^1.8.0",
102
+ "markdown-it": "^14.1.1",
103
+ "markdown-it-highlightjs": "^4.3.0",
104
+ "playwright": "^1.58.2",
105
+ "pptxgenjs": "^4.0.1",
106
+ "puppeteer": "^24.36.1",
107
+ "qrcode": "^1.5.4",
108
+ "sharp": "^0.34.5",
109
+ "tsx": "^4.0.0",
110
+ "typescript": "^5.0.0"
111
+ },
112
+ "files": [
113
+ "dist/src/local-mcp-server/",
114
+ "dist/src/cli/",
115
+ "dist/src/ai-hub/",
116
+ "dist/src/core/",
117
+ "bin/fraim.js",
118
+ "bin/fraim-mcp.js",
119
+ "public/ai-hub/",
120
+ "index.js",
121
+ "README.md",
122
+ "CHANGELOG.md",
123
+ "LICENSE",
124
+ "package.json"
125
+ ],
126
+ "publishConfig": {
127
+ "access": "public"
128
+ },
129
+ "dependencies": {
130
+ "@octokit/rest": "^22.0.1",
131
+ "adm-zip": "^0.5.16",
132
+ "axios": "^1.7.0",
133
+ "chalk": "4.1.2",
134
+ "commander": "^14.0.2",
135
+ "cors": "^2.8.5",
136
+ "dotenv": "^16.4.7",
137
+ "electron": "^41.2.2",
138
+ "express": "^5.2.1",
139
+ "mongodb": "^7.0.0",
140
+ "node-edge-tts": "^1.2.10",
141
+ "nodemailer": "^8.0.3",
142
+ "prompts": "^2.4.2",
143
+ "resend": "^6.9.3",
144
+ "semver": "^7.7.4",
145
+ "stripe": "^20.3.1",
146
+ "toml": "^3.0.0",
147
+ "tree-kill": "^1.2.2",
148
+ "xml2js": "^0.6.2"
149
+ }
150
+ }
@@ -0,0 +1,130 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Visa AI Hub</title>
7
+ <link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Crect width='48' height='48' rx='10' fill='%230d3f8a'/%3E%3Cpath d='M13 31h6l3-14h-6zm10 0h6l3-14h-6zm11-14h-6l-3 14h6z' fill='%23f7b600'/%3E%3C/svg%3E">
8
+ <link rel="stylesheet" href="./styles.css">
9
+ </head>
10
+ <body>
11
+ <div class="app-shell">
12
+ <header class="app-header">
13
+ <div class="brand-lockup">
14
+ <p class="brand-title">Visa AI Hub</p>
15
+ <p class="brand-subtitle">Powered by <a href="https://fraimworks.ai" target="_blank" rel="noreferrer">FRAIM</a></p>
16
+ </div>
17
+ <div class="topbar-card workspace-card">
18
+ <div class="workspace-section workspace-section-inline">
19
+ <span class="section-label">Employee</span>
20
+ <div class="employee-picker" id="employee-picker"></div>
21
+ </div>
22
+ <details class="project-path workspace-project">
23
+ <summary>
24
+ <span>Project Path</span>
25
+ <span class="project-path-preview" id="project-path-preview"></span>
26
+ </summary>
27
+ <div class="project-path-body">
28
+ <input id="project-path-input" class="text-input" type="text" />
29
+ <div class="project-actions">
30
+ <button id="browse-project" class="secondary-button" type="button">Choose Folder</button>
31
+ <button id="reload-project" class="secondary-button" type="button">Reload</button>
32
+ </div>
33
+ <p class="helper-text" id="project-status"></p>
34
+ </div>
35
+ </details>
36
+ </div>
37
+ </header>
38
+
39
+ <main class="workspace">
40
+ <section class="workspace-intro card">
41
+ <div class="workspace-intro-copy">
42
+ <p class="section-label">Pick A Job</p>
43
+ <p class="panel-intro">Manage your AI employees just like you manage your teams. Tell them what jobs they need to complete, review their results, coach them, expect them to learn from you, and expect to learn from your employees.</p>
44
+ </div>
45
+ <div class="workspace-intro-actions">
46
+ <p class="section-label">Job Category</p>
47
+ <div class="category-picker" id="category-picker"></div>
48
+ </div>
49
+ </section>
50
+
51
+ <section class="job-panel">
52
+ <div class="panel-head card">
53
+ <div class="panel-copy">
54
+ <p class="section-label">Job Category</p>
55
+ <h2 class="panel-title">Pick a job</h2>
56
+ <p class="muted">Choose the next assignment for your employee.</p>
57
+ </div>
58
+ </div>
59
+
60
+ <div class="job-list-card card">
61
+ <div class="job-list" id="job-list"></div>
62
+ </div>
63
+ </section>
64
+
65
+ <section class="interaction-panel">
66
+ <div class="card interaction-card">
67
+ <div class="run-toolbar">
68
+ <div class="selected-job-summary">
69
+ <div>
70
+ <p class="section-label">Selected Job</p>
71
+ <h2 id="selected-job-title">Select a job</h2>
72
+ <p id="selected-job-intent" class="muted"></p>
73
+ </div>
74
+ <ul class="job-outcomes" id="selected-job-outcomes"></ul>
75
+ </div>
76
+ <div class="run-toolbar-actions">
77
+ <button id="start-job" class="primary-button" type="button" disabled>Start Job</button>
78
+ </div>
79
+ </div>
80
+
81
+ <div class="interaction-body">
82
+ <div class="conversation-column">
83
+ <div class="interaction-head">
84
+ <div>
85
+ <p class="section-label">Manager / Employee Interactions</p>
86
+ <h2 id="conversation-title">No active job</h2>
87
+ </div>
88
+ <p class="muted" id="conversation-state">Select a job and coach your employee toward your desired outcome.</p>
89
+ </div>
90
+
91
+ <div class="timeline" id="timeline"></div>
92
+ </div>
93
+
94
+ <div class="manager-tools">
95
+ <div class="template-row">
96
+ <span class="section-label">Manager Templates</span>
97
+ <div class="template-chips" id="manager-templates"></div>
98
+ </div>
99
+
100
+ <label class="composer-label" for="manager-message">Coach your employee toward your desired outcome.</label>
101
+ <textarea id="manager-message" class="composer" placeholder='Use FRAIM job "marketing-content-creation" and include the audience, desired outcome, and any constraints.'></textarea>
102
+
103
+ <div class="composer-actions">
104
+ <button id="send-coaching" class="secondary-button" type="button" disabled>Send Coaching</button>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
109
+
110
+ <details class="card micro-manage" id="micro-manage">
111
+ <summary>Micro-manage</summary>
112
+ <div class="micro-manage-body" id="raw-history"></div>
113
+ </details>
114
+ </section>
115
+ </main>
116
+ </div>
117
+
118
+ <template id="timeline-message-template">
119
+ <article class="message">
120
+ <div class="message-meta">
121
+ <span class="message-role"></span>
122
+ <time class="message-time"></time>
123
+ </div>
124
+ <p class="message-text"></p>
125
+ </article>
126
+ </template>
127
+
128
+ <script src="./script.js"></script>
129
+ </body>
130
+ </html>