{"id":35668935,"url":"https://github.com/interaction-dynamics/features","last_synced_at":"2026-02-18T17:03:41.375Z","repository":{"id":318650153,"uuid":"1072173345","full_name":"interaction-dynamics/features","owner":"interaction-dynamics","description":"The CLI to explore the features in your code and improve their ownership","archived":false,"fork":false,"pushed_at":"2026-01-22T12:38:33.000Z","size":740,"stargazers_count":6,"open_issues_count":16,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-23T04:58:55.501Z","etag":null,"topics":["features","rust"],"latest_commit_sha":null,"homepage":"http://interaction-dynamics.io/features/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/interaction-dynamics.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"friedrith","thanks_dev":null,"custom":null}},"created_at":"2025-10-08T11:06:22.000Z","updated_at":"2026-01-22T12:21:36.000Z","dependencies_parsed_at":"2025-10-08T13:16:26.006Z","dependency_job_id":"ac24b366-ef09-46df-a240-3b6e98f732ab","html_url":"https://github.com/interaction-dynamics/features","commit_stats":null,"previous_names":["interaction-dynamics/features"],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/interaction-dynamics/features","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaction-dynamics%2Ffeatures","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaction-dynamics%2Ffeatures/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaction-dynamics%2Ffeatures/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaction-dynamics%2Ffeatures/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/interaction-dynamics","download_url":"https://codeload.github.com/interaction-dynamics/features/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/interaction-dynamics%2Ffeatures/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29587066,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-18T16:55:40.614Z","status":"ssl_error","status_checked_at":"2026-02-18T16:55:37.558Z","response_time":162,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["features","rust"],"created_at":"2026-01-05T18:15:34.469Z","updated_at":"2026-02-18T17:03:41.367Z","avatar_url":"https://github.com/interaction-dynamics.png","language":"TypeScript","readme":"\u003cdiv align=\"center\"\u003e\n    \u003cimg width=\"100\" src=\"./tools/web/public/feature-icon.svg\" alt=\"feature logo\" /\u003e\n\u003c/div\u003e\n\u003ch1 align=\"center\"\u003eFeatures\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://crates.io/crates/features-cli\"\u003e\u003cimg src=\"https://img.shields.io/crates/v/features-cli.svg\" alt=\"Crates.io version\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.npmjs.com/package/features-cli\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/features-cli.svg\" alt=\"Npm version\" /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n`Features` is a Rust-based Web and CLI tool to explore the features in your projects, visualize their metrics and understand the ownership of each of these features.\n\nIt is technology agnostic and can be used with any programming language or framework.\n\nYou can: \n\n- list all the features in a project\n- find the team 'owning' a specific feature\n- get the history of a feature (git log)\n- find the documentation related to the feature\n- list the test coverage by feature\n- check [the technical debt by feature](./FAQ.md#what-is-the-technical-debt-of-a-feature)\n- see statistics about the features like the repartition of feature, fix and refactor commits, lines of code, and files\n- generate CODEOWNERS file\n- list the feature flags and other feature dependencies\n\n\u003e If you see an other use case, feel free to contribute to this repository.\n\nIt also provides a UI to explore the feature. Check a live [demo](http://interaction-dynamics.io/features/).\n\n\u003ca href=\"http://interaction-dynamics.io/features\"\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/e5e76d65-53a2-4469-9736-76daec884839\" width=\"100%\" alt=\"screenshot\" /\u003e\n\u003c/a\u003e\n\n`features-cli` provides a Web Dashboard and also a CLI to generate json reports.\n    \n## Getting started \n\n```bash\nnpx features-cli@latest /path/to/project --project-dir ./repository --serve\n\n# or with installation\nnpm install -g features-cli\n# or\ncargo binstall features-cli\n# then \nfeatures /path/to/project --project-dir ./repository --serve\n```\n\nCommands and their descriptions are listed below:\n\n| Command | Description |\n| ------- | ----------- |\n| `--json` | Output features as JSON |\n| `--flat` | Output features as a flat array instead of nested structure |\n| `--description` | Include feature descriptions in the output (automatically enabled for `--serve`, `--build`, and `--json`) |\n| `--coverage` | Include coverage information in the output (automatically enabled for `--serve`, `--build`, and `--json`) |\n| `--list-owners` | Display only unique list of owners |\n| `--find-owner \u003cpath\u003e` | Find the owner of a specific file or folder |\n| `--check` | Run validation checks on features (e.g., duplicate names) |\n| `--skip-changes` | Skip computing git commit history (faster for large repos) |\n| `--serve` | Start an HTTP server to serve features and the web dashboard UI |\n| `--port \u003cport\u003e` | Change the port (default: 3000). Should be used with `--serve` |\n| `--build` | Build a static version of the web dashboard UI |\n| `--build-dir \u003cpath\u003e` | Output directory for the static build (default: `build`) |\n| `--coverage-dir \u003cpath\u003e` | Specify a custom coverage directory (overrides automatic search) |\n| `--generate-codeowners` | Generate or update a CODEOWNERS file with feature ownership information |\n| `--project-dir \u003cpath\u003e` | Project directory for CODEOWNERS generation and additional coverage search locations |\n| `--codeowners-path \u003cpath\u003e` | Custom path and filename for CODEOWNERS file (default: `CODEOWNERS` in project directory) |\n| `--codeowners-prefix \u003cprefix\u003e` | Custom prefix for owner names in CODEOWNERS file (default: `@`) |\n\n## Guidelines\n\nBy following specific guidelines and conventions, it becomes easier for `features` to find your feature:\n\n### Folder structure\n\nFeatures can be organized in two ways:\n\n#### Method 1: Features folder (recommended)\n\nPlace your features folder in a dedicated `features` folder:\n\n```bash\nsrc/\n├── features\n│   ├── saveUser\n│   │   ├── components/\n│   │   │   ├── UserForm.ts\n│   │   │   └── EmailInput.ts\n│   │   ├── utils/\n│   │   │   ├── useSaveUser.ts\n│   │   │   ├── useFetchUser.ts\n│   │   │   └── transformUser.ts\n│   │   └── README.md # a README.md file for large features helps\n│   └── feature-2\n│       └── ... # ...\n├── components # common components used across features\n├── utils # common utils/hooks used across features\n└── ... # other source code\n```\n\n\u003e You can read the detailed [guidelines](./docs/folder-architecture-guidelines.md) or just jump into trying the CLI with the `--serve` options. The UI will guide you through the methodology.\n\n#### Method 2: Feature flag\nMark any folder as a feature by adding `feature: true` in its README frontmatter:\n\n```yaml\n---\nfeature: true\nowner: backend-team\n---\n```\n\nThis allows features to be organized anywhere in your codebase while still being discoverable by the tools.\n\n### Feature Metadata Annotations\n\nYou can annotate your code with feature metadata using special comments. These annotations can be placed **anywhere in your codebase** and will be automatically associated with the matching feature:\n\n```typescript\n// --feature-flag feature: feature-1, name: feature-flag1, type: experiment, owner: team-a, introduced_on: 2025-01-01\n\nexport function experimentalLoginFlow() {\n  // implementation\n}\n```\n\nThe syntax is: `--feature-\u003cmetadata-key\u003e feature:\u003cfeature-folder-basename\u003e, property: value, ...`\n\n- **`feature:`** property is optional if the comment is inside a feature folder - it will automatically link to that feature\n- **`\u003cmetadata-key\u003e`** becomes a tab in the web UI (e.g., `flag`, `experiment`)\n- Properties are flexible - add any key-value pairs you need\n\nThis works in any programming language:\n\n```python\n# --feature-flag name: feature-flag1, type: processing, language: python\n```\n\n```rust\n// --feature-flag name: feature-flag1, type: core, status: stable\n```\n\n```bash\n# --feature-flag name: feature-flag1, environment: production, region: us-west-2\n```\n\n## Supported Programming Languages\n\nThe tool supports feature metadata annotations in the following programming languages: Rust, C/C++, Java, JavaScript/TypeScript, Go, C#, Swift, Kotlin, Scala, CSS/SCSS/Less, Python, Bash/Shell, Ruby, Perl, YAML, TOML, SQL, Lua, HTML/XML/SVG.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.\n\n## Contributing\n\nWe welcome contributions to this project! If you have any ideas or suggestions, please feel free to open an issue or submit a pull request.\n\n## Roadmap\n\nCheck [here](https://github.com/orgs/interaction-dynamics/projects/18/views/4).\n\n## Bibliography about features-based architecture\n\n\u003e Feature based architecture shouldn't be confused with feature-based design.\n\n- [FAQ](./FAQ.md)\n- [Scalable React Projects with Feature-Based Architecture](https://dev.to/naserrasouli/scalable-react-projects-with-feature-based-architecture-117c)\n- [Reddit discussion about feature-based architecture](https://www.reddit.com/r/reactjs/comments/1afywy4/codebase_examples_of_featuredriven_or_vertical/)\n- [Why I Recommend a Feature-Driven Approach to Software Design](https://khalilstemmler.com/articles/software-design-architecture/feature-driven/): global vision of feature oriented development\n- [Bullet-proof react folder architecture](https://github.com/alan2207/bulletproof-react/blob/master/docs/project-structure.md)\n","funding_links":["https://buymeacoffee.com/friedrith"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finteraction-dynamics%2Ffeatures","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finteraction-dynamics%2Ffeatures","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finteraction-dynamics%2Ffeatures/lists"}