faf-taf-git 2.0.4 → 2.2.1
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/.github/workflows/ci.yml +53 -0
- package/.github/workflows/claude-code-review.yml.disabled +29 -0
- package/.github/workflows/claude.yml +39 -0
- package/.github/workflows/homebrew.yml +19 -0
- package/.taf +79 -2
- package/CHANGELOG.md +28 -0
- package/CLAUDE.md +29 -21
- package/CODE_OF_CONDUCT.md +21 -0
- package/CONTRIBUTING.md +3 -0
- package/README.md +69 -12
- package/SECURITY.md +19 -0
- package/action.yml +6 -1
- package/badge.svg +21 -0
- package/dist/badge.d.ts +23 -0
- package/dist/badge.d.ts.map +1 -0
- package/dist/badge.js +147 -0
- package/dist/badge.js.map +1 -0
- package/dist/cli.d.ts +5 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +144 -193
- package/dist/cli.js.map +1 -1
- package/dist/index.js +26045 -20566
- package/dist/index.js.map +1 -1
- package/dist/licenses.txt +0 -22
- package/dist/parsers/bun.d.ts +59 -0
- package/dist/parsers/bun.d.ts.map +1 -0
- package/dist/parsers/bun.js +100 -0
- package/dist/parsers/bun.js.map +1 -0
- package/dist/parsers/index.d.ts +20 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +26 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/vitest.d.ts +17 -0
- package/dist/parsers/vitest.d.ts.map +1 -0
- package/dist/parsers/vitest.js +61 -0
- package/dist/parsers/vitest.js.map +1 -0
- package/package.json +6 -7
- package/project.faf +20 -24
- package/src/badge.ts +138 -0
- package/src/cli.ts +154 -200
- package/src/index.ts +79 -10
- package/src/parsers/bun.ts +103 -0
- package/src/parsers/index.ts +27 -0
- package/src/parsers/vitest.ts +65 -0
- package/tests/badge.test.ts +260 -0
- package/tests/bun-parser.test.ts +173 -0
- package/tests/vitest-parser.test.ts +112 -0
- package/.faf +0 -126
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: CAR Pipeline
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
car:
|
|
12
|
+
name: Claim → Audit → Receipt
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Setup Node.js
|
|
21
|
+
uses: actions/setup-node@v4
|
|
22
|
+
with:
|
|
23
|
+
node-version: '20.x'
|
|
24
|
+
|
|
25
|
+
- name: Install dependencies
|
|
26
|
+
run: npm ci
|
|
27
|
+
|
|
28
|
+
# ── C: CLAIM ──────────────────────────────────
|
|
29
|
+
- name: 'C: Validate project.faf (Claim)'
|
|
30
|
+
run: |
|
|
31
|
+
if [ ! -f project.faf ]; then
|
|
32
|
+
echo "::error::No project.faf found. Run 'faf init' to create one."
|
|
33
|
+
exit 1
|
|
34
|
+
fi
|
|
35
|
+
node -e "require('yaml').parse(require('fs').readFileSync('project.faf','utf-8')); console.log('project.faf: valid YAML')"
|
|
36
|
+
echo "Claim validated"
|
|
37
|
+
|
|
38
|
+
# ── A: AUDIT ──────────────────────────────────
|
|
39
|
+
- name: Build
|
|
40
|
+
run: npm run build
|
|
41
|
+
|
|
42
|
+
- name: 'A: Run tests (Audit)'
|
|
43
|
+
run: npm test 2>&1 | tee test-output.txt
|
|
44
|
+
|
|
45
|
+
# ── R: RECEIPT ────────────────────────────────
|
|
46
|
+
- name: 'R: Generate TAF Receipt'
|
|
47
|
+
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/main'
|
|
48
|
+
uses: Wolfe-Jam/faf-taf-git@v2.1.1
|
|
49
|
+
with:
|
|
50
|
+
test-output-file: test-output.txt
|
|
51
|
+
auto-commit: 'true'
|
|
52
|
+
commit-message: 'chore(taf): update receipt [skip ci]'
|
|
53
|
+
target-branch: taf-receipts
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Claude Code Review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, ready_for_review, reopened]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
claude-review:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pull-requests: write
|
|
13
|
+
issues: read
|
|
14
|
+
id-token: write
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout repository
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
fetch-depth: 1
|
|
21
|
+
|
|
22
|
+
- name: Run Claude Code Review
|
|
23
|
+
id: claude-review
|
|
24
|
+
uses: anthropics/claude-code-action@v1
|
|
25
|
+
with:
|
|
26
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
27
|
+
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
|
|
28
|
+
plugins: 'code-review@claude-code-plugins'
|
|
29
|
+
prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Claude Code
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
pull_request_review_comment:
|
|
7
|
+
types: [created]
|
|
8
|
+
issues:
|
|
9
|
+
types: [opened, assigned]
|
|
10
|
+
pull_request_review:
|
|
11
|
+
types: [submitted]
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude:
|
|
15
|
+
if: |
|
|
16
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
17
|
+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
18
|
+
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
|
19
|
+
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: write
|
|
23
|
+
pull-requests: write
|
|
24
|
+
issues: write
|
|
25
|
+
id-token: write
|
|
26
|
+
actions: read
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 1
|
|
32
|
+
|
|
33
|
+
- name: Run Claude Code
|
|
34
|
+
id: claude
|
|
35
|
+
uses: anthropics/claude-code-action@v1
|
|
36
|
+
with:
|
|
37
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
38
|
+
additional_permissions: |
|
|
39
|
+
actions: read
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
name: Update Homebrew
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags: ["v*"]
|
|
5
|
+
|
|
6
|
+
jobs:
|
|
7
|
+
homebrew:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
steps:
|
|
10
|
+
- name: Update Homebrew formula
|
|
11
|
+
run: |
|
|
12
|
+
VERSION="${GITHUB_REF#refs/tags/v}"
|
|
13
|
+
gh workflow run update-formula.yml \
|
|
14
|
+
-R Wolfe-Jam/homebrew-faf \
|
|
15
|
+
-f formula=faf-taf-git \
|
|
16
|
+
-f version=$VERSION \
|
|
17
|
+
-f npm_package=faf-taf-git
|
|
18
|
+
env:
|
|
19
|
+
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
|
package/.taf
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
format_version: 1.0.0
|
|
2
2
|
project: faf-taf-git
|
|
3
3
|
created: 2025-10-28T01:26:12.944Z
|
|
4
|
-
last_updated:
|
|
4
|
+
last_updated: 2026-02-19T05:56:11.741Z
|
|
5
5
|
faf_associated: true
|
|
6
|
-
faf_location: .faf
|
|
6
|
+
faf_location: project.faf
|
|
7
7
|
faf_score: 65
|
|
8
8
|
test_history:
|
|
9
9
|
- timestamp: 2025-10-28T01:28:38.600Z
|
|
@@ -19,3 +19,80 @@ test_history:
|
|
|
19
19
|
passed: 7
|
|
20
20
|
failed: 0
|
|
21
21
|
trigger: github-actions
|
|
22
|
+
- timestamp: 2026-02-18T02:24:34.363Z
|
|
23
|
+
result: PASSED
|
|
24
|
+
tests:
|
|
25
|
+
total: 38
|
|
26
|
+
passed: 38
|
|
27
|
+
failed: 0
|
|
28
|
+
trigger: github-actions
|
|
29
|
+
- timestamp: 2026-02-18T02:45:42.500Z
|
|
30
|
+
result: PASSED
|
|
31
|
+
tests:
|
|
32
|
+
total: 55
|
|
33
|
+
passed: 55
|
|
34
|
+
failed: 0
|
|
35
|
+
trigger: github-actions
|
|
36
|
+
- timestamp: 2026-02-18T03:07:37.867Z
|
|
37
|
+
result: PASSED
|
|
38
|
+
tests:
|
|
39
|
+
total: 55
|
|
40
|
+
passed: 55
|
|
41
|
+
failed: 0
|
|
42
|
+
trigger: github-actions
|
|
43
|
+
- timestamp: 2026-02-18T03:11:02.179Z
|
|
44
|
+
result: PASSED
|
|
45
|
+
tests:
|
|
46
|
+
total: 55
|
|
47
|
+
passed: 55
|
|
48
|
+
failed: 0
|
|
49
|
+
trigger: github-actions
|
|
50
|
+
- timestamp: 2026-02-18T03:24:05.159Z
|
|
51
|
+
result: PASSED
|
|
52
|
+
tests:
|
|
53
|
+
total: 55
|
|
54
|
+
passed: 55
|
|
55
|
+
failed: 0
|
|
56
|
+
trigger: github-actions
|
|
57
|
+
- timestamp: 2026-02-18T03:28:51.125Z
|
|
58
|
+
result: PASSED
|
|
59
|
+
tests:
|
|
60
|
+
total: 55
|
|
61
|
+
passed: 55
|
|
62
|
+
failed: 0
|
|
63
|
+
trigger: github-actions
|
|
64
|
+
- timestamp: 2026-02-18T05:59:46.851Z
|
|
65
|
+
result: PASSED
|
|
66
|
+
tests:
|
|
67
|
+
total: 55
|
|
68
|
+
passed: 55
|
|
69
|
+
failed: 0
|
|
70
|
+
trigger: github-actions
|
|
71
|
+
- timestamp: 2026-02-18T06:24:51.475Z
|
|
72
|
+
result: PASSED
|
|
73
|
+
tests:
|
|
74
|
+
total: 55
|
|
75
|
+
passed: 55
|
|
76
|
+
failed: 0
|
|
77
|
+
trigger: github-actions
|
|
78
|
+
- timestamp: 2026-02-18T06:37:15.943Z
|
|
79
|
+
result: PASSED
|
|
80
|
+
tests:
|
|
81
|
+
total: 55
|
|
82
|
+
passed: 55
|
|
83
|
+
failed: 0
|
|
84
|
+
trigger: github-actions
|
|
85
|
+
- timestamp: 2026-02-18T20:33:40.820Z
|
|
86
|
+
result: PASSED
|
|
87
|
+
tests:
|
|
88
|
+
total: 55
|
|
89
|
+
passed: 55
|
|
90
|
+
failed: 0
|
|
91
|
+
trigger: github-actions
|
|
92
|
+
- timestamp: 2026-02-19T05:56:11.741Z
|
|
93
|
+
result: PASSED
|
|
94
|
+
tests:
|
|
95
|
+
total: 55
|
|
96
|
+
passed: 55
|
|
97
|
+
failed: 0
|
|
98
|
+
trigger: github-actions
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
<!-- faf: faf-taf-git | TypeScript | cli | A Test Receipt Printer for git -->
|
|
2
|
+
<!-- faf: doc=changelog | latest=v2.2.1 | canonical=project.faf | family=TAF -->
|
|
3
|
+
|
|
1
4
|
# Changelog
|
|
2
5
|
|
|
3
6
|
All notable changes to this project will be documented in this file.
|
|
@@ -5,6 +8,31 @@ All notable changes to this project will be documented in this file.
|
|
|
5
8
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
9
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
10
|
|
|
11
|
+
## [2.2.1] - 2026-06-17
|
|
12
|
+
|
|
13
|
+
Catch-up release — npm was stuck at 2.0.4 while 2.1.0–2.2.0 were tagged but never published. This rolls the full span to npm, plus the navy badge.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **Native bun-test parser** (was v2.2.0) — closes the shim-shaped undercount; reads `bun test` output directly.
|
|
17
|
+
- **`target-branch` input** (was v2.1.0) — write `.taf` receipts to a dedicated branch.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- **TAF badge pass color cyan `#00D4D4` → navy `#003366`** — white text needs a deep-shade background; cyan was too light.
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- **`switchToTargetBranch`** no longer fails on first run when the consumer repo has no `.taf` seed (was v2.1.2).
|
|
24
|
+
- undici vulnerabilities resolved via `@actions/github` / `@actions/core` upgrade; `@actions/core` pinned to v2 (v3 breaks CJS exports in CI).
|
|
25
|
+
|
|
26
|
+
### Notes
|
|
27
|
+
- faf-taf-git is now 100% Trophy (TAF identity cleanup). Security Policy + Code of Conduct added.
|
|
28
|
+
|
|
29
|
+
## [2.1.2] - 2026-05-06
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- **`switchToTargetBranch` no longer fails on first run when consumer repo has no `.taf` seed.** Previously, the orphan-create path called `git add .taf` unconditionally; if no seed existed on the source branch, that step failed with `fatal: pathspec '.taf' did not match any files` (exit code 128) and the whole TAF Receipt step errored out.
|
|
33
|
+
- New behavior: when no seed is present, the action now writes a minimal valid YAML seed (`format_version`, `project`, `created`, `test_history: []`) so the first commit on the target branch always succeeds. `updateTafFile` then populates `test_history` on the same run.
|
|
34
|
+
- Affects any consumer using `target-branch:` for the first time without a pre-seeded `.taf` on `main`. Previous workaround (manually committing a `.taf` seed) is no longer required.
|
|
35
|
+
|
|
8
36
|
## [2.0.4] - 2026-02-17
|
|
9
37
|
|
|
10
38
|
### Fixed
|
package/CLAUDE.md
CHANGED
|
@@ -1,30 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
<!-- faf:start -->
|
|
2
|
+
<!-- faf: faf-taf-git | TypeScript | cli | Platform-agnostic CLI + GitHub Action for TAF updates -->
|
|
3
|
+
<!-- faf: claim=project.faf | family=FAF -->
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
**Current Position:** Platform-agnostic TAF (Testing Activity Feed) updater - works in ANY CI/CD
|
|
5
|
-
**Tyre Compound:** ULTRASOFT C5 (Maximum Performance)
|
|
5
|
+
# CLAUDE.md — faf-taf-git
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## What This Is
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Platform-agnostic CLI + GitHub Action for TAF updates
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
- **Name:** faf-taf-git
|
|
13
|
-
- **Stack:** TypeScript
|
|
14
|
-
- **Quality:** F1-INSPIRED (Championship Performance)
|
|
11
|
+
## Stack
|
|
15
12
|
|
|
16
|
-
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
13
|
+
- **Language:** TypeScript
|
|
14
|
+
- **Runtime:** Node.js
|
|
15
|
+
- **Build:** TypeScript Compiler
|
|
16
|
+
- **Package Manager:** npm
|
|
17
|
+
- **Api Type:** REST
|
|
18
|
+
- **Hosting:** npm Registry
|
|
19
|
+
- **Cicd:** GitHub Actions
|
|
20
|
+
- **TargetUser:** developers
|
|
21
|
+
- **CoreProblem:** understanding project
|
|
22
|
+
- **MissionPurpose:** project documentation
|
|
23
|
+
- **PackageManager:** npm/yarn/pnpm
|
|
24
|
+
- **MainLanguage:** JavaScript/TypeScript
|
|
19
25
|
|
|
20
|
-
|
|
21
|
-
- **Overall Assessment:** Good
|
|
22
|
-
- **Last Updated:** 2026-02-17
|
|
26
|
+
## Context
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
- **Who:** Development teams adopting test-receipt provenance — open-source maintainers proving honest test history, regulated industries (SOC 2 / ISO / HIPAA) needing append-only audit trails, supply-chain verifiers proving tests ran before artifacts shipped, AI-agent reviewers verifying agent code passes tests consistently, and FAF-ecosystem projects completing the CAR Framework (Claim → Audit → Receipt).
|
|
29
|
+
- **What:** TAF file updates in CI/CD pipelines
|
|
30
|
+
- **Why:** Improve development efficiency
|
|
31
|
+
- **Where:** Any CI/CD platform (GitHub, GitLab, Bitbucket)
|
|
32
|
+
- **When:** During CI/CD test runs
|
|
33
|
+
- **How:** Test-driven development
|
|
25
34
|
|
|
26
|
-
|
|
35
|
+
---
|
|
27
36
|
|
|
28
|
-
*
|
|
29
|
-
|
|
30
|
-
*🏎️⚡️_championship_sync*
|
|
37
|
+
*STATUS: BI-SYNC ACTIVE — 2026-06-17T12:16:31.736Z*
|
|
38
|
+
<!-- faf:end -->
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
This project adopts the [Contributor Covenant, v2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/) as its code of conduct. The full text of that covenant governs behavior in this project and its community spaces.
|
|
4
|
+
|
|
5
|
+
## Summary
|
|
6
|
+
|
|
7
|
+
- We commit to maintaining a respectful, harassment-free environment for everyone who participates, regardless of background.
|
|
8
|
+
- Participation includes contributing code, opening issues, reviewing pull requests, and interacting in any official channel.
|
|
9
|
+
- The Contributor Covenant defines the full scope, expected conduct, and enforcement guidelines. See the link above for the complete text.
|
|
10
|
+
|
|
11
|
+
## Reporting
|
|
12
|
+
|
|
13
|
+
If you observe conduct that violates this Code of Conduct, please email **team@faf.one**. Reports are handled confidentially. Maintainers will review, respond, and take appropriate action consistent with the Contributor Covenant's enforcement guidelines.
|
|
14
|
+
|
|
15
|
+
## Scope
|
|
16
|
+
|
|
17
|
+
This Code of Conduct applies to all project spaces — the repository, issues, pull requests, discussions, and any public communication channels operated by the project. It also applies when representing the project in other forums.
|
|
18
|
+
|
|
19
|
+
## Attribution
|
|
20
|
+
|
|
21
|
+
This Code of Conduct adopts the [Contributor Covenant, version 2.1](https://www.contributor-covenant.org/version/2/1/code_of_conduct/), available under the CC BY 4.0 license.
|
package/CONTRIBUTING.md
CHANGED
package/README.md
CHANGED
|
@@ -1,22 +1,30 @@
|
|
|
1
|
+
<!-- faf: faf-taf-git | TypeScript | cli | A Test Receipt Printer for git -->
|
|
2
|
+
<!-- faf: doc=readme | canonical=project.faf | score=100 | family=TAF -->
|
|
3
|
+
|
|
1
4
|
# faf-taf-git
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
[](https://github.com/Wolfe-Jam/faf-taf-git)
|
|
7
|
+
[](https://github.com/anthropics/claude-code-action)
|
|
8
|
+
|
|
9
|
+
> **Q: What does TAF do?** A: It prints Receipts.
|
|
10
|
+
> **Q: What sort of Receipts?** A: Test Receipts.
|
|
11
|
+
> **Q: Why do I need Test Receipts?** A: Proof over time.
|
|
12
|
+
>
|
|
13
|
+
> *Bonus: Cannot be gamed.*
|
|
14
|
+
|
|
15
|
+
**TAF is a Receipt Printer for git.** Every CI run prints a receipt to `.taf`. The receipts accumulate on a git branch. The history is append-only. The proof is permanent.
|
|
4
16
|
|
|
5
|
-
|
|
17
|
+
**Works on any git repo. No FAF required.** TAF is a standalone product — install the action, get receipts. FAF integration is one of TAF's use cases (see below), not a precondition.
|
|
18
|
+
|
|
19
|
+
`npm: faf-taf-git` · `action: Wolfe-Jam/faf-taf-git`
|
|
6
20
|
|
|
7
21
|
---
|
|
8
22
|
|
|
9
23
|
## 🎯 WHAT
|
|
10
24
|
|
|
11
|
-
**
|
|
12
|
-
|
|
13
|
-
A `.taf` file is a git-tracked timeline of your testing history:
|
|
14
|
-
- Permanent proof of test quality
|
|
15
|
-
- Pass rate trends and failure patterns
|
|
16
|
-
- Integration with `.faf` project DNA
|
|
17
|
-
- Git-native accountability (no external services required)
|
|
25
|
+
**A Test Receipt Printer for git.** Every CI run produces one receipt — timestamp, counts, result, trigger — appended to `.taf` on the `taf-receipts` branch. The timeline is the proof.
|
|
18
26
|
|
|
19
|
-
**Example
|
|
27
|
+
**Example Test Receipt:**
|
|
20
28
|
```yaml
|
|
21
29
|
- timestamp: 2026-02-17T19:12:14.810Z
|
|
22
30
|
result: PASSED
|
|
@@ -28,6 +36,15 @@ A `.taf` file is a git-tracked timeline of your testing history:
|
|
|
28
36
|
trigger: github-actions
|
|
29
37
|
```
|
|
30
38
|
|
|
39
|
+
**Every field maps to a real receipt:** timestamp = receipt date, tests = itemized lines, result = total, trigger = cashier/register, run_id = receipt number, project = vendor, format_version = receipt template.
|
|
40
|
+
|
|
41
|
+
**What you get:**
|
|
42
|
+
- **Proof over time** — longitudinal evidence, not snapshots
|
|
43
|
+
- **Pattern detection** — pass-rate trends, regression vs new failure
|
|
44
|
+
- **Platform-agnostic** — works in ANY CI/CD (GitHub Actions, GitLab, Jenkins, CircleCI, Bitbucket, Azure, local, pre-commit)
|
|
45
|
+
- **Git-native** — no external services, no SaaS lock-in
|
|
46
|
+
- **Cannot be gamed** — git SHA detects edits, append-only history detects deletions, CI sandbox prevents output forgery
|
|
47
|
+
|
|
31
48
|
---
|
|
32
49
|
|
|
33
50
|
## 👥 WHO
|
|
@@ -125,6 +142,32 @@ Works in **ANY CI/CD** environment that runs Node.js:
|
|
|
125
142
|
|
|
126
143
|
---
|
|
127
144
|
|
|
145
|
+
## 🧩 Use Cases
|
|
146
|
+
|
|
147
|
+
TAF works on any git repo. Adoption requires **zero ecosystem buy-in** — install the action, you get receipts. Below are the use cases TAF serves today and tomorrow:
|
|
148
|
+
|
|
149
|
+
### Standalone (no FAF required)
|
|
150
|
+
|
|
151
|
+
| Use Case | What TAF gives you |
|
|
152
|
+
|---|---|
|
|
153
|
+
| **Plain JS/TS projects** | Receipt for every Jest or Vitest run, on every CI execution |
|
|
154
|
+
| **Pytest projects** | Receipt for every Python test run *(pending pytest parser — v2.2 roadmap)* |
|
|
155
|
+
| **Open source maintainers** | "This repo has 1,847 receipts going back 14 months, none missing" |
|
|
156
|
+
| **Regulated industries** (SOC 2, ISO, HIPAA) | Append-only longitudinal evidence — auditors get a tamper-evident timeline, not a snapshot |
|
|
157
|
+
| **Supply-chain trust** | "Prove these tests ran before this artifact shipped" |
|
|
158
|
+
| **AI-agent verification** | "Prove this agent's code passed tests consistently over the last 90 days" |
|
|
159
|
+
|
|
160
|
+
### With FAF (optional integration)
|
|
161
|
+
|
|
162
|
+
| Use Case | What TAF gives you |
|
|
163
|
+
|---|---|
|
|
164
|
+
| **FAF-aware projects** | Receipts include `faf_score`, `faf_associated`, `faf_location` — the receipt tells you not just *did the tests pass*, but *what was the project's AI-readiness when they ran*. Score trends over time become visible. |
|
|
165
|
+
| **Full CAR Framework** | TAF (Receipt) + WJTTC (Audit) + FAF (Claim) — closed-loop attestation: project DNA → testing audit → permanent receipt |
|
|
166
|
+
|
|
167
|
+
**FAF is one tenant among many.** TAF is the platform. The receipt printer doesn't care what kind of project prints to it.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
128
171
|
## 🚀 HOW
|
|
129
172
|
|
|
130
173
|
### Quick Start (GitHub Actions)
|
|
@@ -297,8 +340,8 @@ Options:
|
|
|
297
340
|
| Framework | Status | Notes |
|
|
298
341
|
|-----------|--------|-------|
|
|
299
342
|
| **Jest** | ✅ Fully supported | All output formats |
|
|
343
|
+
| **Vitest** | ✅ Fully supported | Including todo counts |
|
|
300
344
|
| Mocha | ⏳ Planned | - |
|
|
301
|
-
| Vitest | ⏳ Planned | - |
|
|
302
345
|
| Pytest | ⏳ Planned | - |
|
|
303
346
|
| Go test | ⏳ Planned | - |
|
|
304
347
|
| Rust cargo test | ⏳ Planned | - |
|
|
@@ -466,13 +509,27 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines.
|
|
|
466
509
|
|
|
467
510
|
## 📚 Learn More
|
|
468
511
|
|
|
469
|
-
- [FAF CLI](https://npmjs.com/package/faf-cli) - Create and manage `.faf` files
|
|
512
|
+
- [FAF CLI](https://npmjs.com/package/faf-cli) - Create and manage `.faf` files (one of TAF's use cases)
|
|
470
513
|
- [MCP Server](https://npmjs.com/package/claude-faf-mcp) - Claude MCP integration
|
|
471
514
|
- [Website](https://faf.one) - Official FAF website
|
|
472
515
|
- [GitHub Discussions](https://github.com/Wolfe-Jam/faf/discussions) - Ask questions
|
|
473
516
|
|
|
474
517
|
---
|
|
475
518
|
|
|
519
|
+
## 🛣️ Standards Roadmap
|
|
520
|
+
|
|
521
|
+
| Format | IANA Status |
|
|
522
|
+
|---|---|
|
|
523
|
+
| `application/vnd.faf+yaml` (FAF) | ✅ **Registered** |
|
|
524
|
+
| `application/vnd.fafm+yaml` (VML) | 🟡 **Under review** |
|
|
525
|
+
| `application/vnd.taf+yaml` (TAF) | ⏳ **Queued** |
|
|
526
|
+
|
|
527
|
+
`.taf` is filed entirely on its own merits — append-only test provenance, git-tracked, tamper-evident — independent of `.faf`'s registration.
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
If `faf-taf-git` has been useful, consider starring the repo — it helps others find it.
|
|
532
|
+
|
|
476
533
|
## 📄 License
|
|
477
534
|
|
|
478
535
|
MIT - FREE FOREVER
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
We provide security updates for the latest released version. For older versions, please upgrade to the current release.
|
|
6
|
+
|
|
7
|
+
## Reporting a Vulnerability
|
|
8
|
+
|
|
9
|
+
If you discover a security vulnerability, please email **security@faf.one** directly.
|
|
10
|
+
|
|
11
|
+
**Please do not open a public GitHub issue for security reports.** Responsible disclosure gives us time to fix the issue before it's widely known.
|
|
12
|
+
|
|
13
|
+
When reporting, please include:
|
|
14
|
+
- A description of the vulnerability
|
|
15
|
+
- Steps to reproduce
|
|
16
|
+
- Affected versions (if known)
|
|
17
|
+
- Any suggested fix (optional)
|
|
18
|
+
|
|
19
|
+
We aim to respond within 7 days.
|
package/action.yml
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: 'FAF TAF Action'
|
|
2
|
-
description: '
|
|
2
|
+
description: 'A Test Receipt Printer for git. Prints a Test Receipt to .taf on every CI run — append-only, cannot be gamed. Proof over time.'
|
|
3
3
|
author: 'wolfejam'
|
|
4
4
|
|
|
5
5
|
branding:
|
|
@@ -21,6 +21,11 @@ inputs:
|
|
|
21
21
|
required: false
|
|
22
22
|
default: 'chore(taf): update .taf receipt [skip ci]'
|
|
23
23
|
|
|
24
|
+
target-branch:
|
|
25
|
+
description: 'Push receipts to a dedicated branch (e.g. taf-receipts) instead of the current branch. Branch is created automatically on first run and seeded with existing .taf data.'
|
|
26
|
+
required: false
|
|
27
|
+
default: ''
|
|
28
|
+
|
|
24
29
|
outputs:
|
|
25
30
|
result:
|
|
26
31
|
description: 'Test result (PASSED, FAILED, IMPROVED, DEGRADED)'
|
package/badge.svg
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="145" height="20" role="img" aria-label="TAF: 55/55 passing">
|
|
2
|
+
<title>TAF: 55/55 passing</title>
|
|
3
|
+
<linearGradient id="s" x2="0" y2="100%">
|
|
4
|
+
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
|
|
5
|
+
<stop offset="1" stop-opacity=".1"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<clipPath id="r">
|
|
8
|
+
<rect width="145" height="20" rx="3" fill="#fff"/>
|
|
9
|
+
</clipPath>
|
|
10
|
+
<g clip-path="url(#r)">
|
|
11
|
+
<rect width="40" height="20" fill="#555"/>
|
|
12
|
+
<rect x="40" width="105" height="20" fill="#003366"/>
|
|
13
|
+
<rect width="145" height="20" fill="url(#s)"/>
|
|
14
|
+
</g>
|
|
15
|
+
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="11">
|
|
16
|
+
<text x="20" y="14" fill="#010101" fill-opacity=".3">TAF</text>
|
|
17
|
+
<text x="20" y="13" fill="#fff">TAF</text>
|
|
18
|
+
<text x="92.5" y="14" fill="#010101" fill-opacity=".3">55/55 passing</text>
|
|
19
|
+
<text x="92.5" y="13" fill="#fff">55/55 passing</text>
|
|
20
|
+
</g>
|
|
21
|
+
</svg>
|
package/dist/badge.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Badge Generator for faf-taf-git
|
|
3
|
+
*
|
|
4
|
+
* Generates shields.io-style SVG badges from .taf test history.
|
|
5
|
+
* Self-contained SVG with Verdana font, no external dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface BadgeOptions {
|
|
8
|
+
tafPath?: string;
|
|
9
|
+
label?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface BadgeResult {
|
|
12
|
+
success: boolean;
|
|
13
|
+
svg?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Render a shields.io flat-style SVG badge.
|
|
18
|
+
*/
|
|
19
|
+
export declare function renderBadgeSvg(label: string, value: string, color: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Generate a badge SVG from a .taf file.
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateBadge(options?: BadgeOptions): BadgeResult;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"","sourceRoot":"","sources":["file:///Users/wolfejam/FAF/faf-taf-git/src/badge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiClF;AAqCD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,YAAiB,GAAG,WAAW,CA6BrE"}
|