diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..2425bb6
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,2 @@
+# Two members of the Forest team are automatically (and randomly) assigned to review all PRs.
+* @ChainSafe/Forest
diff --git a/.github/ISSUE_TEMPLATE/1-bug_report.md b/.github/ISSUE_TEMPLATE/1-bug_report.md
new file mode 100644
index 0000000..c85e330
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-bug_report.md
@@ -0,0 +1,50 @@
+---
+name: Bug report
+about: Provide a report of unexpected behaviour
+title: ""
+labels: "Type: Bug"
+assignees: ""
+---
+
+## Describe the bug
+
+
+
+## To reproduce
+
+
+
+1. Go to '...'
+2. Run '....'
+3. See error
+
+## Log output
+
+
+
+ Log Output
+
+ ```Paste log output here
+ paste log output...
+ ```
+
+
+## Expected behaviour
+
+
+
+## Screenshots
+
+
+
+## Environment (please complete the following information):
+
+- OS:
+- Branch/commit
+- Hardware
+
+## Other information and links
+
+
+
+
diff --git a/.github/ISSUE_TEMPLATE/2-user_request.md b/.github/ISSUE_TEMPLATE/2-user_request.md
new file mode 100644
index 0000000..adcb7b2
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-user_request.md
@@ -0,0 +1,19 @@
+---
+name: User Request
+about: Request a feature or change
+title: ""
+labels: "Type: Request"
+assignees: ""
+---
+
+# Summary
+
+
+
+# Requirements
+
+
+
+# Motivation
+
+
diff --git a/.github/ISSUE_TEMPLATE/3-epic.md b/.github/ISSUE_TEMPLATE/3-epic.md
new file mode 100644
index 0000000..a4c636c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/3-epic.md
@@ -0,0 +1,30 @@
+---
+name: Epic
+about: "[Internal] Larger chunk of work that can be broken down into smaller tasks"
+title: ""
+labels: "Type: Epic"
+assignees: ""
+---
+
+# Summary
+
+
+
+# Motivation
+
+
+
+# Tasks
+
+
+
+
+- [ ]
+
+# Risks & Dependencies
+
+
+
+# Additional Links & Resources
+
+
diff --git a/.github/ISSUE_TEMPLATE/4-task.md b/.github/ISSUE_TEMPLATE/4-task.md
new file mode 100644
index 0000000..8a13f38
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/4-task.md
@@ -0,0 +1,21 @@
+---
+name: Task
+about: "[Internal] A specific, actionable unit of work"
+title: ""
+labels: "Type: Task"
+assignees: ""
+---
+
+# Summary
+
+
+
+# Completion Criteria
+
+
+
+- [ ]
+
+# Additional Links & Resources
+
+
diff --git a/.github/ISSUE_TEMPLATE/5-other.md b/.github/ISSUE_TEMPLATE/5-other.md
new file mode 100644
index 0000000..1498a0a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/5-other.md
@@ -0,0 +1,22 @@
+---
+name: Other
+about: Use wisely 🧐
+title: ""
+labels: ""
+assignees: ""
+---
+
+
+
+This issue is NOT:
+
+- [ ] A bug
+- [ ] A user-request
+- [ ] An epic
+- [ ] A task
+
+Please check the other issue types if any of these categories apply.
+
+---
+
+
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..8220a21
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,11 @@
+blank_issues_enabled: true
+contact_links:
+ - name: "Filecoin Slack (#fil-forest-help or #fil-forest-dev)"
+ url: https://join.slack.com/t/filecoinproject/shared_invite/enQtNTUwNTI1Mzk5MDYwLTY4YmFjMzRlZjFiNDc0NmI2N2JjMjk5YTAyMDUyODljODg3MGI0ZGRhZTI5ZDNkZTAyNjkyMzI1ODM1YjA1MWI
+ about: Please ask questions here.
+ - name: General Filecoin Discussion Forum
+ url: https://github.com/filecoin-project/community/discussions
+ about: Please ask any general Filecoin questions here.
+ - name: Forest Discussion Forum
+ url: https://github.com/ChainSafe/forest/discussions
+ about: Please ask Forest specific questions here.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..202c925
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,30 @@
+## Summary of changes
+
+
+
+Changes introduced in this pull request:
+
+-
+
+## Reference issue to close (if applicable)
+
+
+
+
+
+Closes
+
+## Other information and links
+
+
+
+## Change checklist
+
+
+
+
+- [ ] I have performed a self-review of my own code,
+- [ ] I have made corresponding changes to the documentation. All new code adheres to the team's [documentation standards](https://github.com/ChainSafe/forest/wiki/Documentation-practices),
+- [ ] I have added tests that prove my fix is effective or that my feature works (if possible),
+
+
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..888fe1a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,16 @@
+# Please see the documentation for all configuration options:
+# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: "cargo"
+ directory: "/" # Location of package manifests
+ open-pull-requests-limit: 1
+ schedule:
+ interval: "weekly"
+ # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot#enabling-dependabot-version-updates-for-actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ open-pull-requests-limit: 1
+ schedule:
+ interval: "weekly"
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 0000000..a7584d4
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,36 @@
+name: Docs
+
+# Cancel workflow if there is a new change to the branch.
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - '**.md'
+ - '.github/workflows/docs.yml'
+ merge_group:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - '**.md'
+ - '.github/workflows/docs.yml'
+
+jobs:
+ check-docs:
+ name: Markdown Lint
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v4
+ - name: Lint Markdown
+ run: make md-check
+ - name: Link check
+ uses: lycheeverse/lychee-action@v1.10.0
+ with:
+ args: '*.md .github/*.md .github/**/*.md .config/*.md'
+ # Fail action on broken links
+ fail: true
diff --git a/.gitignore b/.gitignore
index 226ef17..6d6cdff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,392 @@
+# Created by https://www.toptal.com/developers/gitignore/api/go,rust,rust-analyzer,osx,visualstudiocode,intellij+all,yarn,node,ruby
+# Edit at https://www.toptal.com/developers/gitignore?templates=go,rust,rust-analyzer,osx,visualstudiocode,intellij+all,yarn,node,ruby
+
+### Go ###
+# If you prefer the allow list template instead of the deny list, see community template:
+# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
+#
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, built with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
+
+# Dependency directories (remove the comment below to include it)
+vendor/
+
+# Go workspace file
+go.work
+
+### Intellij+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### Intellij+all Patch ###
+# Ignore everything but code style settings and run configurations
+# that are supposed to be shared within teams.
+
+.idea/*
+
+!.idea/codeStyles
+!.idea/runConfigurations
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+.pnpm-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional stylelint cache
+.stylelintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variable files
+.env
+.env.development.local
+.env.test.local
+.env.production.local
+.env.local
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# vuepress v2.x temp and cache directory
+.temp
+
+# Docusaurus cache and generated files
+.docusaurus
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
+### Node Patch ###
+# Serverless Webpack directories
+.webpack/
+
+# Optional stylelint cache
+
+# SvelteKit build / generate output
+.svelte-kit
+
+### OSX ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### Ruby ###
+*.gem
+*.rbc
+/.config
+/coverage/
+/InstalledFiles
+/pkg/
+/spec/reports/
+/spec/examples.txt
+/test/tmp/
+/test/version_tmp/
+/tmp/
+
+# Used by dotenv library to load environment variables.
+# .env
+
+# Ignore Byebug command history file.
+.byebug_history
+
+## Specific to RubyMotion (use of CocoaPods):
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+# vendor/Pods/
+
+## Documentation cache and generated files:
+/.yardoc/
+/_yardoc/
+/doc/
+/rdoc/
+
+## Environment normalization:
+/.bundle/
+/vendor/bundle
+/lib/bundler/man/
+
+# for a library or gem, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# Gemfile.lock
+# .ruby-version
+# .ruby-gemset
+
+# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
+.rvmrc
+
+# Used by RuboCop. Remote config files pulled in from inherit_from directive.
+# .rubocop-https?--*
+
+### Rust ###
+# Generated by Cargo
+# will have compiled files and executables
+debug/
+target/
+
+# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
+# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
+# Cargo.lock
+
+# These are backup files generated by rustfmt
+**/*.rs.bk
+
+# MSVC Windows builds of rustc generate these, which store debugging information
+*.pdb
+
+### rust-analyzer ###
+# Can be generated by other build systems other than cargo (ex: bazelbuild/rust_rules)
+rust-project.json
+
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+### yarn ###
+# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
+
+.yarn/*
+!.yarn/releases
+!.yarn/patches
+!.yarn/plugins
+!.yarn/sdks
+!.yarn/versions
+
+# if you are NOT using Zero-installs, then:
+# comment the following lines
+!.yarn/cache
+
+# and uncomment the following lines
+# .pnp.*
+
+# End of https://www.toptal.com/developers/gitignore/api/go,rust,rust-analyzer,osx,visualstudiocode,intellij+all,yarn,node,ruby
+
*.ignoreme
*.ipynb
-target/
-.DS_STORE
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..e96080a
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,2 @@
+# The API documentation is autogenerated and might not adhere to all prettify whims
+API.md
diff --git a/Makefile b/Makefile
index d2567c5..5404633 100644
--- a/Makefile
+++ b/Makefile
@@ -17,4 +17,10 @@ test:
cargo test
check:
- cargo check
\ No newline at end of file
+ cargo check
+
+md-fmt:
+ corepack enable && yarn && yarn md-fmt
+
+md-check:
+ corepack enable && yarn && yarn md-check
diff --git a/README.md b/README.md
index ddbbb6c..2729bd8 100644
--- a/README.md
+++ b/README.md
@@ -14,35 +14,42 @@ You may [browse the spec on the OpenRPC playground](https://playground.open-rpc.
This repo also contains tooling for creating, interacting with,
and testing against the schema.
-- [`cna-tool`](src/tool/README.md)
-- [`cna-test-suite`](src/test-suite/README.md)
-- [`cna-util`](src/test-suite/README.md)
+- [`cna-tool`](src/tool/API.md)
+- [`cna-test-suite`](src/test-suite/API.md)
+- [`cna-util`](src/util)
## Setup
+
To get started, you should [install rust](https://www.rust-lang.org/tools/install).
You can compile the utilities with:
+
```
make build
```
Or, install them with:
+
```
make install
```
+
## Example Commands
List the available tests
+
```console
$ cna-test-suite list
```
Capture JSON-RPC calls
+
```console
$ cna-tool json-rpc capture --help
```
Validate the spec, and perhaps captured calls
+
```console
$ cna-tool openrpc validate --help
-```
\ No newline at end of file
+```
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..2eecc62
--- /dev/null
+++ b/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "root",
+ "private": true,
+ "devDependencies": {
+ "prettier": "^3.3.3"
+ },
+ "scripts": {
+ "prettier-version": "prettier --version",
+ "md-fmt": "prettier --write '**/*.md'",
+ "md-check": "prettier --check '**/*.md'"
+ },
+ "packageManager": "yarn@4.5.0"
+}
diff --git a/src/test-suite/README.md b/src/test-suite/API.md
similarity index 100%
rename from src/test-suite/README.md
rename to src/test-suite/API.md
diff --git a/src/test-suite/src/main.rs b/src/test-suite/src/main.rs
index 017b9b7..b0d343a 100644
--- a/src/test-suite/src/main.rs
+++ b/src/test-suite/src/main.rs
@@ -744,7 +744,7 @@ mod harness {
#[test]
fn doc() {
- expect_test::expect_file!["../README.md"].assert_eq(&cna_util::markdown(
+ expect_test::expect_file!["../API.md"].assert_eq(&cna_util::markdown(
&::command(),
));
}
diff --git a/src/tool/README.md b/src/tool/API.md
similarity index 100%
rename from src/tool/README.md
rename to src/tool/API.md
diff --git a/src/tool/src/main.rs b/src/tool/src/main.rs
index 96ce775..a7672fd 100644
--- a/src/tool/src/main.rs
+++ b/src/tool/src/main.rs
@@ -683,7 +683,7 @@ impl FromStr for Header {
#[test]
fn doc() {
- expect_test::expect_file!["../README.md"].assert_eq(&cna_util::markdown(
+ expect_test::expect_file!["../API.md"].assert_eq(&cna_util::markdown(
&::command(),
));
}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..920ccee
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,23 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 8
+ cacheKey: 10c0
+
+"prettier@npm:^3.3.3":
+ version: 3.3.3
+ resolution: "prettier@npm:3.3.3"
+ bin:
+ prettier: bin/prettier.cjs
+ checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26
+ languageName: node
+ linkType: hard
+
+"root@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "root@workspace:."
+ dependencies:
+ prettier: "npm:^3.3.3"
+ languageName: unknown
+ linkType: soft