@signhify/web 0.0.0-stage → 0.3.2

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 CHANGED
@@ -1,3 +1,12 @@
1
- # Temporary Holding Version
1
+ # @signhify/web
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Web components and UI primitives for Signhify documentation and landing experiences.
4
+
5
+ ## Features
6
+
7
+ - **TerminalPreview**: Interactive terminal simulator demonstrating agent workflows and streaming execution in web browsers.
8
+ - **InstallCommandBar**: One-click install snippet copy bar supporting npm, Homebrew, curl, and PowerShell commands.
9
+
10
+ ## License
11
+
12
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terminal-preview.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-preview.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/terminal-preview.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { generateTerminalPreviewMarkup, MOCK_SESSION_FIXTURE } from '../components/TerminalPreview.js';
3
+ // The fixture is a real transcript captured from the mock provider:
4
+ // SIGNHIFY_MOCK_PROVIDER=1 node packages/cli/dist/index.js \
5
+ // run "Does <script>& x>y pipeline work?" --output json
6
+ const fixture = MOCK_SESSION_FIXTURE;
7
+ describe('generateTerminalPreviewMarkup', () => {
8
+ it('renders every fixture transcript line', () => {
9
+ const markup = generateTerminalPreviewMarkup({ transcript: fixture });
10
+ // Fixture content is escaped in output, so compare against the escaped form.
11
+ const escape = (value) => value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
12
+ for (const line of fixture) {
13
+ expect(markup).toContain(escape(line.content));
14
+ }
15
+ expect(markup).toContain('data-role="user"');
16
+ expect(markup).toContain('data-role="assistant"');
17
+ });
18
+ it('escapes <, >, & in transcript content (no injection)', () => {
19
+ const markup = generateTerminalPreviewMarkup({ transcript: fixture });
20
+ // Hostile chars from the real prompt must be escaped, not raw.
21
+ expect(markup).not.toContain('<script>');
22
+ expect(markup).toContain('&lt;script&gt;');
23
+ expect(markup).toContain('&amp;');
24
+ expect(markup).toContain('&gt;');
25
+ });
26
+ it('bar content rides on trusted props, not transcript input', () => {
27
+ const markup = generateTerminalPreviewMarkup({
28
+ mode: 'plan',
29
+ activeRouter: 'groq-cloud (fallback)',
30
+ contextUsagePct: 41,
31
+ transcript: [],
32
+ });
33
+ expect(markup).toContain('PLAN');
34
+ expect(markup).toContain('groq-cloud (fallback)');
35
+ expect(markup).toContain('Context: 41%');
36
+ });
37
+ });
38
+ //# sourceMappingURL=terminal-preview.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-preview.test.js","sourceRoot":"","sources":["../../src/__tests__/terminal-preview.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAEvG,oEAAoE;AACpE,+DAA+D;AAC/D,4DAA4D;AAC5D,MAAM,OAAO,GAAG,oBAAoB,CAAC;AAErC,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,6BAA6B,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtE,6EAA6E;QAC7E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAC/B,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEjF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,6BAA6B,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtE,+DAA+D;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,6BAA6B,CAAC;YAC3C,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,uBAAuB;YACrC,eAAe,EAAE,EAAE;YACnB,UAAU,EAAE,EAAE;SACf,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type PackageManager = 'curl' | 'powershell' | 'npm' | 'pnpm' | 'bun';
2
+ export declare const INSTALL_COMMANDS: Record<PackageManager, string>;
3
+ export declare function getInstallCommand(pm: PackageManager): string;
4
+ //# sourceMappingURL=InstallCommandBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallCommandBar.d.ts","sourceRoot":"","sources":["../../src/components/InstallCommandBar.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AAE5E,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAM3D,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,11 @@
1
+ export const INSTALL_COMMANDS = {
2
+ curl: 'curl -fsSL https://signhify-cli.vercel.app/install.sh | bash',
3
+ powershell: 'irm https://signhify-cli.vercel.app/install.ps1 | iex',
4
+ npm: 'npm install -g @signhify/cli',
5
+ pnpm: 'pnpm add -g @signhify/cli',
6
+ bun: 'bun add -g @signhify/cli',
7
+ };
8
+ export function getInstallCommand(pm) {
9
+ return INSTALL_COMMANDS[pm] || INSTALL_COMMANDS.curl;
10
+ }
11
+ //# sourceMappingURL=InstallCommandBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallCommandBar.js","sourceRoot":"","sources":["../../src/components/InstallCommandBar.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAmC;IAC9D,IAAI,EAAE,8DAA8D;IACpE,UAAU,EAAE,uDAAuD;IACnE,GAAG,EAAE,8BAA8B;IACnC,IAAI,EAAE,2BAA2B;IACjC,GAAG,EAAE,0BAA0B;CAChC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,EAAkB;IAClD,OAAO,gBAAgB,CAAC,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC;AACvD,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface TerminalTranscriptLine {
2
+ role: 'user' | 'assistant' | 'system';
3
+ content: string;
4
+ }
5
+ export interface TerminalPreviewProps {
6
+ title?: string;
7
+ mode?: 'build' | 'plan';
8
+ activeRouter?: string;
9
+ contextUsagePct?: number;
10
+ transcript?: TerminalTranscriptLine[];
11
+ }
12
+ export declare const MOCK_SESSION_FIXTURE: TerminalTranscriptLine[];
13
+ export declare function generateTerminalPreviewMarkup(props?: TerminalPreviewProps): string;
14
+ //# sourceMappingURL=TerminalPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalPreview.d.ts","sourceRoot":"","sources":["../../src/components/TerminalPreview.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,sBAAsB,EAAE,CAAC;CACvC;AASD,eAAO,MAAM,oBAAoB,EAAE,sBAAsB,EAGxD,CAAC;AAYF,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAyBlF"}
@@ -0,0 +1,45 @@
1
+ // Fixture transcript from a real capture:
2
+ // SIGNHIFY_MOCK_PROVIDER=1 node packages/cli/dist/index.js \
3
+ // run "Does <script>& x>y pipeline work?" --output json
4
+ // The user line is the CLI-reported task; the assistant line is the mock
5
+ // adapter's fixed response (packages/providers/src/adapter.ts). The hostile
6
+ // characters come straight from the user prompt, which is why the escaping
7
+ // below is testable against real input rather than a synthetic string.
8
+ export const MOCK_SESSION_FIXTURE = [
9
+ { role: 'user', content: 'Does <script>& x>y pipeline work?' },
10
+ { role: 'assistant', content: 'Task completed successfully by mock provider.' },
11
+ ];
12
+ // Attribute context only — never interpolates raw content into tags.
13
+ function escapeHtml(value) {
14
+ return value
15
+ .replaceAll('&', '&amp;') // ampersand first so entities survive
16
+ .replaceAll('<', '&lt;')
17
+ .replaceAll('>', '&gt;')
18
+ .replaceAll('"', '&quot;')
19
+ .replaceAll("'", '&#39;');
20
+ }
21
+ export function generateTerminalPreviewMarkup(props) {
22
+ const mode = props?.mode ?? 'build';
23
+ const router = props?.activeRouter ?? '9router (port 20128)';
24
+ const usage = props?.contextUsagePct ?? 62;
25
+ const transcript = props?.transcript ?? [];
26
+ const transcriptMarkup = transcript
27
+ .map((line) => {
28
+ const attrs = `data-role="${escapeHtml(line.role)}"`;
29
+ return ` <div class="tp-line" ${attrs}>${escapeHtml(line.content)}</div>`;
30
+ })
31
+ .join('\n');
32
+ return `
33
+ <div class="terminal-preview" data-mode="${mode}" data-router="${router}">
34
+ <div class="terminal-bar">
35
+ <span class="badge ${mode}">${mode.toUpperCase()}</span>
36
+ <span class="router-info">${router}</span>
37
+ <span class="context-meter">Context: ${usage}%</span>
38
+ </div>
39
+ <div class="terminal-transcript">
40
+ ${transcriptMarkup}
41
+ </div>
42
+ </div>
43
+ `.trim();
44
+ }
45
+ //# sourceMappingURL=TerminalPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalPreview.js","sourceRoot":"","sources":["../../src/components/TerminalPreview.ts"],"names":[],"mappings":"AAaA,0CAA0C;AAC1C,+DAA+D;AAC/D,4DAA4D;AAC5D,yEAAyE;AACzE,4EAA4E;AAC5E,2EAA2E;AAC3E,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAA6B;IAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mCAAmC,EAAE;IAC9D,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,+CAA+C,EAAE;CAChF,CAAC;AAEF,qEAAqE;AACrE,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAE,sCAAsC;SAChE,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAA4B;IACxE,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,EAAE,YAAY,IAAI,sBAAsB,CAAC;IAC7D,MAAM,KAAK,GAAG,KAAK,EAAE,eAAe,IAAI,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,KAAK,EAAE,UAAU,IAAI,EAAE,CAAC;IAE3C,MAAM,gBAAgB,GAAG,UAAU;SAChC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,KAAK,GAAG,cAAc,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,OAAO,0BAA0B,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC7E,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;2CACkC,IAAI,kBAAkB,MAAM;;yBAE9C,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;gCACpB,MAAM;2CACK,KAAK;;;EAG9C,gBAAgB;;;GAGf,CAAC,IAAI,EAAE,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { type TerminalPreviewProps, generateTerminalPreviewMarkup, } from './components/TerminalPreview.js';
2
+ export { type PackageManager, INSTALL_COMMANDS, getInstallCommand, } from './components/InstallCommandBar.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EACzB,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,KAAK,cAAc,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { generateTerminalPreviewMarkup, } from './components/TerminalPreview.js';
2
+ export { INSTALL_COMMANDS, getInstallCommand, } from './components/InstallCommandBar.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAEL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,37 @@
1
1
  {
2
2
  "name": "@signhify/web",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.3.2",
4
+ "description": "Signhify Web Platform and UI preview components",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -b",
20
+ "dev": "tsc -b --watch",
21
+ "test": "vitest run",
22
+ "typecheck": "tsc --noEmit",
23
+ "clean": "node -e \"const {rmSync,existsSync}=require('fs');['dist','*.tsbuildinfo'].forEach(p=>{if(existsSync(p))rmSync(p,{recursive:true,force:true})})\""
24
+ },
25
+ "dependencies": {
26
+ "@signhify/core": "^0.3.2",
27
+ "@signhify/providers": "^0.3.2"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.11.0",
31
+ "typescript": "^5.5.0",
32
+ "vitest": "^2.0.0"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ }
37
+ }