quantum-framework 0.18.0__py3-none-any.whl
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.
- quantum/__init__.py +1 -0
- quantum/cli/__init__.py +2 -0
- quantum/cli/admin.py +131 -0
- quantum/cli/check.py +223 -0
- quantum/cli/commands/__init__.py +15 -0
- quantum/cli/commands/build.py +414 -0
- quantum/cli/commands/dev.py +185 -0
- quantum/cli/commands/docs.py +329 -0
- quantum/cli/commands/lint.py +523 -0
- quantum/cli/commands/migrate.py +548 -0
- quantum/cli/commands/new.py +622 -0
- quantum/cli/commands/serve.py +190 -0
- quantum/cli/commands/test.py +193 -0
- quantum/cli/deploy.py +810 -0
- quantum/cli/hot_reload.py +951 -0
- quantum/cli/jobs.py +356 -0
- quantum/cli/mq.py +582 -0
- quantum/cli/pkg.py +390 -0
- quantum/cli/runner.py +565 -0
- quantum/cli/server_process.py +159 -0
- quantum/cli/utils.py +334 -0
- quantum/compiler/__init__.py +30 -0
- quantum/compiler/base_generator.py +367 -0
- quantum/compiler/cli.py +295 -0
- quantum/compiler/expression_transformer.py +444 -0
- quantum/compiler/javascript/__init__.py +10 -0
- quantum/compiler/javascript/generator.py +659 -0
- quantum/compiler/optimizer.py +270 -0
- quantum/compiler/python/__init__.py +10 -0
- quantum/compiler/python/generator.py +883 -0
- quantum/compiler/python/runtime.py +863 -0
- quantum/compiler/transpiler.py +330 -0
- quantum/core/__init__.py +3 -0
- quantum/core/ast_nodes.py +2619 -0
- quantum/core/config_env.py +54 -0
- quantum/core/docs_links.py +8 -0
- quantum/core/expression_diagnostics.py +87 -0
- quantum/core/expression_stdlib.py +208 -0
- quantum/core/expressions.py +677 -0
- quantum/core/features/agents/src/__init__.py +30 -0
- quantum/core/features/agents/src/ast_node.py +540 -0
- quantum/core/features/conditionals/src/__init__.py +8 -0
- quantum/core/features/conditionals/src/ast_node.py +68 -0
- quantum/core/features/data_import/src/__init__.py +0 -0
- quantum/core/features/data_import/src/ast_node.py +292 -0
- quantum/core/features/data_import/src/runtime.py +533 -0
- quantum/core/features/dump/src/__init__.py +12 -0
- quantum/core/features/dump/src/ast_node.py +106 -0
- quantum/core/features/dump/src/parser.py +61 -0
- quantum/core/features/dump/src/runtime.py +246 -0
- quantum/core/features/functions/src/__init__.py +8 -0
- quantum/core/features/functions/src/ast_node.py +149 -0
- quantum/core/features/game_engine_2d/src/__init__.py +19 -0
- quantum/core/features/game_engine_2d/src/ast_nodes.py +1719 -0
- quantum/core/features/game_engine_2d/src/parser.py +983 -0
- quantum/core/features/invocation/src/__init__.py +0 -0
- quantum/core/features/invocation/src/ast_node.py +147 -0
- quantum/core/features/invocation/src/runtime.py +332 -0
- quantum/core/features/knowledge_base/src/__init__.py +6 -0
- quantum/core/features/knowledge_base/src/ast_node.py +113 -0
- quantum/core/features/knowledge_base/src/parser.py +82 -0
- quantum/core/features/logging/src/__init__.py +12 -0
- quantum/core/features/logging/src/ast_node.py +111 -0
- quantum/core/features/logging/src/parser.py +50 -0
- quantum/core/features/logging/src/runtime.py +190 -0
- quantum/core/features/loops/src/__init__.py +8 -0
- quantum/core/features/loops/src/ast_node.py +60 -0
- quantum/core/features/query/src/__init__.py +0 -0
- quantum/core/features/query/src/query_validators.py +20 -0
- quantum/core/features/state_management/src/__init__.py +11 -0
- quantum/core/features/state_management/src/ast_node.py +121 -0
- quantum/core/features/terminal_engine/src/__init__.py +21 -0
- quantum/core/features/terminal_engine/src/ast_nodes.py +560 -0
- quantum/core/features/terminal_engine/src/parser.py +361 -0
- quantum/core/features/testing_engine/src/__init__.py +41 -0
- quantum/core/features/testing_engine/src/ast_nodes.py +1212 -0
- quantum/core/features/testing_engine/src/parser.py +604 -0
- quantum/core/features/theming/src/__init__.py +48 -0
- quantum/core/features/theming/src/ast_node.py +137 -0
- quantum/core/features/theming/src/presets.py +405 -0
- quantum/core/features/ui_engine/src/__init__.py +20 -0
- quantum/core/features/ui_engine/src/ast_nodes.py +1913 -0
- quantum/core/features/ui_engine/src/parser.py +1192 -0
- quantum/core/features/websocket/src/__init__.py +24 -0
- quantum/core/features/websocket/src/ast_node.py +247 -0
- quantum/core/guards.py +53 -0
- quantum/core/html_compat.py +299 -0
- quantum/core/parser.py +1551 -0
- quantum/core/parser_registry.py +213 -0
- quantum/core/parsers/__init__.py +76 -0
- quantum/core/parsers/ai/__init__.py +12 -0
- quantum/core/parsers/ai/agent_parser.py +106 -0
- quantum/core/parsers/ai/knowledge_parser.py +86 -0
- quantum/core/parsers/ai/llm_parser.py +78 -0
- quantum/core/parsers/ai/team_parser.py +88 -0
- quantum/core/parsers/base.py +322 -0
- quantum/core/parsers/composition/__init__.py +10 -0
- quantum/core/parsers/composition/import_parser.py +50 -0
- quantum/core/parsers/composition/slot_parser.py +48 -0
- quantum/core/parsers/control_flow/__init__.py +11 -0
- quantum/core/parsers/control_flow/if_parser.py +71 -0
- quantum/core/parsers/control_flow/loop_parser.py +105 -0
- quantum/core/parsers/control_flow/set_parser.py +93 -0
- quantum/core/parsers/data/__init__.py +12 -0
- quantum/core/parsers/data/data_parser.py +229 -0
- quantum/core/parsers/data/invoke_parser.py +133 -0
- quantum/core/parsers/data/query_parser.py +213 -0
- quantum/core/parsers/data/transaction_parser.py +86 -0
- quantum/core/parsers/events/__init__.py +9 -0
- quantum/core/parsers/events/dispatch_event_parser.py +44 -0
- quantum/core/parsers/forms/__init__.py +11 -0
- quantum/core/parsers/forms/action_parser.py +79 -0
- quantum/core/parsers/forms/flash_parser.py +34 -0
- quantum/core/parsers/forms/redirect_parser.py +33 -0
- quantum/core/parsers/functions/__init__.py +11 -0
- quantum/core/parsers/functions/function_parser.py +98 -0
- quantum/core/parsers/functions/param_parser.py +73 -0
- quantum/core/parsers/functions/return_parser.py +31 -0
- quantum/core/parsers/html/__init__.py +10 -0
- quantum/core/parsers/html/component_call_parser.py +130 -0
- quantum/core/parsers/html/html_parser.py +115 -0
- quantum/core/parsers/jobs/__init__.py +11 -0
- quantum/core/parsers/jobs/job_parser.py +71 -0
- quantum/core/parsers/jobs/schedule_parser.py +62 -0
- quantum/core/parsers/jobs/thread_parser.py +57 -0
- quantum/core/parsers/messaging/__init__.py +17 -0
- quantum/core/parsers/messaging/message_ack_parser.py +30 -0
- quantum/core/parsers/messaging/message_nack_parser.py +30 -0
- quantum/core/parsers/messaging/message_parser.py +114 -0
- quantum/core/parsers/messaging/queue_parser.py +61 -0
- quantum/core/parsers/messaging/websocket_parser.py +121 -0
- quantum/core/parsers/routing/__init__.py +9 -0
- quantum/core/parsers/routing/route_parser.py +41 -0
- quantum/core/parsers/scripting/__init__.py +12 -0
- quantum/core/parsers/scripting/pyclass_parser.py +62 -0
- quantum/core/parsers/scripting/pydecorator_parser.py +68 -0
- quantum/core/parsers/scripting/pyimport_parser.py +52 -0
- quantum/core/parsers/scripting/python_parser.py +49 -0
- quantum/core/parsers/services/__init__.py +12 -0
- quantum/core/parsers/services/dump_parser.py +52 -0
- quantum/core/parsers/services/file_parser.py +48 -0
- quantum/core/parsers/services/log_parser.py +46 -0
- quantum/core/parsers/services/mail_parser.py +65 -0
- quantum/core/tiers.py +164 -0
- quantum/core/xml_lines.py +81 -0
- quantum/packages/__init__.py +28 -0
- quantum/packages/manager.py +413 -0
- quantum/packages/manifest.py +351 -0
- quantum/packages/registry.py +399 -0
- quantum/packages/resolver.py +336 -0
- quantum/plugins/__init__.py +33 -0
- quantum/plugins/hooks.py +329 -0
- quantum/plugins/loader.py +479 -0
- quantum/plugins/manifest.py +336 -0
- quantum/plugins/registry.py +371 -0
- quantum/runtime/__init__.py +25 -0
- quantum/runtime/action_handler.py +532 -0
- quantum/runtime/adapters/__init__.py +88 -0
- quantum/runtime/adapters/memory_adapter.py +690 -0
- quantum/runtime/adapters/rabbitmq_adapter.py +715 -0
- quantum/runtime/adapters/redis_adapter.py +582 -0
- quantum/runtime/adapters/sqlite_adapter.py +414 -0
- quantum/runtime/agent_service.py +1133 -0
- quantum/runtime/ast_cache.py +506 -0
- quantum/runtime/auth_service.py +267 -0
- quantum/runtime/component.py +1048 -0
- quantum/runtime/component_composer.py +133 -0
- quantum/runtime/component_resolver.py +174 -0
- quantum/runtime/conditions.py +54 -0
- quantum/runtime/database_service.py +595 -0
- quantum/runtime/db_schema.py +100 -0
- quantum/runtime/dev_panel.py +178 -0
- quantum/runtime/email_service.py +162 -0
- quantum/runtime/error_handler.py +295 -0
- quantum/runtime/execution_context.py +283 -0
- quantum/runtime/executor_registry.py +178 -0
- quantum/runtime/executors/__init__.py +71 -0
- quantum/runtime/executors/ai/__init__.py +12 -0
- quantum/runtime/executors/ai/agent_executor.py +217 -0
- quantum/runtime/executors/ai/knowledge_executor.py +114 -0
- quantum/runtime/executors/ai/llm_executor.py +153 -0
- quantum/runtime/executors/ai/team_executor.py +171 -0
- quantum/runtime/executors/base.py +264 -0
- quantum/runtime/executors/control_flow/__init__.py +12 -0
- quantum/runtime/executors/control_flow/if_executor.py +98 -0
- quantum/runtime/executors/control_flow/loop_executor.py +308 -0
- quantum/runtime/executors/control_flow/redirect_executor.py +43 -0
- quantum/runtime/executors/control_flow/set_executor.py +464 -0
- quantum/runtime/executors/data/__init__.py +12 -0
- quantum/runtime/executors/data/data_executor.py +156 -0
- quantum/runtime/executors/data/invoke_executor.py +228 -0
- quantum/runtime/executors/data/query_executor.py +290 -0
- quantum/runtime/executors/data/transaction_executor.py +91 -0
- quantum/runtime/executors/jobs/__init__.py +11 -0
- quantum/runtime/executors/jobs/job_executor.py +190 -0
- quantum/runtime/executors/jobs/schedule_executor.py +132 -0
- quantum/runtime/executors/jobs/thread_executor.py +127 -0
- quantum/runtime/executors/messaging/__init__.py +17 -0
- quantum/runtime/executors/messaging/message_ack_executor.py +51 -0
- quantum/runtime/executors/messaging/message_executor.py +174 -0
- quantum/runtime/executors/messaging/queue_executor.py +103 -0
- quantum/runtime/executors/messaging/websocket_executor.py +197 -0
- quantum/runtime/executors/scripting/__init__.py +11 -0
- quantum/runtime/executors/scripting/pyclass_executor.py +90 -0
- quantum/runtime/executors/scripting/pyimport_executor.py +81 -0
- quantum/runtime/executors/scripting/python_executor.py +249 -0
- quantum/runtime/executors/services/__init__.py +12 -0
- quantum/runtime/executors/services/dump_executor.py +72 -0
- quantum/runtime/executors/services/file_executor.py +89 -0
- quantum/runtime/executors/services/log_executor.py +77 -0
- quantum/runtime/executors/services/mail_executor.py +81 -0
- quantum/runtime/expression_cache.py +498 -0
- quantum/runtime/file_upload_service.py +326 -0
- quantum/runtime/function_registry.py +118 -0
- quantum/runtime/game_builder.py +166 -0
- quantum/runtime/game_code_generator.py +2371 -0
- quantum/runtime/game_templates.py +2006 -0
- quantum/runtime/godot_code_generator.py +4681 -0
- quantum/runtime/godot_templates.py +1449 -0
- quantum/runtime/job_executor.py +1599 -0
- quantum/runtime/knowledge_service.py +546 -0
- quantum/runtime/llm_cache.py +100 -0
- quantum/runtime/llm_providers.py +704 -0
- quantum/runtime/llm_service.py +287 -0
- quantum/runtime/local_server.py +28 -0
- quantum/runtime/logging_setup.py +141 -0
- quantum/runtime/message_broker.py +364 -0
- quantum/runtime/message_queue_service.py +571 -0
- quantum/runtime/param_validation.py +218 -0
- quantum/runtime/pypy_compat.py +317 -0
- quantum/runtime/python_bridge.py +698 -0
- quantum/runtime/query_validators.py +304 -0
- quantum/runtime/renderer.py +734 -0
- quantum/runtime/service_container.py +470 -0
- quantum/runtime/table_params.py +163 -0
- quantum/runtime/terminal_builder.py +76 -0
- quantum/runtime/terminal_code_generator.py +607 -0
- quantum/runtime/terminal_templates.py +243 -0
- quantum/runtime/testing_builder.py +77 -0
- quantum/runtime/testing_code_generator.py +833 -0
- quantum/runtime/testing_templates.py +85 -0
- quantum/runtime/ui_builder.py +222 -0
- quantum/runtime/ui_console.py +405 -0
- quantum/runtime/ui_desktop.py +56 -0
- quantum/runtime/ui_form_rules.py +193 -0
- quantum/runtime/ui_html_adapter.py +2567 -0
- quantum/runtime/ui_html_templates.py +2106 -0
- quantum/runtime/ui_mobile_adapter.py +1832 -0
- quantum/runtime/ui_mobile_templates.py +1003 -0
- quantum/runtime/ui_page_renderer.py +392 -0
- quantum/runtime/ui_pager.py +73 -0
- quantum/runtime/ui_table_edit.py +139 -0
- quantum/runtime/ui_textual_adapter.py +1866 -0
- quantum/runtime/ui_textual_templates.py +45 -0
- quantum/runtime/ui_tokens.py +465 -0
- quantum/runtime/ui_validator.py +365 -0
- quantum/runtime/ui_view.py +221 -0
- quantum/runtime/validators.py +256 -0
- quantum/runtime/web_server.py +2131 -0
- quantum/runtime/websocket_adapter.py +501 -0
- quantum/runtime/websocket_service.py +585 -0
- quantum/runtime/websocket_transport.py +289 -0
- quantum/runtime/wsgi.py +101 -0
- quantum/services.py +109 -0
- quantum/utils/__init__.py +1 -0
- quantum_admin/__init__.py +4 -0
- quantum_admin/assets/quantum-admin-connectors.js +123 -0
- quantum_admin/assets/quantum-admin.css +2058 -0
- quantum_admin/assets/quantum-source-highlight.js +106 -0
- quantum_admin/backend/__init__.py +4 -0
- quantum_admin/backend/audit_service.py +346 -0
- quantum_admin/backend/auth_service.py +394 -0
- quantum_admin/backend/component_discovery.py +766 -0
- quantum_admin/backend/config_generator.py +586 -0
- quantum_admin/backend/connector_service.py +1016 -0
- quantum_admin/backend/crud.py +557 -0
- quantum_admin/backend/database.py +226 -0
- quantum_admin/backend/db_setup_service.py +193 -0
- quantum_admin/backend/deploy_service.py +698 -0
- quantum_admin/backend/docker_service.py +422 -0
- quantum_admin/backend/environment_service.py +418 -0
- quantum_admin/backend/git_service.py +370 -0
- quantum_admin/backend/health_service.py +390 -0
- quantum_admin/backend/job_service.py +347 -0
- quantum_admin/backend/log_service.py +331 -0
- quantum_admin/backend/main.py +14426 -0
- quantum_admin/backend/models.py +986 -0
- quantum_admin/backend/pipeline_service.py +812 -0
- quantum_admin/backend/resource_manager.py +1118 -0
- quantum_admin/backend/schemas.py +419 -0
- quantum_admin/backend/secret_manager.py +277 -0
- quantum_admin/backend/settings_service.py +488 -0
- quantum_admin/backend/template_service.py +710 -0
- quantum_admin/backend/test_execution_service.py +364 -0
- quantum_admin/backend/test_generator.py +782 -0
- quantum_admin/backend/webhook_service.py +454 -0
- quantum_admin/backend/websocket_manager.py +360 -0
- quantum_admin/components/admin/_layout/AdminShell.q +121 -0
- quantum_admin/components/admin/agents.q +107 -0
- quantum_admin/components/admin/app/[name].q +558 -0
- quantum_admin/components/admin/applications.q +160 -0
- quantum_admin/components/admin/component/[...path].q +205 -0
- quantum_admin/components/admin/components.q +59 -0
- quantum_admin/components/admin/connectors.q +283 -0
- quantum_admin/components/admin/dashboard.q +86 -0
- quantum_admin/components/admin/database.q +95 -0
- quantum_admin/components/admin/features.q +69 -0
- quantum_admin/components/admin/index.q +12 -0
- quantum_admin/components/admin/jobs.q +75 -0
- quantum_admin/components/admin/login.q +65 -0
- quantum_admin/components/admin/logout.q +11 -0
- quantum_admin/components/admin/settings.q +174 -0
- quantum_admin/components/admin/source.q +45 -0
- quantum_admin/components/admin/tests.q +73 -0
- quantum_admin/run.py +13 -0
- quantum_admin/services/__init__.py +16 -0
- quantum_admin/services/_base.py +84 -0
- quantum_admin/services/_component_test_generator.py +205 -0
- quantum_admin/services/_yaml_editor.py +82 -0
- quantum_admin/services/apps.py +330 -0
- quantum_admin/services/auth.py +61 -0
- quantum_admin/services/components.py +210 -0
- quantum_admin/services/connectors.py +164 -0
- quantum_admin/services/projects.py +189 -0
- quantum_admin/services/repository.py +223 -0
- quantum_admin/services/settings.py +150 -0
- quantum_admin/services/yaml_import.py +118 -0
- quantum_framework-0.18.0.dist-info/METADATA +281 -0
- quantum_framework-0.18.0.dist-info/RECORD +333 -0
- quantum_framework-0.18.0.dist-info/WHEEL +5 -0
- quantum_framework-0.18.0.dist-info/entry_points.txt +2 -0
- quantum_framework-0.18.0.dist-info/licenses/LICENSE +21 -0
- quantum_framework-0.18.0.dist-info/top_level.txt +2 -0
quantum/cli/pkg.py
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Quantum Package Manager CLI
|
|
3
|
+
|
|
4
|
+
CLI commands for package management:
|
|
5
|
+
- quantum pkg init [path] - Initialize a new package
|
|
6
|
+
- quantum pkg publish [path] - Create publishable archive
|
|
7
|
+
- quantum pkg install <source> - Install package from path/URL
|
|
8
|
+
- quantum pkg remove <name> - Remove installed package
|
|
9
|
+
- quantum pkg list - List installed packages
|
|
10
|
+
- quantum pkg search <query> - Search packages
|
|
11
|
+
- quantum pkg info <name> - Show package details
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import argparse
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Optional
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def create_pkg_parser(subparsers: argparse._SubParsersAction) -> None:
|
|
21
|
+
"""Create the 'pkg' subparser with all package commands."""
|
|
22
|
+
pkg_parser = subparsers.add_parser(
|
|
23
|
+
'pkg',
|
|
24
|
+
help='Package management commands',
|
|
25
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
26
|
+
description='Quantum Package Manager - Share and reuse components',
|
|
27
|
+
epilog="""
|
|
28
|
+
Examples:
|
|
29
|
+
quantum pkg init ./my-component # Create new package
|
|
30
|
+
quantum pkg init -n my-ui -a "Me" # Create with name and author
|
|
31
|
+
quantum pkg install ./other-package # Install from local path
|
|
32
|
+
quantum pkg install https://github.com/user/pkg.git # Install from git
|
|
33
|
+
quantum pkg remove my-component # Remove package
|
|
34
|
+
quantum pkg list # List all packages
|
|
35
|
+
quantum pkg search button # Search for packages
|
|
36
|
+
quantum pkg info my-component # Show package details
|
|
37
|
+
quantum pkg publish ./my-component # Create archive for sharing
|
|
38
|
+
"""
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
pkg_subparsers = pkg_parser.add_subparsers(dest='pkg_command', help='Package command')
|
|
42
|
+
|
|
43
|
+
# init command
|
|
44
|
+
init_parser = pkg_subparsers.add_parser(
|
|
45
|
+
'init',
|
|
46
|
+
help='Initialize a new package'
|
|
47
|
+
)
|
|
48
|
+
init_parser.add_argument(
|
|
49
|
+
'path',
|
|
50
|
+
nargs='?',
|
|
51
|
+
default='.',
|
|
52
|
+
help='Directory to initialize (default: current directory)'
|
|
53
|
+
)
|
|
54
|
+
init_parser.add_argument(
|
|
55
|
+
'-n', '--name',
|
|
56
|
+
help='Package name (default: directory name)'
|
|
57
|
+
)
|
|
58
|
+
init_parser.add_argument(
|
|
59
|
+
'-d', '--description',
|
|
60
|
+
default='',
|
|
61
|
+
help='Package description'
|
|
62
|
+
)
|
|
63
|
+
init_parser.add_argument(
|
|
64
|
+
'-a', '--author',
|
|
65
|
+
default='',
|
|
66
|
+
help='Package author'
|
|
67
|
+
)
|
|
68
|
+
init_parser.add_argument(
|
|
69
|
+
'-l', '--license',
|
|
70
|
+
default='MIT',
|
|
71
|
+
help='License identifier (default: MIT)'
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# publish command
|
|
75
|
+
publish_parser = pkg_subparsers.add_parser(
|
|
76
|
+
'publish',
|
|
77
|
+
help='Create publishable package archive'
|
|
78
|
+
)
|
|
79
|
+
publish_parser.add_argument(
|
|
80
|
+
'path',
|
|
81
|
+
nargs='?',
|
|
82
|
+
default='.',
|
|
83
|
+
help='Package directory (default: current directory)'
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
# install command
|
|
87
|
+
install_parser = pkg_subparsers.add_parser(
|
|
88
|
+
'install',
|
|
89
|
+
help='Install a package'
|
|
90
|
+
)
|
|
91
|
+
install_parser.add_argument(
|
|
92
|
+
'source',
|
|
93
|
+
help='Package source (local path or git URL)'
|
|
94
|
+
)
|
|
95
|
+
install_parser.add_argument(
|
|
96
|
+
'-v', '--version',
|
|
97
|
+
help='Specific version to install'
|
|
98
|
+
)
|
|
99
|
+
install_parser.add_argument(
|
|
100
|
+
'--no-deps',
|
|
101
|
+
action='store_true',
|
|
102
|
+
help='Skip dependency resolution'
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# remove command
|
|
106
|
+
remove_parser = pkg_subparsers.add_parser(
|
|
107
|
+
'remove',
|
|
108
|
+
help='Remove an installed package'
|
|
109
|
+
)
|
|
110
|
+
remove_parser.add_argument(
|
|
111
|
+
'name',
|
|
112
|
+
help='Package name to remove'
|
|
113
|
+
)
|
|
114
|
+
remove_parser.add_argument(
|
|
115
|
+
'-v', '--version',
|
|
116
|
+
help='Specific version to remove (default: all versions)'
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# list command
|
|
120
|
+
pkg_subparsers.add_parser(
|
|
121
|
+
'list',
|
|
122
|
+
help='List installed packages'
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# search command
|
|
126
|
+
search_parser = pkg_subparsers.add_parser(
|
|
127
|
+
'search',
|
|
128
|
+
help='Search installed packages'
|
|
129
|
+
)
|
|
130
|
+
search_parser.add_argument(
|
|
131
|
+
'query',
|
|
132
|
+
help='Search query'
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# info command
|
|
136
|
+
info_parser = pkg_subparsers.add_parser(
|
|
137
|
+
'info',
|
|
138
|
+
help='Show package details'
|
|
139
|
+
)
|
|
140
|
+
info_parser.add_argument(
|
|
141
|
+
'name',
|
|
142
|
+
help='Package name'
|
|
143
|
+
)
|
|
144
|
+
info_parser.add_argument(
|
|
145
|
+
'-v', '--version',
|
|
146
|
+
help='Specific version'
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def handle_pkg(args: argparse.Namespace) -> int:
|
|
151
|
+
"""Handle pkg command and subcommands."""
|
|
152
|
+
# Lazy import to avoid circular imports
|
|
153
|
+
try:
|
|
154
|
+
from quantum.packages import PackageManager, PackageError
|
|
155
|
+
except ImportError:
|
|
156
|
+
# Try relative import
|
|
157
|
+
from quantum.packages import PackageManager, PackageError
|
|
158
|
+
|
|
159
|
+
if not args.pkg_command:
|
|
160
|
+
print("[ERROR] No package command specified")
|
|
161
|
+
print("Usage: quantum pkg <command> [options]")
|
|
162
|
+
print("Commands: init, publish, install, remove, list, search, info")
|
|
163
|
+
return 1
|
|
164
|
+
|
|
165
|
+
pm = PackageManager()
|
|
166
|
+
|
|
167
|
+
try:
|
|
168
|
+
if args.pkg_command == 'init':
|
|
169
|
+
return _handle_init(pm, args)
|
|
170
|
+
elif args.pkg_command == 'publish':
|
|
171
|
+
return _handle_publish(pm, args)
|
|
172
|
+
elif args.pkg_command == 'install':
|
|
173
|
+
return _handle_install(pm, args)
|
|
174
|
+
elif args.pkg_command == 'remove':
|
|
175
|
+
return _handle_remove(pm, args)
|
|
176
|
+
elif args.pkg_command == 'list':
|
|
177
|
+
return _handle_list(pm, args)
|
|
178
|
+
elif args.pkg_command == 'search':
|
|
179
|
+
return _handle_search(pm, args)
|
|
180
|
+
elif args.pkg_command == 'info':
|
|
181
|
+
return _handle_info(pm, args)
|
|
182
|
+
else:
|
|
183
|
+
print(f"[ERROR] Unknown package command: {args.pkg_command}")
|
|
184
|
+
return 1
|
|
185
|
+
|
|
186
|
+
except PackageError as e:
|
|
187
|
+
print(f"[ERROR] {e}")
|
|
188
|
+
return 1
|
|
189
|
+
except Exception as e:
|
|
190
|
+
print(f"[ERROR] Unexpected error: {e}")
|
|
191
|
+
return 1
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _handle_init(pm, args: argparse.Namespace) -> int:
|
|
195
|
+
"""Handle 'pkg init' command."""
|
|
196
|
+
path = Path(args.path).resolve()
|
|
197
|
+
|
|
198
|
+
print(f"[INFO] Initializing package in {path}")
|
|
199
|
+
|
|
200
|
+
manifest = pm.init(
|
|
201
|
+
path=str(path),
|
|
202
|
+
name=args.name,
|
|
203
|
+
description=args.description,
|
|
204
|
+
author=args.author,
|
|
205
|
+
license_id=args.license
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
print(f"[SUCCESS] Package '{manifest.name}' initialized!")
|
|
209
|
+
print(f" Version: {manifest.version}")
|
|
210
|
+
print(f" Main: {manifest.main}")
|
|
211
|
+
print()
|
|
212
|
+
print("Created files:")
|
|
213
|
+
print(" quantum.yaml")
|
|
214
|
+
print(" src/index.q")
|
|
215
|
+
print(" examples/demo.q")
|
|
216
|
+
print(" README.md")
|
|
217
|
+
print()
|
|
218
|
+
print("Next steps:")
|
|
219
|
+
print(f" 1. Edit src/index.q to create your component")
|
|
220
|
+
print(f" 2. Update quantum.yaml with description and keywords")
|
|
221
|
+
print(f" 3. Run 'quantum pkg publish {args.path}' to create archive")
|
|
222
|
+
|
|
223
|
+
return 0
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _handle_publish(pm, args: argparse.Namespace) -> int:
|
|
227
|
+
"""Handle 'pkg publish' command."""
|
|
228
|
+
path = Path(args.path).resolve()
|
|
229
|
+
|
|
230
|
+
print(f"[INFO] Publishing package from {path}")
|
|
231
|
+
|
|
232
|
+
archive_path = pm.publish(str(path))
|
|
233
|
+
|
|
234
|
+
print(f"[SUCCESS] Package archive created!")
|
|
235
|
+
print(f" Archive: {archive_path}")
|
|
236
|
+
print()
|
|
237
|
+
print("Share this archive or upload to a registry.")
|
|
238
|
+
|
|
239
|
+
return 0
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def _handle_install(pm, args: argparse.Namespace) -> int:
|
|
243
|
+
"""Handle 'pkg install' command."""
|
|
244
|
+
source = args.source
|
|
245
|
+
resolve_deps = not getattr(args, 'no_deps', False)
|
|
246
|
+
|
|
247
|
+
print(f"[INFO] Installing package from {source}")
|
|
248
|
+
|
|
249
|
+
installed = pm.install(
|
|
250
|
+
source=source,
|
|
251
|
+
version=args.version,
|
|
252
|
+
resolve_deps=resolve_deps
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
if not installed:
|
|
256
|
+
print("[WARN] No packages installed")
|
|
257
|
+
return 0
|
|
258
|
+
|
|
259
|
+
print(f"[SUCCESS] Installed {len(installed)} package(s):")
|
|
260
|
+
for manifest in installed:
|
|
261
|
+
print(f" {manifest.name}@{manifest.version}")
|
|
262
|
+
|
|
263
|
+
return 0
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def _handle_remove(pm, args: argparse.Namespace) -> int:
|
|
267
|
+
"""Handle 'pkg remove' command."""
|
|
268
|
+
name = args.name
|
|
269
|
+
version = args.version
|
|
270
|
+
|
|
271
|
+
if version:
|
|
272
|
+
print(f"[INFO] Removing {name}@{version}")
|
|
273
|
+
else:
|
|
274
|
+
print(f"[INFO] Removing {name} (all versions)")
|
|
275
|
+
|
|
276
|
+
removed = pm.remove(name, version)
|
|
277
|
+
|
|
278
|
+
if removed:
|
|
279
|
+
print(f"[SUCCESS] Package '{name}' removed")
|
|
280
|
+
return 0
|
|
281
|
+
else:
|
|
282
|
+
print(f"[WARN] Package '{name}' not found")
|
|
283
|
+
return 1
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def _handle_list(pm, args: argparse.Namespace) -> int:
|
|
287
|
+
"""Handle 'pkg list' command."""
|
|
288
|
+
packages = pm.list_packages()
|
|
289
|
+
|
|
290
|
+
if not packages:
|
|
291
|
+
print("[INFO] No packages installed")
|
|
292
|
+
print()
|
|
293
|
+
print("Install packages with:")
|
|
294
|
+
print(" quantum pkg install <path-or-url>")
|
|
295
|
+
return 0
|
|
296
|
+
|
|
297
|
+
print(f"[INFO] Installed packages ({len(packages)}):")
|
|
298
|
+
print()
|
|
299
|
+
|
|
300
|
+
for pkg in packages:
|
|
301
|
+
name = pkg['name']
|
|
302
|
+
latest = pkg.get('latest', 'unknown')
|
|
303
|
+
description = pkg.get('description', '')[:50]
|
|
304
|
+
versions = pkg.get('versions', [])
|
|
305
|
+
|
|
306
|
+
print(f" {name}@{latest}")
|
|
307
|
+
if description:
|
|
308
|
+
print(f" {description}")
|
|
309
|
+
if len(versions) > 1:
|
|
310
|
+
print(f" Versions: {', '.join(versions)}")
|
|
311
|
+
print()
|
|
312
|
+
|
|
313
|
+
return 0
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def _handle_search(pm, args: argparse.Namespace) -> int:
|
|
317
|
+
"""Handle 'pkg search' command."""
|
|
318
|
+
query = args.query
|
|
319
|
+
|
|
320
|
+
print(f"[INFO] Searching for '{query}'...")
|
|
321
|
+
|
|
322
|
+
results = pm.search(query)
|
|
323
|
+
|
|
324
|
+
if not results:
|
|
325
|
+
print(f"[INFO] No packages found matching '{query}'")
|
|
326
|
+
return 0
|
|
327
|
+
|
|
328
|
+
print(f"[INFO] Found {len(results)} package(s):")
|
|
329
|
+
print()
|
|
330
|
+
|
|
331
|
+
for pkg in results:
|
|
332
|
+
name = pkg['name']
|
|
333
|
+
latest = pkg.get('latest', 'unknown')
|
|
334
|
+
description = pkg.get('description', '')[:50]
|
|
335
|
+
keywords = pkg.get('keywords', [])
|
|
336
|
+
|
|
337
|
+
print(f" {name}@{latest}")
|
|
338
|
+
if description:
|
|
339
|
+
print(f" {description}")
|
|
340
|
+
if keywords:
|
|
341
|
+
print(f" Keywords: {', '.join(keywords[:5])}")
|
|
342
|
+
print()
|
|
343
|
+
|
|
344
|
+
return 0
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
def _handle_info(pm, args: argparse.Namespace) -> int:
|
|
348
|
+
"""Handle 'pkg info' command."""
|
|
349
|
+
name = args.name
|
|
350
|
+
version = args.version
|
|
351
|
+
|
|
352
|
+
manifest = pm.get_package(name, version)
|
|
353
|
+
|
|
354
|
+
if not manifest:
|
|
355
|
+
print(f"[ERROR] Package '{name}' not found")
|
|
356
|
+
return 1
|
|
357
|
+
|
|
358
|
+
pkg_path = pm.get_package_path(name, version)
|
|
359
|
+
|
|
360
|
+
print(f"[INFO] Package: {manifest.name}")
|
|
361
|
+
print()
|
|
362
|
+
print(f" Version: {manifest.version}")
|
|
363
|
+
print(f" Description: {manifest.description or '(none)'}")
|
|
364
|
+
print(f" Author: {manifest.author or '(none)'}")
|
|
365
|
+
print(f" License: {manifest.license}")
|
|
366
|
+
print(f" Main: {manifest.main}")
|
|
367
|
+
print(f" Path: {pkg_path}")
|
|
368
|
+
|
|
369
|
+
if manifest.keywords:
|
|
370
|
+
print(f" Keywords: {', '.join(manifest.keywords)}")
|
|
371
|
+
|
|
372
|
+
if manifest.dependencies:
|
|
373
|
+
print()
|
|
374
|
+
print(" Dependencies:")
|
|
375
|
+
for dep_name, dep_version in manifest.dependencies.items():
|
|
376
|
+
print(f" {dep_name}: {dep_version}")
|
|
377
|
+
|
|
378
|
+
if manifest.exports:
|
|
379
|
+
print()
|
|
380
|
+
print(" Exports:")
|
|
381
|
+
for export in manifest.exports:
|
|
382
|
+
print(f" {export}")
|
|
383
|
+
|
|
384
|
+
# Show available versions
|
|
385
|
+
all_versions = pm.registry.get_all_versions(name)
|
|
386
|
+
if len(all_versions) > 1:
|
|
387
|
+
print()
|
|
388
|
+
print(f" All versions: {', '.join(all_versions)}")
|
|
389
|
+
|
|
390
|
+
return 0
|