portable-agent-layer 0.30.1 → 0.31.0

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.
Files changed (52) hide show
  1. package/assets/skills/consulting-report/SKILL.md +68 -74
  2. package/assets/skills/consulting-report/demo/app/globals.css +344 -0
  3. package/assets/skills/consulting-report/demo/app/layout.tsx +32 -0
  4. package/assets/skills/consulting-report/demo/app/page.tsx +255 -0
  5. package/assets/skills/consulting-report/demo/bun.lock +240 -0
  6. package/assets/skills/consulting-report/demo/components/callout.tsx +13 -0
  7. package/assets/skills/consulting-report/demo/components/cover-page.tsx +34 -0
  8. package/assets/skills/consulting-report/demo/components/exhibit.tsx +21 -0
  9. package/assets/skills/consulting-report/demo/components/finding-card.tsx +28 -0
  10. package/assets/skills/consulting-report/demo/components/quote-block.tsx +17 -0
  11. package/assets/skills/consulting-report/demo/components/recommendation-card.tsx +52 -0
  12. package/assets/skills/consulting-report/demo/components/section.tsx +16 -0
  13. package/assets/skills/consulting-report/demo/components/severity-badge.tsx +19 -0
  14. package/assets/skills/consulting-report/demo/components/timeline.tsx +20 -0
  15. package/assets/skills/consulting-report/demo/lib/report-data.ts +247 -0
  16. package/assets/skills/consulting-report/demo/lib/utils.ts +6 -0
  17. package/assets/skills/consulting-report/demo/next.config.js +9 -0
  18. package/assets/skills/consulting-report/demo/package.json +27 -0
  19. package/assets/skills/consulting-report/demo/postcss.config.mjs +5 -0
  20. package/assets/skills/consulting-report/demo/tsconfig.json +41 -0
  21. package/assets/skills/consulting-report/template/app/globals.css +344 -0
  22. package/assets/skills/consulting-report/template/app/layout.tsx +32 -0
  23. package/assets/skills/consulting-report/template/app/page.tsx +255 -0
  24. package/assets/skills/consulting-report/template/bun.lock +240 -0
  25. package/assets/skills/consulting-report/template/components/callout.tsx +13 -0
  26. package/assets/skills/consulting-report/template/components/cover-page.tsx +34 -0
  27. package/assets/skills/consulting-report/template/components/exhibit.tsx +21 -0
  28. package/assets/skills/consulting-report/template/components/finding-card.tsx +28 -0
  29. package/assets/skills/consulting-report/template/components/quote-block.tsx +17 -0
  30. package/assets/skills/consulting-report/template/components/recommendation-card.tsx +52 -0
  31. package/assets/skills/consulting-report/template/components/section.tsx +16 -0
  32. package/assets/skills/consulting-report/template/components/severity-badge.tsx +19 -0
  33. package/assets/skills/consulting-report/template/components/timeline.tsx +20 -0
  34. package/assets/skills/consulting-report/template/lib/report-data.ts +176 -0
  35. package/assets/skills/consulting-report/template/lib/utils.ts +6 -0
  36. package/assets/skills/consulting-report/template/next.config.js +9 -0
  37. package/assets/skills/consulting-report/template/package.json +27 -0
  38. package/assets/skills/consulting-report/template/postcss.config.mjs +5 -0
  39. package/assets/skills/consulting-report/template/tsconfig.json +27 -0
  40. package/assets/skills/consulting-report/tools/dev.ts +47 -0
  41. package/assets/skills/consulting-report/tools/generate-pdf.ts +140 -408
  42. package/assets/skills/consulting-report/tools/scaffold.ts +83 -48
  43. package/assets/skills/presentation/SKILL.md +1 -1
  44. package/package.json +9 -9
  45. package/assets/skills/consulting-report/demo/content/current-state.md +0 -33
  46. package/assets/skills/consulting-report/demo/content/executive-summary.md +0 -19
  47. package/assets/skills/consulting-report/demo/content/report-data.ts +0 -101
  48. package/assets/skills/consulting-report/demo/diagrams/.gitkeep +0 -0
  49. package/assets/skills/consulting-report/template/README.md +0 -28
  50. package/assets/skills/consulting-report/template/content/executive-summary.md +0 -19
  51. package/assets/skills/consulting-report/template/content/report-data.ts +0 -59
  52. package/assets/skills/consulting-report/template/diagrams/.gitkeep +0 -0
