Compare commits
2 commits
0a136ea090
...
dc3609bd75
| Author | SHA1 | Date | |
|---|---|---|---|
| dc3609bd75 | |||
| 07944e3137 |
3 changed files with 494 additions and 0 deletions
74
.forgejo/ISSUE_TEMPLATE/bug_report.yml
Normal file
74
.forgejo/ISSUE_TEMPLATE/bug_report.yml
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
name: Bug Report
|
||||
description: Report something that's not working as expected.
|
||||
title: "[Bug]: "
|
||||
labels:
|
||||
- Kind/Bug
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this bug report! Please provide as much detail as possible to help us investigate.
|
||||
- type: input
|
||||
id: summary
|
||||
attributes:
|
||||
label: Brief Summary
|
||||
description: A concise, one-sentence description of the bug.
|
||||
placeholder: ex. Application crashes when saving a file with a specific character.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: steps
|
||||
attributes:
|
||||
label: Steps to Reproduce
|
||||
description: |
|
||||
What steps did you take to encounter the bug? Be specific and number each step.
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
placeholder: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: What did you expect to happen?
|
||||
placeholder: ex. The file should save successfully and a confirmation message should appear.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: actual
|
||||
attributes:
|
||||
label: Actual Behavior
|
||||
description: What actually happened? Include any error messages, logs, or crash reports.
|
||||
placeholder: ex. The application closes immediately without any error message.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: extra-context
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: |
|
||||
Add any other context about the problem here.
|
||||
This is a good place to list:
|
||||
- Your OS and version (e.g., Windows 11, Debian 12)
|
||||
- Application or package version (e.g., v2.1.0, commit SHA)
|
||||
- Screenshots or screen recordings
|
||||
- Relevant environment variables or configuration
|
||||
render: shell
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
id: checks
|
||||
attributes:
|
||||
label: Checklist
|
||||
description: Please confirm the following.
|
||||
options:
|
||||
- label: I have checked that this bug has not already been reported.
|
||||
required: true
|
||||
- label: I have provided all the requested information to the best of my ability.
|
||||
required: true
|
||||
59
.forgejo/ISSUE_TEMPLATE/feature_request.yml
Normal file
59
.forgejo/ISSUE_TEMPLATE/feature_request.yml
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
name: Feature Request
|
||||
description: Suggest a new feature or enhancement for this project.
|
||||
title: "[Feature]: "
|
||||
labels:
|
||||
- Kind/Feature
|
||||
- enhancement
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for suggesting this feature! Please provide as much detail as possible to help us understand your idea.
|
||||
- type: input
|
||||
id: feature-summary
|
||||
attributes:
|
||||
label: Feature Summary
|
||||
description: A brief one-sentence description of the proposed feature.
|
||||
placeholder: ex. Add dark mode support for the dashboard.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: Problem or Use Case
|
||||
description: What problem does this feature solve, or what use case does it address?
|
||||
placeholder: Describe the current limitation or user need...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: proposed-solution
|
||||
attributes:
|
||||
label: Proposed Solution
|
||||
description: How should this feature work? Be specific about functionality, UI, or API changes.
|
||||
placeholder: ex. Add a toggle switch in the user settings to enable dark mode.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
attributes:
|
||||
label: Alternatives Considered
|
||||
description: Are there any alternative solutions or workarounds you’ve explored?
|
||||
placeholder: ex. Using browser extensions or custom CSS.
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional Context
|
||||
description: Add any screenshots, mockups, links, or examples that illustrate your idea.
|
||||
placeholder: ex. Links to similar features in other projects.
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
id: terms
|
||||
attributes:
|
||||
label: Community Guidelines
|
||||
description: By submitting this feature request, you agree to follow our project’s Code of Conduct.
|
||||
options:
|
||||
- label: I agree to follow this project’s Code of Conduct and contribution guidelines.
|
||||
required: true
|
||||
361
docs/workspace-restructuring-plan.md
Normal file
361
docs/workspace-restructuring-plan.md
Normal file
|
|
@ -0,0 +1,361 @@
|
|||
# Workspace Restructuring Plan
|
||||
|
||||
## Overview
|
||||
|
||||
This document outlines the plan to restructure the Sharenet Passport project into a Cargo workspace with a library crate (`sharenet-passport`) and a CLI wrapper crate (`sharenet-passport-cli`). The goal is to enable reuse of the core passport functionality in multiple contexts (CLI, web/WASM, embedded) while maintaining Clean Architecture principles.
|
||||
|
||||
## Target Architecture
|
||||
|
||||
### Workspace Structure
|
||||
|
||||
```
|
||||
sharenet-passport-creator/
|
||||
├── Cargo.toml # Workspace manifest
|
||||
├── sharenet-passport/ # Library crate (core functionality)
|
||||
│ ├── Cargo.toml
|
||||
│ └── src/
|
||||
│ ├── lib.rs
|
||||
│ ├── domain/
|
||||
│ ├── application/
|
||||
│ └── infrastructure/
|
||||
├── sharenet-passport-cli/ # CLI crate (command-line interface)
|
||||
│ ├── Cargo.toml
|
||||
│ └── src/
|
||||
│ ├── main.rs
|
||||
│ ├── cli/
|
||||
│ └── interface/
|
||||
└── docs/
|
||||
```
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### 1. Workspace Configuration
|
||||
|
||||
**Root `Cargo.toml`:**
|
||||
```toml
|
||||
[workspace]
|
||||
members = ["sharenet-passport", "sharenet-passport-cli"]
|
||||
resolver = "2"
|
||||
|
||||
[workspace.dependencies]
|
||||
# Common dependencies shared across workspace members
|
||||
bip39 = "2.1"
|
||||
ed25519-dalek = { version = "2.1", features = ["serde"] }
|
||||
chacha20poly1305 = "0.10"
|
||||
hkdf = "0.12"
|
||||
sha2 = "0.10"
|
||||
rand = "0.8"
|
||||
rand_core = "0.6"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_cbor = "0.11"
|
||||
thiserror = "1.0"
|
||||
zeroize = { version = "1.7", features = ["zeroize_derive"] }
|
||||
hex = "0.4"
|
||||
```
|
||||
|
||||
### 2. Library Crate (`sharenet-passport`)
|
||||
|
||||
**Purpose**: Core passport creation, management, and verification functionality
|
||||
|
||||
**`sharenet-passport/Cargo.toml`:**
|
||||
```toml
|
||||
[package]
|
||||
name = "sharenet-passport"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Core library for Sharenet Passport creation and management"
|
||||
authors = ["Your Name <your.email@example.com>"]
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://git.sharenet.sh/your-org/sharenet-passport"
|
||||
|
||||
[dependencies]
|
||||
# Inherit from workspace dependencies
|
||||
bip39.workspace = true
|
||||
ed25519-dalek.workspace = true
|
||||
chacha20poly1305.workspace = true
|
||||
hkdf.workspace = true
|
||||
sha2.workspace = true
|
||||
rand.workspace = true
|
||||
rand_core.workspace = true
|
||||
serde.workspace = true
|
||||
serde_cbor.workspace = true
|
||||
thiserror.workspace = true
|
||||
zeroize.workspace = true
|
||||
hex.workspace = true
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib", "rlib"] # Support both native and WASM
|
||||
|
||||
[features]
|
||||
default = ["std"]
|
||||
std = [] # Standard library support
|
||||
alloc = [] # No-std with alloc support
|
||||
wasm = ["alloc"] # WASM target support
|
||||
|
||||
[publish]
|
||||
registry = "sharenet"
|
||||
```
|
||||
|
||||
### 3. CLI Crate (`sharenet-passport-cli`)
|
||||
|
||||
**Purpose**: Command-line interface wrapper around the library
|
||||
|
||||
**`sharenet-passport-cli/Cargo.toml`:**
|
||||
```toml
|
||||
[package]
|
||||
name = "sharenet-passport-cli"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "CLI interface for Sharenet Passport"
|
||||
authors = ["Your Name <your.email@example.com>"]
|
||||
|
||||
[dependencies]
|
||||
sharenet-passport = { path = "../sharenet-passport" }
|
||||
clap = { version = "4.4", features = ["derive"] }
|
||||
rpassword = "7.2"
|
||||
|
||||
[dev-dependencies]
|
||||
assert_matches = "1.5"
|
||||
tempfile = "3.8"
|
||||
```
|
||||
|
||||
## Clean Architecture Preservation
|
||||
|
||||
### Domain Layer (Pure Business Logic)
|
||||
|
||||
**Location**: `sharenet-passport/src/domain/`
|
||||
|
||||
**Characteristics**:
|
||||
- Pure Rust, no external dependencies
|
||||
- No I/O operations
|
||||
- WASM-compatible
|
||||
- Contains entities, traits, and domain errors
|
||||
|
||||
**Key Files**:
|
||||
- `entities.rs` - Core data structures (Passport, RecoveryPhrase, etc.)
|
||||
- `traits.rs` - Abstract interfaces (MnemonicGenerator, KeyDeriver, etc.)
|
||||
- `error.rs` - Domain-specific errors
|
||||
|
||||
### Application Layer (Use Cases)
|
||||
|
||||
**Location**: `sharenet-passport/src/application/`
|
||||
|
||||
**Characteristics**:
|
||||
- Generic over infrastructure traits
|
||||
- Orchestrates domain and infrastructure
|
||||
- No concrete implementations
|
||||
- Dependency injection via traits
|
||||
|
||||
**Key Files**:
|
||||
- `use_cases.rs` - Business use cases (CreatePassport, Import, Export, etc.)
|
||||
- `error.rs` - Application-specific errors
|
||||
|
||||
### Infrastructure Layer (Platform Implementations)
|
||||
|
||||
**Location**: `sharenet-passport/src/infrastructure/`
|
||||
|
||||
**Characteristics**:
|
||||
- Concrete implementations of domain traits
|
||||
- Platform-specific code
|
||||
- Optional features via conditional compilation
|
||||
- Separate modules for different concerns
|
||||
|
||||
**Key Files**:
|
||||
- `crypto.rs` - Cryptographic implementations
|
||||
- `storage.rs` - File system operations
|
||||
|
||||
## Code Organization
|
||||
|
||||
### Library Public API (`sharenet-passport/src/lib.rs`)
|
||||
|
||||
```rust
|
||||
// Re-export public API
|
||||
pub mod domain;
|
||||
pub mod application;
|
||||
pub mod infrastructure;
|
||||
|
||||
// Public API surface
|
||||
pub use domain::entities::{Passport, RecoveryPhrase, PassportFile};
|
||||
pub use domain::traits::{MnemonicGenerator, KeyDeriver, FileEncryptor, FileStorage};
|
||||
pub use application::use_cases::{
|
||||
CreatePassportUseCase,
|
||||
ImportFromRecoveryUseCase,
|
||||
ImportFromFileUseCase,
|
||||
ExportPassportUseCase,
|
||||
SignCardUseCase
|
||||
};
|
||||
pub use infrastructure::{
|
||||
Bip39MnemonicGenerator,
|
||||
Ed25519KeyDeriver,
|
||||
XChaCha20FileEncryptor,
|
||||
FileSystemStorage
|
||||
};
|
||||
```
|
||||
|
||||
### CLI Entry Point (`sharenet-passport-cli/src/main.rs`)
|
||||
|
||||
```rust
|
||||
use sharenet_passport::{
|
||||
application::use_cases::*,
|
||||
infrastructure::*,
|
||||
domain::entities::*
|
||||
};
|
||||
|
||||
// CLI-specific code remains here
|
||||
mod cli;
|
||||
mod interface;
|
||||
|
||||
use clap::Parser;
|
||||
use crate::cli::commands::{Cli, Commands};
|
||||
use crate::cli::interface::CliInterface;
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let cli = Cli::parse();
|
||||
let interface = CliInterface::new();
|
||||
|
||||
// CLI command handling
|
||||
match cli.command {
|
||||
Commands::Create { output } => {
|
||||
interface.handle_create(&output)?;
|
||||
}
|
||||
// ... other commands
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
## Feature Flags Strategy
|
||||
|
||||
### Library Features
|
||||
|
||||
- **`std`** (default): Standard library features including file I/O
|
||||
- **`alloc`**: No-std with allocator support for embedded systems
|
||||
- **`wasm`**: WASM-specific optimizations and bindings
|
||||
|
||||
### Usage Examples
|
||||
|
||||
**For Web/WASM Applications:**
|
||||
```toml
|
||||
sharenet-passport = { version = "0.1", default-features = false, features = ["wasm"] }
|
||||
```
|
||||
|
||||
**For Embedded Systems:**
|
||||
```toml
|
||||
sharenet-passport = { version = "0.1", default-features = false, features = ["alloc"] }
|
||||
```
|
||||
|
||||
**For CLI Applications:**
|
||||
```toml
|
||||
sharenet-passport = { version = "0.1" } # Uses default std features
|
||||
```
|
||||
|
||||
## Private Registry Configuration
|
||||
|
||||
### Cargo Configuration
|
||||
|
||||
Add to `~/.cargo/config.toml`:
|
||||
```toml
|
||||
[registries.sharenet]
|
||||
index = "https://git.sharenet.sh/api/v1/crates/{crate}/index"
|
||||
```
|
||||
|
||||
### Publishing
|
||||
|
||||
```bash
|
||||
cd sharenet-passport
|
||||
cargo publish --registry sharenet
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
### 1. Reusability
|
||||
- **CLI**: Full command-line interface
|
||||
- **Web/WASM**: Browser-based passport management
|
||||
- **Embedded**: Resource-constrained environments
|
||||
- **Mobile**: Native mobile applications
|
||||
|
||||
### 2. Maintainability
|
||||
- Clear separation of concerns
|
||||
- Independent versioning of library vs CLI
|
||||
- Shared dependency management
|
||||
- Easier testing and mocking
|
||||
|
||||
### 3. Deployment Flexibility
|
||||
- Library can be published to private registry
|
||||
- CLI can be distributed as standalone binary
|
||||
- Web components can be compiled to WASM
|
||||
- Embedded systems can use minimal features
|
||||
|
||||
### 4. Development Workflow
|
||||
- Shared code changes affect all consumers
|
||||
- Independent development of CLI features
|
||||
- Parallel testing of different components
|
||||
- Clear API boundaries
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Web Application Usage
|
||||
|
||||
```rust
|
||||
use sharenet_passport::{
|
||||
domain::entities::Passport,
|
||||
application::use_cases::CreatePassportUseCase,
|
||||
infrastructure::{Bip39MnemonicGenerator, Ed25519KeyDeriver}
|
||||
};
|
||||
|
||||
// Web-specific infrastructure implementations
|
||||
struct WebFileEncryptor;
|
||||
struct WebStorage;
|
||||
|
||||
impl FileEncryptor for WebFileEncryptor { /* ... */ }
|
||||
impl FileStorage for WebStorage { /* ... */ }
|
||||
|
||||
let use_case = CreatePassportUseCase::new(
|
||||
Bip39MnemonicGenerator,
|
||||
Ed25519KeyDeriver,
|
||||
WebFileEncryptor,
|
||||
WebStorage,
|
||||
);
|
||||
```
|
||||
|
||||
### CLI Usage (Unchanged)
|
||||
|
||||
```bash
|
||||
# Existing CLI commands continue to work
|
||||
sharenet-passport-cli create --output my-passport.spf
|
||||
sharenet-passport-cli import-recovery --output restored.spf
|
||||
sharenet-passport-cli info --file passport.spf
|
||||
```
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
### Library Tests
|
||||
- Unit tests for domain logic
|
||||
- Integration tests for use cases
|
||||
- WASM tests using `wasm-bindgen-test`
|
||||
- Feature-flag specific tests
|
||||
|
||||
### CLI Tests
|
||||
- End-to-end command tests
|
||||
- File system integration tests
|
||||
- Cross-platform compatibility tests
|
||||
- User interaction tests
|
||||
|
||||
## Migration Considerations
|
||||
|
||||
### Backward Compatibility
|
||||
- Existing CLI commands remain unchanged
|
||||
- File formats remain compatible
|
||||
- API surface remains stable
|
||||
- Documentation updates minimal
|
||||
|
||||
### Development Impact
|
||||
- Shared workspace dependencies
|
||||
- Unified build process
|
||||
- Consistent testing approach
|
||||
- Clear separation of library vs CLI concerns
|
||||
|
||||
---
|
||||
|
||||
This restructuring enables the Sharenet Passport core functionality to be reused across multiple platforms while maintaining the Clean Architecture principles and enabling private registry publishing to git.sharenet.sh.
|
||||
Loading…
Add table
Reference in a new issue