fraim-framework 2.0.120 → 2.0.123

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.
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ensureUserLevelDirectories = ensureUserLevelDirectories;
7
+ exports.ensureUserLevelDependencies = ensureUserLevelDependencies;
7
8
  exports.syncUserLevelArtifacts = syncUserLevelArtifacts;
8
9
  /**
9
10
  * User-Level FRAIM Setup
@@ -23,8 +24,19 @@ exports.syncUserLevelArtifacts = syncUserLevelArtifacts;
23
24
  */
24
25
  const fs_1 = __importDefault(require("fs"));
25
26
  const path_1 = __importDefault(require("path"));
27
+ const child_process_1 = require("child_process");
26
28
  const chalk_1 = __importDefault(require("chalk"));
27
29
  const script_sync_utils_1 = require("../utils/script-sync-utils");
30
+ /**
31
+ * Curated list of npm runtime dependencies that user-level scripts in
32
+ * ~/.fraim/scripts/ require at runtime. Keep this list narrow — only add deps
33
+ * that are actually `require()`d by a script in registry/scripts/.
34
+ *
35
+ * Tracked in FRAIM #301 (author-audio first-run failure).
36
+ */
37
+ const USER_LEVEL_RUNTIME_DEPS = {
38
+ 'node-edge-tts': '*', // used by scripts/author-audio.js
39
+ };
28
40
  /**
29
41
  * Ensure the user-level FRAIM directory structure exists.
30
42
  * Creates personalized-employee dirs for user-level overrides.
@@ -44,6 +56,52 @@ function ensureUserLevelDirectories(userFraimDir) {
44
56
  }
45
57
  }
46
58
  }
59
+ /**
60
+ * Ensure the curated set of npm runtime dependencies is installed under
61
+ * ~/.fraim/node_modules/. Maintains ~/.fraim/package.json so the deps survive
62
+ * a re-sync, and only runs `npm install` when something is actually missing.
63
+ *
64
+ * Soft-fails (yellow warning, no throw) if npm is unavailable or install
65
+ * errors — setup must not break because a downstream script's dep couldn't
66
+ * be installed.
67
+ */
68
+ function ensureUserLevelDependencies(userFraimDir) {
69
+ const baseDir = userFraimDir || (0, script_sync_utils_1.getUserFraimDir)();
70
+ const pkgPath = path_1.default.join(baseDir, 'package.json');
71
+ const nodeModulesDir = path_1.default.join(baseDir, 'node_modules');
72
+ let pkg = {};
73
+ if (fs_1.default.existsSync(pkgPath)) {
74
+ try {
75
+ pkg = JSON.parse(fs_1.default.readFileSync(pkgPath, 'utf8'));
76
+ }
77
+ catch {
78
+ // Corrupt package.json — overwrite below rather than crash.
79
+ pkg = {};
80
+ }
81
+ }
82
+ pkg.name = pkg.name || 'fraim-user-runtime';
83
+ pkg.private = true;
84
+ pkg.dependencies = { ...(pkg.dependencies || {}), ...USER_LEVEL_RUNTIME_DEPS };
85
+ fs_1.default.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
86
+ const missing = Object.keys(USER_LEVEL_RUNTIME_DEPS).filter((dep) => !fs_1.default.existsSync(path_1.default.join(nodeModulesDir, dep)));
87
+ if (missing.length === 0) {
88
+ return;
89
+ }
90
+ console.log(chalk_1.default.blue(`📦 Installing user-level runtime dependencies (${missing.join(', ')})...`));
91
+ try {
92
+ (0, child_process_1.execSync)('npm install --no-audit --no-fund --no-save --no-package-lock --omit=dev', {
93
+ cwd: baseDir,
94
+ stdio: 'pipe',
95
+ });
96
+ console.log(chalk_1.default.green(`✅ Installed: ${missing.join(', ')}`));
97
+ }
98
+ catch (error) {
99
+ const stderr = error?.stderr?.toString?.() || error?.message || 'unknown error';
100
+ console.log(chalk_1.default.yellow(`⚠️ Could not install user-level deps (${missing.join(', ')}): ${stderr.split('\n')[0]}`));
101
+ console.log(chalk_1.default.gray(` Skills that depend on these will surface a clear error when invoked.`));
102
+ console.log(chalk_1.default.gray(` To retry manually: cd ${baseDir} && npm install`));
103
+ }
104
+ }
47
105
  /**
48
106
  * Set up the user-level FRAIM directory.
49
107
  * Creates the personalized-employee structure so FRAIM works outside any project.
@@ -55,5 +113,6 @@ async function syncUserLevelArtifacts(userFraimDir) {
55
113
  console.log(chalk_1.default.blue('📦 Setting up user-level FRAIM directory...'));
56
114
  console.log(chalk_1.default.gray(` Target: ${baseDir}`));
57
115
  ensureUserLevelDirectories(baseDir);
116
+ ensureUserLevelDependencies(baseDir);
58
117
  console.log(chalk_1.default.green('✅ User-level FRAIM directory ready'));
59
118
  }
@@ -12,6 +12,7 @@ const START_MARKER = '<!-- FRAIM_AGENT_ADAPTER_START -->';
12
12
  const END_MARKER = '<!-- FRAIM_AGENT_ADAPTER_END -->';
13
13
  const CURSOR_RULE_PATH = path_1.default.join('.cursor', 'rules', 'fraim.mdc');
14
14
  const CLAUDE_FRAIM_COMMAND_PATH = path_1.default.join('.claude', 'commands', 'fraim.md');
15
+ const CLAUDE_FRAIM_SKILL_PATH = path_1.default.join('.claude', 'skills', 'fraim', 'SKILL.md');
15
16
  const VSCODE_FRAIM_PROMPT_PATH = path_1.default.join('.github', 'prompts', 'fraim.prompt.md');
16
17
  const CODEX_FRAIM_SKILL_PATH = path_1.default.join('.codex', 'skills', 'fraim', 'SKILL.md');
17
18
  const WINDSURF_FRAIM_COMMAND_PATH = path_1.default.join('.windsurf', 'commands', 'fraim.md');
@@ -108,7 +109,8 @@ ${ide_invocation_surfaces_1.FRAIM_INVOCATION_BODY}`;
108
109
  { path: CURSOR_RULE_PATH, content: cursorManagedBody },
109
110
  { path: VSCODE_FRAIM_PROMPT_PATH, content: vscodePrompt },
110
111
  { path: path_1.default.join(project_fraim_paths_1.WORKSPACE_FRAIM_DIRNAME, 'README.md'), content: fraimReadme },
111
- { path: CLAUDE_FRAIM_COMMAND_PATH, content: (0, ide_invocation_surfaces_1.buildClaudeSlashCommandContent)() },
112
+ { path: CLAUDE_FRAIM_SKILL_PATH, content: (0, ide_invocation_surfaces_1.buildClaudeSkillContent)() },
113
+ { path: CLAUDE_FRAIM_COMMAND_PATH, content: (0, ide_invocation_surfaces_1.buildClaudeCommandShimContent)() },
112
114
  { path: CODEX_FRAIM_SKILL_PATH, content: (0, ide_invocation_surfaces_1.buildCodexSkillContent)() },
113
115
  { path: WINDSURF_FRAIM_COMMAND_PATH, content: (0, ide_invocation_surfaces_1.buildWindsurfCommandContent)() },
114
116
  { path: KIRO_FRAIM_COMMAND_PATH, content: (0, ide_invocation_surfaces_1.buildKiroCommandContent)() }
@@ -127,6 +129,7 @@ function ensureAgentAdapterFiles(projectRoot) {
127
129
  ? mergeCursorRule(existing, file.content)
128
130
  : file.path.endsWith('README.md')
129
131
  || file.path === VSCODE_FRAIM_PROMPT_PATH
132
+ || file.path === CLAUDE_FRAIM_SKILL_PATH
130
133
  || file.path === CLAUDE_FRAIM_COMMAND_PATH
131
134
  || file.path === CODEX_FRAIM_SKILL_PATH
132
135
  || file.path === WINDSURF_FRAIM_COMMAND_PATH
@@ -43,6 +43,8 @@ exports.QUALITY_REGISTRY = {
43
43
  'code-quality-assessment': { stage: 'product-quality', enforced: true },
44
44
  // Test Quality
45
45
  'test-quality-assessment': { stage: 'test-quality', enforced: true },
46
+ // Security
47
+ 'security-review': { stage: 'security', enforced: true },
46
48
  // Fundraising
47
49
  'investor-pitch-preparation': { stage: 'fundraising', enforced: false },
48
50
  // Go-to-Market
@@ -67,6 +69,7 @@ exports.STAGE_DISPLAY_NAMES = {
67
69
  'branding': 'Branding',
68
70
  'product-quality': 'Product Quality',
69
71
  'test-quality': 'Test Quality',
72
+ 'security': 'Security',
70
73
  'fundraising': 'Fundraising',
71
74
  'go-to-market': 'Go-to-Market',
72
75
  };
@@ -79,6 +82,7 @@ exports.ALL_STAGE_CATEGORIES = [
79
82
  'branding',
80
83
  'product-quality',
81
84
  'test-quality',
85
+ 'security',
82
86
  'fundraising',
83
87
  'go-to-market',
84
88
  ];
package/package.json CHANGED
@@ -1,146 +1,150 @@
1
- {
2
- "name": "fraim-framework",
3
- "version": "2.0.120",
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.123",
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>