imlil 1.0.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/.eslintrc.cjs +40 -0
- package/DOCS.md +63 -0
- package/README.md +160 -0
- package/agentTestSandbox/cli-test-zone/README.md +0 -0
- package/agentTestSandbox/cli-test-zone/imlil.blueprint.json +5 -0
- package/agentTestSandbox/cli-test-zone/notes-warning.md +3 -0
- package/agentTestSandbox/cli-test-zone/package.json +0 -0
- package/agentTestSandbox/cli-test-zone/public/index.html +0 -0
- package/agentTestSandbox/cli-test-zone/src/App.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/App.jsx +29 -0
- package/agentTestSandbox/cli-test-zone/src/__tests__/App.test.jsx +48 -0
- package/agentTestSandbox/cli-test-zone/src/components/AddTodo.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/components/Navigation/Navigation.jsx +48 -0
- package/agentTestSandbox/cli-test-zone/src/components/Navigation/__tests__/Navigation.module.test.js +45 -0
- package/agentTestSandbox/cli-test-zone/src/components/Navigation/__tests__/Navigation.test.jsx +47 -0
- package/agentTestSandbox/cli-test-zone/src/components/Navigation.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/components/TodoItem/TodoItem.jsx +41 -0
- package/agentTestSandbox/cli-test-zone/src/components/TodoItem/__tests__/TodoItem.test.jsx +65 -0
- package/agentTestSandbox/cli-test-zone/src/components/TodoItem.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/components/TodoList/TodoList.module.css +62 -0
- package/agentTestSandbox/cli-test-zone/src/components/TodoList.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/index.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/pages/About.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/pages/Home.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/store/TodoContext.js +0 -0
- package/agentTestSandbox/cli-test-zone/src/styles/Todo.css +0 -0
- package/agentTestSandbox/cli-test-zone/src/styles/index.css +0 -0
- package/agentTestSandbox/cli-test-zone/src/utils/__tests__/localStorage.test.js +48 -0
- package/agentTestSandbox/cli-test-zone/src/utils/localStorage.js +38 -0
- package/agentTestSandbox/parallel-test/.env.example +0 -0
- package/agentTestSandbox/parallel-test/.eslintrc.json +0 -0
- package/agentTestSandbox/parallel-test/.github/workflows/__tests__/workflows.test.ts +115 -0
- package/agentTestSandbox/parallel-test/.github/workflows/cd.yml +0 -0
- package/agentTestSandbox/parallel-test/.github/workflows/ci.yml +4 -0
- package/agentTestSandbox/parallel-test/.imlil/plan-2026-02-08.md +186 -0
- package/agentTestSandbox/parallel-test/.prettierrc +0 -0
- package/agentTestSandbox/parallel-test/Dockerfile +0 -0
- package/agentTestSandbox/parallel-test/README.md +3 -0
- package/agentTestSandbox/parallel-test/ast.json +74 -0
- package/agentTestSandbox/parallel-test/docker-compose.yml +4 -0
- package/agentTestSandbox/parallel-test/jest.config.js +61 -0
- package/agentTestSandbox/parallel-test/k8s/__tests__/deployment.test.ts +168 -0
- package/agentTestSandbox/parallel-test/k8s/frontend-deployment.yaml +4 -0
- package/agentTestSandbox/parallel-test/nginx/nginx.conf +0 -0
- package/agentTestSandbox/parallel-test/package.json +50 -0
- package/agentTestSandbox/parallel-test/prisma/__tests__/schema.test.ts +176 -0
- package/agentTestSandbox/parallel-test/prisma/schema.prisma +109 -0
- package/agentTestSandbox/parallel-test/server/__tests__/controllers/dashboard.controller.test.ts +127 -0
- package/agentTestSandbox/parallel-test/server/__tests__/index.test.ts +60 -0
- package/agentTestSandbox/parallel-test/server/__tests__/models/user.model.test.ts +111 -0
- package/agentTestSandbox/parallel-test/server/config/__tests__/swagger.test.ts +128 -0
- package/agentTestSandbox/parallel-test/server/config/database.ts +0 -0
- package/agentTestSandbox/parallel-test/server/config/redis.ts +0 -0
- package/agentTestSandbox/parallel-test/server/config/swagger.ts +0 -0
- package/agentTestSandbox/parallel-test/server/controllers/__tests__/auth.controller.test.ts +178 -0
- package/agentTestSandbox/parallel-test/server/controllers/__tests__/user.controller.test.ts +105 -0
- package/agentTestSandbox/parallel-test/server/controllers/auth.controller.ts +148 -0
- package/agentTestSandbox/parallel-test/server/controllers/dashboard.controller.ts +137 -0
- package/agentTestSandbox/parallel-test/server/controllers/user.controller.ts +161 -0
- package/agentTestSandbox/parallel-test/server/index.ts +62 -0
- package/agentTestSandbox/parallel-test/server/middleware/__tests__/auth.middleware.test.ts +74 -0
- package/agentTestSandbox/parallel-test/server/middleware/auth.middleware.ts +55 -0
- package/agentTestSandbox/parallel-test/server/middleware/error.middleware.ts +0 -0
- package/agentTestSandbox/parallel-test/server/middleware/validation.middleware.ts +0 -0
- package/agentTestSandbox/parallel-test/server/models/analytics.model.ts +0 -0
- package/agentTestSandbox/parallel-test/server/models/profile.model.ts +0 -0
- package/agentTestSandbox/parallel-test/server/models/user.model.ts +78 -0
- package/agentTestSandbox/parallel-test/server/routes/auth.routes.ts +0 -0
- package/agentTestSandbox/parallel-test/server/routes/dashboard.routes.ts +0 -0
- package/agentTestSandbox/parallel-test/server/routes/user.routes.ts +0 -0
- package/agentTestSandbox/parallel-test/src/App.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/__tests__/config.test.ts +127 -0
- package/agentTestSandbox/parallel-test/src/__tests__/index.test.tsx +36 -0
- package/agentTestSandbox/parallel-test/src/__tests__/setup.test.ts +34 -0
- package/agentTestSandbox/parallel-test/src/__tests__/setupTest.test.ts +44 -0
- package/agentTestSandbox/parallel-test/src/components/common/Button/Button.tsx +80 -0
- package/agentTestSandbox/parallel-test/src/components/common/Button/__tests__/Button.test.tsx +75 -0
- package/agentTestSandbox/parallel-test/src/components/common/Card/Card.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/common/Input/Input.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/common/Table/Table.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/features/Authentication/LoginForm.tsx +75 -0
- package/agentTestSandbox/parallel-test/src/components/features/Authentication/RegisterForm.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/features/Authentication/__tests__/LoginForm.test.tsx +101 -0
- package/agentTestSandbox/parallel-test/src/components/features/Dashboard/AnalyticsChart.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/features/Dashboard/DashboardStats.tsx +81 -0
- package/agentTestSandbox/parallel-test/src/components/features/Dashboard/__tests__/DashboardStats.test.tsx +122 -0
- package/agentTestSandbox/parallel-test/src/components/layouts/Header.tsx +70 -0
- package/agentTestSandbox/parallel-test/src/components/layouts/MainLayout.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/layouts/Sidebar.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/components/layouts/__tests__/MainLayout.test.tsx +65 -0
- package/agentTestSandbox/parallel-test/src/hooks/__tests__/useAuth.test.ts +75 -0
- package/agentTestSandbox/parallel-test/src/hooks/useApi.ts +0 -0
- package/agentTestSandbox/parallel-test/src/hooks/useAuth.ts +54 -0
- package/agentTestSandbox/parallel-test/src/hooks/useTheme.ts +0 -0
- package/agentTestSandbox/parallel-test/src/index.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/services/__tests__/api.service.test.ts +48 -0
- package/agentTestSandbox/parallel-test/src/services/analytics.service.ts +0 -0
- package/agentTestSandbox/parallel-test/src/services/api.service.ts +59 -0
- package/agentTestSandbox/parallel-test/src/services/api.ts +0 -0
- package/agentTestSandbox/parallel-test/src/services/auth.service.ts +0 -0
- package/agentTestSandbox/parallel-test/src/services/user.service.ts +0 -0
- package/agentTestSandbox/parallel-test/src/store/__tests__/store.test.ts +60 -0
- package/agentTestSandbox/parallel-test/src/store/index.ts +23 -0
- package/agentTestSandbox/parallel-test/src/store/slices/authSlice.ts +0 -0
- package/agentTestSandbox/parallel-test/src/store/slices/dashboardSlice.ts +0 -0
- package/agentTestSandbox/parallel-test/src/store/slices/userSlice.ts +0 -0
- package/agentTestSandbox/parallel-test/src/types/auth.types.ts +0 -0
- package/agentTestSandbox/parallel-test/src/types/dashboard.types.ts +0 -0
- package/agentTestSandbox/parallel-test/src/types/user.types.ts +0 -0
- package/agentTestSandbox/parallel-test/src/utils/constants.ts +0 -0
- package/agentTestSandbox/parallel-test/src/utils/formatters.ts +0 -0
- package/agentTestSandbox/parallel-test/src/utils/validation.ts +0 -0
- package/agentTestSandbox/parallel-test/src/views/Dashboard.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/views/Login.tsx +31 -0
- package/agentTestSandbox/parallel-test/src/views/Profile.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/views/Register.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/views/Settings.tsx +0 -0
- package/agentTestSandbox/parallel-test/src/views/__tests__/Login.test.tsx +62 -0
- package/agentTestSandbox/parallel-test/src/vite-env.d.ts +1 -0
- package/agentTestSandbox/parallel-test/tailwind.config.js +0 -0
- package/agentTestSandbox/parallel-test/tests/integration/api/auth.test.ts +120 -0
- package/agentTestSandbox/parallel-test/tests/unit/components/Button.test.tsx +35 -0
- package/agentTestSandbox/parallel-test/tests/unit/config/jest.config.test.js +62 -0
- package/agentTestSandbox/parallel-test/tests/unit/config/jest.setup.test.js +52 -0
- package/agentTestSandbox/parallel-test/tests/unit/infrastructure/__tests__/docker-config.test.ts +107 -0
- package/agentTestSandbox/parallel-test/tsconfig.json +0 -0
- package/agentTestSandbox/zone2/Makefile +58 -0
- package/agentTestSandbox/zone2/README.md +0 -0
- package/agentTestSandbox/zone2/docs/API.md +0 -0
- package/agentTestSandbox/zone2/docs/CONTRIBUTING.md +0 -0
- package/agentTestSandbox/zone2/imlil.blueprint.json +5 -0
- package/agentTestSandbox/zone2/notes-warning.md +3 -0
- package/agentTestSandbox/zone2/src/calculator.c +0 -0
- package/agentTestSandbox/zone2/src/calculator.h +0 -0
- package/agentTestSandbox/zone2/src/core/__tests__/test_memory.c +89 -0
- package/agentTestSandbox/zone2/src/core/memory.c +60 -0
- package/agentTestSandbox/zone2/src/display.c +0 -0
- package/agentTestSandbox/zone2/src/display.h +0 -0
- package/agentTestSandbox/zone2/src/input_handler.c +0 -0
- package/agentTestSandbox/zone2/src/input_handler.h +0 -0
- package/agentTestSandbox/zone2/src/main.c +0 -0
- package/agentTestSandbox/zone2/src/utils/error_handling.c +0 -0
- package/agentTestSandbox/zone2/src/utils/error_handling.h +0 -0
- package/agentTestSandbox/zone2/src/utils/input.c +0 -0
- package/agentTestSandbox/zone2/src/utils/input.h +0 -0
- package/agentTestSandbox/zone2/src/utils/math_utils.c +0 -0
- package/agentTestSandbox/zone2/src/utils/math_utils.h +0 -0
- package/agentTestSandbox/zone2/src/utils/stack.c +0 -0
- package/agentTestSandbox/zone2/src/utils/stack.h +0 -0
- package/agentTestSandbox/zone2/src/utils.c +34 -0
- package/agentTestSandbox/zone2/tests/__tests__/test_makefile.c +58 -0
- package/agentTestSandbox/zone2/tests/calculator_tests.c +0 -0
- package/agentTestSandbox/zone2/tests/input_handler_tests.c +0 -0
- package/agentTestSandbox/zone2/tests/math_utils_tests.c +0 -0
- package/agentTestSandbox/zone2/tests/test_calculator.c +0 -0
- package/agentTestSandbox/zone2/tests/test_input.c +0 -0
- package/agentTestSandbox/zone2/tests/test_stack.c +0 -0
- package/agentTestSandbox/zone2/tests/test_utils.c +8 -0
- package/bin/cli.js +369 -0
- package/imlil.config.js +22 -0
- package/index.js +0 -0
- package/jest.config.js +5 -0
- package/package.json +45 -0
- package/src/__tests__/cli.test.js +5 -0
- package/src/actions/Action.js +125 -0
- package/src/agents/Agent.js +64 -0
- package/src/agents/Operator.js +147 -0
- package/src/agents/ScrumAgent.js +74 -0
- package/src/agents/SupervisorAgent.js +198 -0
- package/src/agents/ValidatorAgent.js +48 -0
- package/src/agents/coder.js +208 -0
- package/src/agents/worker.js +52 -0
- package/src/utils/db.js +40 -0
- package/src/utils/embedapi.js +19 -0
- package/test-api.js +24 -0
package/.eslintrc.cjs
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
env: {
|
|
3
|
+
browser: true,
|
|
4
|
+
es2021: true,
|
|
5
|
+
node: true,
|
|
6
|
+
},
|
|
7
|
+
extends: 'airbnb-base',
|
|
8
|
+
overrides: [
|
|
9
|
+
{
|
|
10
|
+
env: {
|
|
11
|
+
node: true,
|
|
12
|
+
},
|
|
13
|
+
files: [
|
|
14
|
+
'.eslintrc.{js,cjs}',
|
|
15
|
+
],
|
|
16
|
+
parserOptions: {
|
|
17
|
+
sourceType: 'script',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
files: ['src/**/*.test.js'],
|
|
22
|
+
env: {
|
|
23
|
+
jest: true,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
parserOptions: {
|
|
28
|
+
ecmaVersion: 'latest',
|
|
29
|
+
sourceType: 'module',
|
|
30
|
+
},
|
|
31
|
+
rules: {
|
|
32
|
+
'import/extensions': ['error', 'ignorePackages'],
|
|
33
|
+
'max-len': 'off',
|
|
34
|
+
'no-console': 'off',
|
|
35
|
+
'no-restricted-syntax': 'off',
|
|
36
|
+
'no-await-in-loop': 'off',
|
|
37
|
+
'no-continue': 'off',
|
|
38
|
+
'prefer-destructuring': 'off',
|
|
39
|
+
},
|
|
40
|
+
};
|
package/DOCS.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# `imlil` Documentation
|
|
2
|
+
|
|
3
|
+
This document provides a deeper dive into the architecture and functionality of `imlil`.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
`imlil` uses a multi-agent system to build projects. The main agents are:
|
|
8
|
+
|
|
9
|
+
- **Supervisor Agent**: This is the project manager. It takes the user's initial prompt, creates a plan, and delegates tasks to Operator agents.
|
|
10
|
+
- **Operator Agent**: This agent is responsible for executing a specific task from the plan. It uses the AI model to generate the code or commands needed to complete the task.
|
|
11
|
+
- **Coder Agent**: This agent is specialized in writing and modifying code. It receives instructions from the Operator and performs file system operations.
|
|
12
|
+
|
|
13
|
+
### The Flow
|
|
14
|
+
|
|
15
|
+
1. The user runs `imlil make "..."`.
|
|
16
|
+
2. The `SupervisorAgent` is instantiated.
|
|
17
|
+
3. The `SupervisorAgent` creates a high-level plan using the AI model.
|
|
18
|
+
4. The plan is broken down into a series of tasks.
|
|
19
|
+
5. The `SupervisorAgent` assigns tasks to `Operator` agents, up to `maxAgents`.
|
|
20
|
+
6. Each `Operator` agent uses the AI model to generate a sequence of actions (like `writeFile`, `gitCommit`, etc.) to complete its task.
|
|
21
|
+
7. The actions are executed by the `Coder` agent.
|
|
22
|
+
8. The process continues until all tasks are completed.
|
|
23
|
+
|
|
24
|
+
## Configuration (`imlil.config.js`)
|
|
25
|
+
|
|
26
|
+
- **`mode`**: Can be `'yolo'` or `'safe'`. In `yolo` mode, the agents are given more freedom to experiment. `'safe'` mode will be more conservative. (Note: `'safe'` mode is not yet fully implemented).
|
|
27
|
+
- **`maxAgents`**: An integer that determines how many agents can run in parallel. This is useful for controlling API usage and resource consumption.
|
|
28
|
+
- **`cliPersonality`**: A system prompt that is prepended to every call to the AI model. This allows you to customize the personality and tone of the CLI's output and behavior.
|
|
29
|
+
|
|
30
|
+
## Agents in Detail
|
|
31
|
+
|
|
32
|
+
### `SupervisorAgent.js`
|
|
33
|
+
|
|
34
|
+
- **Purpose**: To manage the overall project creation process.
|
|
35
|
+
- **Key Methods**:
|
|
36
|
+
- `run()`: The main entry point. It creates a plan and starts assigning tasks.
|
|
37
|
+
- `createPlan()`: Interacts with the AI to get a structured plan.
|
|
38
|
+
- `assignTask()`: Creates and dispatches an `Operator` agent for a task.
|
|
39
|
+
|
|
40
|
+
### `Operator.js`
|
|
41
|
+
|
|
42
|
+
- **Purpose**: To execute a single task from the plan.
|
|
43
|
+
- **Key Methods**:
|
|
44
|
+
- `run()`: Takes a task and generates a series of actions to complete it.
|
|
45
|
+
- `executeAction()`: Executes a single action, like writing a file or running a command.
|
|
46
|
+
|
|
47
|
+
### `coder.js`
|
|
48
|
+
|
|
49
|
+
- **Purpose**: A specialized agent for code generation and modification.
|
|
50
|
+
- **Key Methods**:
|
|
51
|
+
- `run()`: Takes a task and generates code.
|
|
52
|
+
- `executeAction()`: Interacts with the `Action.js` toolkit to modify the filesystem.
|
|
53
|
+
|
|
54
|
+
## The Action Toolkit (`Action.js`)
|
|
55
|
+
|
|
56
|
+
This class provides a set of methods that agents can use to interact with the user's system. It's a layer of abstraction over the filesystem and git.
|
|
57
|
+
|
|
58
|
+
- `writeFile(filePath, content)`
|
|
59
|
+
- `readFile(filePath)`
|
|
60
|
+
- `gitAdd(files)`
|
|
61
|
+
- `gitCommit(message)`
|
|
62
|
+
|
|
63
|
+
This architecture allows for extending the tool's capabilities by adding new actions and new types of agents.
|
package/README.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# imlil.dev: Your CTO in a box.
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### 🚀 100+ Agents. 60 Seconds. Zero Limits.
|
|
5
|
+
|
|
6
|
+
**One CLI. One API Key. Infinite Staff.**
|
|
7
|
+
|
|
8
|
+
[](https://www.npmjs.com/package/imlil)
|
|
9
|
+
[](https://imlil.dev/docs/tdd)
|
|
10
|
+
[](https://imlil.dev/pricing)
|
|
11
|
+
[](https://imlil.dev/docs)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
**imlil.dev is the first High-Velocity AI Firm that lives in your terminal.**
|
|
16
|
+
|
|
17
|
+
Forget "coding assistants." You need a **team**.
|
|
18
|
+
**imlil** gives you a **CTO, Engineering Managers, Scrum Masters, Senior Devs, and QA Leads**—all working in parallel.
|
|
19
|
+
|
|
20
|
+
**10 Agents? 100 Agents? 1,000 Agents?**
|
|
21
|
+
There is no limit. If you have the tokens, we have the staff.
|
|
22
|
+
Build a full-stack SaaS (Backend + Frontend + Infra) in **60 seconds flat**.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 👥 Meet Your New Employees
|
|
27
|
+
|
|
28
|
+
When you run `imlil make`, you are hiring a specialized, autonomous workforce:
|
|
29
|
+
|
|
30
|
+
### 1. **The Supervisor (CTO)**
|
|
31
|
+
* **Role:** Architect & Planner.
|
|
32
|
+
* **Job:** Designs the system, selects the stack (e.g., Next.js, Rust, Python), and maps out the entire project structure.
|
|
33
|
+
* **Output:** A master architectural plan.
|
|
34
|
+
|
|
35
|
+
### 2. **The Operator (Engineering Manager)**
|
|
36
|
+
* **Role:** Task Orchestrator.
|
|
37
|
+
* **Job:** Breaks the CTO's plan into hundreds of parallel tickets. Assigns them to the worker pool.
|
|
38
|
+
|
|
39
|
+
### 3. **The Scrum Master (Agile Coach)**
|
|
40
|
+
* **Role:** Flow Optimizer.
|
|
41
|
+
* **Job:** Unblocks agents, manages retries, and ensures velocity remains high.
|
|
42
|
+
|
|
43
|
+
### 4. **The Coder (Senior Developer)**
|
|
44
|
+
* **Role:** Implementation Specialist.
|
|
45
|
+
* **Job:** Writes clean, idiomatic code.
|
|
46
|
+
* **Superpower:** **Surgical Precision.** Unlike other tools that overwrite files blindly, The Coder reads your codebase's structure and inserts changes without breaking existing logic.
|
|
47
|
+
|
|
48
|
+
### 5. **The Validator (QA Lead)**
|
|
49
|
+
* **Role:** The Gatekeeper.
|
|
50
|
+
* **Job:** Enforces **Strict TDD**.
|
|
51
|
+
1. Writes a failing test.
|
|
52
|
+
2. Verifies the failure.
|
|
53
|
+
3. Approves the Coder's work *only* if the test passes.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## ⚡ Why Hire This Team?
|
|
58
|
+
|
|
59
|
+
### 1. **Unlimited Parallel Concurrency**
|
|
60
|
+
Why wait for one developer? **imlil** spawns an army.
|
|
61
|
+
* **Scale:** Run **50+ agents** simultaneously.
|
|
62
|
+
* **Speed:** Build a full-stack SaaS in minutes, not weeks.
|
|
63
|
+
* **Infrastructure:** True multi-threaded execution for maximum throughput.
|
|
64
|
+
|
|
65
|
+
### 2. **Bleeding-Edge Intelligence (EmbedAPI)**
|
|
66
|
+
Your team uses the absolute latest research models, updated automatically.
|
|
67
|
+
|
|
68
|
+
**Currently Supported (2026):**
|
|
69
|
+
* ⚡ **Gemini 3 Flash** (The fastest inference engine on the market)
|
|
70
|
+
* 🧠 **Gemini 3 Pro** (Unmatched reasoning and context)
|
|
71
|
+
* 🤖 **Claude 4.6 (Opus/Sonnet)** (Best-in-class coding & agentic behavior)
|
|
72
|
+
* 🚀 **GPT-5.3-Codex** (The new gold standard for software engineering)
|
|
73
|
+
|
|
74
|
+
### 3. **Context-Aware Memory**
|
|
75
|
+
Your team never forgets. They map your entire project's DNA before writing a single line of code, ensuring every file fits the architecture perfectly.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 📦 Installation
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm install -g imlil
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## 🔑 Setup
|
|
86
|
+
|
|
87
|
+
1. **Get your Universal API Key:**
|
|
88
|
+
Sign up at [https://imlil.dev](https://imlil.dev).
|
|
89
|
+
> **⚠️ Note:** There is **no free plan**. This is enterprise-grade tooling.
|
|
90
|
+
|
|
91
|
+
2. **Authenticate:**
|
|
92
|
+
```bash
|
|
93
|
+
export EMBED_API_KEY="your-key-here"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🛠️ Usage
|
|
99
|
+
|
|
100
|
+
### The `make` Command
|
|
101
|
+
Issue a contract to your new digital firm.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Contract: Build a SaaS Dashboard with 20 staff members
|
|
105
|
+
imlil make "A modern SaaS dashboard with Next.js 14, Tailwind, Supabase, and Stripe integration" --max-agents 20
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Options
|
|
109
|
+
* `--max-agents <number>`: Staffing level. Default `10`. Increase for speed, decrease for cost efficiency.
|
|
110
|
+
* `--debug`: Audit the internal Slack channels (logs) of your agents.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## 💻 Development
|
|
115
|
+
|
|
116
|
+
### Scripts
|
|
117
|
+
|
|
118
|
+
* `npm test`: Runs the test suite.
|
|
119
|
+
* `npm run lint`: Lints the codebase.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 💎 Pricing: Pay-As-You-Go
|
|
124
|
+
|
|
125
|
+
**imlil** operates on a transparent, usage-based model via **EmbedAPI**.
|
|
126
|
+
|
|
127
|
+
* **No Salaries:** You don't pay fixed monthly costs.
|
|
128
|
+
* **Token-Based:** Pay only for the compute (tokens) your team consumes.
|
|
129
|
+
* **Direct Pass-Through:** We provide the infrastructure; you provide the fuel.
|
|
130
|
+
|
|
131
|
+
*Check [imlil.dev/pricing](https://imlil.dev/pricing) for current rates.*
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 🏗️ The Org Chart
|
|
136
|
+
|
|
137
|
+
```mermaid
|
|
138
|
+
graph TD;
|
|
139
|
+
Client[User] -->|Goal| Supervisor[Supervisor (CTO)];
|
|
140
|
+
Supervisor -->|Plan| Operator[Operator (Manager)];
|
|
141
|
+
Operator -->|Tasks| Backlog[Task Queue];
|
|
142
|
+
|
|
143
|
+
subgraph Swarm [The Worker Pool]
|
|
144
|
+
Scrum[Scrum Master] -->|Assigns| Coder[Coder];
|
|
145
|
+
Coder -->|Code| Validator[QA Lead];
|
|
146
|
+
Validator -->|TDD Check| Coder;
|
|
147
|
+
Validator -->|Pass| Done[Done];
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
Backlog --> Scrum;
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 📜 License
|
|
156
|
+
|
|
157
|
+
Copyright © 2026 **imlil.dev**. All rights reserved.
|
|
158
|
+
Released under the MIT License.
|
|
159
|
+
|
|
160
|
+
> *"You define the product. We build the company that builds it."*
|
|
File without changes
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fileStructure": "src/\n ├── components/\n │ ├── TodoList/\n │ ├── TodoItem/\n │ ├── AddTodo/\n │ └── Navigation/\n ├── store/\n │ └── todoSlice/\n ├── utils/\n └── styles/",
|
|
3
|
+
"conventions": "- Components: PascalCase (e.g., TodoList.jsx)\n- Hooks: camelCase prefixed with 'use' (e.g., useLocalStorage)\n- Utils: camelCase\n- CSS Modules: ComponentName.module.css\n- Tests: ComponentName.test.jsx in same directory as component",
|
|
4
|
+
"techStack": "- React 18\n- React Router DOM\n- Local Storage for state persistence\n- CSS Modules for styling\n- PropTypes for type checking"
|
|
5
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
|
|
3
|
+
import Navigation from './components/Navigation/Navigation';
|
|
4
|
+
import TodoList from './components/TodoList/TodoList';
|
|
5
|
+
|
|
6
|
+
const Home = () => (
|
|
7
|
+
<div>
|
|
8
|
+
<h1>Welcome to Todo App</h1>
|
|
9
|
+
<p>Manage your tasks efficiently</p>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
const App = () => {
|
|
14
|
+
return (
|
|
15
|
+
<Router>
|
|
16
|
+
<div>
|
|
17
|
+
<Navigation />
|
|
18
|
+
<main>
|
|
19
|
+
<Routes>
|
|
20
|
+
<Route path="/" element={<Home />} />
|
|
21
|
+
<Route path="/todos" element={<TodoList />} />
|
|
22
|
+
</Routes>
|
|
23
|
+
</main>
|
|
24
|
+
</div>
|
|
25
|
+
</Router>
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export default App;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import { BrowserRouter as Router, Routes, Route, MemoryRouter } from 'react-router-dom';
|
|
4
|
+
import { viretest } from 'vitest';
|
|
5
|
+
import App from '../App';
|
|
6
|
+
|
|
7
|
+
describe('App Router Configuration', () => {
|
|
8
|
+
it('should render the home page by default', () => {
|
|
9
|
+
render(
|
|
10
|
+
<MemoryRouter initialEntries={['/']}>
|
|
11
|
+
<App />
|
|
12
|
+
</MemoryRouter>
|
|
13
|
+
);
|
|
14
|
+
expect(screen.getByTestId('home-page')).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should render the todo list page when navigating to /todos', () => {
|
|
18
|
+
render(
|
|
19
|
+
<MemoryRouter initialEntries={['/todos']}>
|
|
20
|
+
<App />
|
|
21
|
+
</MemoryRouter>
|
|
22
|
+
);
|
|
23
|
+
expect(screen.getByTestId('todo-list-page')).toBeInTheDocument();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should display 404 page for unknown routes', () => {
|
|
27
|
+
render(
|
|
28
|
+
<MemoryRouter initialEntries={[/invalid-route/]}>
|
|
29
|
+
<App />
|
|
30
|
+
</MemoryRouter>
|
|
31
|
+
);
|
|
32
|
+
expect(screen.getByTestId('not-found-page')).toBeInTheDocument();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should have navigation links for home and todo list', () => {
|
|
36
|
+
render(
|
|
37
|
+
<MemoryRouter>
|
|
38
|
+
<App />
|
|
39
|
+
</MemoryRouter>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const homeLink = screen.getByRole('link', { name: /home/i });
|
|
43
|
+
const todosLink = screen.getByRole('link', { name: /todos/i });
|
|
44
|
+
|
|
45
|
+
expect(homeLink).toBeInTheDocument();
|
|
46
|
+
expect(todosLink).toBeInTheDocument();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
File without changes
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NavLink } from 'react-router-dom';
|
|
3
|
+
import PropTypes from 'prop-types';
|
|
4
|
+
import styles from './Navigation.module.css';
|
|
5
|
+
|
|
6
|
+
const Navigation = () => {
|
|
7
|
+
return (
|
|
8
|
+
<nav className={styles.navigation}>
|
|
9
|
+
<ul className={styles.navList}>
|
|
10
|
+
<li>
|
|
11
|
+
<NavLink
|
|
12
|
+
to="/"
|
|
13
|
+
className={({ isActive }) =>
|
|
14
|
+
`${styles.navLink} ${isActive ? styles.active : ''}`
|
|
15
|
+
}
|
|
16
|
+
end={true}
|
|
17
|
+
>
|
|
18
|
+
Home
|
|
19
|
+
</NavLink>
|
|
20
|
+
</li>
|
|
21
|
+
<li>
|
|
22
|
+
<NavLink
|
|
23
|
+
to="/active"
|
|
24
|
+
className={({ isActive }) =>
|
|
25
|
+
`${styles.navLink} ${isActive ? styles.active : ''}`
|
|
26
|
+
}
|
|
27
|
+
>
|
|
28
|
+
Active
|
|
29
|
+
</NavLink>
|
|
30
|
+
</li>
|
|
31
|
+
<li>
|
|
32
|
+
<NavLink
|
|
33
|
+
to="/completed"
|
|
34
|
+
className={({ isActive }) =>
|
|
35
|
+
`${styles.navLink} ${isActive ? styles.active : ''}`
|
|
36
|
+
}
|
|
37
|
+
>
|
|
38
|
+
Completed
|
|
39
|
+
</NavLink>
|
|
40
|
+
</li>
|
|
41
|
+
</ul>
|
|
42
|
+
</nav>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
Navigation.propTypes = {};
|
|
47
|
+
|
|
48
|
+
export default Navigation;
|
package/agentTestSandbox/cli-test-zone/src/components/Navigation/__tests__/Navigation.module.test.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
import styles from '../Navigation.module.css';
|
|
4
|
+
|
|
5
|
+
// Mock the CSS module
|
|
6
|
+
jest.mock('../Navigation.module.css', () => ({
|
|
7
|
+
nav: 'nav',
|
|
8
|
+
link: 'link',
|
|
9
|
+
active: 'active'
|
|
10
|
+
}));
|
|
11
|
+
|
|
12
|
+
describe('CSS Modules - Navigation Styles', () => {
|
|
13
|
+
it('should have the correct CSS module styles', () => {
|
|
14
|
+
// Verify that the styles object has the expected properties
|
|
15
|
+
expect(styles).toHaveProperty('nav');
|
|
16
|
+
expect(styles).toHaveProperty('link');
|
|
17
|
+
expect(styles).toHaveProperty('active');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should apply styles properly to Navigation component', () => {
|
|
21
|
+
const { container } = render(
|
|
22
|
+
<nav className={styles.nav}>
|
|
23
|
+
<a className={styles.link}>Link</a>
|
|
24
|
+
</nav>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
// Verify that the classes are applied
|
|
28
|
+
const navElement = container.querySelector('nav');
|
|
29
|
+
const linkElement = container.querySelector('a');
|
|
30
|
+
|
|
31
|
+
expect(navElement).toHaveClass(styles.nav);
|
|
32
|
+
expect(linkElement).toHaveClass(styles.link);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should apply active styles when active class is added', () => {
|
|
36
|
+
const { container } = render(
|
|
37
|
+
<nav className={styles.nav}>
|
|
38
|
+
<a className={`${styles.link} ${styles.active}`}>Active Link</a>
|
|
39
|
+
</nav>
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const activeLink = container.querySelector('a');
|
|
43
|
+
expect(activeLink).toHaveClass(styles.active);
|
|
44
|
+
});
|
|
45
|
+
});
|
package/agentTestSandbox/cli-test-zone/src/components/Navigation/__tests__/Navigation.test.jsx
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react';
|
|
2
|
+
import { BrowserRouter as Router } from 'react-router-dom';
|
|
3
|
+
import Navigation from '../Navigation';
|
|
4
|
+
|
|
5
|
+
describe('Navigation Component', () => {
|
|
6
|
+
const renderWithRouter = () => {
|
|
7
|
+
render(
|
|
8
|
+
<Router>
|
|
9
|
+
<Navigation />
|
|
10
|
+
</Router>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
it('renders without crashing', () => {
|
|
15
|
+
expect(() => renderWithRouter()).not.toThrow();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('displays the home link', () => {
|
|
19
|
+
renderWithRouter();
|
|
20
|
+
const homeLink = screen.getByRole('link', { name: /Home/i });
|
|
21
|
+
expect(homeLink).toBeInTheDocument();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('displays the active todos link', () => {
|
|
25
|
+
renderWithRouter();
|
|
26
|
+
const activeLink = screen.getByRole('link', { name: /Active/i });
|
|
27
|
+
expect(activeLink).toBeInTheDocument();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('displays the completed todos link', () => {
|
|
31
|
+
renderWithRouter();
|
|
32
|
+
const completedLink = screen.getByRole('link', { name: /Completed/i });
|
|
33
|
+
expect(completedLink).toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('has accessible navigation', () => {
|
|
37
|
+
renderWithRouter();
|
|
38
|
+
const nav = screen.getByRole('navigation');
|
|
39
|
+
expect(nav).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('has accessible landmark', () => {
|
|
43
|
+
renderWithRouter();
|
|
44
|
+
const nav = screen.getByRole('navigation');
|
|
45
|
+
expect(nav).toHaveAttribute('aria-label', 'main navigation');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
File without changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import styles from './TodoItem.module.css';
|
|
4
|
+
|
|
5
|
+
const TodoItem = ({ id, text, completed, onToggle, onDelete }) => {
|
|
6
|
+
return (
|
|
7
|
+
<div className={styles.todoItem}>
|
|
8
|
+
<div className={styles.content}>
|
|
9
|
+
<label className={styles.checkboxLabel}>
|
|
10
|
+
<input
|
|
11
|
+
type="checkbox"
|
|
12
|
+
checked={completed}
|
|
13
|
+
onChange={() => onToggle(id)}
|
|
14
|
+
className={styles.checkbox}
|
|
15
|
+
/>
|
|
16
|
+
<span className={`${styles.text} ${completed ? styles.completed : ''}`}>
|
|
17
|
+
{text}
|
|
18
|
+
</span>
|
|
19
|
+
</label>
|
|
20
|
+
</div>
|
|
21
|
+
<button
|
|
22
|
+
type="button"
|
|
23
|
+
onClick={() => onDelete(id)}
|
|
24
|
+
className={styles.deleteButton}
|
|
25
|
+
aria-label="Delete todo"
|
|
26
|
+
>
|
|
27
|
+
<span aria-hidden="true">×</span>
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
TodoItem.propTypes = {
|
|
34
|
+
id: PropTypes.string.isRequired,
|
|
35
|
+
text: PropTypes.string.isRequired,
|
|
36
|
+
completed: PropTypes.bool.isRequired,
|
|
37
|
+
onToggle: PropTypes.func.isRequired,
|
|
38
|
+
onDelete: PropTypes.func.isRequired
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export default TodoItem;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, screen, fireEvent } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
4
|
+
import TodoItem from '../TodoItem';
|
|
5
|
+
|
|
6
|
+
const mockTodo = {
|
|
7
|
+
id: '123',
|
|
8
|
+
text: 'Buy groceries',
|
|
9
|
+
completed: false
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const mockOnToggle = jest.fn();
|
|
13
|
+
const mockOnDelete = jest.fn();
|
|
14
|
+
|
|
15
|
+
const setup = (props = {}) => {
|
|
16
|
+
return render(
|
|
17
|
+
<TodoItem
|
|
18
|
+
todo={mockTodo}
|
|
19
|
+
onToggle={mockOnToggle}
|
|
20
|
+
onDelete={mockOnDelete}
|
|
21
|
+
{...props}
|
|
22
|
+
/>
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
describe('TodoItem', () => {
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
jest.clearAllMocks();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('renders todo text', () => {
|
|
32
|
+
setup();
|
|
33
|
+
expect(screen.getByText('Buy groceries')).toBeInTheDocument();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('renders checkbox with correct checked state', () => {
|
|
37
|
+
setup();
|
|
38
|
+
const checkbox = screen.getByRole('checkbox');
|
|
39
|
+
expect(checkbox).toBeInTheDocument();
|
|
40
|
+
expect(checkbox).not.toBeChecked();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('calls onToggle when checkbox is clicked', async () => {
|
|
44
|
+
setup();
|
|
45
|
+
const checkbox = screen.getByRole('checkbox');
|
|
46
|
+
await userEvent.click(checkbox);
|
|
47
|
+
expect(mockOnToggle).toHaveBeenCalledWith('123');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it('calls onDelete when delete button is clicked', async () => {
|
|
51
|
+
setup();
|
|
52
|
+
const deleteButton = screen.getByRole('button', { name: /delete/i });
|
|
53
|
+
await userEvent.click(deleteButton);
|
|
54
|
+
expect(mockOnDelete).toHaveBeenCalledWith('123');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('applies completed style when todo is completed', () => {
|
|
58
|
+
const completedTodo = { ...mockTodo, completed: true };
|
|
59
|
+
setup({ todo: completedTodo });
|
|
60
|
+
const todoText = screen.getByText('Buy groceries');
|
|
61
|
+
expect(todoText).toHaveStyle({
|
|
62
|
+
textDecoration: 'line-through'
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
File without changes
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
.listContainer {
|
|
2
|
+
width: 100%;
|
|
3
|
+
max-width: 600px;
|
|
4
|
+
margin: 0 auto;
|
|
5
|
+
padding: 20px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.todoList {
|
|
9
|
+
list-style: none;
|
|
10
|
+
padding: 0;
|
|
11
|
+
margin: 20px 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.todoItem {
|
|
15
|
+
display: flex;
|
|
16
|
+
justify-content: space-between;
|
|
17
|
+
align-items: center;
|
|
18
|
+
padding: 10px 15px;
|
|
19
|
+
margin-bottom: 8px;
|
|
20
|
+
background-color: #fff;
|
|
21
|
+
border-radius: 4px;
|
|
22
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
23
|
+
transition: all 0.3s ease;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.todoItem:hover {
|
|
27
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
|
28
|
+
transform: translateY(-1px);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.completed {
|
|
32
|
+
background-color: #f0f0f0;
|
|
33
|
+
text-decoration: line-through;
|
|
34
|
+
color: #888;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.actions {
|
|
38
|
+
display: flex;
|
|
39
|
+
gap: 10px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.button {
|
|
43
|
+
padding: 6px 12px;
|
|
44
|
+
border: none;
|
|
45
|
+
border-radius: 4px;
|
|
46
|
+
cursor: pointer;
|
|
47
|
+
transition: background-color 0.2s ease;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.deleteButton {
|
|
51
|
+
background-color: #ff4444;
|
|
52
|
+
color: white;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.deleteButton:hover {
|
|
56
|
+
background-color: #ee2222;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.checkbox {
|
|
60
|
+
margin-right: 10px;
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
}
|
|
File without changes
|
|
File without changes
|