feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(cli): add application container to docker demo; make mssql opt-in - #59

Merged
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container
Aug 28, 2026
Merged

feat(cli): add application container to docker demo; make mssql opt-in#59
nadeem4 merged 1 commit into
mainfrom
feat/demo-app-container

Conversation

@nadeem4

Copy link
Copy Markdown
Owner

Task 13 of the 14-task plan.

nl2sql setup --demo --docker generated a compose file with four database
services and no application, so the demo could not actually answer a query
without the user installing and wiring up nl2sql by hand. MSSQL also forced a
~1.6 GB pull before anything came up.

What changed

  • DOCKER_COMPOSE_TEMPLATE gains an app service: built from the repo root
    (context: .., dockerfile: packages/api/Dockerfile), publishes 8000:8000,
    reads the same .env.demo the lite path writes (env_file: ../.env.demo),
    mounts ../configs and ../data, and waits on the three databases with
    condition: service_healthy (all three declare healthchecks;
    manufacturing_history does not, and nothing depends on it).
  • manufacturing_history is now behind profiles: ["mssql"]. Nothing outside
    the profile depends on it, so the default up never resolves it.
  • DemoManager.setup_docker now always writes .env.demo, instead of behind a
    prompt: the app service's env_file must exist or Compose refuses to start
    (and docker compose config fails). The corresponding confirm prompt in
    setup_command is gone; the next-steps panel documents the API port and the
    --profile mssql opt-in.
  • packages/api/Dockerfile now builds from the repo instead of PyPI. It
    installed nl2sql and nl2sql-api from PyPI, where nothing is published yet,
    so it could not build at all. It now copies packages/adapter-sdk,
    packages/nl2sql and packages/api from the build context and installs
    ./packages/adapter-sdk, ./packages/nl2sql[postgres,mysql] and
    ./packages/api. The NL2SQL_EXTRAS build arg is gone; the extras are in the
    install line.
  • .gitignore gains demo_docker/ — stated explicitly rather than quietly: the
    directory setup --demo --docker generates was not ignored, and it contains
    generated database passwords.

Tests

No docker-writer tests existed before this PR. Nothing under
packages/nl2sql/tests/ referenced DockerWriter, write_docker, or
docker-compose.demo, so packages/nl2sql/tests/cli/test_demo_docker_compose.py
is the first coverage for this writer. It generates the stack through the writer,
parses the compose file with yaml.safe_load, and asserts the app service, its
port, its .env.demo env file, service_healthy dependencies, the mssql
profile on manufacturing_history, and that nothing outside that profile depends
on it. Written first: 5 of the 6 failed against the old template
(KeyError: 'app', KeyError: 'profiles').

Unit: 225 passed, 1 skipped, 47 deselected before; 231 passed, 1 skipped,
47 deselected after. Key-free integration: 28 passed, unchanged. Both suites run
twice under pytest-randomly.

Compose validation

Validated with a real docker compose config run (Docker 28.0.4) against
generated output; no images pulled, nothing started.

Default (docker compose -f docker-compose.demo.yml config --services):

manufacturing_ops
manufacturing_ref
manufacturing_supply
app

With --profile mssql:

manufacturing_history
manufacturing_ops
manufacturing_ref
manufacturing_supply
app

Both resolve cleanly. app's depends_on resolves to service_healthy on the
three database services and nothing references manufacturing_history outside
the profile.

Known gap, not addressed here

configs/datasources.demo.yaml for the docker demo points every datasource at
localhost:<published port>, which is correct from the host but does not resolve
from inside the app container. The compose stack starts as specified, but a
query issued against the containerised API would not reach the databases until
that config grows a container-side host. Changing it would break the documented
host-side nl2sql --env demo index / run workflow, so it is left for a
follow-up decision rather than changed here.

@nadeem4
nadeem4 merged commit a7bd223 into mainAug 28, 2026
8 checks passed
@nadeem4
nadeem4 deleted the feat/demo-app-container branch August 28, 2026 05:02
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@nadeem4