fraim 2.0.303 → 2.0.305
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/README.md +2 -3
- package/dist/src/config/persona-capability-bundles.js +10 -10
- package/dist/src/core/quality-evidence.js +2 -2
- package/dist/src/services/demo-seed-service.js +2 -2
- package/package.json +1 -1
- package/public/first-run/error-frame.js +1 -1
- package/public/first-run/script.js +7 -4
- package/public/first-run/styles.css +6 -5
package/README.md
CHANGED
|
@@ -313,9 +313,8 @@ Use these defaults:
|
|
|
313
313
|
- `technical-design` after the spec is approved and you need the implementation plan, file touchpoints, and risk handling.
|
|
314
314
|
- `feature-implementation` for code changes, bug fixes, and documentation updates that should be executed and validated.
|
|
315
315
|
- `test-authoring` when you need reproduction coverage, missing tests, or stronger regression protection before implementation.
|
|
316
|
-
- `
|
|
317
|
-
- `implementation-
|
|
318
|
-
- `implementation-design-review` when you need to verify the code matches the approved technical design.
|
|
316
|
+
- `iterative-quality-improvement` or `ui-polish-validation` after user-facing UI changes or when the ask is explicitly browser validation.
|
|
317
|
+
- `independent-implementation-review` when you need an independent sign-off that the delivered behavior matches both the approved technical design and the feature spec.
|
|
319
318
|
- `issue-retrospective` after the work is complete and you want durable learnings captured.
|
|
320
319
|
|
|
321
320
|
Typical path for a larger feature:
|
|
@@ -53,8 +53,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
53
53
|
pam: {
|
|
54
54
|
personaKey: 'pam',
|
|
55
55
|
bundleId: 'persona-pam-core',
|
|
56
|
-
catalogMetadata: buildCatalogMetadata('pam', ['feature-specification', 'project-plan-creation', 'implementation-
|
|
57
|
-
protectedJobs: ['feature-specification', 'send-newsletter', 'send-thank-you-notes', 'experiment-tracking', 'project-plan-creation', 'implementation-
|
|
56
|
+
catalogMetadata: buildCatalogMetadata('pam', ['feature-specification', 'project-plan-creation', 'independent-implementation-review']),
|
|
57
|
+
protectedJobs: ['feature-specification', 'send-newsletter', 'send-thank-you-notes', 'experiment-tracking', 'project-plan-creation', 'independent-implementation-review', 'scrum-sprint-planning', 'mvp-validation-plan', 'sprint-planning', 'customer-prospect-discovery', 'interview-preparation', 'participant-recruitment', 'process-interview-notes', 'review-customer-development', 'triage-customer-needs'],
|
|
58
58
|
protectedAliases: ['product-management', 'product-spec'],
|
|
59
59
|
defaultHireMode: 'job',
|
|
60
60
|
lockCopy: 'Hire PaM to unlock product-management work for this request.'
|
|
@@ -63,7 +63,7 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
63
63
|
personaKey: 'swen',
|
|
64
64
|
bundleId: 'persona-swen-core',
|
|
65
65
|
catalogMetadata: buildCatalogMetadata('swen', ['feature-implementation', 'technical-design', 'code-refactoring']),
|
|
66
|
-
protectedJobs: ['feature-implementation', 'technical-design', '
|
|
66
|
+
protectedJobs: ['feature-implementation', 'technical-design', 'code-refactoring', 'large-refactor-plan', 'pr-iteration', 'mobile-app-development', 'cloud-application-deployment', 'cloud-cost-optimization', 'cloud-performance-diagnosis', 'route-llm-spend-to-cloud-credits', 'set-up-cloud-cost-alerts', 'gitlabs-to-github', 'system-migration', 'cross-cloud-migration', 'data-pipeline-design', 'data-quality-monitoring', 'data-platform-architecture', 'write-dev-docs', 'database-schema-design', 'create-architecture', 'project-scaffolding', 'codebase-analysis-and-ideation', 'github-org-setup', 'google-workspace-setup', 'mobile-app-rejection-response', 'mobile-app-submission', 'application-replication-workflow'],
|
|
67
67
|
protectedAliases: ['software-engineering', 'implementation'],
|
|
68
68
|
defaultHireMode: 'job',
|
|
69
69
|
lockCopy: 'Hire SWEn to unlock software-engineering delivery for this request.'
|
|
@@ -71,8 +71,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
71
71
|
qasm: {
|
|
72
72
|
personaKey: 'qasm',
|
|
73
73
|
bundleId: 'persona-qasm-core',
|
|
74
|
-
catalogMetadata: buildCatalogMetadata('qasm', ['test-authoring', '
|
|
75
|
-
protectedJobs: ['test-authoring', '
|
|
74
|
+
catalogMetadata: buildCatalogMetadata('qasm', ['test-authoring', 'iterative-quality-improvement', 'ui-polish-validation']),
|
|
75
|
+
protectedJobs: ['test-authoring', 'ui-polish-validation', 'codebase-quality-assessment', 'test-quality-assessment', 'user-testing-and-bug-bash', 'iterative-quality-improvement', 'accessibility-audit', 'api-testing', 'performance-benchmarking'],
|
|
76
76
|
protectedAliases: ['qa', 'quality-assurance'],
|
|
77
77
|
defaultHireMode: 'job',
|
|
78
78
|
lockCopy: 'Hire QAsm to unlock QA validation for this request.'
|
|
@@ -107,11 +107,11 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
107
107
|
sekhar: {
|
|
108
108
|
personaKey: 'sekhar',
|
|
109
109
|
bundleId: 'persona-sekhar-core',
|
|
110
|
-
catalogMetadata: buildCatalogMetadata('sekhar', ['security-review', '
|
|
111
|
-
protectedJobs: ['security-review', '
|
|
110
|
+
catalogMetadata: buildCatalogMetadata('sekhar', ['security-review', 'security-baseline-setup', 'vulnerability-triage-and-remediation']),
|
|
111
|
+
protectedJobs: ['security-review', 'security-baseline-setup', 'vulnerability-triage-and-remediation', 'compliance-review', 'compliance-continuous-monitoring', 'compliance-policy-authoring', 'compliance-questionnaire-response', 'compliance-requirements-detection', 'generate-audit-evidence', 'regulation-evidence-management', 'soc2-evidence-management'],
|
|
112
112
|
protectedAliases: ['security', 'appsec'],
|
|
113
113
|
defaultHireMode: 'job',
|
|
114
|
-
lockCopy: 'Hire SEChar to unlock security setup, review, and
|
|
114
|
+
lockCopy: 'Hire SEChar to unlock security setup, review, and remediation work for this request.'
|
|
115
115
|
},
|
|
116
116
|
travis: {
|
|
117
117
|
personaKey: 'travis',
|
|
@@ -161,8 +161,8 @@ exports.PERSONA_CAPABILITY_BUNDLES = {
|
|
|
161
161
|
careena: {
|
|
162
162
|
personaKey: 'careena',
|
|
163
163
|
bundleId: 'persona-careena-core',
|
|
164
|
-
catalogMetadata: buildCatalogMetadata('careena', ['career-spec', 'resume-creation', 'job-application-
|
|
165
|
-
protectedJobs: ['career-spec', 'job-application-
|
|
164
|
+
catalogMetadata: buildCatalogMetadata('careena', ['career-spec', 'resume-creation', 'job-search-strategy-and-application-plan']),
|
|
165
|
+
protectedJobs: ['career-spec', 'job-search-strategy-and-application-plan', 'job-applications-and-networking', 'resume-creation', 'public-profile-updates', 'career-trajectory-planning', 'pitch-and-interview-prep', 'career-networking', 'offer-negotiation', 'resilience-planning'],
|
|
166
166
|
protectedAliases: ['career', 'career-coach', 'job-search'],
|
|
167
167
|
defaultHireMode: 'job',
|
|
168
168
|
lockCopy: 'Hire CAREEna to unlock job-search execution, interview prep, and career coaching for this request.'
|
|
@@ -38,7 +38,7 @@ exports.QUALITY_REGISTRY = {
|
|
|
38
38
|
'business-plan-creation': { stage: 'business-strategy', enforced: false },
|
|
39
39
|
'branding-quality-audit': { stage: 'branding', enforced: true, telemetryKind: 'score' },
|
|
40
40
|
// Product Quality
|
|
41
|
-
'
|
|
41
|
+
'codebase-quality-assessment': { stage: 'product-quality', enforced: true, telemetryKind: 'score' },
|
|
42
42
|
// UI/UX Quality
|
|
43
43
|
'ui-quality-assessment': { stage: 'ui-ux-quality', enforced: true, telemetryKind: 'score' },
|
|
44
44
|
// Test Quality
|
|
@@ -151,7 +151,7 @@ const QUALITY_SCORE_DIMENSIONS = {
|
|
|
151
151
|
'identityExpressiveness',
|
|
152
152
|
'governanceReadiness'
|
|
153
153
|
],
|
|
154
|
-
'
|
|
154
|
+
'codebase-quality-assessment': [
|
|
155
155
|
'typeSafety',
|
|
156
156
|
'errorHandling',
|
|
157
157
|
'architecture',
|
|
@@ -5,7 +5,7 @@ const crypto_1 = require("crypto");
|
|
|
5
5
|
const STAGE_JOBS = [
|
|
6
6
|
{ name: 'brainstorming', category: 'brainstorming', jobs: ['idea-exploration', 'opportunity-mapping'] },
|
|
7
7
|
{ name: 'customer-development', category: 'customer-development', jobs: ['interview-preparation', 'process-interview-notes', 'review-customer-development'] },
|
|
8
|
-
{ name: 'product-building', category: 'product-building', jobs: ['feature-specification', 'technical-design', 'feature-implementation'
|
|
8
|
+
{ name: 'product-building', category: 'product-building', jobs: ['feature-specification', 'technical-design', 'feature-implementation'] },
|
|
9
9
|
{ name: 'fundraising', category: 'fundraising', jobs: ['investor-outreach', 'deck-iteration'] },
|
|
10
10
|
{ name: 'gtm', category: 'gtm', jobs: ['gtm-plan', 'channel-tests'] },
|
|
11
11
|
{ name: 'marketing', category: 'marketing', jobs: ['brand-creation', 'whitepaper-thought-leadership'] },
|
|
@@ -103,7 +103,7 @@ async function seedDemoDataForUser(dbService, userId) {
|
|
|
103
103
|
{ category: 'customer-development', jobName: 'process-interview-notes' },
|
|
104
104
|
{ category: 'business-strategy', jobName: 'review-business-strategy' },
|
|
105
105
|
{ category: 'branding', jobName: 'branding-quality-audit' },
|
|
106
|
-
{ category: 'product-quality', jobName: '
|
|
106
|
+
{ category: 'product-quality', jobName: 'codebase-quality-assessment' },
|
|
107
107
|
{ category: 'ui-ux-quality', jobName: 'ui-quality-assessment' },
|
|
108
108
|
{ category: 'test-quality', jobName: 'test-quality-assessment' },
|
|
109
109
|
{ category: 'security', jobName: 'security-review' },
|
package/package.json
CHANGED
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
const { visible, hidden } = truncateToLastLines(frame.whatHappened || '', 12);
|
|
58
|
-
const whatHappened = document.createElement('
|
|
58
|
+
const whatHappened = document.createElement('div');
|
|
59
59
|
whatHappened.className = 'what-happened';
|
|
60
60
|
whatHappened.setAttribute('data-testid', 'error-what-happened');
|
|
61
61
|
whatHappened.textContent = visible;
|
|
@@ -584,6 +584,10 @@
|
|
|
584
584
|
const existing = modal.querySelector('[data-testid="error-frame"]');
|
|
585
585
|
if (existing) existing.remove();
|
|
586
586
|
if (!window.FraimErrorFrame || typeof window.FraimErrorFrame.render !== 'function') return;
|
|
587
|
+
const status = modal.querySelector('[data-testid="agent-install-status"]');
|
|
588
|
+
if (status) status.remove();
|
|
589
|
+
const actions = modal.querySelector('.install-actions');
|
|
590
|
+
if (actions) actions.remove();
|
|
587
591
|
const frame = window.FraimErrorFrame.render({
|
|
588
592
|
whatTried: `We tried to set up ${opt.label}.`,
|
|
589
593
|
whatHappened: message,
|
|
@@ -598,10 +602,9 @@
|
|
|
598
602
|
} else if (action.id === 'alternative') {
|
|
599
603
|
closeButton.click();
|
|
600
604
|
} else if (action.id === 'manual') {
|
|
601
|
-
const
|
|
602
|
-
if (
|
|
603
|
-
|
|
604
|
-
status.removeAttribute('data-tone');
|
|
605
|
+
const happened = modal.querySelector('[data-testid="error-what-happened"]');
|
|
606
|
+
if (happened) {
|
|
607
|
+
happened.textContent = 'Run npx fraim add-ide for manual setup, then return here when your local agent is ready.';
|
|
605
608
|
}
|
|
606
609
|
}
|
|
607
610
|
});
|
|
@@ -357,15 +357,16 @@ body {
|
|
|
357
357
|
padding: 10px 12px;
|
|
358
358
|
}
|
|
359
359
|
.error-frame .what-happened {
|
|
360
|
-
background: #
|
|
361
|
-
color:
|
|
362
|
-
font-
|
|
363
|
-
|
|
360
|
+
background: #fff;
|
|
361
|
+
color: var(--text);
|
|
362
|
+
font-size: 14px;
|
|
363
|
+
line-height: 1.45;
|
|
364
364
|
padding: 10px 12px;
|
|
365
365
|
border-radius: 8px;
|
|
366
|
+
border: 1px solid #f0c9c9;
|
|
366
367
|
max-height: 88px;
|
|
367
368
|
overflow: auto;
|
|
368
|
-
white-space: pre;
|
|
369
|
+
white-space: pre-wrap;
|
|
369
370
|
margin: 0;
|
|
370
371
|
}
|
|
371
372
|
.error-frame .show-full {
|