PHPackages                             amryami/assessments - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. amryami/assessments

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

amryami/assessments
===================

Reusable Assessments (Question Bank &amp; Exams) package for Laravel projects.

v1.0.0(6mo ago)05MITPHPPHP ^8.2

Since Nov 19Pushed 5mo agoCompare

[ Source](https://github.com/AmrYami/assessments)[ Packagist](https://packagist.org/packages/amryami/assessments)[ RSS](/packages/amryami-assessments/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (4)Versions (4)Used By (0)

Amryami Assessments Package
===========================

[](#amryami-assessments-package)

[![CI](https://github.com/Amryami/assessments/actions/workflows/assessments-ci.yml/badge.svg)](https://github.com/Amryami/assessments/actions/workflows/assessments-ci.yml)[![PHP](https://camo.githubusercontent.com/b155d1fbfe7022677ed4dac5b73cf38ed7a068a12e20c5d58dacb684e872a428/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e332532422d3737376262333f6c6f676f3d706870)](https://www.php.net/)[![License](https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667)](LICENSE)

Reusable Assessments (question bank + exams) module packaged for Laravel 12 projects.

Requirements
------------

[](#requirements)

- PHP 8.2+
- Laravel 12.x
- `spatie/laravel-package-tools` (pulled in automatically)

Installation
------------

[](#installation)

### Packagist / Composer (recommended)

[](#packagist--composer-recommended)

1. Require the package in your Laravel application: ```
    composer require Amryami/assessments:^1.0.0-beta
    ```
2. Publish the configuration file so you can point the package to your Category &amp; User models, guards, and route prefixes: ```
    php artisan vendor:publish --tag=assessments-config
    ```
3. Run the package migrations (automatically loaded once the service provider boots): ```
    php artisan migrate
    ```
4. Seed the default permissions / demo data if desired: ```
    php artisan db:seed --class="Amryami\\Assessments\\Database\\Seeders\\AssessmentsPermissionSeeder"
    ```

Routes, views, migrations, and config are auto-registered by the service provider. No manual service provider registration is required in Laravel 10+ thanks to package auto-discovery.

### Monorepo / path repository development

[](#monorepo--path-repository-development)

When hacking inside this monorepo you can keep using a local path repository so the host application picks up changes instantly:

```
// composer.json (host application)
"repositories": [
    {
        "type": "path",
        "url": "packages/assessments",
        "options": { "symlink": true }
    }
]
```

Then require the dev build:

```
composer require Amryami/assessments:@dev --dev
```

This path workflow mirrors how GitHub Actions runs the package testbench and is handy before tagging a release for Packagist.

Artisan Commands
----------------

[](#artisan-commands)

CommandPurpose`assessments:backfill-schema-hash`Computes `schema_hash` for questions/exams in batches.`assessments:finalize-expired`Auto-submits and grades expired in-progress attempts.`assessments:rebuild-answer-usage`Rebuilds aggregate usage metrics for answers/answer sets.`assessments:reports`Generates per-exam reporting snapshots (table/CSV/JSON, optional filters).Configuration Highlights
------------------------

[](#configuration-highlights)

- `assessments.enabled` / `assessments.admin_only` toggle the module surface.
- `assessments.activation.*` controls the one-time exam activation link (public prefix, middleware stack, token length/expiry, and default redirect route).
- `assessments.models.category` / `assessments.models.user` (or env `ASSESSMENTS_MODEL_CATEGORY/USER`) must be set to the host app's Eloquent classes if the defaults cannot be auto-discovered by `Amryami\Assessments\Support\ModelResolver`.
- `assessments.middleware.*` controls the guard/middleware stack for admin / candidate web + API surfaces.
- `assessments.routes.*` adjusts path + name prefixes for dashboard and candidate endpoints so they can live under an existing `/dashboard` or `/api` namespace.
- `assessments.assembly.grace_seconds`, `assessments.exposure_*`, and `assessments.propagation_strict` tune the attempt lifecycle, exposure enforcement, and propagation safety checks.

See `config/assessments.php` (or the published copy) for full defaults and inline docs.

### Activation Links

[](#activation-links)

- Config keys: `assessments.activation.prefix`, `assessments.activation.middleware`, `assessments.activation.token_length`, `assessments.activation.expires_minutes`, `assessments.activation.redirect_route` (all have `ASSESSMENTS_ACTIVATION_*` env mirrors).
- Admin UI (exam create/edit) shows activation path, expiry, token, and a copyable URL. Leave token blank to regenerate; leave path blank to auto-fill from prefix + slug.
- Public route: `/assessments/activate/{exam}/{token}` (prefix overridable). It checks token, expiry, and one-time use, marks the exam published, and redirects to the configured route (default `assessments.candidate.exams.preview`).

Development Notes
-----------------

[](#development-notes)

- Host application classes under `app/Assessments` are thin wrappers that extend package controllers, services, and commands to preserve backwards compatibility while the module is extracted.
- Package controllers now consume custom FormRequest classes (`Amryami\\Assessments\\Support\\FormRequest`) which proxy through to any host base request when present (topics, exams, presets, answer sets UI/API, propagation, reviews, questions, candidate attempts), and API responses lean on dedicated resources (answer sets, attempt start, exam preview).
- Blade templates for admin + candidate UIs now live under `assessments::admin/*` and `assessments::assessments/candidate/*`; host views are pass-through includes for existing references.
- Temporary class aliases are defined in `src/helpers.php`; remove them once consumers switch fully to the `Amryami\Assessments\` namespace.
- Package migrations and seeders live in `database/{migrations,seeders}` under the package root. They are automatically loaded when running Artisan commands.
- Progress and sprint planning live in `co-pilot_assistance/assesment_package/*.md`.

Testing
-------

[](#testing)

```
composer test --working-dir=packages/assessments

```

The package uses Orchestra Testbench with the `hr_test` database (see `phpunit.xml.dist`). Update the DB credentials there if your local environment differs.

Release Process
---------------

[](#release-process)

We keep a small [RELEASING.md](RELEASING.md) alongside this README that documents how to:

1. Split / package the `packages/assessments` subtree for distribution.
2. Tag semantic versions and update `CHANGELOG.md`.
3. Trigger Packagist to pull the new tag.

Following those steps ensures consumers installing via Composer always receive a tested, tagged build with up-to-date documentation.

Roadmap
-------

[](#roadmap)

The current sprint plan and backlog are tracked in:

- `co-pilot_assistance/assesment_package/phase1.md`
- `co-pilot_assistance/assesment_package/pending.md`
- `co-pilot_assistance/assesment_package/done.md`

Refer there for detailed migration status and upcoming tasks (Testbench coverage, request/resource abstractions, dynamic workflow integration, etc.).

###  Health Score

34

—

LowBetter than 77% of packages

Maintenance69

Regular maintenance activity

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~3 days

Total

3

Last Release

174d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c4fc0b0e996175c0121872cea5e9b0ded0e456ffb60891d2f6e8e60262b2eb35?d=identicon)[amryami](/maintainers/amryami)

---

Top Contributors

[![AmrYami](https://avatars.githubusercontent.com/u/24992671?v=4)](https://github.com/AmrYami "AmrYami (9 commits)")

---

Tags

laravelpackagequestionsexamsassessments

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/amryami-assessments/health.svg)

```
[![Health](https://phpackages.com/badges/amryami-assessments/health.svg)](https://phpackages.com/packages/amryami-assessments)
```

###  Alternatives

[spatie/laravel-livewire-wizard

Build wizards using Livewire

4061.0M4](/packages/spatie-laravel-livewire-wizard)[tonysm/importmap-laravel

Use ESM with importmap to manage modern JavaScript in Laravel without transpiling or bundling.

148399.8k1](/packages/tonysm-importmap-laravel)[bezhansalleh/filament-google-analytics

Google Analytics integration for FilamentPHP

205144.8k5](/packages/bezhansalleh-filament-google-analytics)[bensampo/laravel-embed

Painless responsive embeds for videos, slideshows and more.

142146.8k](/packages/bensampo-laravel-embed)[laracraft-tech/laravel-useful-additions

A collection of useful Laravel additions!

58109.4k](/packages/laracraft-tech-laravel-useful-additions)[erlandmuchasaj/laravel-gzip

Gzip your responses.

40129.3k2](/packages/erlandmuchasaj-laravel-gzip)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
