Artifex/control_plane/projects/migrations/0001_initial.py
2026-08-15 13:50:24 +07:00

285 lines
17 KiB
Python

# Generated by Django 5.2.16 on 2026-08-15 05:46
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('agents', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Project',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=200)),
('project_type', models.CharField(default='WEB_APP', max_length=100)),
('goal', models.TextField()),
('repository_url', models.TextField(blank=True)),
('repository_path', models.TextField(blank=True)),
('status', models.CharField(choices=[('PLANNING', 'Planning'), ('READY', 'Ready'), ('ARCHAEOLOGY', 'Archaeology'), ('BUILDING', 'Building'), ('PAUSING', 'Pausing'), ('PAUSED', 'Paused'), ('BLOCKED', 'Blocked'), ('VERIFYING', 'Verifying'), ('FINISHED', 'Finished'), ('FAILED', 'Failed')], default='PLANNING', max_length=32)),
('current_plan_version', models.PositiveIntegerField(default=0)),
('architecture_summary', models.TextField(blank=True)),
('constraints', models.JSONField(blank=True, default=dict)),
('budget', models.JSONField(blank=True, default=dict)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Milestone',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('key', models.CharField(max_length=50)),
('title', models.CharField(max_length=200)),
('goal', models.TextField()),
('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('VERIFYING', 'Verifying'), ('COMPLETE', 'Complete'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed')], default='QUEUED', max_length=32)),
('verification_contract', models.JSONField(blank=True, default=dict)),
('order', models.PositiveIntegerField(default=0)),
('dependencies', models.ManyToManyField(blank=True, to='projects.milestone')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='milestones', to='projects.project')),
],
options={
'ordering': ['order', 'created_at'],
},
),
migrations.CreateModel(
name='Finding',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('source', models.CharField(max_length=80)),
('finding_type', models.CharField(max_length=80)),
('severity', models.CharField(default='INFO', max_length=32)),
('title', models.CharField(max_length=255)),
('description', models.TextField(blank=True)),
('evidence', models.JSONField(blank=True, default=list)),
('status', models.CharField(default='OPEN', max_length=32)),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='findings', to='projects.project')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Feature',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('title', models.CharField(max_length=200)),
('description', models.TextField(blank=True)),
('acceptance_criteria', models.JSONField(blank=True, default=list)),
('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('VERIFYING', 'Verifying'), ('COMPLETE', 'Complete'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed')], default='QUEUED', max_length=32)),
('milestone', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='projects.milestone')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='projects.project')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Decision',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('decision_type', models.CharField(max_length=80)),
('decision', models.TextField()),
('reason', models.TextField(blank=True)),
('evidence', models.JSONField(blank=True, default=list)),
('project_plan_version', models.PositiveIntegerField(default=0)),
('actor', models.CharField(max_length=120)),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='decisions', to='projects.project')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='ProjectPlan',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('version', models.PositiveIntegerField()),
('goal', models.TextField()),
('scope', models.TextField(blank=True)),
('stack', models.JSONField(blank=True, default=dict)),
('architecture', models.JSONField(blank=True, default=dict)),
('constraints', models.JSONField(blank=True, default=dict)),
('acceptance_criteria', models.JSONField(blank=True, default=list)),
('permissions', models.JSONField(blank=True, default=dict)),
('budget', models.JSONField(blank=True, default=dict)),
('open_decisions', models.JSONField(blank=True, default=list)),
('approved_at', models.DateTimeField(blank=True, null=True)),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='plans', to='projects.project')),
],
),
migrations.AddField(
model_name='milestone',
name='plan',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='milestones', to='projects.projectplan'),
),
migrations.CreateModel(
name='RoadmapItem',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('title', models.CharField(max_length=200)),
('description', models.TextField(blank=True)),
('source', models.CharField(default='user', max_length=80)),
('status', models.CharField(choices=[('INBOX', 'Inbox'), ('NOW', 'Now'), ('NEXT', 'Next'), ('LATER', 'Later'), ('EXPLORING', 'Exploring'), ('DECLINED', 'Declined'), ('DONE', 'Done')], default='INBOX', max_length=32)),
('priority', models.PositiveSmallIntegerField(default=50)),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='roadmap_items', to='projects.project')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Scenario',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=200)),
('target_type', models.CharField(max_length=80)),
('target_id', models.CharField(max_length=120)),
('definition', models.JSONField(blank=True, default=dict)),
('status', models.CharField(default='DRAFT', max_length=32)),
('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='scenarios', to='projects.project')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Task',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('task_type', models.CharField(max_length=80)),
('status', models.CharField(choices=[('QUEUED', 'Queued'), ('READY', 'Ready'), ('RUNNING', 'Running'), ('WAITING_TOOL', 'Waiting Tool'), ('REVIEW', 'Review'), ('BLOCKED', 'Blocked'), ('FAILED', 'Failed'), ('COMPLETE', 'Complete')], default='QUEUED', max_length=32)),
('priority', models.PositiveSmallIntegerField(choices=[(10, 'Low'), (50, 'Normal'), (80, 'High'), (100, 'Critical')], default=50)),
('goal', models.TextField()),
('acceptance_criteria', models.JSONField(blank=True, default=list)),
('retry_count', models.PositiveIntegerField(default=0)),
('max_retries', models.PositiveIntegerField(default=2)),
('assigned_agent_version', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='agents.agentversion')),
('feature', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tasks', to='projects.feature')),
('milestone', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='tasks', to='projects.milestone')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='projects.project')),
],
),
migrations.CreateModel(
name='Artifact',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('artifact_type', models.CharField(max_length=80)),
('name', models.CharField(max_length=255)),
('uri', models.TextField(blank=True)),
('content', models.JSONField(blank=True, default=dict)),
('generated_by', models.CharField(blank=True, max_length=120)),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='artifacts', to='projects.project')),
('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='artifacts', to='projects.task')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Action',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('action_type', models.CharField(max_length=80)),
('status', models.CharField(default='PENDING', max_length=32)),
('contract', models.JSONField(blank=True, default=dict)),
('result', models.JSONField(blank=True, default=dict)),
('started_at', models.DateTimeField(blank=True, null=True)),
('finished_at', models.DateTimeField(blank=True, null=True)),
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='actions', to='projects.task')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='TaskDependency',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('depends_on', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dependent_edges', to='projects.task')),
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dependency_edges', to='projects.task')),
],
),
migrations.CreateModel(
name='Worktree',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('repository_path', models.TextField()),
('worktree_path', models.TextField()),
('branch_name', models.CharField(max_length=255)),
('base_ref', models.CharField(default='main', max_length=255)),
('status', models.CharField(default='ACTIVE', max_length=32)),
('task', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='worktree', to='projects.task')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='CommitRecord',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('sha', models.CharField(max_length=64)),
('branch_name', models.CharField(max_length=255)),
('message', models.TextField()),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='commits', to='projects.project')),
('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='commits', to='projects.task')),
('worktree', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='commits', to='projects.worktree')),
],
options={
'abstract': False,
},
),
migrations.AddConstraint(
model_name='projectplan',
constraint=models.UniqueConstraint(fields=('project', 'version'), name='unique_plan_version'),
),
migrations.AddConstraint(
model_name='milestone',
constraint=models.UniqueConstraint(fields=('project', 'key'), name='unique_milestone_key'),
),
migrations.AddIndex(
model_name='task',
index=models.Index(fields=['project', 'status', 'priority'], name='projects_ta_project_423b1c_idx'),
),
migrations.AddConstraint(
model_name='taskdependency',
constraint=models.UniqueConstraint(fields=('task', 'depends_on'), name='unique_task_dependency'),
),
]