@@ -0,0 +1,176 @@
1
+ export interface Finding {
2
+ id: string;
3
+ title: string;
4
+ description: string;
5
+ evidence: string;
6
+ source: string;
7
+ severity: "critical" | "high" | "medium" | "low";
8
+ }
9
+
10
+ export interface Recommendation {
11
+ id: string;
12
+ title: string;
13
+ description: string;
14
+ priority: "immediate" | "short-term" | "long-term";
15
+ }
16
+
17
+ export interface TimelinePhase {
18
+ phase: string;
19
+ title: string;
20
+ description: string;
21
+ duration: string;
22
+ }
23
+
24
+ export interface ReportData {
25
+ clientName: string;
26
+ reportTitle: string;
27
+ reportDate: string;
28
+ classification: string;
29
+ consultancyName: string;
30
+ preTitle?: string;
31
+
32
+ executiveSummary: {
33
+ context: string;
34
+ methodology: { interviewCount: number; roles: string[] };
35
+ keyFindings: string[];
36
+ primaryRecommendation: string;
37
+ expectedOutcomes: string[];
38
+ };
39
+
40
+ situationAssessment: {
41
+ currentState: string;
42
+ clientAsk: string;
43
+ whyNow: string;
44
+ };
45
+
46
+ findings: Finding[];
47
+
48
+ riskAnalysis: {
49
+ existentialRisks: string[];
50
+ competitiveThreats: string[];
51
+ timelinePressures: string;
52
+ };
53
+
54
+ strategicOpportunity: {
55
+ goodNews: string;
56
+ requirements: string[];
57
+ };
58
+
59
+ recommendations: Recommendation[];
60
+
61
+ targetState: {
62
+ description: string;
63
+ keyCapabilities: string[];
64
+ successMetrics: string[];
65
+ };
66
+
67
+ roadmap: TimelinePhase[];
68
+
69
+ callToAction: {
70
+ immediateSteps: string[];
71
+ decisionPoints: string[];
72
+ commitmentRequired: string;
73
+ };
74
+ }
75
+
76
+ export const reportData: ReportData = {
77
+ clientName: "[CLIENT NAME]",
78
+ reportTitle: "Strategic Assessment & Transformation Roadmap",
79
+ reportDate: new Date().toLocaleDateString("en-US", {
80
+ year: "numeric",
81
+ month: "long",
82
+ day: "numeric",
83
+ }),
84
+ classification: "CONFIDENTIAL",
85
+ consultancyName: "[YOUR CONSULTANCY]",
86
+ preTitle: "Strategic Assessment",
87
+
88
+ executiveSummary: {
89
+ context:
90
+ "This report presents findings from a comprehensive assessment of [CLIENT], conducted to evaluate strategic readiness and identify transformation opportunities.",
91
+ methodology: {
92
+ interviewCount: 0,
93
+ roles: ["Executive Leadership", "Department Heads", "Team Leads"],
94
+ },
95
+ keyFindings: [
96
+ "Finding 1 — replace with actual finding",
97
+ "Finding 2 — replace with actual finding",
98
+ "Finding 3 — replace with actual finding",
99
+ ],
100
+ primaryRecommendation: "Based on this analysis, [PRIMARY RECOMMENDATION HERE]",
101
+ expectedOutcomes: ["Expected outcome 1", "Expected outcome 2", "Expected outcome 3"],
102
+ },
103
+
104
+ situationAssessment: {
105
+ currentState: "Replace with current state analysis.",
106
+ clientAsk: "Replace with what the client originally asked for.",
107
+ whyNow: "Replace with why this matters now — the underlying drivers.",
108
+ },
109
+
110
+ findings: [
111
+ {
112
+ id: "F1",
113
+ title: "Finding Title",
114
+ description: "Description of the finding.",
115
+ evidence: "Evidence supporting this finding.",
116
+ source: "Interview / data / observation",
117
+ severity: "critical",
118
+ },
119
+ ],
120
+
121
+ riskAnalysis: {
122
+ existentialRisks: ["Replace with existential risks"],
123
+ competitiveThreats: ["Replace with competitive threats"],
124
+ timelinePressures: "Replace with timeline pressures and urgency factors.",
125
+ },
126
+
127
+ strategicOpportunity: {
128
+ goodNews: "Replace with the strategic pivot — the path forward.",
129
+ requirements: ["Requirement 1", "Requirement 2", "Requirement 3"],
130
+ },
131
+
132
+ recommendations: [
133
+ {
134
+ id: "R1",
135
+ title: "Primary Recommendation",
136
+ description: "Description of the recommendation.",
137
+ priority: "immediate",
138
+ },
139
+ ],
140
+
141
+ targetState: {
142
+ description: "Replace with the vision description.",
143
+ keyCapabilities: ["Capability 1", "Capability 2", "Capability 3"],
144
+ successMetrics: ["Metric 1", "Metric 2", "Metric 3"],
145
+ },
146
+
147
+ roadmap: [
148
+ {
149
+ phase: "Phase 1",
150
+ title: "Foundation",
151
+ description: "Initial phase description.",
152
+ duration: "Weeks 1-4",
153
+ },
154
+ {
155
+ phase: "Phase 2",
156
+ title: "Implementation",
157
+ description: "Main implementation phase.",
158
+ duration: "Weeks 5-12",
159
+ },
160
+ {
161
+ phase: "Phase 3",
162
+ title: "Optimization",
163
+ description: "Optimization and scaling.",
164
+ duration: "Weeks 13-20",
165
+ },
166
+ ],
167
+
168
+ callToAction: {
169
+ immediateSteps: ["Immediate next step 1", "Immediate next step 2"],
170
+ decisionPoints: [
171
+ "Decision point 1 requiring leadership approval",
172
+ "Decision point 2",
173
+ ],
174
+ commitmentRequired: "Replace with the commitment required.",
175
+ },
176
+ };
@@ -0,0 +1,6 @@
1
+ import { type ClassValue, clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,9 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ output: "export",
4
+ images: { unoptimized: true },
5
+ trailingSlash: true,
6
+ turbopack: { root: __dirname },
7
+ };
8
+
9
+ module.exports = nextConfig;
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "consulting-report",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "lint": "next lint"
9
+ },
10
+ "dependencies": {
11
+ "next": "16.2.4",
12
+ "react": "19.2.5",
13
+ "react-dom": "19.2.5",
14
+ "lucide-react": "1.14.0",
15
+ "clsx": "2.1.1",
16
+ "tailwind-merge": "3.5.0"
17
+ },
18
+ "devDependencies": {
19
+ "@tailwindcss/postcss": "4.2.4",
20
+ "@types/node": "25.6.0",
21
+ "@types/react": "19.2.14",
22
+ "@types/react-dom": "19.2.3",
23
+ "postcss": "8.5.13",
24
+ "tailwindcss": "4.2.4",
25
+ "typescript": "6.0.3"
26
+ }
27
+ }
@@ -0,0 +1,5 @@
1
+ export default {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
@@ -0,0 +1,27 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": ["dom", "dom.iterable", "esnext"],
4
+ "target": "ES2017",
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "react-jsx",
15
+ "incremental": true,
16
+ "plugins": [{ "name": "next" }],
17
+ "paths": { "@/*": ["./*"] }
18
+ },
19
+ "include": [
20
+ "next-env.d.ts",
21
+ "**/*.ts",
22
+ "**/*.tsx",
23
+ ".next/types/**/*.ts",
24
+ ".next/dev/types/**/*.ts"
25
+ ],
26
+ "exclude": ["node_modules"]
27
+ }
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // consulting-report skill tool: launch the Next.js dev server for live preview.
4
+ //
5
+ // Usage:
6
+ // bun ~/.pal/skills/consulting-report/tools/dev.ts <report-dir>
7
+
8
+ import { spawnSync } from "node:child_process";
9
+ import { constants as fsConstants } from "node:fs";
10
+ import { access } from "node:fs/promises";
11
+ import { join, resolve } from "node:path";
12
+
13
+ async function exists(p: string): Promise<boolean> {
14
+ try {
15
+ await access(p, fsConstants.F_OK);
16
+ return true;
17
+ } catch {
18
+ return false;
19
+ }
20
+ }
21
+
22
+ export async function dev(reportDir: string): Promise<number> {
23
+ const dir = resolve(reportDir);
24
+ const pkg = join(dir, "package.json");
25
+ if (!(await exists(pkg))) {
26
+ throw new Error(`not a scaffolded report (missing package.json): ${dir}`);
27
+ }
28
+ const result = spawnSync("bun", ["run", "dev"], {
29
+ cwd: dir,
30
+ stdio: "inherit",
31
+ shell: true,
32
+ });
33
+ return result.status ?? 1;
34
+ }
35
+
36
+ export async function run(argv: string[] = process.argv.slice(2)): Promise<void> {
37
+ if (argv.length === 0) {
38
+ console.error("usage: dev.ts <report-dir>");
39
+ process.exit(1);
40
+ }
41
+ const status = await dev(argv[0]);
42
+ process.exit(status);
43
+ }
44
+
45
+ if (import.meta.main) {
46
+ await run();
47
+ }