@fenixforce/edition-pro 0.1.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.
- package/dist/api/approval-routes.d.ts +15 -0
- package/dist/api/fleet-routes.d.ts +23 -0
- package/dist/api/integration-routes.d.ts +17 -0
- package/dist/api/middleware.d.ts +37 -0
- package/dist/boot.d.ts +37 -0
- package/dist/business/approval-queue.d.ts +94 -0
- package/dist/business/arena.d.ts +71 -0
- package/dist/business/best-of-n.d.ts +68 -0
- package/dist/business/brainstorm.d.ts +42 -0
- package/dist/business/compile-checker.d.ts +50 -0
- package/dist/business/debate.d.ts +38 -0
- package/dist/business/fleet-budget.d.ts +69 -0
- package/dist/business/fleet-config.d.ts +125 -0
- package/dist/business/fleet.d.ts +85 -0
- package/dist/business/handoff.d.ts +56 -0
- package/dist/business/hat-system.d.ts +57 -0
- package/dist/business/index.d.ts +44 -0
- package/dist/business/integration-registry.d.ts +66 -0
- package/dist/business/node-pipeline.d.ts +62 -0
- package/dist/business/oracle.d.ts +64 -0
- package/dist/business/roles/index.d.ts +7 -0
- package/dist/business/roles/judge.d.ts +24 -0
- package/dist/business/roles/planner.d.ts +30 -0
- package/dist/business/roles/types.d.ts +37 -0
- package/dist/business/roles/worker.d.ts +25 -0
- package/dist/business/router.d.ts +75 -0
- package/dist/business/shared-memory.d.ts +85 -0
- package/dist/business/status-detector.d.ts +52 -0
- package/dist/business/swarm-registry.d.ts +63 -0
- package/dist/business/templates.d.ts +55 -0
- package/dist/business/workspace-manager.d.ts +105 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +638 -0
- package/dist/infrastructure/pty-agent.d.ts +74 -0
- package/dist/migrations/migrate.d.ts +7 -0
- package/dist/migrations/runner.d.ts +49 -0
- package/dist/workspace/worktree.d.ts +69 -0
- package/package.json +37 -0
- package/skills/builtin/academic-researcher/SKILL.md +51 -0
- package/skills/builtin/advanced-recon/SKILL.md +75 -0
- package/skills/builtin/agent-governance/SKILL.md +122 -0
- package/skills/builtin/algorithmic-art/SKILL.md +55 -0
- package/skills/builtin/api-attack-surface-mapper/SKILL.md +88 -0
- package/skills/builtin/api-development/SKILL.md +147 -0
- package/skills/builtin/api-exploit-prover/SKILL.md +74 -0
- package/skills/builtin/api-integration/SKILL.md +73 -0
- package/skills/builtin/api-security-tester/SKILL.md +82 -0
- package/skills/builtin/api-test-executor/SKILL.md +62 -0
- package/skills/builtin/app-store-optimization/SKILL.md +46 -0
- package/skills/builtin/audio-tour-guide/SKILL.md +18 -0
- package/skills/builtin/auth-flow-operator/SKILL.md +70 -0
- package/skills/builtin/autonomous-rag/SKILL.md +21 -0
- package/skills/builtin/backend-development/SKILL.md +265 -0
- package/skills/builtin/binary-analysis-analyst/SKILL.md +61 -0
- package/skills/builtin/binary-analysis-core/SKILL.md +65 -0
- package/skills/builtin/binary-recon/SKILL.md +64 -0
- package/skills/builtin/blackboard-coordination/SKILL.md +56 -0
- package/skills/builtin/blog-to-podcast/SKILL.md +18 -0
- package/skills/builtin/blog-writing/SKILL.md +36 -0
- package/skills/builtin/brainstorming/SKILL.md +69 -0
- package/skills/builtin/brand-design/SKILL.md +42 -0
- package/skills/builtin/ci-cd-pipelines/SKILL.md +210 -0
- package/skills/builtin/cloud-infrastructure/SKILL.md +140 -0
- package/skills/builtin/code-review/SKILL.md +88 -0
- package/skills/builtin/code-review-analyst/SKILL.md +96 -0
- package/skills/builtin/code-review-recon/SKILL.md +64 -0
- package/skills/builtin/code-review-verifier/SKILL.md +55 -0
- package/skills/builtin/coding-agent-team/SKILL.md +13 -0
- package/skills/builtin/competitor-intelligence/SKILL.md +39 -0
- package/skills/builtin/content-engine/SKILL.md +82 -0
- package/skills/builtin/context7-docs/SKILL.md +145 -0
- package/skills/builtin/copywriting/SKILL.md +38 -0
- package/skills/builtin/corrective-rag/SKILL.md +19 -0
- package/skills/builtin/cost-optimization/SKILL.md +131 -0
- package/skills/builtin/crypto-vulnerability-analyst/SKILL.md +64 -0
- package/skills/builtin/customer-support/SKILL.md +48 -0
- package/skills/builtin/customer-voice-support/SKILL.md +43 -0
- package/skills/builtin/data-analysis/SKILL.md +57 -0
- package/skills/builtin/data-visualization/SKILL.md +33 -0
- package/skills/builtin/database-design/SKILL.md +119 -0
- package/skills/builtin/decision-helper/SKILL.md +84 -0
- package/skills/builtin/deep-research/SKILL.md +68 -0
- package/skills/builtin/deepwiki-research/SKILL.md +115 -0
- package/skills/builtin/dependency-audit/SKILL.md +46 -0
- package/skills/builtin/doc-coauthoring/SKILL.md +48 -0
- package/skills/builtin/docker-deployment/SKILL.md +243 -0
- package/skills/builtin/docx-generation/SKILL.md +135 -0
- package/skills/builtin/dry-run-harness/SKILL.md +61 -0
- package/skills/builtin/editor/SKILL.md +44 -0
- package/skills/builtin/email-drafter/SKILL.md +42 -0
- package/skills/builtin/error-handling/SKILL.md +82 -0
- package/skills/builtin/eval-harness/SKILL.md +197 -0
- package/skills/builtin/evaluation-framework/SKILL.md +51 -0
- package/skills/builtin/exploit-writer/SKILL.md +63 -0
- package/skills/builtin/fact-checker/SKILL.md +51 -0
- package/skills/builtin/filesystem-context/SKILL.md +47 -0
- package/skills/builtin/financial-coach/SKILL.md +18 -0
- package/skills/builtin/finding-chain-correlator/SKILL.md +70 -0
- package/skills/builtin/finding-verifier/SKILL.md +65 -0
- package/skills/builtin/frontend-design/SKILL.md +104 -0
- package/skills/builtin/frontend-development/SKILL.md +227 -0
- package/skills/builtin/frontend-slides/SKILL.md +155 -0
- package/skills/builtin/fullstack-project/SKILL.md +286 -0
- package/skills/builtin/game-development/SKILL.md +60 -0
- package/skills/builtin/git-workflow/SKILL.md +44 -0
- package/skills/builtin/i18n-localization/SKILL.md +38 -0
- package/skills/builtin/image-prompt-engineering/SKILL.md +37 -0
- package/skills/builtin/investment-research/SKILL.md +33 -0
- package/skills/builtin/investor-materials/SKILL.md +90 -0
- package/skills/builtin/javascript-surface-analyzer/SKILL.md +66 -0
- package/skills/builtin/markdown-reports/SKILL.md +68 -0
- package/skills/builtin/market-research/SKILL.md +69 -0
- package/skills/builtin/mcp-builder/SKILL.md +86 -0
- package/skills/builtin/meeting-notes/SKILL.md +47 -0
- package/skills/builtin/memory-safety-analyst/SKILL.md +61 -0
- package/skills/builtin/meta-controller/SKILL.md +44 -0
- package/skills/builtin/mixture-of-agents/SKILL.md +53 -0
- package/skills/builtin/monitoring-observability/SKILL.md +169 -0
- package/skills/builtin/negotiation-simulator/SKILL.md +24 -0
- package/skills/builtin/nestjs-development/SKILL.md +56 -0
- package/skills/builtin/nextjs-development/SKILL.md +55 -0
- package/skills/builtin/parallel-dispatch/SKILL.md +83 -0
- package/skills/builtin/pdf-generation/SKILL.md +169 -0
- package/skills/builtin/personal-finance/SKILL.md +17 -0
- package/skills/builtin/pev-workflow/SKILL.md +62 -0
- package/skills/builtin/planning-with-files/SKILL.md +59 -0
- package/skills/builtin/pptx-generation/SKILL.md +117 -0
- package/skills/builtin/prisma-orm/SKILL.md +48 -0
- package/skills/builtin/rag-database-routing/SKILL.md +38 -0
- package/skills/builtin/rapid-prototyping/SKILL.md +152 -0
- package/skills/builtin/react-development/SKILL.md +244 -0
- package/skills/builtin/react-native-mobile/SKILL.md +113 -0
- package/skills/builtin/refactoring/SKILL.md +39 -0
- package/skills/builtin/reflexive-metacognition/SKILL.md +29 -0
- package/skills/builtin/riper-workflow/SKILL.md +214 -0
- package/skills/builtin/security-audit/SKILL.md +113 -0
- package/skills/builtin/security-self-audit/SKILL.md +311 -0
- package/skills/builtin/self-evolving-agent/SKILL.md +28 -0
- package/skills/builtin/self-improvement-loop/SKILL.md +58 -0
- package/skills/builtin/semantic-search/SKILL.md +93 -0
- package/skills/builtin/seo-audit-team/SKILL.md +27 -0
- package/skills/builtin/seo-optimization/SKILL.md +49 -0
- package/skills/builtin/server-management/SKILL.md +190 -0
- package/skills/builtin/social-media-content/SKILL.md +50 -0
- package/skills/builtin/sprint-planner/SKILL.md +49 -0
- package/skills/builtin/strategic-compact/SKILL.md +61 -0
- package/skills/builtin/strategy-advisor/SKILL.md +51 -0
- package/skills/builtin/structured-thinking/SKILL.md +70 -0
- package/skills/builtin/subagent-development/SKILL.md +105 -0
- package/skills/builtin/system-design/SKILL.md +66 -0
- package/skills/builtin/systematic-debugging/SKILL.md +87 -0
- package/skills/builtin/tailwind-css/SKILL.md +55 -0
- package/skills/builtin/taint-flow-tracer/SKILL.md +89 -0
- package/skills/builtin/teaching-agent-team/SKILL.md +32 -0
- package/skills/builtin/tech-debt-manager/SKILL.md +67 -0
- package/skills/builtin/technical-documentation/SKILL.md +47 -0
- package/skills/builtin/test-driven-development/SKILL.md +70 -0
- package/skills/builtin/theme-factory/SKILL.md +244 -0
- package/skills/builtin/threat-model-generator/SKILL.md +105 -0
- package/skills/builtin/trust-layer/SKILL.md +43 -0
- package/skills/builtin/typescript-patterns/SKILL.md +61 -0
- package/skills/builtin/ui-ux-design/SKILL.md +75 -0
- package/skills/builtin/verification-before-completion/SKILL.md +41 -0
- package/skills/builtin/verification-loop/SKILL.md +120 -0
- package/skills/builtin/waf-bypass-agent/SKILL.md +97 -0
- package/skills/builtin/web-artifacts-builder/SKILL.md +117 -0
- package/skills/builtin/web-assessment-executor/SKILL.md +66 -0
- package/skills/builtin/web-exploit-prover/SKILL.md +58 -0
- package/skills/builtin/web-scraping/SKILL.md +63 -0
- package/skills/builtin/webapp-testing/SKILL.md +86 -0
- package/skills/builtin/webhook-development/SKILL.md +62 -0
- package/skills/builtin/writing-skills/SKILL.md +67 -0
- package/skills/builtin/xlsx-generation/SKILL.md +116 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Web Assessment Executor
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
Run assigned web tests without scope drift while preserving strong proof quality.
|
|
5
|
+
|
|
6
|
+
## Inputs
|
|
7
|
+
- `target_url`
|
|
8
|
+
- `test_cases`
|
|
9
|
+
- `auth_context`
|
|
10
|
+
- `scope_constraints`
|
|
11
|
+
- `runtime_limits`
|
|
12
|
+
|
|
13
|
+
## Execution Policy
|
|
14
|
+
- Complete one test case end-to-end before moving on.
|
|
15
|
+
- Use browser automation for stateful UX flows.
|
|
16
|
+
- Use HTTP tooling for deterministic replay.
|
|
17
|
+
- Keep payload variants bounded and logged.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
### Phase 1: Session and Baseline
|
|
21
|
+
1. Validate authentication and role.
|
|
22
|
+
2. Capture normal behavior baseline for target action.
|
|
23
|
+
3. Define success and failure signal for the case.
|
|
24
|
+
|
|
25
|
+
### Phase 2: Case Execution
|
|
26
|
+
1. Run base payload.
|
|
27
|
+
2. Run controlled payload variants.
|
|
28
|
+
3. Capture request context and response deltas.
|
|
29
|
+
|
|
30
|
+
### Phase 3: Escalation
|
|
31
|
+
1. If vulnerable signal appears, escalate toward measurable impact.
|
|
32
|
+
2. If blocked by filter, pivot to bypass testing.
|
|
33
|
+
3. If no signal after bounded variants, classify negative.
|
|
34
|
+
|
|
35
|
+
### Phase 4: Evidence Packaging
|
|
36
|
+
1. Include replay steps, payloads, and artifacts.
|
|
37
|
+
2. Map evidence to case ID and vulnerability type.
|
|
38
|
+
3. Store explicit rationale for verdict.
|
|
39
|
+
|
|
40
|
+
## Minimum Variant Policy
|
|
41
|
+
| Vulnerability Type | Minimum Variants |
|
|
42
|
+
|---|---|
|
|
43
|
+
| XSS | context-aware payloads across HTML/attr/JS contexts |
|
|
44
|
+
| SQLi | boolean, error, and time-control checks |
|
|
45
|
+
| IDOR | object ID and role/tenant permutations |
|
|
46
|
+
| CSRF/workflow | token, sequence, and method variations |
|
|
47
|
+
|
|
48
|
+
## Output Contract
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"executed_cases": [],
|
|
52
|
+
"confirmed_findings": [],
|
|
53
|
+
"negative_cases": [],
|
|
54
|
+
"blocked_cases": [],
|
|
55
|
+
"evidence_index": []
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Constraints
|
|
60
|
+
- Do not invent unrelated tests.
|
|
61
|
+
- Do not claim exploitation without execution proof.
|
|
62
|
+
|
|
63
|
+
## Quality Checklist
|
|
64
|
+
- [ ] Every case has terminal status.
|
|
65
|
+
- [ ] Variant set is sufficient and bounded.
|
|
66
|
+
- [ ] Confirmed findings are replayable.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Web Exploit Prover
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
Convert initial web vulnerability leads into high-confidence exploit outcomes.
|
|
5
|
+
|
|
6
|
+
## Inputs
|
|
7
|
+
- `initial_findings`
|
|
8
|
+
- `target_context`
|
|
9
|
+
- `auth_and_role_data`
|
|
10
|
+
- `environment_constraints`
|
|
11
|
+
|
|
12
|
+
## Evidence Levels
|
|
13
|
+
- `L1`: suspicious behavior only
|
|
14
|
+
- `L2`: exploit primitive observed
|
|
15
|
+
- `L3`: code path executed in attacker-controlled way
|
|
16
|
+
- `L4`: business impact demonstrated
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
### Phase 1: Independent Reproduction
|
|
20
|
+
1. Reproduce lead with alternate technique.
|
|
21
|
+
2. Validate preconditions and dependencies.
|
|
22
|
+
3. Confirm baseline-control difference.
|
|
23
|
+
|
|
24
|
+
### Phase 2: Impact Demonstration
|
|
25
|
+
1. Move from primitive to measurable impact.
|
|
26
|
+
2. Demonstrate confidentiality, integrity, or authorization breach.
|
|
27
|
+
3. Capture minimal proof with clear stop condition.
|
|
28
|
+
|
|
29
|
+
### Phase 3: Robustness Testing
|
|
30
|
+
1. Re-test across fresh session and role context.
|
|
31
|
+
2. Re-test with slight payload and transport changes.
|
|
32
|
+
3. Downgrade confidence on instability.
|
|
33
|
+
|
|
34
|
+
### Phase 4: Final Classification
|
|
35
|
+
1. `confirmed` when L3+ is reproducible.
|
|
36
|
+
2. `plausible` when primitive exists but impact blocked.
|
|
37
|
+
3. `disputed` when mitigation is proven.
|
|
38
|
+
4. `inconclusive` when environmental blockers remain.
|
|
39
|
+
|
|
40
|
+
## Output Contract
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"confirmed_exploits": [],
|
|
44
|
+
"plausible_findings": [],
|
|
45
|
+
"disputed_findings": [],
|
|
46
|
+
"inconclusive_findings": [],
|
|
47
|
+
"impact_evidence": []
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Constraints
|
|
52
|
+
- No severity inflation from weak indicators.
|
|
53
|
+
- Distinguish security mitigation from test-environment failure.
|
|
54
|
+
|
|
55
|
+
## Quality Checklist
|
|
56
|
+
- [ ] Impact, not just signal, is demonstrated.
|
|
57
|
+
- [ ] Confirmation uses independent method.
|
|
58
|
+
- [ ] Confidence aligns with stability.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web-scraping
|
|
3
|
+
description: "Use this skill when the user asks to extract data from websites, scrape web pages, build content pipelines, or automate data collection from the web. Triggers: 'scrape', 'extract from website', 'web data', 'crawl', 'parse HTML', or requests to programmatically collect information from web pages."
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Web Scraping
|
|
8
|
+
|
|
9
|
+
## What This Skill Does
|
|
10
|
+
|
|
11
|
+
Extract structured data from web pages. HTML parsing, content extraction, batch scraping, anti-detection, and data pipeline construction.
|
|
12
|
+
|
|
13
|
+
## Approaches
|
|
14
|
+
|
|
15
|
+
| Method | When to Use |
|
|
16
|
+
|--------|-------------|
|
|
17
|
+
| fetch + HTML parser | Simple pages, no JS rendering needed |
|
|
18
|
+
| Playwright/Puppeteer | JS-rendered content, SPAs, interactive pages |
|
|
19
|
+
| API first | Always check if the site has an API before scraping |
|
|
20
|
+
| Scrapling MCP | Batch scraping with anti-bot bypass (Fenix integration) |
|
|
21
|
+
|
|
22
|
+
## Basic Scraping
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import * as cheerio from "cheerio";
|
|
26
|
+
|
|
27
|
+
const html = await fetch(url).then(r => r.text());
|
|
28
|
+
const $ = cheerio.load(html);
|
|
29
|
+
|
|
30
|
+
const items = $(".product-card").map((_, el) => ({
|
|
31
|
+
title: $(el).find("h2").text().trim(),
|
|
32
|
+
price: $(el).find(".price").text().trim(),
|
|
33
|
+
link: $(el).find("a").attr("href"),
|
|
34
|
+
})).get();
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Rules
|
|
38
|
+
|
|
39
|
+
- Check robots.txt and terms of service before scraping
|
|
40
|
+
- Rate limit requests (1-2 seconds between requests minimum)
|
|
41
|
+
- Set a proper User-Agent header
|
|
42
|
+
- Handle pagination and infinite scroll
|
|
43
|
+
- Store raw HTML alongside extracted data (for debugging)
|
|
44
|
+
- Validate extracted data (check for empty fields, unexpected formats)
|
|
45
|
+
- Build resilient selectors (prefer data attributes over CSS classes)
|
|
46
|
+
|
|
47
|
+
## Structured Scraping with Typed Output
|
|
48
|
+
|
|
49
|
+
Define the output schema before scraping:
|
|
50
|
+
```typescript
|
|
51
|
+
interface ScrapedProduct {
|
|
52
|
+
title: string;
|
|
53
|
+
price: number;
|
|
54
|
+
currency: string;
|
|
55
|
+
description: string;
|
|
56
|
+
imageUrl: string;
|
|
57
|
+
availability: "in_stock" | "out_of_stock" | "pre_order";
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Validate every scraped item against the schema. Log items that fail validation rather than silently dropping fields.
|
|
62
|
+
|
|
63
|
+
Firecrawl integration: use Firecrawl MCP for sites that require JavaScript rendering and anti-bot bypass. Fall back to cheerio for simple HTML pages.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: webapp-testing
|
|
3
|
+
description: "Use this skill when writing end-to-end tests, browser automation, visual regression tests, or accessibility tests for web applications. Triggers: 'E2E test', 'Playwright', 'end-to-end', 'browser test', 'visual regression', 'accessibility test', 'integration test', or requests to verify web application behavior from the user's perspective."
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Web Application Testing
|
|
8
|
+
|
|
9
|
+
## What This Skill Does
|
|
10
|
+
|
|
11
|
+
End-to-end testing with Playwright. Browser automation, visual regression, accessibility testing, and cross-browser verification.
|
|
12
|
+
|
|
13
|
+
## Before You Start
|
|
14
|
+
|
|
15
|
+
**Context7:** Fetch Playwright docs before writing tests. The API evolves.
|
|
16
|
+
|
|
17
|
+
## Test Structure
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { test, expect } from "@playwright/test";
|
|
21
|
+
|
|
22
|
+
test.describe("Authentication", () => {
|
|
23
|
+
test("user can register and login", async ({ page }) => {
|
|
24
|
+
await page.goto("/register");
|
|
25
|
+
await page.fill('[name="email"]', "test@example.com");
|
|
26
|
+
await page.fill('[name="password"]', "SecurePass123!");
|
|
27
|
+
await page.click('button[type="submit"]');
|
|
28
|
+
|
|
29
|
+
await expect(page).toHaveURL("/dashboard");
|
|
30
|
+
await expect(page.locator("h1")).toContainText("Welcome");
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("shows error for invalid credentials", async ({ page }) => {
|
|
34
|
+
await page.goto("/login");
|
|
35
|
+
await page.fill('[name="email"]', "wrong@example.com");
|
|
36
|
+
await page.fill('[name="password"]', "wrong");
|
|
37
|
+
await page.click('button[type="submit"]');
|
|
38
|
+
|
|
39
|
+
await expect(page.locator(".error")).toContainText("Invalid credentials");
|
|
40
|
+
await expect(page).toHaveURL("/login");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Playwright Config
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { defineConfig } from "@playwright/test";
|
|
49
|
+
|
|
50
|
+
export default defineConfig({
|
|
51
|
+
testDir: "./tests/e2e",
|
|
52
|
+
timeout: 30_000,
|
|
53
|
+
retries: 2,
|
|
54
|
+
use: {
|
|
55
|
+
baseURL: "http://localhost:3000",
|
|
56
|
+
screenshot: "only-on-failure",
|
|
57
|
+
trace: "on-first-retry",
|
|
58
|
+
},
|
|
59
|
+
webServer: {
|
|
60
|
+
command: "bun run dev",
|
|
61
|
+
port: 3000,
|
|
62
|
+
reuseExistingServer: !process.env.CI,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## What to Test E2E
|
|
68
|
+
|
|
69
|
+
- Critical user journeys (registration, login, core feature, payment)
|
|
70
|
+
- Cross-browser (Chromium, Firefox, WebKit)
|
|
71
|
+
- Mobile viewports
|
|
72
|
+
- Error states and edge cases
|
|
73
|
+
|
|
74
|
+
## What NOT to Test E2E
|
|
75
|
+
|
|
76
|
+
- Unit-testable logic (calculations, transformations)
|
|
77
|
+
- API responses (use API tests)
|
|
78
|
+
- Every possible input combination (use unit tests)
|
|
79
|
+
|
|
80
|
+
## Rules
|
|
81
|
+
|
|
82
|
+
- Use data-testid attributes for selectors (stable across CSS changes)
|
|
83
|
+
- Each test must be independent (own setup, own teardown)
|
|
84
|
+
- Tests must run in CI and locally
|
|
85
|
+
- Screenshot on failure for debugging
|
|
86
|
+
- Keep E2E test count small (10-30 for most apps). Pyramid: many unit, some integration, few E2E.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: webhook-development
|
|
3
|
+
description: "Use this skill when building webhook endpoints, processing webhook events, implementing retry logic, or verifying webhook signatures. Triggers: 'webhook', 'callback URL', 'event notification', 'webhook handler', 'signature verification', or requests to receive events from external services."
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Webhook Development
|
|
8
|
+
|
|
9
|
+
## What This Skill Does
|
|
10
|
+
|
|
11
|
+
Build reliable webhook endpoints. Receive events from external services, verify authenticity, process idempotently, and handle failures.
|
|
12
|
+
|
|
13
|
+
## Webhook Handler Pattern
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
app.post("/webhooks/:provider", async (c) => {
|
|
17
|
+
const provider = c.req.param("provider");
|
|
18
|
+
const signature = c.req.header("x-signature-256");
|
|
19
|
+
const body = await c.req.text();
|
|
20
|
+
|
|
21
|
+
// 1. Verify signature
|
|
22
|
+
if (!verifySignature(body, signature, secrets[provider])) {
|
|
23
|
+
return c.json({ error: "Invalid signature" }, 401);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// 2. Parse event
|
|
27
|
+
const event = JSON.parse(body);
|
|
28
|
+
|
|
29
|
+
// 3. Idempotency check
|
|
30
|
+
const eventId = event.id || c.req.header("x-event-id");
|
|
31
|
+
if (await isProcessed(eventId)) {
|
|
32
|
+
return c.json({ status: "already_processed" }, 200);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// 4. Queue for async processing
|
|
36
|
+
await queue.add("webhook", { provider, event, eventId });
|
|
37
|
+
|
|
38
|
+
// 5. Respond immediately (don't process inline)
|
|
39
|
+
return c.json({ status: "accepted" }, 202);
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Signature Verification
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { createHmac, timingSafeEqual } from "crypto";
|
|
47
|
+
|
|
48
|
+
function verifySignature(body: string, signature: string, secret: string): boolean {
|
|
49
|
+
const expected = createHmac("sha256", secret).update(body).digest("hex");
|
|
50
|
+
const sig = signature.replace("sha256=", "");
|
|
51
|
+
return timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Rules
|
|
56
|
+
|
|
57
|
+
- Always verify webhook signatures (never trust unverified events)
|
|
58
|
+
- Always respond with 200/202 within 5 seconds (process async)
|
|
59
|
+
- Always implement idempotency (webhooks can be delivered multiple times)
|
|
60
|
+
- Use timing-safe comparison for signatures (prevent timing attacks)
|
|
61
|
+
- Log every received webhook with event type and processing result
|
|
62
|
+
- Store raw webhook payloads for debugging and replay
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: writing-skills
|
|
3
|
+
description: "Use this skill when creating new skills for the agent, evaluating skill quality, or improving existing skills. Triggers: 'create a skill', 'write a skill', 'new skill', 'skill template', 'improve this skill', or any meta-work on the skill system itself."
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Writing Skills (Meta-Skill)
|
|
8
|
+
|
|
9
|
+
## What This Skill Does
|
|
10
|
+
|
|
11
|
+
Create, evaluate, and improve agent skills. TDD for skill authoring: test that the skill changes agent behavior before shipping.
|
|
12
|
+
|
|
13
|
+
## Skill File Structure
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
skill-name/
|
|
17
|
+
├── SKILL.md # Primary skill document
|
|
18
|
+
├── skill.yaml # Optional: Fenix-native metadata (triggers, owns, handoffs)
|
|
19
|
+
└── references/ # Optional: deep-dive docs loaded on demand
|
|
20
|
+
├── patterns.md
|
|
21
|
+
└── examples.md
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## SKILL.md Template
|
|
25
|
+
|
|
26
|
+
```markdown
|
|
27
|
+
---
|
|
28
|
+
name: skill-name
|
|
29
|
+
description: "Aggressive trigger description. Claude undertriggers skills, so write descriptions that activate on any related query. Include specific trigger words."
|
|
30
|
+
license: MIT
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
# Skill Title
|
|
34
|
+
|
|
35
|
+
## What This Skill Does
|
|
36
|
+
One paragraph. What capability does the agent gain?
|
|
37
|
+
|
|
38
|
+
## When to Activate
|
|
39
|
+
Bullet list of trigger conditions.
|
|
40
|
+
|
|
41
|
+
## [Core Content]
|
|
42
|
+
The actual knowledge, patterns, and procedures.
|
|
43
|
+
|
|
44
|
+
## Rules
|
|
45
|
+
Non-negotiable constraints.
|
|
46
|
+
|
|
47
|
+
## Verification
|
|
48
|
+
How to confirm the skill worked correctly.
|
|
49
|
+
|
|
50
|
+
## Integration with Other Skills
|
|
51
|
+
Cross-references to complementary skills.
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Testing a Skill
|
|
55
|
+
|
|
56
|
+
1. Write 5 test prompts that SHOULD trigger the skill
|
|
57
|
+
2. Write 3 test prompts that should NOT trigger the skill
|
|
58
|
+
3. Run each through the agent
|
|
59
|
+
4. Verify: correct triggers fire, incorrect triggers don't, output quality improves
|
|
60
|
+
|
|
61
|
+
## Rules
|
|
62
|
+
|
|
63
|
+
- Description field is the most important part (it's the activation mechanism)
|
|
64
|
+
- Write descriptions aggressively. Better to overtrigger than undertrigger.
|
|
65
|
+
- Every skill must have a verification section
|
|
66
|
+
- Skills should be self-contained (readable without loading other skills)
|
|
67
|
+
- Test with real prompts before shipping
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: xlsx-generation
|
|
3
|
+
description: "Use this skill when the user asks to create or edit Excel spreadsheets (.xlsx). Triggers: 'spreadsheet', 'Excel', '.xlsx', '.csv', 'data table', 'pivot table', 'chart', 'formulas', or requests for tabular data with calculations and formatting."
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# XLSX Generation
|
|
8
|
+
|
|
9
|
+
## What This Skill Does
|
|
10
|
+
|
|
11
|
+
Create and edit Excel spreadsheets using the `exceljs` npm package (MIT, pure JavaScript, runs on Bun).
|
|
12
|
+
|
|
13
|
+
## Dependencies
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
bun add exceljs
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Creation
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import ExcelJS from "exceljs";
|
|
23
|
+
|
|
24
|
+
const workbook = new ExcelJS.Workbook();
|
|
25
|
+
workbook.creator = "Fenix Agent";
|
|
26
|
+
workbook.created = new Date();
|
|
27
|
+
|
|
28
|
+
const sheet = workbook.addWorksheet("Data");
|
|
29
|
+
|
|
30
|
+
// Define columns
|
|
31
|
+
sheet.columns = [
|
|
32
|
+
{ header: "Name", key: "name", width: 25 },
|
|
33
|
+
{ header: "Email", key: "email", width: 30 },
|
|
34
|
+
{ header: "Amount", key: "amount", width: 15 },
|
|
35
|
+
{ header: "Date", key: "date", width: 15 },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
// Add rows
|
|
39
|
+
sheet.addRows([
|
|
40
|
+
{ name: "Alice", email: "alice@example.com", amount: 1500, date: new Date("2025-01-15") },
|
|
41
|
+
{ name: "Bob", email: "bob@example.com", amount: 2300, date: new Date("2025-02-20") },
|
|
42
|
+
{ name: "Carol", email: "carol@example.com", amount: 980, date: new Date("2025-03-10") },
|
|
43
|
+
]);
|
|
44
|
+
|
|
45
|
+
// Style header row
|
|
46
|
+
const headerRow = sheet.getRow(1);
|
|
47
|
+
headerRow.font = { bold: true, color: { argb: "FFFFFFFF" } };
|
|
48
|
+
headerRow.fill = { type: "pattern", pattern: "solid", fgColor: { argb: "FF2563EB" } };
|
|
49
|
+
headerRow.alignment = { vertical: "middle", horizontal: "center" };
|
|
50
|
+
|
|
51
|
+
// Format amount column as currency
|
|
52
|
+
sheet.getColumn("amount").numFmt = "$#,##0.00";
|
|
53
|
+
|
|
54
|
+
// Format date column
|
|
55
|
+
sheet.getColumn("date").numFmt = "yyyy-mm-dd";
|
|
56
|
+
|
|
57
|
+
// Add formula for total
|
|
58
|
+
const lastRow = sheet.rowCount;
|
|
59
|
+
const totalRow = sheet.addRow({ name: "TOTAL" });
|
|
60
|
+
totalRow.getCell("amount").value = { formula: `SUM(C2:C${lastRow})` };
|
|
61
|
+
totalRow.font = { bold: true };
|
|
62
|
+
|
|
63
|
+
// Freeze header row
|
|
64
|
+
sheet.views = [{ state: "frozen", ySplit: 1 }];
|
|
65
|
+
|
|
66
|
+
// Auto-filter
|
|
67
|
+
sheet.autoFilter = { from: "A1", to: `D${lastRow}` };
|
|
68
|
+
|
|
69
|
+
// Conditional formatting (highlight amounts over 2000)
|
|
70
|
+
sheet.addConditionalFormatting({
|
|
71
|
+
ref: `C2:C${lastRow}`,
|
|
72
|
+
rules: [{
|
|
73
|
+
type: "cellIs",
|
|
74
|
+
operator: "greaterThan",
|
|
75
|
+
formulae: [2000],
|
|
76
|
+
style: { fill: { type: "pattern", pattern: "solid", bgColor: { argb: "FF22C55E" } } },
|
|
77
|
+
}],
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Write file
|
|
81
|
+
await workbook.xlsx.writeFile("output.xlsx");
|
|
82
|
+
// Or get buffer: const buffer = await workbook.xlsx.writeBuffer();
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Reading Existing .xlsx
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
const workbook = new ExcelJS.Workbook();
|
|
89
|
+
await workbook.xlsx.readFile("input.xlsx");
|
|
90
|
+
|
|
91
|
+
const sheet = workbook.getWorksheet("Sheet1");
|
|
92
|
+
sheet.eachRow((row, rowNumber) => {
|
|
93
|
+
console.log(`Row ${rowNumber}:`, row.values);
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Reading CSV
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const workbook = new ExcelJS.Workbook();
|
|
101
|
+
const sheet = await workbook.csv.readFile("input.csv");
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Charts
|
|
105
|
+
|
|
106
|
+
ExcelJS has limited chart support. For charts, create the data in ExcelJS, then add charts by manipulating the underlying XML with `adm-zip`, or recommend the user opens in Excel/Sheets for chart creation.
|
|
107
|
+
|
|
108
|
+
## Rules
|
|
109
|
+
|
|
110
|
+
- Use `exceljs` for creation and editing (pure JS, Bun-compatible)
|
|
111
|
+
- Always freeze the header row
|
|
112
|
+
- Always format numbers with appropriate decimal places
|
|
113
|
+
- Include totals/summaries for numeric columns
|
|
114
|
+
- Use auto-filter on data tables
|
|
115
|
+
- Test output opens in Excel or LibreOffice Calc
|
|
116
|
+
- All packages are MIT licensed, no Python required
|